From d79b4511886019fc18392b2dc05c131338f93839 Mon Sep 17 00:00:00 2001 From: iota97 Date: Wed, 25 Dec 2019 16:48:25 +0100 Subject: [PATCH 001/336] Allow tilt input on Z instead of X --- Core/Config.cpp | 1 + Core/Config.h | 2 ++ UI/NativeApp.cpp | 14 +++++++++++--- UI/TiltAnalogSettingsScreen.cpp | 1 + 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index 214aeb433e..838c6cc8b2 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -857,6 +857,7 @@ static ConfigSetting controlSettings[] = { #ifdef MOBILE_DEVICE ConfigSetting("TiltBaseX", &g_Config.fTiltBaseX, 0.0f, true, true), ConfigSetting("TiltBaseY", &g_Config.fTiltBaseY, 0.0f, true, true), + ConfigSetting("TiltVertical", &g_Config.TiltVertical, false, true, true), ConfigSetting("InvertTiltX", &g_Config.bInvertTiltX, false, true, true), ConfigSetting("InvertTiltY", &g_Config.bInvertTiltY, true, true, true), ConfigSetting("TiltSensitivityX", &g_Config.iTiltSensitivityX, 100, true, true), diff --git a/Core/Config.h b/Core/Config.h index 084eacc942..ca2e8b3938 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -266,6 +266,8 @@ public: //the base x and y tilt. this inclination is treated as (0,0) and the tilt input //considers this orientation to be equal to no movement of the analog stick. float fTiltBaseX, fTiltBaseY; + //tilt vertically will use Z accelerometer axis as X (X would require phone on flat plane) + bool TiltVertical; //whether the x axes and y axes should invert directions (left becomes right, top becomes bottom.) bool bInvertTiltX, bInvertTiltY; //the sensitivity of the tilt in the x direction diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index 9e3ea05102..8e4c7b8b56 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -1266,7 +1266,10 @@ bool NativeAxis(const AxisInput &axis) { // see [http://developer.android.com/guide/topics/sensors/sensors_overview.html] for details bool portrait = dp_yres > dp_xres; switch (axis.axisId) { + //TODO: make this generic. case JOYSTICK_AXIS_ACCELEROMETER_X: + if (g_Config.TiltVertical) // use Z axis instead + return false; if (portrait) { currentTilt.x_ = axis.value; } else { @@ -1283,9 +1286,14 @@ bool NativeAxis(const AxisInput &axis) { break; case JOYSTICK_AXIS_ACCELEROMETER_Z: - //don't handle this now as only landscape is enabled. - //TODO: make this generic. - return false; + if (!g_Config.TiltVertical) // use X axis instead + return false; + if (portrait) { + currentTilt.x_ = axis.value; + } else { + currentTilt.y_ = axis.value; + } + break; case JOYSTICK_AXIS_OUYA_UNKNOWN1: case JOYSTICK_AXIS_OUYA_UNKNOWN2: diff --git a/UI/TiltAnalogSettingsScreen.cpp b/UI/TiltAnalogSettingsScreen.cpp index 1281c5658f..16fc40f5d3 100644 --- a/UI/TiltAnalogSettingsScreen.cpp +++ b/UI/TiltAnalogSettingsScreen.cpp @@ -35,6 +35,7 @@ void TiltAnalogSettingsScreen::CreateViews() { settings->Add(new ItemHeader(co->T("Invert Axes"))); settings->Add(new CheckBox(&g_Config.bInvertTiltX, co->T("Invert Tilt along X axis"))); settings->Add(new CheckBox(&g_Config.bInvertTiltY, co->T("Invert Tilt along Y axis"))); + settings->Add(new CheckBox(&g_Config.TiltVertical, co->T("Tilt along Z axis instead of X"))); settings->Add(new ItemHeader(co->T("Sensitivity"))); //TODO: allow values greater than 100? I'm not sure if that's needed. From a56e56cf531fe0ae9919f331d5d3bd3396b5a02d Mon Sep 17 00:00:00 2001 From: iota97 Date: Tue, 31 Dec 2019 11:08:48 +0100 Subject: [PATCH 002/336] Auto switch option --- Core/Config.cpp | 2 +- Core/Config.h | 3 +-- UI/NativeApp.cpp | 27 +++++++++++++++++++++------ UI/TiltAnalogSettingsScreen.cpp | 3 ++- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index 838c6cc8b2..c35b57a660 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -857,7 +857,7 @@ static ConfigSetting controlSettings[] = { #ifdef MOBILE_DEVICE ConfigSetting("TiltBaseX", &g_Config.fTiltBaseX, 0.0f, true, true), ConfigSetting("TiltBaseY", &g_Config.fTiltBaseY, 0.0f, true, true), - ConfigSetting("TiltVertical", &g_Config.TiltVertical, false, true, true), + ConfigSetting("TiltOrientation", &g_Config.iTiltOrientation, 0, true, true), ConfigSetting("InvertTiltX", &g_Config.bInvertTiltX, false, true, true), ConfigSetting("InvertTiltY", &g_Config.bInvertTiltY, true, true, true), ConfigSetting("TiltSensitivityX", &g_Config.iTiltSensitivityX, 100, true, true), diff --git a/Core/Config.h b/Core/Config.h index ca2e8b3938..86d25983fb 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -266,8 +266,7 @@ public: //the base x and y tilt. this inclination is treated as (0,0) and the tilt input //considers this orientation to be equal to no movement of the analog stick. float fTiltBaseX, fTiltBaseY; - //tilt vertically will use Z accelerometer axis as X (X would require phone on flat plane) - bool TiltVertical; + int iTiltOrientation; //whether the x axes and y axes should invert directions (left becomes right, top becomes bottom.) bool bInvertTiltX, bInvertTiltY; //the sensitivity of the tilt in the x direction diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index 8e4c7b8b56..40ebcf4ea4 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -1260,6 +1260,13 @@ bool NativeAxis(const AxisInput &axis) { // This is static, since we need to remember where we last were (in terms of orientation) static Tilt currentTilt; + // tilt on x or y? + static bool TiltVertical; + if (g_Config.iTiltOrientation == 0) + TiltVertical = false; + else if (g_Config.iTiltOrientation == 1) + TiltVertical = true; + // x and y are flipped if we are in landscape orientation. The events are // sent with respect to the portrait coordinate system, while we // take all events in landscape. @@ -1268,8 +1275,12 @@ bool NativeAxis(const AxisInput &axis) { switch (axis.axisId) { //TODO: make this generic. case JOYSTICK_AXIS_ACCELEROMETER_X: - if (g_Config.TiltVertical) // use Z axis instead - return false; + if (TiltVertical) { + if (fabs(axis.value) < 0.8f && g_Config.iTiltOrientation == 2) // Auto tilt switch + TiltVertical = false; + else + return false; // Tilt on Z instead + } if (portrait) { currentTilt.x_ = axis.value; } else { @@ -1286,12 +1297,16 @@ bool NativeAxis(const AxisInput &axis) { break; case JOYSTICK_AXIS_ACCELEROMETER_Z: - if (!g_Config.TiltVertical) // use X axis instead - return false; + if (!TiltVertical) { + if (fabs(axis.value) < 0.8f && g_Config.iTiltOrientation == 2) // Auto tilt switch + TiltVertical = true; + else + return false; // Tilt on X instead + } if (portrait) { - currentTilt.x_ = axis.value; + currentTilt.x_ = -axis.value; } else { - currentTilt.y_ = axis.value; + currentTilt.y_ = -axis.value; } break; diff --git a/UI/TiltAnalogSettingsScreen.cpp b/UI/TiltAnalogSettingsScreen.cpp index 16fc40f5d3..09a463760c 100644 --- a/UI/TiltAnalogSettingsScreen.cpp +++ b/UI/TiltAnalogSettingsScreen.cpp @@ -35,7 +35,8 @@ void TiltAnalogSettingsScreen::CreateViews() { settings->Add(new ItemHeader(co->T("Invert Axes"))); settings->Add(new CheckBox(&g_Config.bInvertTiltX, co->T("Invert Tilt along X axis"))); settings->Add(new CheckBox(&g_Config.bInvertTiltY, co->T("Invert Tilt along Y axis"))); - settings->Add(new CheckBox(&g_Config.TiltVertical, co->T("Tilt along Z axis instead of X"))); + static const char* tiltMode[] = { "Screen parallel to ground", "Screen orthogonal to ground", "Auto-switch" }; + settings->Add(new PopupMultiChoice(&g_Config.iTiltOrientation, co->T("Base tilt position"), tiltMode, 0, ARRAY_SIZE(tiltMode), co->GetName(), screenManager())); settings->Add(new ItemHeader(co->T("Sensitivity"))); //TODO: allow values greater than 100? I'm not sure if that's needed. From b25482f314f13f6830d8e30818f70a01c3136d85 Mon Sep 17 00:00:00 2001 From: iota97 Date: Mon, 13 Jan 2020 18:48:04 +0100 Subject: [PATCH 003/336] Improve tilt masking --- UI/TiltEventProcessor.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/UI/TiltEventProcessor.cpp b/UI/TiltEventProcessor.cpp index 97b5bcd90a..cdc5910adc 100644 --- a/UI/TiltEventProcessor.cpp +++ b/UI/TiltEventProcessor.cpp @@ -106,12 +106,12 @@ void TiltEventProcessor::GenerateDPadEvent(const Tilt &tilt) { static const int dir[4] = {CTRL_RIGHT, CTRL_DOWN, CTRL_LEFT, CTRL_UP}; if (tilt.x_ == 0) { - __CtrlButtonUp(CTRL_RIGHT | CTRL_LEFT); + __CtrlButtonUp(tiltButtonsDown & (CTRL_RIGHT | CTRL_LEFT)); tiltButtonsDown &= ~(CTRL_LEFT | CTRL_RIGHT); } if (tilt.y_ == 0) { - __CtrlButtonUp(CTRL_UP | CTRL_DOWN); + __CtrlButtonUp(tiltButtonsDown & (CTRL_UP | CTRL_DOWN)); tiltButtonsDown &= ~(CTRL_UP | CTRL_DOWN); } @@ -131,7 +131,6 @@ void TiltEventProcessor::GenerateDPadEvent(const Tilt &tilt) { case 6: ctrlMask |= CTRL_UP; break; case 7: ctrlMask |= CTRL_UP | CTRL_RIGHT; break; } - __CtrlButtonDown(ctrlMask); tiltButtonsDown |= ctrlMask; } @@ -140,12 +139,12 @@ void TiltEventProcessor::GenerateActionButtonEvent(const Tilt &tilt) { static const int buttons[4] = {CTRL_CIRCLE, CTRL_CROSS, CTRL_SQUARE, CTRL_TRIANGLE}; if (tilt.x_ == 0) { - __CtrlButtonUp(CTRL_SQUARE | CTRL_CIRCLE); + __CtrlButtonUp(tiltButtonsDown & (CTRL_SQUARE | CTRL_CIRCLE)); tiltButtonsDown &= ~(CTRL_SQUARE | CTRL_CIRCLE); } if (tilt.y_ == 0) { - __CtrlButtonUp(CTRL_TRIANGLE | CTRL_CROSS); + __CtrlButtonUp(tiltButtonsDown & (CTRL_TRIANGLE | CTRL_CROSS)); tiltButtonsDown &= ~(CTRL_TRIANGLE | CTRL_CROSS); } @@ -161,8 +160,10 @@ void TiltEventProcessor::GenerateActionButtonEvent(const Tilt &tilt) { void TiltEventProcessor::GenerateTriggerButtonEvent(const Tilt &tilt) { u32 upButtons = 0; u32 downButtons = 0; - // KISS, let's only look at X. Expect deadzone to already be applied. - if (tilt.x_ == 0.0f) { + // Y axis for both + if (tilt.y_ < 0.0f) { + downButtons = CTRL_LTRIGGER | CTRL_RTRIGGER; + } else if (tilt.x_ == 0.0f) { upButtons = CTRL_LTRIGGER | CTRL_RTRIGGER; } else if (tilt.x_ < 0.0f) { downButtons = CTRL_LTRIGGER; @@ -172,7 +173,7 @@ void TiltEventProcessor::GenerateTriggerButtonEvent(const Tilt &tilt) { upButtons = CTRL_LTRIGGER; } - __CtrlButtonUp(upButtons); + __CtrlButtonUp(tiltButtonsDown & upButtons); __CtrlButtonDown(downButtons); tiltButtonsDown = (tiltButtonsDown & ~upButtons) | downButtons; } From c085e2f1a87696e66c3057da2a8dfac607ca7587 Mon Sep 17 00:00:00 2001 From: iota97 Date: Tue, 14 Jan 2020 14:54:29 +0100 Subject: [PATCH 004/336] Little improvement --- UI/TiltEventProcessor.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/UI/TiltEventProcessor.cpp b/UI/TiltEventProcessor.cpp index cdc5910adc..c5e15c1038 100644 --- a/UI/TiltEventProcessor.cpp +++ b/UI/TiltEventProcessor.cpp @@ -131,6 +131,7 @@ void TiltEventProcessor::GenerateDPadEvent(const Tilt &tilt) { case 6: ctrlMask |= CTRL_UP; break; case 7: ctrlMask |= CTRL_UP | CTRL_RIGHT; break; } + ctrlMask &= ~__CtrlPeekButtons(); __CtrlButtonDown(ctrlMask); tiltButtonsDown |= ctrlMask; } @@ -153,8 +154,9 @@ void TiltEventProcessor::GenerateActionButtonEvent(const Tilt &tilt) { } int direction = (int)(floorf((atan2f(tilt.y_, tilt.x_) / (2.0f * (float)M_PI) * 4.0f) + 0.5f)) & 3; - __CtrlButtonDown(buttons[direction]); - tiltButtonsDown |= buttons[direction]; + int downButtons = buttons[direction] & ~__CtrlPeekButtons(); + __CtrlButtonDown(downButtons); + tiltButtonsDown |= downButtons; } void TiltEventProcessor::GenerateTriggerButtonEvent(const Tilt &tilt) { @@ -173,6 +175,7 @@ void TiltEventProcessor::GenerateTriggerButtonEvent(const Tilt &tilt) { upButtons = CTRL_LTRIGGER; } + downButtons &= ~__CtrlPeekButtons(); __CtrlButtonUp(tiltButtonsDown & upButtons); __CtrlButtonDown(downButtons); tiltButtonsDown = (tiltButtonsDown & ~upButtons) | downButtons; From c47478ea04edd88f40728b0217c805353874cfc3 Mon Sep 17 00:00:00 2001 From: iota97 Date: Wed, 4 Mar 2020 08:44:10 +0100 Subject: [PATCH 005/336] Rewording --- UI/TiltAnalogSettingsScreen.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UI/TiltAnalogSettingsScreen.cpp b/UI/TiltAnalogSettingsScreen.cpp index 09a463760c..81bf243293 100644 --- a/UI/TiltAnalogSettingsScreen.cpp +++ b/UI/TiltAnalogSettingsScreen.cpp @@ -35,7 +35,7 @@ void TiltAnalogSettingsScreen::CreateViews() { settings->Add(new ItemHeader(co->T("Invert Axes"))); settings->Add(new CheckBox(&g_Config.bInvertTiltX, co->T("Invert Tilt along X axis"))); settings->Add(new CheckBox(&g_Config.bInvertTiltY, co->T("Invert Tilt along Y axis"))); - static const char* tiltMode[] = { "Screen parallel to ground", "Screen orthogonal to ground", "Auto-switch" }; + static const char* tiltMode[] = { "Screen aligned to ground", "Screen at right angle to ground", "Auto-switch" }; settings->Add(new PopupMultiChoice(&g_Config.iTiltOrientation, co->T("Base tilt position"), tiltMode, 0, ARRAY_SIZE(tiltMode), co->GetName(), screenManager())); settings->Add(new ItemHeader(co->T("Sensitivity"))); From ba98e540f147893d48438cfc3ea5f943ed70dfe2 Mon Sep 17 00:00:00 2001 From: iota97 Date: Thu, 4 Jun 2020 19:21:52 +0200 Subject: [PATCH 006/336] Code style fix --- UI/NativeApp.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index 40ebcf4ea4..623aee24a6 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -1261,11 +1261,11 @@ bool NativeAxis(const AxisInput &axis) { static Tilt currentTilt; // tilt on x or y? - static bool TiltVertical; + static bool verticalTilt; if (g_Config.iTiltOrientation == 0) - TiltVertical = false; + verticalTilt = false; else if (g_Config.iTiltOrientation == 1) - TiltVertical = true; + verticalTilt = true; // x and y are flipped if we are in landscape orientation. The events are // sent with respect to the portrait coordinate system, while we @@ -1275,9 +1275,9 @@ bool NativeAxis(const AxisInput &axis) { switch (axis.axisId) { //TODO: make this generic. case JOYSTICK_AXIS_ACCELEROMETER_X: - if (TiltVertical) { + if (verticalTilt) { if (fabs(axis.value) < 0.8f && g_Config.iTiltOrientation == 2) // Auto tilt switch - TiltVertical = false; + verticalTilt = false; else return false; // Tilt on Z instead } @@ -1297,9 +1297,9 @@ bool NativeAxis(const AxisInput &axis) { break; case JOYSTICK_AXIS_ACCELEROMETER_Z: - if (!TiltVertical) { + if (!verticalTilt) { if (fabs(axis.value) < 0.8f && g_Config.iTiltOrientation == 2) // Auto tilt switch - TiltVertical = true; + verticalTilt = true; else return false; // Tilt on X instead } From e3540ccd17193e131d42290a9dd4d6bca6e5f634 Mon Sep 17 00:00:00 2001 From: Conrad Kreyling Date: Mon, 30 Nov 2020 20:31:14 -0500 Subject: [PATCH 007/336] First pass on using Display KHR, needs proper init flags --- CMakeLists.txt | 7 +++++++ Common/GPU/Vulkan/VulkanContext.cpp | 14 ++++++++++++++ Common/GPU/Vulkan/VulkanContext.h | 3 +++ Common/GPU/Vulkan/VulkanLoader.cpp | 6 ++++++ Common/GPU/Vulkan/VulkanLoader.h | 3 +++ libretro/LibretroVulkanContext.cpp | 2 ++ libretro/libretro_vulkan.cpp | 3 +++ 7 files changed, 38 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 58502f15c6..40a4498bed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -120,6 +120,7 @@ option(USING_FBDEV "Set to ON if target environment uses fbdev (eg. Pandora)" ${ option(USING_GLES2 "Set to ON if target device uses OpenGL ES 2.0" ${USING_GLES2}) option(USING_X11_VULKAN "Set to OFF if target environment doesn't use X11 for Vulkan" ON) option(USE_WAYLAND_WSI "Enable or disable Wayland WSI support for Vulkan" ${USE_WAYLAND_WSI}) +option(USE_VULKAN_DISPLAY_KHR "Enable or disable full screen display of Vulkan" ${USE_VULKAN_DISPLAY_KHR}) # :: Frontends option(USING_QT_UI "Set to ON if you wish to use the Qt frontend wrapper" ${USING_QT_UI}) option(MOBILE_DEVICE "Set to ON when targeting a mobile device" ${MOBILE_DEVICE}) @@ -143,6 +144,7 @@ if(UNIX AND NOT (APPLE OR ANDROID) AND VULKAN) else() message("NOT using X11 for Vulkan") endif() + # add_definitions(-DVK_USE_PLATFORM_XCB_KHR) if(USE_WAYLAND_WSI) find_package(Wayland) @@ -153,6 +155,11 @@ if(UNIX AND NOT (APPLE OR ANDROID) AND VULKAN) add_definitions(-DVK_USE_PLATFORM_WAYLAND_KHR) endif() endif() + + if(USE_VULKAN_DISPLAY_KHR) + message(STATUS "Using experimental full-screen display for Vulkan.") + add_definitions(-DVK_USE_PLATFORM_DISPLAY_KHR) + endif() endif() if(LIBRETRO) diff --git a/Common/GPU/Vulkan/VulkanContext.cpp b/Common/GPU/Vulkan/VulkanContext.cpp index bf77c2720f..1ab627512c 100644 --- a/Common/GPU/Vulkan/VulkanContext.cpp +++ b/Common/GPU/Vulkan/VulkanContext.cpp @@ -123,6 +123,11 @@ VkResult VulkanContext::CreateInstance(const CreateInfo &info) { instance_extensions_enabled_.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME); } #endif +#if defined(VK_USE_PLATFORM_DISPLAY_KHR) + if (IsInstanceExtensionAvailable(VK_KHR_DISPLAY_EXTENSION_NAME)) { + instance_extensions_enabled_.push_back(VK_KHR_DISPLAY_EXTENSION_NAME); + } +#endif #if defined(VK_USE_PLATFORM_METAL_EXT) if (IsInstanceExtensionAvailable(VK_EXT_METAL_SURFACE_EXTENSION_NAME)) { instance_extensions_enabled_.push_back(VK_EXT_METAL_SURFACE_EXTENSION_NAME); @@ -795,6 +800,15 @@ VkResult VulkanContext::ReinitSurface() { break; } #endif +#if defined(VK_USE_PLATFORM_DISPLAY_KHR) + case WINDOWSYSTEM_DISPLAY: + { + VkDisplaySurfaceCreateInfoKHR display{ VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR }; + display.flags = 0; + retval = vkCreateDisplayPlaneSurfaceKHR(instance_, &display, nullptr, &surface_); + break; + } +#endif default: _assert_msg_(false, "Vulkan support for chosen window system not implemented"); diff --git a/Common/GPU/Vulkan/VulkanContext.h b/Common/GPU/Vulkan/VulkanContext.h index 3798066c65..a277561800 100644 --- a/Common/GPU/Vulkan/VulkanContext.h +++ b/Common/GPU/Vulkan/VulkanContext.h @@ -48,6 +48,9 @@ enum WindowSystem { #ifdef VK_USE_PLATFORM_WAYLAND_KHR WINDOWSYSTEM_WAYLAND, #endif +#ifdef VK_USE_PLATFORM_DISPLAY_KHR + WINDOWSYSTEM_DISPLAY, +#endif }; struct VulkanPhysicalDeviceInfo { diff --git a/Common/GPU/Vulkan/VulkanLoader.cpp b/Common/GPU/Vulkan/VulkanLoader.cpp index ad44606272..7471d07266 100644 --- a/Common/GPU/Vulkan/VulkanLoader.cpp +++ b/Common/GPU/Vulkan/VulkanLoader.cpp @@ -185,6 +185,9 @@ PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR; #if defined(VK_USE_PLATFORM_WAYLAND_KHR) PFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR; #endif +#if defined(VK_USE_PLATFORM_DISPLAY_KHR) +PFN_vkCreateDisplayPlaneSurfaceKHR vkCreateDisplayPlaneSurfaceKHR; +#endif PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR; @@ -532,6 +535,9 @@ void VulkanLoadInstanceFunctions(VkInstance instance, const VulkanExtensions &en #if defined(VK_USE_PLATFORM_WAYLAND_KHR) LOAD_INSTANCE_FUNC(instance, vkCreateWaylandSurfaceKHR); #endif +#if defined(VK_USE_PLATFORM_DISPLAY_KHR) + LOAD_INSTANCE_FUNC(instance, vkCreateDisplayPlaneSurfaceKHR); +#endif LOAD_INSTANCE_FUNC(instance, vkDestroySurfaceKHR); diff --git a/Common/GPU/Vulkan/VulkanLoader.h b/Common/GPU/Vulkan/VulkanLoader.h index c91ad6296c..02a2b947f0 100644 --- a/Common/GPU/Vulkan/VulkanLoader.h +++ b/Common/GPU/Vulkan/VulkanLoader.h @@ -184,6 +184,9 @@ extern PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR; #if defined(VK_USE_PLATFORM_WAYLAND_KHR) extern PFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR; #endif +#if defined(VK_USE_PLATFORM_DISPLAY_KHR) +extern PFN_vkCreateDisplayPlaneSurfaceKHR vkCreateDisplayPlaneSurfaceKHR; +#endif extern PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR; diff --git a/libretro/LibretroVulkanContext.cpp b/libretro/LibretroVulkanContext.cpp index 2b9e944360..98a2db727e 100644 --- a/libretro/LibretroVulkanContext.cpp +++ b/libretro/LibretroVulkanContext.cpp @@ -66,6 +66,8 @@ static bool create_device(retro_vulkan_context *context, VkInstance instance, Vk vk->InitSurface(WINDOWSYSTEM_XCB, nullptr, nullptr); #elif defined(VK_USE_PLATFORM_WAYLAND_KHR) vk->InitSurface(WINDOWSYSTEM_WAYLAND, nullptr, nullptr); +#elif defined(VK_USE_PLATFORM_DISPLAY_KHR) + vk->InitSurface(WINDOWSYSTEM_DISPLAY, nullptr, nullptr); #endif context->gpu = vk->GetPhysicalDevice(physical_device); diff --git a/libretro/libretro_vulkan.cpp b/libretro/libretro_vulkan.cpp index 1081f95e0b..8007d31d3f 100644 --- a/libretro/libretro_vulkan.cpp +++ b/libretro/libretro_vulkan.cpp @@ -372,6 +372,9 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr_libretro(VkInstan #endif #ifdef VK_USE_PLATFORM_WAYLAND_KHR || !strcmp(pName, "vkCreateWaylandSurfaceKHR") +#endif +#ifdef VK_USE_PLATFORM_DISPLAY_KHR + || !strcmp(pName, "vkCreateDisplayPlaneSurfaceKHR") #endif ) { return (PFN_vkVoidFunction)vkCreateLibretroSurfaceKHR; From 784e803f98eb74392ed7faf8955df7d88c9fffa2 Mon Sep 17 00:00:00 2001 From: sum2012 Date: Sat, 30 Jan 2021 07:03:52 +0800 Subject: [PATCH 008/336] Add CRC32 calc Fix #13964 Thanks @unknownbrackets --- UI/GameScreen.cpp | 29 +++++++++++++++++++++++++++++ UI/GameScreen.h | 4 ++++ 2 files changed, 33 insertions(+) diff --git a/UI/GameScreen.cpp b/UI/GameScreen.cpp index 697a2145c9..61d72a9fd7 100644 --- a/UI/GameScreen.cpp +++ b/UI/GameScreen.cpp @@ -40,6 +40,7 @@ #include "UI/MiscScreens.h" #include "UI/MainScreen.h" #include "UI/BackgroundAudio.h" +#include "Core/Reporting.h" GameScreen::GameScreen(const std::string &gamePath) : UIDialogScreenWithGameBackground(gamePath) { g_BackgroundAudio.SetGame(gamePath); @@ -48,6 +49,27 @@ GameScreen::GameScreen(const std::string &gamePath) : UIDialogScreenWithGameBack GameScreen::~GameScreen() { } +template std::string int2hexstr(I w, size_t hex_len = sizeof(I) << 1) { + static const char* digits = "0123456789ABCDEF"; + std::string rc(hex_len, '0'); + for (size_t i = 0, j = (hex_len - 1) * 4; i < hex_len; ++i, j -= 4) + rc[i] = digits[(w >> j) & 0x0f]; + return rc; +} + +void GameScreen::update() { + UIScreen::update(); + + // Has the user requested a CRC32? + if (CRC32string == "...") { + // Wait until the CRC32 is ready. It might take time on some devices. + if (Reporting::HasCRC(gamePath_)) { + uint32_t crcvalue = Reporting::RetrieveCRC(gamePath_); + CRC32string = int2hexstr(crcvalue); + } + } +} + void GameScreen::CreateViews() { std::shared_ptr info = g_gameInfoCache->GetInfo(NULL, gamePath_, GAMEINFO_WANTBG | GAMEINFO_WANTSIZE); @@ -143,6 +165,7 @@ void GameScreen::CreateViews() { btnSetBackground_ = rightColumnItems->Add(new Choice(ga->T("Use UI background"))); btnSetBackground_->OnClick.Handle(this, &GameScreen::OnSetBackground); btnSetBackground_->SetVisibility(V_GONE); + rightColumnItems->Add(new ChoiceWithValueDisplay(&CRC32string, ga->T("CRC32 CALC"), (const char*)nullptr))->OnClick.Handle(this, &GameScreen::OnDoCRC32); } UI::Choice *GameScreen::AddOtherChoice(UI::Choice *choice) { @@ -265,6 +288,12 @@ UI::EventReturn GameScreen::OnCwCheat(UI::EventParams &e) { return UI::EVENT_DONE; } +UI::EventReturn GameScreen::OnDoCRC32(UI::EventParams& e) { + CRC32string = "..."; + return UI::EVENT_DONE; +} + + UI::EventReturn GameScreen::OnSwitchBack(UI::EventParams &e) { TriggerFinish(DR_OK); return UI::EVENT_DONE; diff --git a/UI/GameScreen.h b/UI/GameScreen.h index 2e7fa3f596..ca9c0793bf 100644 --- a/UI/GameScreen.h +++ b/UI/GameScreen.h @@ -33,6 +33,8 @@ public: GameScreen(const std::string &gamePath); ~GameScreen(); + void update() override; + void render() override; std::string tag() const override { return "game"; } @@ -43,6 +45,7 @@ protected: void CallbackDeleteSaveData(bool yes); void CallbackDeleteGame(bool yes); bool isRecentGame(const std::string &gamePath); + std::string CRC32string = ""; private: UI::Choice *AddOtherChoice(UI::Choice *choice); @@ -60,6 +63,7 @@ private: UI::EventReturn OnDeleteConfig(UI::EventParams &e); UI::EventReturn OnCwCheat(UI::EventParams &e); UI::EventReturn OnSetBackground(UI::EventParams &e); + UI::EventReturn OnDoCRC32(UI::EventParams& e); // As we load metadata in the background, we need to be able to update these after the fact. UI::TextView *tvTitle_; From b999b9cb996be487e15acb196245d623db024b4a Mon Sep 17 00:00:00 2001 From: Pierce Andjelkovic Date: Fri, 25 Jun 2021 04:56:43 +1000 Subject: [PATCH 009/336] Update CMakeLists.txt --- CMakeLists.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index ec5aa331f6..d1d3704429 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -56,6 +56,8 @@ if(CMAKE_SYSTEM_PROCESSOR) set(X86_DEVICE ON) elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^mips") set(MIPS_DEVICE ON) + elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^riscv64") + set(RISCV64_DEVICE ON) else() message("Unknown CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}") endif() @@ -113,6 +115,7 @@ endif() option(ARMV7 "Set to ON if targeting an ARMv7 processor" ${ARMV7_DEVICE}) option(ARM "Set to ON if targeting an ARM processor" ${ARM_DEVICE}) option(MIPS "Set to ON if targeting a MIPS processor" ${MIPS_DEVICE}) +option(RISCV64 "Set to ON if targeting a RISCV64 processor" ${RISCV64_DEVICE}) option(X86 "Set to ON if targeting an X86 processor" ${X86_DEVICE}) option(X86_64 "Set to ON if targeting an X86_64 processor" ${X86_64_DEVICE}) # :: Environments @@ -248,6 +251,9 @@ endif() if(MIPS) message("Generating for MIPS, ${CMAKE_BUILD_TYPE}") endif() +if(RISCV64) + message("Generating for RISCV64, ${CMAKE_BUILD_TYPE}") +endif() if(X86) message("Generating for x86, ${CMAKE_BUILD_TYPE}") endif() @@ -712,6 +718,8 @@ if(USE_FFMPEG) set(PLATFORM_ARCH "linux/arm") elseif(MIPS) set(PLATFORM_ARCH "linux/mips32") + elseif(RISCV64) + set(PLATFORM_ARCH "linux/riscv64") elseif(CMAKE_SIZEOF_VOID_P EQUAL 8) set(PLATFORM_ARCH "linux/x86_64") elseif(X86) From 549ad024e40b964bdac02b684d838252e907eb2a Mon Sep 17 00:00:00 2001 From: Pierce Andjelkovic Date: Tue, 29 Jun 2021 21:46:17 +1000 Subject: [PATCH 010/336] Include FakeJit in RISC-V build --- CMakeLists.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index d1d3704429..1dc167efda 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -429,6 +429,12 @@ set(CommonMIPS ) source_group(MIPS FILES ${CommonMIPS}) +set(CommonRISCV64 + Core/MIPS/fake/FakeJit.cpp + Core/MIPS/fake/FakeJit.h +) +source_group(RISCV64 FILES ${CommonRISCV64}) + if(WIN32) set(CommonD3D Common/GPU/D3D9/D3D9ShaderCompiler.cpp @@ -448,6 +454,7 @@ add_library(Common STATIC ${CommonARM} ${CommonARM64} ${CommonMIPS} + ${CommonRISCV64} ${CommonD3D} Common/Serialize/Serializer.cpp Common/Serialize/Serializer.h From 15cdea8650f75928942d43ea1a3a716a0fb85453 Mon Sep 17 00:00:00 2001 From: Pierce Andjelkovic Date: Tue, 29 Jun 2021 22:01:30 +1000 Subject: [PATCH 011/336] Swap submodule repo to fork --- .gitmodules | 2 +- ffmpeg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index 773fbeb290..485479f633 100644 --- a/.gitmodules +++ b/.gitmodules @@ -6,7 +6,7 @@ url = https://github.com/hrydgard/ppsspp-lang.git [submodule "ffmpeg"] path = ffmpeg - url = https://github.com/hrydgard/ppsspp-ffmpeg.git + url = https://github.com/archanox/ppsspp-ffmpeg.git [submodule "dx9sdk"] path = dx9sdk url = https://github.com/hrydgard/minidx9.git diff --git a/ffmpeg b/ffmpeg index 0b28335ace..2455c82d39 160000 --- a/ffmpeg +++ b/ffmpeg @@ -1 +1 @@ -Subproject commit 0b28335acea4f429ae798c5e75232e54881bf164 +Subproject commit 2455c82d394dddcef187b6413d8b0a617e8e166a From 77e578bbb88fa7523eea0387c791d423d825bfe6 Mon Sep 17 00:00:00 2001 From: Pierce Andjelkovic Date: Thu, 1 Jul 2021 12:01:18 +1000 Subject: [PATCH 012/336] Re-target to merged upstream changes --- .gitmodules | 2 +- ffmpeg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index 485479f633..773fbeb290 100644 --- a/.gitmodules +++ b/.gitmodules @@ -6,7 +6,7 @@ url = https://github.com/hrydgard/ppsspp-lang.git [submodule "ffmpeg"] path = ffmpeg - url = https://github.com/archanox/ppsspp-ffmpeg.git + url = https://github.com/hrydgard/ppsspp-ffmpeg.git [submodule "dx9sdk"] path = dx9sdk url = https://github.com/hrydgard/minidx9.git diff --git a/ffmpeg b/ffmpeg index 2455c82d39..a5baf97df4 160000 --- a/ffmpeg +++ b/ffmpeg @@ -1 +1 @@ -Subproject commit 2455c82d394dddcef187b6413d8b0a617e8e166a +Subproject commit a5baf97df4579b4614cd5e643241c7acfc36b0c4 From fd168160fd396b4ec5481f3ab3919100839f1960 Mon Sep 17 00:00:00 2001 From: Gingka Akiyama <33764485+GingkathFox@users.noreply.github.com> Date: Tue, 13 Jul 2021 21:59:49 -0400 Subject: [PATCH 013/336] Add support for the PS5 DualSense controller --- assets/gamecontrollerdb.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/gamecontrollerdb.txt b/assets/gamecontrollerdb.txt index 004121d612..1d82831e88 100644 --- a/assets/gamecontrollerdb.txt +++ b/assets/gamecontrollerdb.txt @@ -199,3 +199,4 @@ bd1200000000000015d0000000000000,Tomee SNES USB Controller,x:b3,a:b2,b:b1,y:b0,b 060000007e0500000820000000000000,Nintendo Switch Combined Joy-Cons,platform:Linux,a:b0,b:b1,x:b3,y:b2,back:b9,guide:b11,start:b10,leftstick:b12,rightstick:b13,leftshoulder:b5,rightshoulder:b6,dpup:b14,dpdown:b15,dpleft:b16,dpright:b17,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b7,righttrigger:b8, 05000000491900000204000000000000,PG-9118,platform:Linux,x:b76,a:b73,b:b74,y:b77,back:b83,start:b84,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b79,lefttrigger:b81,rightshoulder:b80,righttrigger:b82,leftstick:b86,rightstick:b87,leftx:a0,lefty:a1,rightx:a2,righty:a3, 03000000d620000011a7000011010000,PowerA Nintendo Switch Wired Controller,a:b1,b:b2,x:b0,y:b3,back:b8,guide:b12,start:b9,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Linux, +050000004c050000e60c000000810000,Sony DualSense,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, From bbe39339cbd45be76cdb7e315518178f31659d96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 17 Jul 2021 16:45:41 +0200 Subject: [PATCH 014/336] Remove lang from gitmodules --- .gitmodules | 3 --- assets/lang | 1 - 2 files changed, 4 deletions(-) delete mode 160000 assets/lang diff --git a/.gitmodules b/.gitmodules index 773fbeb290..4a5b9dd6a9 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,9 +1,6 @@ [submodule "pspautotests"] path = pspautotests url = https://github.com/hrydgard/pspautotests.git -[submodule "lang"] - path = assets/lang - url = https://github.com/hrydgard/ppsspp-lang.git [submodule "ffmpeg"] path = ffmpeg url = https://github.com/hrydgard/ppsspp-ffmpeg.git diff --git a/assets/lang b/assets/lang deleted file mode 160000 index 87f58200e4..0000000000 --- a/assets/lang +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 87f58200e4e48a047aa9641270432746c10cc6c4 From 6d6b5d8b81186b114ebdde6d156475c5959607d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 17 Jul 2021 16:46:48 +0200 Subject: [PATCH 015/336] Add contents of the assets/lang submodule to the main repo. --- assets/lang/README.md | 28 + assets/lang/ar_AE.ini | 1080 +++++++++++++++++++++++++++++++++ assets/lang/az_AZ.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/bg_BG.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/ca_ES.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/cz_CZ.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/da_DK.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/de_DE.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/dr_ID.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/en_US.ini | 1097 ++++++++++++++++++++++++++++++++++ assets/lang/es_ES.ini | 1066 +++++++++++++++++++++++++++++++++ assets/lang/es_LA.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/fa_IR.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/fi_FI.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/fr_FR.ini | 1063 ++++++++++++++++++++++++++++++++ assets/lang/gl_ES.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/gr_EL.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/he_IL.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/he_IL_invert.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/hr_HR.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/hu_HU.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/id_ID.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/it_IT.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/ja_JP.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/jv_ID.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/ko_KR.ini | 1074 +++++++++++++++++++++++++++++++++ assets/lang/lo_LA.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/lt-LT.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/ms_MY.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/nl_NL.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/no_NO.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/pl_PL.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/pt_BR.ini | 1096 +++++++++++++++++++++++++++++++++ assets/lang/pt_PT.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/ro_RO.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/ru_RU.ini | 1073 +++++++++++++++++++++++++++++++++ assets/lang/sv_SE.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/tg_PH.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/th_TH.ini | 1073 +++++++++++++++++++++++++++++++++ assets/lang/tr_TR.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/uk_UA.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/vi_VN.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/zh_CN.ini | 1072 +++++++++++++++++++++++++++++++++ assets/lang/zh_TW.ini | 1072 +++++++++++++++++++++++++++++++++ 44 files changed, 46170 insertions(+) create mode 100644 assets/lang/README.md create mode 100644 assets/lang/ar_AE.ini create mode 100644 assets/lang/az_AZ.ini create mode 100644 assets/lang/bg_BG.ini create mode 100644 assets/lang/ca_ES.ini create mode 100644 assets/lang/cz_CZ.ini create mode 100644 assets/lang/da_DK.ini create mode 100644 assets/lang/de_DE.ini create mode 100644 assets/lang/dr_ID.ini create mode 100644 assets/lang/en_US.ini create mode 100644 assets/lang/es_ES.ini create mode 100644 assets/lang/es_LA.ini create mode 100644 assets/lang/fa_IR.ini create mode 100644 assets/lang/fi_FI.ini create mode 100644 assets/lang/fr_FR.ini create mode 100644 assets/lang/gl_ES.ini create mode 100644 assets/lang/gr_EL.ini create mode 100644 assets/lang/he_IL.ini create mode 100644 assets/lang/he_IL_invert.ini create mode 100644 assets/lang/hr_HR.ini create mode 100644 assets/lang/hu_HU.ini create mode 100644 assets/lang/id_ID.ini create mode 100644 assets/lang/it_IT.ini create mode 100644 assets/lang/ja_JP.ini create mode 100644 assets/lang/jv_ID.ini create mode 100644 assets/lang/ko_KR.ini create mode 100644 assets/lang/lo_LA.ini create mode 100644 assets/lang/lt-LT.ini create mode 100644 assets/lang/ms_MY.ini create mode 100644 assets/lang/nl_NL.ini create mode 100644 assets/lang/no_NO.ini create mode 100644 assets/lang/pl_PL.ini create mode 100644 assets/lang/pt_BR.ini create mode 100644 assets/lang/pt_PT.ini create mode 100644 assets/lang/ro_RO.ini create mode 100644 assets/lang/ru_RU.ini create mode 100644 assets/lang/sv_SE.ini create mode 100644 assets/lang/tg_PH.ini create mode 100644 assets/lang/th_TH.ini create mode 100644 assets/lang/tr_TR.ini create mode 100644 assets/lang/uk_UA.ini create mode 100644 assets/lang/vi_VN.ini create mode 100644 assets/lang/zh_CN.ini create mode 100644 assets/lang/zh_TW.ini diff --git a/assets/lang/README.md b/assets/lang/README.md new file mode 100644 index 0000000000..53e5ad0b64 --- /dev/null +++ b/assets/lang/README.md @@ -0,0 +1,28 @@ +# lang + +PPSSPP language ini repository + +# Thanks for your interest in translating PPSSPP! + +* Simply copy *en_US.ini* file to a new ini file with your language code, or use it to update an existing file with that name. +* To see a list of codes, view [this](http://stackoverflow.com/questions/3191664/list-of-all-locales-and-their-short-codes) page. + +# Please note, while translating: +* Ampersands `&` on the *RIGHT* side of an equals sign denote an underlined keyboard hotkey. +* The hotkeys are only supported currently in the *DesktopUI* section, however. +* Example: `&File`. This will make it so when you press ALT + F on Windows, it'll open the File menu. + +# Tools + +* To remove a translation, use the following (where KeyWord is the key): + + find . -type f -print0 | xargs -0 sed -i /^KeyWord/d + +* To change a translation key, use something like this: + + find . -type f -print0 | xargs -0 sed -i /^Key/NewKey + +* Before you commit, use git diff to check that you don't delete too much + or some unrelated key with the same prefix. + +### Happy translating! diff --git a/assets/lang/ar_AE.ini b/assets/lang/ar_AE.ini new file mode 100644 index 0000000000..b64a7c54af --- /dev/null +++ b/assets/lang/ar_AE.ini @@ -0,0 +1,1080 @@ +# The following command inserts an U+200E before every string which contains Arabic +# characters to keep a consistent base direction. + +# The command doesn't insert a new character if there is already one; +# it's safe to run it multiple times. + +# perl -CSAD -p -i -e 's/(.* = )(?!\x{200e})(.*\p{Arabic}.*)/\1\x{200e}\2/g' ar_AE.ini + +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = ‎(إعادة التشغيل مطلوبة) الخلفية الصوتية +AudioBufferingForBluetooth = ‎معادلة مصادقة البلوتوث (بطئ) +Auto = Auto +Device = Device +DSound (compatible) = ‎DSound (متكامل) +Enable Sound = ‎تفعيل الصوت +Global volume = ‎الصوت العام +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = ‎WASAPI (سريع) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = ‎حساسية المحور التناظري +Analog Limiter = ‎محدد التناظري +Analog Mapper High End = ‎مخطط التناظري النهاية العظمي (حساسية المحور) +Analog Mapper Low End = ‎مخطط التناظري نهاية دنيا (المنطقة الميتة المعكوسة) +Analog Mapper Mode = ‎وضع تخطيط التناظري +Analog Stick = ‎عصا تناظرية +AnalogLimiter Tip = ‎حينما يتم ضغط زر تحديد التناظر +Auto = ‎تلقائي +Auto-centering analog stick = ‎تنصيف العصا التناظرية تلقائياً +Auto-hide buttons after seconds = ‎إخفاء الأزرار تلقائياً بعد ثواني +Binds = Binds +Button Opacity = ‎شفافية الأزرار +Button style = ‎شكل الأزرار +Calibrate D-Pad = ‎معايرة +Calibration = ‎المعايرة +Classic = ‎كلاسيكي +Combo Key Setting = ‎إعدادات مفتاح الكومبو +Combo Key Setup = ‎تجهيز مفتاح الكومبو +Confine Mouse = ‎حجز مؤشر الماوس في حدود نافذة البرنامج +Control Mapping = ‎تخطيط التحكم +Custom layout... = ‎تعديل نسق إعدادات اللمس... +Customize tilt = ‎إمالة مخصصة... +D-PAD = D-Pad +Deadzone Radius = ‎مساحة المنطقة الميتة +DInput Analog Settings = ‎DI إعدادت الدخل التناظري الخاص بـ +Disable D-Pad diagonals (4-way touch) = ‎(4طرق للمس)تعطيل أقطار D-Pad +Glowing borders = Glowing borders +HapticFeedback = ‎الإستجابة اللمسية (الإهتزاز) +Ignore gamepads when not focused = ‎تخطي أزرعة التحكم حينما لا يكون في التركيز +Ignore Windows Key = ‎تعطيل مفتاح الوندوز +Invert Axes = ‎عكس المحاور +Invert Tilt along X axis = ‎عكس الإمالة علي طول محور X +Invert Tilt along Y axis = ‎عكس الإمالة علي طول محور y +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = ‎إعادات التحكم بالكيوبورد +L/R Trigger Buttons = ‎L/R أزارار التفعيل +Landscape = ‎الخلفية الواسعة +Landscape Auto = Landscape auto +Landscape Reversed = ‎الخلفية الواسعة معكوسة +Mouse = ‎إعدادات الماوس +Mouse sensitivity = ‎حساسية الماوس +Mouse smoothing = ‎تنعيم حركة الماوس +MouseControl Tip = ‎'M'يمكنك الأن تخطيط الماوس في شاشة التخطيط عن طريق أيقونة . +None (Disabled) = ‎لا شئ (معطل) +Off = ‎مغلق +OnScreen = ‎تحكم لمس الشاشة +Portrait = ‎طولية +Portrait Reversed = ‎طولية معكوسة +PSP Action Buttons = ‎PSP أزرار الأفعال الخاصة بـ +Screen Rotation = ‎تدوير الشاشة +seconds, 0 : off = ثواني, 0 = ‎مغلق +Sensitivity = ‎الحساسية +Show right analog = Show right analog +Show Touch Pause Menu Button = ‎أظهر زر قائمة التوقف المؤقت +Thin borders = ‎حدود رفيعة +Tilt Base Radius = Tilt base radius +Tilt Input Type = ‎نوع الإدخال المنطقة +Tilt Sensitivity along X axis = ‎X حساسية المنطقة علي طول محور +Tilt Sensitivity along Y axis = ‎Y حساسية المنطقة علي طول محور +To Calibrate = ‎لتقوم بالمعايرة, ضع الجهاز عل سطح مستوي وإضغط "معايرة". +Touch Control Visibility = ‎شفافية تحكم اللمس +Use custom right analog = Use custom right analog +Use Mouse Control = ‎إستخدم تحكم الماوس +Visibility = ‎الشفافية +X = X +X + Y = X + Y +XInput Analog Settings = XInput analog settings +Y = Y + +[CwCheats] +Cheats = ‎الشفرات +Edit Cheat File = ‎عدل ملف الشفرة +Enable/Disable All = ‎تمكين/تعطيل كل الشفرات +Import Cheats = ‎إستورد من cheat.db +Options = ‎إعدادات +Refresh Rate = ‎معدل التحديث + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = ‎&عن البرنامج... +Auto = ‎&تلقائي +Backend = ‎&خلفية التصيير(إعادة تشغيل PPSSPP) +Bicubic = &Bicubic +Break = Break +Break on Load = Break on load +Buffered Rendering = ‎&تصيير مخفف +Buy Gold = ‎إشتري النسخة الإحترافية & +Control Mapping... = ‎&تخطيط التحكم... +Debugging = ‎&تصحيح +Deposterize = ‎&تحديد الحجم +Direct3D9 = Direct3D &9 +Direct3D11 = Direct3D &11 +Disassembly = ‎&التفكيك... +Discord = Discord +Display Layout Editor = ‎أظهر مُعدل النسق... +Display Rotation = ‎تدوير العرض +Dump Next Frame to Log = ‎تصحيح الفريم التالي إلي سجل +Emulation = ‎&محاكاة +Enable Chat = Enable chat +Enable Cheats = ‎تفعيل &الشفرات +Enable Sound = ‎تفعيل &الصوت +Exit = ‎&خروج +Extract File... = ‎&إستخراج ملف... +File = ‎&ملف +Frame Skipping = ‎&تخطي الفرام +Frame Skipping Type = Frame skipping type +Fullscreen = ‎&الشاشة الكاملة +Game Settings = ‎&إعدادات اللعبة +GE Debugger... = ‎GE مصحح... +GitHub = ‎&جيت هب +Hardware Transform = ‎&تحويل الهاردوير +Help = ‎&مساعدة +Hybrid = &Hybrid +Hybrid + Bicubic = ‎هجين + مزدوج النقاط +Ignore Illegal Reads/Writes = ‎&تخطي القراءة /الكتابة الغير قانونية +Ignore Windows Key = ‎تخطي مفتاح الوندوز +Keep PPSSPP On Top = ‎&أبقي البرنامج في المقدمة +Landscape = ‎مشهد +Landscape reversed = ‎مشهد معكوس +Language... = ‎ال&لغة... +Linear = ‎&خطي +Load = ‎&تحميل... +Load .sym File... = ‎تح&ميل .sym ملف... +Load Map File... = ‎تحميل &ملف التخطيط... +Load State = ‎ت&حميل الحالة +Load State File... = ‎&تحميل ملف الحالة... +Log Console = ‎&سجل الكونسول +Memory View... = ‎عرض الرام... +More Settings... = ‎&إعدادات إضافية... +Nearest = ‎&الأقرب +Non-Buffered Rendering = ‎&تخطي تأثيرات الصقل (غير مصقول, أسرع) +Off = ‎&مغلق +Open Directory... = ‎إفتح مسار&... +Open from MS:/PSP/GAME... = O&pen from MS:/PSP/GAME... +Open Memory Stick = Open &Memory Stick +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = ‎&إيقاف مؤقت +Pause When Not Focused = ‎&إيقاف مؤقت حينما لا يكون مفعلاً +Portrait = ‎لوحة +Portrait reversed = ‎لوحة معكوسة +Postprocessing Shader = Postprocessin&g shader +PPSSPP Forums = ‎PPSSPP &منتديات +Record = ‎&تسجيل +Record Audio = ‎تسجيل &الصوت +Record Display = ‎تسجيل &الشاشة +Rendering Mode = ‎وضع ال&تصيير +Rendering Resolution = ‎&مقاس التصيير +Reset = ‎إ&عادة +Reset Symbol Table = Reset s&ymbol table +Run = ‎&تشغيل +Save .sym File... = ‎& .sym حفظ ملف... +Save Map File... = ‎&إحفظ ملف الخريطة... +Save State = ‎ح&فظ الحالة +Save State File... = ‎&حفظ ملف الحالة... +Savestate Slot = Saves&tate slot +Screen Scaling Filter = Scr&een scaling filter +Show Debug Statistics = ‎إظهار حالة التصحيح +Show FPS Counter = ‎&FPS أظهر عداد +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = ‎&توقف +Switch UMD = ‎تغيير UMD +Take Screenshot = ‎&خذ لقطة شاشة +Texture Filtering = Te&xture filtering +Texture Scaling = ‎&تكبير الرسوم +Use Lossless Video Codec (FFV1) = &Use lossless video codec (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = ‎&مخزن الفريتكس +VSync = VS&ync +Vulkan = ‎فولكان +Window Size = ‎&حجم النافذة +www.ppsspp.org = ‎زيارة www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allocator viewer (Vulkan) +Allow remote debugger = Allow remote debugger +Backspace = Backspace +Block address = Block address +By Address = ‎بالعنوان +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Create/Open textures.ini file for current game +Current = ‎الحالي +Dev Tools = ‎أدوات التطوير +DevMenu = DevMenu +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Dump decrypted EBOOT.BIN on game boot +Dump Frame GPU Commands = Dump frame GPU commands +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = ‎تفعيل سجل التصحيح +Enter address = ‎أدخل العنوان +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Frame profiler +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = Jit compare +JIT debug tools = JIT debug tools +Language = ‎اللغة +Load language ini = ‎تحميل ملف اللغة +Log Dropped Frame Statistics = ‎سجل التفاصيل للفريمات المتدنية +Log Level = ‎مستوي السجل +Log View = ‎أظهر السجل +Logging Channels = ‎قنوات التسجيل +Next = ‎التالي +No block = ‎لا بوك +Prev = ‎السابق +Random = ‎عشوائي +Replace textures = ‎إستبدال الرسوم +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. +RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? +Resume = Resume +Run CPU Tests = ‎شغل فحوص المعالج +Save language ini = ‎إحفظ ملف اللغة +Save new textures = ‎حفظ الرسم الجديد +Shader Viewer = ‎مستعرض الرسوميات +Show Developer Menu = ‎أظهر قائمة المطور +Show on-screen messages = Show on-screen messages +Stats = ‎الحالات +System Information = ‎معلومات النظام +Texture Replacement = ‎إستبدال الرسوم +Toggle Audio Debug = ‎تفعيل تصحيح الصوت +Toggle Freeze = ‎تفعيل الإيقاف +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = ‎* PSP حجم +Active = Active +Back = ‎رجوع +Cancel = ‎إلغاء +Center = ‎المركز +ChangingGPUBackends = ‎تغيير واجهة معالجة من كرت الشاشة يتطلب إعادة التشغيل. إعادة تشغيل الأن؟ +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = ‎إختر PPSSPP مجلد الحفظ الخاص بـ +Confirm Overwrite = ‎هل تريد الكتابة علي هذه البيانات? +Confirm Save = ‎هل تود حفظ هذه البيانات? +ConfirmLoad = ‎تحميل هذه البيانات? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = ‎مسح +Delete all = ‎مسح الكل +Delete completed = ‎المسح إكتمل. +DeleteConfirm = ‎بيانات الحفظ هذه سوف تمسح.\nهل أنت متأكد من الإكمال? +DeleteConfirmAll = ‎هل تريد حقاً مسح كل \nملفات الحفظ لهذه اللعبة? +DeleteConfirmGame = ‎هل تود حقاً مسح هذه اللعبة \nfمن جهازك? لا يمكن الرجوع عن هذا. +DeleteConfirmGameConfig = ‎هل تود حقاً مسح الإعدادات لهذه اللعبة? +DeleteFailed = ‎غير قادر علي مسح البيانات. +Deleting = ‎يمسح\nمن فضلك إنتظر... +Disable All = ‎عطل الكل +Edit = Edit +Enable All = ‎فعل الكل +Enter = ‎إدخال +Finish = ‎إنهاء +Grid = Grid +Inactive = Inactive +InternalError = An internal error has occurred. +Load = ‎تحميل +Load completed = ‎التحميل إكتمل. +Loading = ‎تحميل\nمن فضلك إنتظر... +LoadingFailed = ‎غير قادر علي تحميل البيانات. +Move = ‎تحريك +Network Connection = ‎إتصال الشبكة +NEW DATA = ‎بيانات جديدة +No = ‎لا +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = ‎حسناً +Old savedata detected = ‎بيانات حفظ قديمة قد إكتشفت +Options = ‎إعدادات +Reset = ‎إستعادة +Resize = ‎تغيير الحجم +Retry = ‎حاول مجدداً +Save = ‎حفظ +Save completed = ‎الحفظ إكتمل. +Saving = ‎يحفظ\nمن فضلك إنتظر... +SavingFailed = ‎غير قادر علي حفظ البيانات. +Select = ‎حدد +Shift = ‎شفت +Snap = Snap +Space = ‎مسافة +SSID = SSID +Submit = ‎تقديم +Supported = Supported +There is no data = ‎ليس هناك بيانات. +Toggle All = ‎تبديل الكل +Toggle List = Toggle list +Unsupported = Unsupported +When you save, it will load on a PSP, but not an older PPSSPP = When you save, it will load on a PSP, but not an older PPSSPP +When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Yes = ‎نعم +Zoom = ‎تقريب + +[Error] +7z file detected (Require 7-Zip) = ‎الملف مضغوط (7z).\nمن فضلك فك الضغط أولاً (جرب 7-Zip أوWinRAR). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = ‎لا يمكن حفظ ملف لقطة الشاشة. +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = ‎D3DCompiler_47.dll غير موجود. من فضلك ثبته. إو إضغط مجدداً للمحاولة بإستخدام Direct3D 9 بدلا من. +D3D11InitializationError = ‎Direct3D 11 خطأ في تشغيل +D3D11Missing = Your operating system version does not include D3D11. Please run Windows Update.\n\nPress Yes to try again using Direct3D 9 instead. +D3D11NotSupported = Your GPU does not appear to support Direct3D 11.\n\nWould you like to try again using Direct3D 9 instead? +Disk full while writing data = ‎المساحة إمتلئت حين كتابة الملف. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = ‎لا يمكن تحميل اللعبة. +Error reading file = ‎خطأ في قرأة الملف. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = ‎خطأ في التعرف علي الملف. +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Failed initializing graphics. Try upgrading your graphics drivers and DirectX 9 runtime.\n\nWould you like to try switching to OpenGL?\n\nError message: +GenericGraphicsError = ‎خطأ في الجرافيك +GenericOpenGLError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to DirectX 9?\n\nError message: +GenericVulkanError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to OpenGL?\n\nError message: +InsufficientOpenGLDriver = Insufficient OpenGL driver support detected!\n\nYour GPU reports that it does not support OpenGL 2.0. Would you like to try using DirectX instead?\n\nDirectX is currently compatible with less games, but on your GPU it may be the only choice.\n\nVisit the forums at https://forums.ppsspp.org for more information.\n\n +Just a directory. = ‎الوجهة فقط. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = no EBOOT.PBP, misidentified game. +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = OpenGL driver error +PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP currently does not support connecting to the Internet for DLC, PSN, or game updates. +PS1 EBOOTs are not supported by PPSSPP. = PS1 EBOOTs are not supported by PPSSPP. +PSX game image detected. = File is a MODE2 image. PPSSPP doesn't support PS1 games. +RAR file detected (Require UnRAR) = file is compressed (RAR).\nPlease decompress first (try UnRAR). +RAR file detected (Require WINRAR) = file is compressed (RAR).\nPlease decompress first (try WinRAR). +Running slow: try frameskip, sound is choppy when slow = Running slow: try frameskip, sound is choppy when slow +Running slow: Try turning off Software Rendering = Running slow: try turning off "software rendering" +Save encryption failed. This save won't work on real PSP = Save encryption failed. This save won't work on real PSP +textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +This is a saved state, not a game. = This is a saved state, not a game. +This is save data, not a game. = This is save data, not a game. +Unable to create cheat file, disk may be full = Unable to create cheat file, disk may be full. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Unable to write savedata, disk may be full. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Warning: Video memory FULL, reducing upscaling and switching to slow caching mode. +Warning: Video memory FULL, switching to slow caching mode = Warning: Video memory FULL, switching to slow caching mode. +ZIP file detected (Require UnRAR) = ‎الملف مضغوط (ZIP).\nمن فضلك فك الضغط أولاً (جرب وين رر). +ZIP file detected (Require WINRAR) = ‎الملف مضغوط (ZIP).\nمن فضلك فك الضغط أولاً (جرب WinRAR). + +[Game] +Asia = ‎أسيا +ConfirmDelete = ‎مسح +Create Game Config = ‎أنشي إعدادت للعبة +Create Shortcut = ‎إصنع إختصار +Delete Game = ‎إمسح اللعبة +Delete Game Config = ‎مسح إعدادات اللعبة +Delete Save Data = ‎مسح بيانات الحفظ +Europe = ‎أروبا +Game = ‎اللعبة +Game Settings = ‎إعدادات اللعبة +Homebrew = ‎الصفحة الرئيسية +Hong Kong = ‎هونج كونج +InstallData = ‎تثبيت البيانات +Japan = ‎اليابان +Korea = Korea +MB = ‎ميجا +One moment please... = ‎دقيقة واحدة من فضلك... +Play = ‎إبدء اللعب +Remove From Recent = ‎مسح من "الحالي" +SaveData = ‎بيانات الحفظ +Setting Background = ‎إعدادات الخلفية +Show In Folder = ‎أظهر في المجلد +USA = ‎أمريكا +Use UI background = ‎إستخدم خلفية الواجهة + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = ‎غير محدود +(supersampling) = (supersampling) +(upscaling) = ‎(يكبر) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = ‎عنيف +Alternative Speed = سرعة ثانوية (في %, 0 = ‎غير محدود) +Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Anisotropic Filtering = ‎فلتر الحواف +Auto = ‎تلقائي +Auto (1:1) = ‎تلقائي (1:1) +Auto (same as Rendering) = ‎تلقائي (مثل حجم التصيير) +Auto FrameSkip = ‎تخطي الإطار التلقائي +Auto Scaling = ‎تكبير تلقائي +Backend = ‎الخلفي +Balanced = ‎متناسق +Bicubic = Bicubic +BlockTransfer Tip = Some games require this to be On for correct graphics +BlockTransferRequired = Warning: This game requires "simulate block transfer effects" to be set to On. +Both = ‎الأثنين +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = ‎التصيير المُخفف +BufferedRenderingRequired = Warning: This game requires "rendering mode" to be set to "buffered". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Screen size (in % of the viewport) +Cardboard Screen X Shift = X shift (in % of the blank space) +Cardboard Screen Y Shift = Y shift (in % of the blank space) +Cardboard VR Settings = Google Cardboard VR settings +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = ‎أنوية المعالج +Debugging = ‎التصحيح +DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. +Deposterize = Deposterize +Deposterize Tip = Fixes visual banding glitches in upscaled textures +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Disable slower effects (speedup) +Disabled = Disabled +Display layout editor = Display layout editor +Display Resolution (HW scaler) = Display resolution (HW scaler) +Dump next frame to log = Dump next frame to log +Enable Cardboard VR = Enable Cardboard VR +FPS = FPS +Frame Rate Control = ‎التحكم في معدل الإطارات +Frame Skipping = ‎تخطي الإطارات +Frame Skipping Type = Frame skipping type +FullScreen = ‎الشاشة الكاملة +Hack Settings = Hack settings (may cause glitches) +Hardware Tessellation = Hardware tessellation +Hardware Transform = Hardware transform +hardware transform error - falling back to software = Hardware transform error, falling back to software +HardwareTessellation Tip = Uses hardware to make curves +High = ‎عالي +Hybrid = ‎هجين +Hybrid + Bicubic = ‎هجين + تكعيب +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Internal resolution +Lazy texture caching = Lazy texture caching (speedup) +Linear = ‎خطي +Low = ‎منخفض +LowCurves = Spline/Bezier curves quality +LowCurves Tip = ‎فقط يستخدم من بعض الألعاب, يتحكم بنعومة المنحنيات +Lower resolution for effects (reduces artifacts) = Lower resolution for effects (reduces artifacts) +Manual Scaling = ‎تكبير يدوي +Medium = ‎متوسط +Mode = ‎الوضع +Must Restart = ‎يجب عليك إعادة تشغيل البرنامج لكي تُطبق التغييرات. +Native device resolution = ‎حجم الجهاز الأساسي +Nearest = Nearest +No buffer = No buffer +Non-Buffered Rendering = Skip buffer effects (non-buffered, faster) +None = ‎لا شئ +Number of Frames = Number of frames +Off = ‎مغلق +OpenGL = ‎أوبن جل +Overlay Information = ‎معلومات النسق +Partial Stretch = ‎تمطيط جزئي +Percent of FPS = Percent of FPS +Performance = ‎الأداء +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Postprocessing shader +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = ‎وضع التصيير +Rendering Resolution = ‎حجم التصيير +RenderingMode NonBuffered Tip = ‎أسرع, لكن يمكن أن لا يظهر أي شئ في بعض الألعاب +Retain changed textures = Retain changed textures (sometimes slower) +RetainChangedTextures Tip = ‎يجعل ألعاب كثيرة بطيئة, لكن بعض الألعاب أسرع +Rotation = ‎الدوران +Safe = ‎أمن +Screen layout = Screen layout +Screen Scaling Filter = ‎فلتر تكبير حجم الشاشة +Show Debug Statistics = ‎أظهر معلومات التصحيح +Show FPS Counter = ‎أظهر عداد الـFPS +Simulate Block Transfer = Simulate block transfer effects +SoftGPU Tip = ‎حالياً بطئ جداً +Software Rendering = ‎تصيير السوفت وير (slow) +Software Skinning = ‎طلاء برمجي +SoftwareSkinning Tip = Combine skinned model draws on the CPU, faster in most games +Speed = ‎السرعة +Stretching = ‎المط +Texture Filter = ‎منقي الرسوم +Texture Filtering = ‎مفلتر الرسوم +Texture Scaling = ‎تكبير الرسوم +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Turn off "hardware tessellation": unsupported +Unlimited = ‎لا محدود +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = ‎مستوي التكبير +Upscale Type = ‎نوع التكبير +UpscaleLevel Tip = CPU heavy - some scaling may be delayed to avoid stutter +Use all displays = Use all displays +Vertex Cache = Vertex cache +VertexCache Tip = ‎أسرع, لكن ربما يسبب تميع مؤقت +VSync = VSync +Vulkan = ‎فولكان +Window Size = ‎حجم النافذة +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = ‎مسح الملف المضغوط +Install = ‎تثبيت +Install game from ZIP file? = ‎تثبيت اللعبة من الملف المضغوط ? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = ‎مثبت! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = ‎ضبط تلقائي +Autoconfigure for device = ‎إعداد تلقائي للعبة +Clear All = ‎إخلاء الكل +Default All = ‎إرجاع للإفتراضي +Map a new key for = ‎خريطة مفتاح جديدة لـ +Map Key = ‎خريطة مفتاح +Map Mouse = ‎خريطة الفأرة +Test Analogs = ‎إختبر التناظر +You can press ESC to cancel. = ‎يمكنك ضغط علي زر الخروج للإلغاء. + +[MainMenu] +Browse = ‎تصفح... +Buy PPSSPP Gold = Buy PPSSPP Gold +Choose folder = Choose folder +Credits = ‎الحقوق +‎PPSSPP Homebrew Store = ‎PPSSPP Homebrew Store +Exit = ‎خروج +Game Settings = ‎الإعدادات +Games = ‎الألعاب +Give PPSSPP permission to access storage = ‎الأذون للوصول إلي مساحة التخزين PPSSPP أعطي الـ +Homebrew & Demos = Homebrew && Demos +How to get games = ‎كيف يمكنني الحصول علي الألعاب? +How to get homebrew & demos = How can I get homebrew && demos? +Load = ‎تحميل... +Loading... = Loading... +PinPath = ‎تثبيت +PPSSPP can't load games or save right now = ‎لا يمكنه تحميل الألعاب الأن أو الحفظ الأن PPSSPP +Recent = ‎الحالي +SavesAreTemporary = PPSSPP is saving in temporary storage +SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently +SavesAreTemporaryIgnore = Ignore warning +UnpinPath = ‎إلغاء التثبيت +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = ‎الصوت +Controls = ‎التحكم +Graphics = ‎الجرافك +Networking = ‎الشبكة +System = ‎النظام +Tools = ‎الأدوات + +[MappableControls] +Alt speed 1 = Alt speed 1 +Alt speed 2 = Alt speed 2 +An.Down = Analog Down +An.Left = Analog Left +An.Right = Analog Right +An.Up = Analog Up +Analog limiter = Analog limiter +Analog Stick = Analog stick +Audio/Video Recording = Audio/Video recording +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Axis swap +Circle = ‎الدائرة +Cross = ‎الأكس +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = ‎قائمة المطوريين +Down = Dpad Down +Dpad = Dpad +Frame Advance = Frame advance +Hold = Hold +Home = Home +L = L +Left = Dpad Left +Load State = Load state +Mute toggle = Mute toggle +Next Slot = Next slot +None = None +Note = Note +OpenChat = Open chat +Pause = ‎توقف مؤقت +R = R +RapidFire = Rapid-fire +Remote hold = Remote hold +Rewind = Rewind +Right = Dpad Right +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = RightAn.Down +RightAn.Left = RightAn.Left +RightAn.Right = RightAn.Right +RightAn.Up = RightAn.Up +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Save state +Screen = ‎الشاشة +Screenshot = Screenshot +Select = ‎تحديد +SpeedToggle = ‎تفعيل السرعة +Square = ‎مربع +Start = ‎بدء +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = ‎تفعيل وضع الشاشة الكاملة +Toggle mode = Toggle mode +Triangle = ‎مثلث +Unthrottle = Unthrottle +Up = Dpad Up +Vol + = Vol + +Vol - = Vol - +Wlan = ‎الواي فاي + +[Networking] +Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = ‎MAC تغيير عنوان الـ +Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable network chat = Enable network chat +Enable networking = Enable networking/WLAN (beta, may break games) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = ‎الشبكة تُطلق +Please change your Port Offset = Please change your port offset +Port offset = Port offset (0 = PSP compatibility) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Send Discord "Rich Presence" information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = ‎الشفرات +Continue = ‎إكمال +Create Game Config = ‎أنشئ إعدادات للعبة +Delete Game Config = ‎إمسح إعدادات اللعبة +Exit to menu = ‎أخرج إلي القائمة +Game Settings = ‎إعدادات اللعبة +Load State = ‎تحميل الحالة +Rewind = ‎إرجاع +Save State = ‎حفظ الحالة +Settings = ‎الإعدادات +Switch UMD = ‎تبديل الـ UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = ‎AA-لون +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = ‎كرتوني +ColorCorrection = Color correction +Contrast = Contrast +CRT = ‎CRT خطوط الفحص +FXAA = ‎FXAA منعم الحواف +Gamma = Gamma +Grayscale = ‎التدرج الرمادي +Intensity = Intensity +InverseColors = ‎عكس الألوان +Natural = ‎الألوان الحقيقية +NaturalA = Natural Colors (no blur) +Off = ‎مغلق +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlines (CRT) +Sharpen = ‎تنعيم الحواف +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 Upscaler +VideoSmoothingAA = VideoSmoothingAA +Vignette = Vignette + +[PSPCredits] +all the forum mods = all the forum mods +build server = build server +Buy Gold = ‎إشتري النسخة الذهبية +check = ‎تفحص أيضا برنامج Dolphin, أفضل محاكي جهاز الوي ومكعب الألعاب موجود حالياً: +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = ‎المساهمون: +created = ‎صنعت بواسطة +Discord = Discord +info1 = ‎صُنع لغرض التعليم فقط PPSSPP . +info2 = ‎من فضلك تحقق أنك تملك الحقوق لأي لعبة +info3 = you play by owning the UMD or by buying the digital +info4 = download from the PSN store on your real PSP. +info5 = PSP is a trademark by Sony, Inc. +iOS builds = iOS builds +license = ‎برنامج مجاني تحت رخصة GPL 2.0+ +list = ‎قائمة التكامل, المنتديات, ومعلومات التطوير +PPSSPP Forums = ‎PPSSPP منتديات +Privacy Policy = Privacy policy +Share PPSSPP = ‎مشاركة PPSSPP +specialthanks = ‎الشكر الجزيل إلي: +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = ‎هذه الترجمة بواسطة: +title = ‎أمن ومجاني ومستقل PSP محاكي +tools = ‎الأدوات المجانية المستعملة: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = ‎عمر أنور عجلان +translators2 = omar.aglan91@gmail.com +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = ‎تحقق من الموقع الألكتروني: +written = ‎مكتوب في لغة C++ من أجل السرعة والمتانة + +[RemoteISO] +Browse Games = ‎تصفح الألعاب +Local Server Port = ‎منفذ السرفر المحلي +Manual Mode Client = ‎الوضع اليدوي للعميل +Remote disc streaming = Remote disc streaming +Remote Port = ‎منفذ السرفر البعيد +Remote Server = ‎السرفر البعيد +Remote Subdirectory = ‎تحكم في المجلد عن بعد +RemoteISODesc = ‎الألعاب في قائمتك الحالية سوف تنشر +RemoteISOLoading = ‎متصل, تحميل قائمة الألعاب... +RemoteISOScanning = ‎يفحص... إضغط "أنشر الألعاب" علي جهاز السرفر +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = ‎ملحوظة: وصل كلا الجهازين إلي نفس شبكة الواي فاي +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = ‎إعدادات +Share Games (Server) = ‎مشاركة الألعاب (السرفر) +Share on PPSSPP startup = Share on PPSSPP startup +Stop Sharing = ‎توقف عن المشاركة +Stopping.. = ‎يتوقف... + +[Reporting] +Bad = ‎سئ +FeedbackDelayInfo = ‎بيناتك يتم تقديمها في الخلفية. +FeedbackDesc = ‎كيف حال المحاكاة? إجعلنا نحن والمجتمع يعرف! +FeedbackDisabled = ‎تقارير سرفر التكامل يجب تفعيلها. +FeedbackIncludeCRC = Note: Battery will be used to send a disc CRC +FeedbackIncludeScreen = ‎تضمين لقطة شاشة +FeedbackSubmitDone = ‎بياناتك قد قُدمت. +FeedbackSubmitFail = ‎لا يمكن تقديم التقرير. جرب تحديث PPSSPP. +FeedbackThanks = ‎شكراً لمساعدتك! +Gameplay = ‎اللعب +Graphics = ‎الجرافك +Great = ‎عظيم +In-game = ‎في اللعبة +In-game Description = ‎تدخل إلي اللعب, لكن مليئة بالأخطاء لكي تُلعب +Menu/Intro = ‎القائمة/الدخول +Menu/Intro Description = ‎لا يمكن الدخول للعبة نفسها +Nothing = ‎لا شئ +Nothing Description = ‎لا تعمل بالكامل +OK = ‎حسناً +Open Browser = ‎إفتح موقع التقارير +Overall = ‎الكل +Perfect = ‎ممتاز +Perfect Description = ‎تشغيل ممتاز للعبة كلها - عظيم! +Plays = ‎يلعب +Plays Description = ‎شغالة بالكامل لكن ليس من غير أخطاء +ReportButton = ‎تبليغ عن مراجعة +Speed = ‎السرعة +Submit Feedback = ‎تقديم مراجعتك +SuggestionConfig = See reports on website for good settings. +SuggestionCPUSpeed0 = Disable locked CPU speed setting. +SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this bug). +SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. +SuggestionsNone = This game isn't working for other users too. +SuggestionsWaiting = Submitting and checking other users feedback... +SuggestionUpgrade = Upgrade to a newer PPSSPP build. +SuggestionVerifyDisc = Check your ISO is a good copy of your disc. +Unselected Overall Description = ‎هل هذه اللعبة تمت لعبتها جيداً? +View Feedback = ‎أظهر كل المراجاعات + +[Savedata] +Date = Date +Filename = Filename +No screenshot = ‎لا لقطة شاشة +None yet. Things will appear here after you save. = ‎ليس بعد. الأشياء سوف تظهر هنا بعد الحفظ. +Save Data = ‎حفظ البيانات +Save States = ‎حفظ الحالة +Savedata Manager = ‎مدير حفظ الحالة +Size = Size + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = WARNING: Chainfire3D detected, may cause problems. +Failed to load state = Failed to load state +Failed to save state = Failed to save state +fixed = ‎السرعة: الجانبي +GLToolsWarning = WARNING: GLTools detected, may cause problems. +In menu = In menu +Load savestate failed = Load savestate failed +Loaded State = ‎الحالة تم تحميلها +Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +LoadStateDoesntExist = Failed to load state: Savestate doesn't exist! +LoadStateWrongVersion = Failed to load state: Savestate is for an older version of PPSSPP! +norewind = No rewind save states available. +Playing = Playing +PressESC = ‎إضغط خروج للدخول علي قائمة التوقف المؤقت. +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = ‎فشل في حفظ الحالة! +Saved State = ‎حُفظت الحالة +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Speed: alternate 2 +standard = ‎السرعة: إعتيادية +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = ‎مثبتة بالفعل +Connection Error = ‎خطأ في الإتصال +Install = ‎تثبيت +Launch Game = ‎إبدء اللعبة +Loading... = ‎تحميل... +MB = ‎ميجا +Size = ‎الحجم +Uninstall = ‎إلغاء التثبيت + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d cores) +%d bytes = %d bytes +(none detected) = (none detected) +3D API = 3D API +ABI = ABI +API Version = API version +Audio Information = Audio information +Board = Board +Build Config = Build config +Build Configuration = Build Configuration +Built by = Built by +Core Context = Core context +Cores = Cores +CPU Extensions = CPU extensions +CPU Information = CPU information +CPU Name = Name +D3DCompiler Version = D3DCompiler version +Debug = Debug +Debugger Present = Debugger present +Device Info = Device info +Display Information = Display information +Driver Version = Driver version +EGL Extensions = EGL extensions +Frames per buffer = Frames per buffer +GPU Information = GPU information +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Lang/Region +Memory Page Size = Memory page size +Native Resolution = Native resolution +OGL Extensions = OGL extensions +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 extensions +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 extensions +OpenGL Extensions = OpenGL extensions +Optimal frames per buffer = Optimal frames per buffer +Optimal sample rate = Optimal sample rate +OS Information = OS information +PPSSPP build = PPSSPP build +Refresh rate = Refresh rate +Release = Release +RW/RX exclusive = RW/RX exclusive +Sample rate = Sample rate +Shading Language = Shading language +Sustained perf mode = Sustained perf mode +System Information = System information +System Name = Name +System Version = System version +Threads = Threads +Vendor = Vendor +Vendor (detected) = Vendor (detected) +Version Information = Version information +Vulkan Extensions = Vulkan extensions +Vulkan Features = Vulkan features + +[System] +(broken) = ‎(متضرر) +12HR = ‎12 ساعة +24HR = ‎24 ساعة +Auto = ‎تلقائي +Auto Load Savestate = Auto load savestate +AVI Dump started. = AVI dump started +AVI Dump stopped. = AVI dump stopped +Cache ISO in RAM = Cache full ISO in RAM +Change CPU Clock = Change emulated PSP's CPU clock (unstable) +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = ‎تغيير الأسم المستعار +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = ‎الشفرات (تجريبي, أنظر في المنتديات) +Clear Recent = Clear "Recent" +Clear Recent Games List = ‎إخلاء قائمة الألعاب الحالية +Clear UI background = ‎إخلاء خلفية الواجهة +Confirmation Button = ‎زر التأكيد +Date Format = ‎صيغة التاريخ +Day Light Saving = ‎التوقيت الصيفي +DDMMYYYY = ‎يوم شهر سنة +Decrease size = Decrease size +Developer Tools = ‎ادوات المطور +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = ‎المحاكاة +Enable Cheats = ‎فعل الشفرات +Enable Compatibility Server Reports = Enable compatibility server reports +Failed to load state. Error in the file system. = ‎فشل في تحميل الحالة،خطأ في ملف النظام. +Failed to save state. Error in the file system. = ‎فشل في حفظ الحالة، خطأ في ملف النظام. +Fast (lag on slow storage) = ‎سريع (بطي علي الذواكر البطئيه) +Fast Memory = ‎الذاكرة السريعة (غير ثابت) +Force real clock sync (slower, less lag) = Force real clock sync (slower, less lag) +frames, 0:off = إطارات, 0 = ‎مُغلق +Games list settings = Games list settings +General = ‎العام +Grid icon size = Grid icon size +Help the PPSSPP team = ‎ساعد فريق البرنامج +Host (bugs, less lag) = Host (bugs, less lag) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = ‎المترجم +IO timing method = I/O timing method +IR Interpreter = IR interpreter +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = ‎تم إدخال الذاكرة +MHz, 0:default = ميجا هرتز, 0 = ‎الإفتراضي +MMDDYYYY = ‎شهر يوم سنة +Newest Save = Newest save +Not a PSP game = ‎PSP ليست لعبة +Off = ‎مغلق +Oldest Save = Oldest save +PSP Model = ‎PSP موديل +PSP Settings = ‎PSP إعدادات +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = ‎تسجيل الصوت +Record Display = ‎سجل الفيديو +Reset Recording on Save/Load State = Reset recording on Save/Load state +Restore Default Settings = ‎إلي الإفتراضي PPSSPP's إعادة إعدادات +Rewind Snapshot Frequency = ‎ترجيع تردد اللقطة (يأكل الذاكرة) +Save path in installed.txt = ‎installed.txt مسار الحفظ في +Save path in My Documents = ‎مسار الحفظ في مستنداتي +Savestate Slot = ‎منطقة حفظ الحالة +Savestate slot backups = Savestate slot backups +Screenshots as PNG = ‎PNG إحفظ لقطة الشاشة في صيغة +Set UI background... = ‎حدد خلفية الواجهة... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = ‎UMD محاكاة تأخر +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = ‎الذاكرة ممتلئة +Sustained performance mode = ‎وضع الأداء المتواصل +Time Format = ‎صيغة الوقت +UI = اجهة +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = ‎إستخدم صيغة الفيديو الأقل تأثيراً (FFV1) +Use O to confirm = ‎إستخدم O علي إنه زر التأكيد +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = ‎إستخدم X علي إنه زر التأكيد +VersionCheck = ‎إبحث عن نسخة جديدة من البرنامج +WARNING: Android battery save mode is on = ‎تحذير: وضع حفظ الطاقة في الأندرويد مُفعل +WARNING: Battery save mode is on = ‎تحذير: وضع حفظ البطارية مُفعل +YYYYMMDD = ‎سنة شهر يوم + +[Upgrade] +Details = Details +Dismiss = ‎إلغاء +Download = ‎تحميل +New version of PPSSPP available = ‎تتوفر نسخة جديدة من البرنامج diff --git a/assets/lang/az_AZ.ini b/assets/lang/az_AZ.ini new file mode 100644 index 0000000000..19d7c167c4 --- /dev/null +++ b/assets/lang/az_AZ.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = Audio backend (restart req.) +AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) +Auto = Auto +Device = Device +DSound (compatible) = DSound (compatible) +Enable Sound = Səs Açıq +Global volume = Global volume +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = WASAPI (fast) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Analog axis sensitivity +Analog Limiter = Analog limiter +Analog Mapper High End = Analog mapper high-end (axis sensitivity) +Analog Mapper Low End = Analog mapper low-end (inverse deadzone) +Analog Mapper Mode = Analog mapper mode +Analog Stick = Analog stick +AnalogLimiter Tip = When the analog limiter button is pressed +Auto = Auto +Auto-centering analog stick = Auto-centering analog stick +Auto-hide buttons after seconds = Auto-hide buttons after seconds +Binds = Binds +Button Opacity = Buttons opacity +Button style = Button style +Calibrate D-Pad = Calibrate +Calibration = Calibration +Classic = Classic +Combo Key Setting = Combo key setting +Combo Key Setup = Combo key setup +Confine Mouse = Trap mouse within window/display area +Control Mapping = Control mapping +Custom layout... = Edit touch control layout... +Customize tilt = Customize tilt... +D-PAD = D-Pad +Deadzone Radius = Deadzone radius +DInput Analog Settings = DInput analog settings +Disable D-Pad diagonals (4-way touch) = Disable D-Pad diagonals (4-way touch) +Glowing borders = Glowing borders +HapticFeedback = Haptic feedback (vibration) +Ignore gamepads when not focused = Ignore gamepads when not focused +Ignore Windows Key = Disable Windows key +Invert Axes = Invert axes +Invert Tilt along X axis = Invert tilt along X axis +Invert Tilt along Y axis = Invert tilt along Y axis +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Keyboard control settings +L/R Trigger Buttons = L/R trigger buttons +Landscape = Landscape +Landscape Auto = Landscape auto +Landscape Reversed = Landscape reversed +Mouse = Mouse settings +Mouse sensitivity = Mouse sensitivity +Mouse smoothing = Mouse smoothing +MouseControl Tip = You can now map mouse in control mapping screen by pressing the 'M' icon. +None (Disabled) = None (disabled) +Off = Off +OnScreen = Ekran Kontrolları Açıq +Portrait = Portrait +Portrait Reversed = Portrait reversed +PSP Action Buttons = PSP action buttons +Screen Rotation = Screen rotation +seconds, 0 : off = seconds, 0 = off +Sensitivity = Sensitivity +Show right analog = Show right analog +Show Touch Pause Menu Button = Show pause menu button +Thin borders = Thin borders +Tilt Base Radius = Tilt base radius +Tilt Input Type = Tilt input type +Tilt Sensitivity along X axis = Tilt sensitivity along X axis +Tilt Sensitivity along Y axis = Tilt sensitivity along Y axis +To Calibrate = To calibrate, keep device on a flat surface and press "Calibrate". +Touch Control Visibility = Touch control visibility +Use custom right analog = Use custom right analog +Use Mouse Control = Use mouse control +Visibility = Visibility +X = X +X + Y = X + Y +XInput Analog Settings = XInput analog settings +Y = Y + +[CwCheats] +Cheats = Cheats +Edit Cheat File = Edit cheat file +Enable/Disable All = Enable/Disable all Cheats +Import Cheats = Import from cheat.db +Options = Options +Refresh Rate = Refresh rate + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = &About PPSSPP... +Auto = &Auto +Backend = Rendering &Backend (Restarts PPSSPP) +Bicubic = &Bicubic +Break = Break +Break on Load = Break on load +Buffered Rendering = &Buffered Rendering +Buy Gold = Buy &Gold +Control Mapping... = C&ontrol Mapping... +Debugging = &Debug +Deposterize = &Deposterize +Direct3D9 = &Direct3D9 +Direct3D11 = Direct3D &11 +Disassembly = &Disassembly... +Discord = Discord +Display Layout Editor = Display layout editor... +Display Rotation = Display rotation +Dump Next Frame to Log = D&ump Next Frame to Log +Emulation = &Emulation +Enable Chat = Enable chat +Enable Cheats = Enable &Cheats +Enable Sound = Enable S&ound +Exit = E&xit +Extract File... = E&xtract File... +File = &File +Frame Skipping = &Frame skipping +Frame Skipping Type = Frame skipping type +Fullscreen = Fu&llscreen +Game Settings = &Game Settings +GE Debugger... = GE Debugge&r... +GitHub = Git&Hub +Hardware Transform = &Hardware Transform +Help = &Help +Hybrid = &Hybrid +Hybrid + Bicubic = H&ybrid + Bicubic +Ignore Illegal Reads/Writes = &Ignore Illegal Reads/Writes +Ignore Windows Key = Ignore Windows Key +Keep PPSSPP On Top = &Keep PPSSPP on Top +Landscape = Landscape +Landscape reversed = Landscape reversed +Language... = La&nguage... +Linear = &Linear +Load = &Load... +Load .sym File... = Lo&ad .sym File... +Load Map File... = Load &Map File... +Load State = L&oad State +Load State File... = &Load State File... +Log Console = &Log Console +Memory View... = Memory &View... +More Settings... = &More Settings... +Nearest = &Nearest +Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) +Off = &Off +Open Directory... = Open &Directory... +Open from MS:/PSP/GAME... = O&pen from MS:/PSP/GAME... +Open Memory Stick = Open &Memory Stick +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = &Pause +Pause When Not Focused = &Pause When Not Focused +Portrait = Portrait +Portrait reversed = Portrait reversed +Postprocessing Shader = Postprocessin&g Shader +PPSSPP Forums = PPSSPP &Forums +Record = &Record +Record Audio = Record &audio +Record Display = Record &display +Rendering Mode = Rendering M&ode +Rendering Resolution = &Rendering Resolution +Reset = R&eset +Reset Symbol Table = Reset S&ymbol Table +Run = &Run +Save .sym File... = Sav&e .sym File... +Save Map File... = &Save Map File... +Save State = S&ave State +Save State File... = &Save State File... +Savestate Slot = Saves&tate Slot +Screen Scaling Filter = Scr&een Scaling Filter +Show Debug Statistics = Show Debu&g Statistics +Show FPS Counter = Show &FPS Counter +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = &Stop +Switch UMD = Switch UMD +Take Screenshot = &Take Screenshot +Texture Filtering = Te&xture Filtering +Texture Scaling = &Texture Scaling +Use Lossless Video Codec (FFV1) = &Use lossless video codec (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = &Vertex Cache +VSync = VS&ync +Vulkan = Vulkan +Window Size = &Window Size +www.ppsspp.org = Visit www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allocator viewer (Vulkan) +Allow remote debugger = Allow remote debugger +Backspace = Backspace +Block address = Block address +By Address = By address +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Create/Open textures.ini file for current game +Current = Current +Dev Tools = Development tools +DevMenu = DevMenu +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Dump decrypted EBOOT.BIN on game boot +Dump Frame GPU Commands = Dump frame GPU commands +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Enable debug logging +Enter address = Enter address +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Frame profiler +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = Jit compare +JIT debug tools = JIT debug tools +Language = Language +Load language ini = Dil faylı yüklə(.ini) +Log Dropped Frame Statistics = Log dropped frame statistics +Log Level = Log level +Log View = Log view +Logging Channels = Logging channels +Next = Next +No block = No block +Prev = Previous +Random = Random +Replace textures = Replace textures +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. +RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? +Resume = Resume +Run CPU Tests = Run CPU tests +Save language ini = Dil faylını qeyd et (.ini) +Save new textures = Save new textures +Shader Viewer = Shader viewer +Show Developer Menu = Show developer menu +Show on-screen messages = Show on-screen messages +Stats = Stats +System Information = System information +Texture Replacement = Texture replacement +Toggle Audio Debug = Toggle audio debug +Toggle Freeze = Toggle freeze +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP res +Active = Active +Back = Geri +Cancel = Cancel +Center = Center +ChangingGPUBackends = Changing GPU backends requires PPSSPP to restart. Restart now? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = Choose PPSSPP save folder +Confirm Overwrite = Do you want to overwrite the data? +Confirm Save = Do you want to save this data? +ConfirmLoad = Load this data? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Sil +Delete all = Delete all +Delete completed = Silmə tamamlandı +DeleteConfirm = Bu qeyd silinəcək.\nDəvam etmək istəyisinizmir? +DeleteConfirmAll = Do you really want to delete all\nyour save data for this game? +DeleteConfirmGame = Do you really want to delete this game\nfrom your device? You can't undo this. +DeleteConfirmGameConfig = Do you really want to delete the settings for this game? +DeleteFailed = Unable to delete data. +Deleting = Silinir\nZəhmət Olmasa Gözləyin... +Disable All = Disable all +Edit = Edit +Enable All = Enable all +Enter = Gir +Finish = Bitir +Grid = Grid +Inactive = Inactive +InternalError = An internal error has occurred. +Load = Load +Load completed = Yükləmə Tamamlandı +Loading = Yüklənir\nZəhmət Olmasa Gözləyin... +LoadingFailed = Unable to load data. +Move = Move +Network Connection = Network Connection +NEW DATA = NEW DATA +No = Xeyir +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = OK +Old savedata detected = Old savedata detected +Options = Options +Reset = Reset +Resize = Resize +Retry = Retry +Save = Save +Save completed = Qeyd edildi +Saving = Qeyd edilir\nZəhmət Olmasa Gözləyin... +SavingFailed = Unable to save data. +Select = Seç +Shift = Shift +Snap = Snap +Space = Space +SSID = SSID +Submit = Submit +Supported = Supported +There is no data = Veri yoxdur +Toggle All = Toggle all +Toggle List = Toggle list +Unsupported = Unsupported +When you save, it will load on a PSP, but not an older PPSSPP = When you save, it will load on a PSP, but not an older PPSSPP +When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Yes = Bəli +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = file is compressed (7z).\nPlease decompress first (try 7-Zip or WinRAR). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = Could not save screenshot file. +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll not found. Please install. Or press Yes to try again using Direct3D 9 instead. +D3D11InitializationError = Direct3D 11 initialization error +D3D11Missing = Your operating system version does not include D3D11. Please run Windows Update.\n\nPress Yes to try again using Direct3D 9 instead. +D3D11NotSupported = Your GPU does not appear to support Direct3D 11.\n\nWould you like to try again using Direct3D 9 instead? +Disk full while writing data = Disk full while writing data. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = Could not load game. +Error reading file = error reading file. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = failed to identify file. +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Failed initializing graphics. Try upgrading your graphics drivers and DirectX 9 runtime.\n\nWould you like to try switching to OpenGL?\n\nError message: +GenericGraphicsError = Graphics Error +GenericOpenGLError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to DirectX 9?\n\nError message: +GenericVulkanError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to OpenGL?\n\nError message: +InsufficientOpenGLDriver = Insufficient OpenGL driver support detected!\n\nYour GPU reports that it does not support OpenGL 2.0. Would you like to try using DirectX instead?\n\nDirectX is currently compatible with less games, but on your GPU it may be the only choice.\n\nVisit the forums at https://forums.ppsspp.org for more information.\n\n +Just a directory. = just a directory. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = no EBOOT.PBP, misidentified game. +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = OpenGL driver error +PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP currently does not support connecting to the Internet for DLC, PSN, or game updates. +PS1 EBOOTs are not supported by PPSSPP. = PS1 EBOOTs are not supported by PPSSPP. +PSX game image detected. = File is a MODE2 image. PPSSPP doesn't support PS1 games. +RAR file detected (Require UnRAR) = file is compressed (RAR).\nPlease decompress first (try UnRAR). +RAR file detected (Require WINRAR) = file is compressed (RAR).\nPlease decompress first (try WinRAR). +Running slow: try frameskip, sound is choppy when slow = Running slow: try frameskip, sound is choppy when slow +Running slow: Try turning off Software Rendering = Running slow: try turning off "software rendering" +Save encryption failed. This save won't work on real PSP = Save encryption failed. This save won't work on real PSP +textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +This is a saved state, not a game. = This is a saved state, not a game. +This is save data, not a game. = This is save data, not a game. +Unable to create cheat file, disk may be full = Unable to create cheat file, disk may be full. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Unable to write savedata, disk may be full. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Warning: Video memory FULL, reducing upscaling and switching to slow caching mode. +Warning: Video memory FULL, switching to slow caching mode = Warning: Video memory FULL, switching to slow caching mode. +ZIP file detected (Require UnRAR) = file is compressed (ZIP).\nPlease decompress first (try UnRAR). +ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompress first (try WinRAR). + +[Game] +Asia = Asia +ConfirmDelete = Delete +Create Game Config = Create game config +Create Shortcut = Create shortcut +Delete Game = Delete game +Delete Game Config = Delete game config +Delete Save Data = Delete savedata +Europe = Europe +Game = Game +Game Settings = Game settings +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Data install +Japan = Japan +Korea = Korea +MB = MB +One moment please... = One moment please... +Play = Play +Remove From Recent = Remove from "Recent" +SaveData = Savedata +Setting Background = Setting background +Show In Folder = Show in folder +USA = USA +Use UI background = Use UI background + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = unlimited +(supersampling) = (supersampling) +(upscaling) = (upscaling) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Aggressive +Alternative Speed = Alternative speed (in %, 0 = unlimited) +Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Anisotropic Filtering = Anisotropic filtering +Auto = Auto +Auto (1:1) = Auto (1:1) +Auto (same as Rendering) = Auto (same as rendering resolution) +Auto FrameSkip = Auto frameskip +Auto Scaling = Auto scaling +Backend = Backend +Balanced = Balanced +Bicubic = Bicubic +BlockTransfer Tip = Some games require this to be On for correct graphics +BlockTransferRequired = Warning: This game requires "simulate block transfer effects" to be set to On. +Both = Both +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Yükləyərək Aç +BufferedRenderingRequired = Warning: This game requires "rendering mode" to be set to "buffered". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Screen size (in % of the viewport) +Cardboard Screen X Shift = X shift (in % of the blank space) +Cardboard Screen Y Shift = Y shift (in % of the blank space) +Cardboard VR Settings = Google Cardboard VR settings +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU core +Debugging = Debugging +DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. +Deposterize = Deposterize +Deposterize Tip = Fixes visual banding glitches in upscaled textures +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Disable slower effects (speedup) +Disabled = Disabled +Display layout editor = Display layout editor +Display Resolution (HW scaler) = Display resolution (HW scaler) +Dump next frame to log = Dump next frame to log +Enable Cardboard VR = Enable Cardboard VR +FPS = FPS +Frame Rate Control = Framerate control +Frame Skipping = Kvadrat Keçid et (Sürət) +Frame Skipping Type = Frame skipping type +FullScreen = Fullscreen +Hack Settings = Hack settings (may cause glitches) +Hardware Tessellation = Hardware tessellation +Hardware Transform = Təchizat Dönüşüm +hardware transform error - falling back to software = Hardware transform error, falling back to software +HardwareTessellation Tip = Uses hardware to make curves +High = High +Hybrid = Hybrid +Hybrid + Bicubic = Hybrid + Bicubic +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Internal resolution +Lazy texture caching = Lazy texture caching (speedup) +Linear = Linear +Low = Low +LowCurves = Spline/Bezier curves quality +LowCurves Tip = Only used by some games, controls smoothness of curves +Lower resolution for effects (reduces artifacts) = Lower resolution for effects (reduces artifacts) +Manual Scaling = Manual scaling +Medium = Medium +Mode = Mode +Must Restart = You must restart PPSSPP for this change to take effect. +Native device resolution = Native device resolution +Nearest = Nearest +No buffer = No buffer +Non-Buffered Rendering = Skip buffer effects (non-buffered, faster) +None = None +Number of Frames = Number of frames +Off = Off +OpenGL = OpenGL +Overlay Information = Overlay information +Partial Stretch = Partial stretch +Percent of FPS = Percent of FPS +Performance = Performance +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Postprocessing shader +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = Rendering mode +Rendering Resolution = Rendering resolution +RenderingMode NonBuffered Tip = Faster, but nothing may draw in some games +Retain changed textures = Retain changed textures (sometimes slower) +RetainChangedTextures Tip = Makes many games slower, but some games a lot faster +Rotation = Rotation +Safe = Safe +Screen layout = Screen layout +Screen Scaling Filter = Screen scaling filter +Show Debug Statistics = Show debug statistics +Show FPS Counter = Show FPS counter +Simulate Block Transfer = Simulate block transfer effects +SoftGPU Tip = Currently VERY slow +Software Rendering = Software rendering (experimental) +Software Skinning = Software skinning +SoftwareSkinning Tip = Combine skinned model draws on the CPU, faster in most games +Speed = Speed +Stretching = Stretching +Texture Filter = Texture filtering +Texture Filtering = Texture filtering +Texture Scaling = Texture scaling +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Turn off "hardware tessellation": unsupported +Unlimited = Unlimited +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = Upscale level +Upscale Type = Upscale type +UpscaleLevel Tip = CPU heavy - some scaling may be delayed to avoid stutter +Use all displays = Use all displays +Vertex Cache = Vertex Keş +VertexCache Tip = Faster, but may cause temporary flicker +VSync = VSync +Vulkan = Vulkan +Window Size = Window size +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Delete ZIP file +Install = Install +Install game from ZIP file? = Install game from ZIP file? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = Installed! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = Auto configure +Autoconfigure for device = Autoconfigure for device +Clear All = Clear all +Default All = Restore defaults +Map a new key for = Map a new key for +Map Key = Map key +Map Mouse = Map mouse +Test Analogs = Test analogs +You can press ESC to cancel. = You can press Esc to cancel. + +[MainMenu] +Browse = Browse... +Buy PPSSPP Gold = Buy PPSSPP Gold +Choose folder = Choose folder +Credits = Tanıtım +‎PPSSPP Homebrew Store = PPSSPP Homebrew Store +Exit = Çıxış +Game Settings = Settings +Games = Games +Give PPSSPP permission to access storage = Give PPSSPP permission to access storage +Homebrew & Demos = Homebrew && Demos +How to get games = How can I get games? +How to get homebrew & demos = How can I get homebrew && demos? +Load = Yüklə... +Loading... = Loading... +PinPath = Pin +PPSSPP can't load games or save right now = PPSSPP can't load games or save right now +Recent = Açılanlar +SavesAreTemporary = PPSSPP is saving in temporary storage +SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently +SavesAreTemporaryIgnore = Ignore warning +UnpinPath = Unpin +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Səs +Controls = Kontrollar +Graphics = Qrafika +Networking = Networking +System = Sistem +Tools = Tools + +[MappableControls] +Alt speed 1 = Alt speed 1 +Alt speed 2 = Alt speed 2 +An.Down = Analog Down +An.Left = Analog Left +An.Right = Analog Right +An.Up = Analog Up +Analog limiter = Analog limiter +Analog Stick = Analog stick +Audio/Video Recording = Audio/Video recording +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Axis swap +Circle = Circle +Cross = Cross +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = DevMenu +Down = Dpad Down +Dpad = Dpad +Frame Advance = Frame advance +Hold = Hold +Home = Home +L = L +Left = Dpad Left +Load State = Load State +Mute toggle = Mute toggle +Next Slot = Next Slot +None = None +Note = Note +OpenChat = Open chat +Pause = Pause +R = R +RapidFire = Rapid-fire +Remote hold = Remote hold +Rewind = Rewind +Right = Dpad Right +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = RightAn.Down +RightAn.Left = RightAn.Left +RightAn.Right = RightAn.Right +RightAn.Up = RightAn.Up +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Save State +Screen = Screen +Screenshot = Screenshot +Select = Select +SpeedToggle = Speed toggle +Square = Square +Start = Start +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = Toggle fullscreen +Toggle mode = Toggle mode +Triangle = Triangle +Unthrottle = Unthrottle +Up = Dpad Up +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Change MAC address +Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable network chat = Enable network chat +Enable networking = Enable networking/WLAN (beta, may break games) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Network initialized +Please change your Port Offset = Please change your port offset +Port offset = Port offset(0 = PSP compatibility) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Send Discord "Rich Presence" information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = Cheats +Continue = Dəvam +Create Game Config = Create game config +Delete Game Config = Delete game config +Exit to menu = Exit to menu +Game Settings = Game settings +Load State = Yüklə +Rewind = Rewind +Save State = Yaddaşda Saxla +Settings = Ayarlar +Switch UMD = Switch UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Color +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Cartoon +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT scanlines +FXAA = FXAA Antialiasing +Gamma = Gamma +Grayscale = Grayscale +Intensity = Intensity +InverseColors = Inverse Colors +Natural = Natural Colors +NaturalA = Natural Colors (no blur) +Off = Off +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlines (CRT) +Sharpen = Sharpen +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 Upscaler +VideoSmoothingAA = VideoSmoothingAA +Vignette = Vignette + +[PSPCredits] +all the forum mods = all the forum mods +build server = build server +Buy Gold = Buy Gold +check = Also check out Dolphin, the best Wii/GC emu around: +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = Contributors: +created = Created by +Discord = Discord +info1 = PPSSPP is intended for educational purposes only. +info2 = Please make sure that you own the rights to any games +info3 = you play by owning the UMD or by buying the digital +info4 = download from the PSN store on your real PSP. +info5 = PSP is a trademark by Sony, Inc. +iOS builds = iOS builds +license = Free software under GPL 2.0+ +list = compatibility lists, forums, and development info +PPSSPP Forums = PPSSPP Forums +Privacy Policy = Privacy policy +Share PPSSPP = Share PPSSPP +specialthanks = Special thanks to: +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = this translation by: +title = A fast and portable PSP emulator +tools = Free tools used: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = +translators2 = +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Check out the website: +written = Written in C++ for speed and portability + +[RemoteISO] +Browse Games = Browse games +Local Server Port = Local server port +Manual Mode Client = Manual mode client +Remote disc streaming = Remote disc streaming +Remote Port = Remote port +Remote Server = Remote server +Remote Subdirectory = Remote subdirectory +RemoteISODesc = Games in your recent list will be shared +RemoteISOLoading = Connected, loading game list... +RemoteISOScanning = Scanning... Click "share games" on your server device +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Note: Connect both devices to the same Wi-Fi network +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Settings +Share Games (Server) = Share games (server) +Share on PPSSPP startup = Share on PPSSPP startup +Stop Sharing = Stop sharing +Stopping.. = Stopping... + +[Reporting] +Bad = Bad +FeedbackDelayInfo = Your data is being submitted in the background. +FeedbackDesc = How's the emulation? Let us and the community know! +FeedbackDisabled = Compatibility server reports must be enabled. +FeedbackIncludeCRC = Note: Battery will be used to send a disc CRC +FeedbackIncludeScreen = Include a screenshot +FeedbackSubmitDone = Your data has been submitted. +FeedbackSubmitFail = Could not submit data to server. Try updating PPSSPP. +FeedbackThanks = Thanks for your feedback! +Gameplay = Gameplay +Graphics = Graphics +Great = Great +In-game = In-game +In-game Description = Gets into gameplay, but too buggy to complete +Menu/Intro = Menu/Intro +Menu/Intro Description = Can't get into the game itself +Nothing = Nothing +Nothing Description = Completely broken +OK = OK +Open Browser = Open browser +Overall = Overall +Perfect = Perfect +Perfect Description = Flawless emulation for the entire game - great! +Plays = Plays +Plays Description = Fully playable but might be with glitches +ReportButton = Report feedback +Speed = Speed +Submit Feedback = Submit feedback +SuggestionConfig = See reports on website for good settings. +SuggestionCPUSpeed0 = Disable locked CPU speed setting. +SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this bug). +SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. +SuggestionsNone = This game isn't working for other users too. +SuggestionsWaiting = Submitting and checking other users feedback... +SuggestionUpgrade = Upgrade to a newer PPSSPP build. +SuggestionVerifyDisc = Check your ISO is a good copy of your disc. +Unselected Overall Description = How well does this game emulate? +View Feedback = View all feedbacks + +[Savedata] +Date = Date +Filename = Filename +No screenshot = No screenshot +None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Save Data = Save data +Save States = Save states +Savedata Manager = Savedata manager +Size = Size + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = WARNING: Chainfire3D detected, may cause problems. +Failed to load state = Failed to load state +Failed to save state = Failed to save state +fixed = Speed: alternate +GLToolsWarning = WARNING: GLTools detected, may cause problems. +In menu = In menu +Load savestate failed = Load savestate failed +Loaded State = State loaded +Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +LoadStateDoesntExist = Failed to load state: Savestate doesn't exist! +LoadStateWrongVersion = Failed to load state: Savestate is for an older version of PPSSPP! +norewind = No rewind save states available. +Playing = Playing +PressESC = Press ESC to open the pause menu. +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = Failed to save state! +Saved State = State saved +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Speed: alternate 2 +standard = Speed: standard +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = Already installed +Connection Error = Connection error +Install = Install +Launch Game = Launch game +Loading... = Loading... +MB = MB +Size = Size +Uninstall = Uninstall + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d cores) +%d bytes = %d bytes +(none detected) = (none detected) +3D API = 3D API +ABI = ABI +API Version = API version +Audio Information = Audio information +Board = Board +Build Config = Build config +Build Configuration = Build Configuration +Built by = Built by +Core Context = Core context +Cores = Cores +CPU Extensions = CPU extensions +CPU Information = CPU information +CPU Name = Name +D3DCompiler Version = D3DCompiler version +Debug = Debug +Debugger Present = Debugger present +Device Info = Device info +Display Information = Display information +Driver Version = Driver version +EGL Extensions = EGL extensions +Frames per buffer = Frames per buffer +GPU Information = GPU information +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Lang/Region +Memory Page Size = Memory page size +Native Resolution = Native resolution +OGL Extensions = OGL extensions +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 extensions +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 extensions +OpenGL Extensions = OpenGL extensions +Optimal frames per buffer = Optimal frames per buffer +Optimal sample rate = Optimal sample rate +OS Information = OS information +PPSSPP build = PPSSPP build +Refresh rate = Refresh rate +Release = Release +RW/RX exclusive = RW/RX exclusive +Sample rate = Sample rate +Shading Language = Shading language +Sustained perf mode = Sustained perf mode +System Information = System information +System Name = Name +System Version = System version +Threads = Threads +Vendor = Vendor +Vendor (detected) = Vendor (detected) +Version Information = Version information +Vulkan Extensions = Vulkan extensions +Vulkan Features = Vulkan features + +[System] +(broken) = (broken) +12HR = 12HR +24HR = 24HR +Auto = Auto +Auto Load Savestate = Auto load savestate +AVI Dump started. = AVI dump started +AVI Dump stopped. = AVI dump stopped +Cache ISO in RAM = Cache full ISO in RAM +Change CPU Clock = Change emulated PSP's CPU clock (unstable) +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Change nickname +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = Cheats (experimental, see forums) +Clear Recent = Clear "Recent" +Clear Recent Games List = Clear Recent games list +Clear UI background = Clear UI background +Confirmation Button = Confirmation button +Date Format = Date format +Day Light Saving = Daylight savings +DDMMYYYY = DDMMYYYY +Decrease size = Decrease size +Developer Tools = Developer tools +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emulation +Enable Cheats = Enable cheats +Enable Compatibility Server Reports = Enable compatibility server reports +Failed to load state. Error in the file system. = Failed to load state. Error in the file system. +Failed to save state. Error in the file system. = Failed to save state. Error in the file system. +Fast (lag on slow storage) = Fast (lag on slow storage) +Fast Memory = Sürətli Yaddaş (qərarsız) +Force real clock sync (slower, less lag) = Force real clock sync (slower, less lag) +frames, 0:off = frames, 0 = off +Games list settings = Games list settings +General = General +Grid icon size = Grid icon size +Help the PPSSPP team = Help the PPSSPP team +Host (bugs, less lag) = Host (bugs, less lag) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Interpreter +IO timing method = I/O timing method +IR Interpreter = IR interpreter +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = Memory Stick inserted +MHz, 0:default = MHz, 0 = default +MMDDYYYY = MMDDYYYY +Newest Save = Newest save +Not a PSP game = Not a PSP game +Off = Off +Oldest Save = Oldest save +PSP Model = PSP model +PSP Settings = PSP settings +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Record audio +Record Display = Record display +Reset Recording on Save/Load State = Reset recording on Save/Load state +Restore Default Settings = Restore PPSSPP's settings to default +Rewind Snapshot Frequency = Rewind snapshot frequency (mem hog) +Save path in installed.txt = Save path in installed.txt +Save path in My Documents = Save path in My Documents +Savestate Slot = Savestate slot +Savestate slot backups = Savestate slot backups +Screenshots as PNG = Save screenshots in PNG format +Set UI background... = Set UI background... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Simulate UMD delays +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Storage full +Sustained performance mode = Sustained performance mode +Time Format = Time format +UI = UI +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) +Use O to confirm = Use O as confirmation button +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = Use X as confirmation button +VersionCheck = Check for new versions of PPSSPP +WARNING: Android battery save mode is on = WARNING: Android battery save mode is On +WARNING: Battery save mode is on = WARNING: Battery save mode is on +YYYYMMDD = YYYYMMDD + +[Upgrade] +Details = Details +Dismiss = Dismiss +Download = Download +New version of PPSSPP available = New version of PPSSPP available diff --git a/assets/lang/bg_BG.ini b/assets/lang/bg_BG.ini new file mode 100644 index 0000000000..7e60e60743 --- /dev/null +++ b/assets/lang/bg_BG.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = Audio backend (restart req.) +AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) +Auto = Auto +Device = Device +DSound (compatible) = DSound (compatible) +Enable Sound = Включи звук +Global volume = Global volume +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = WASAPI (fast) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Analog axis sensitivity +Analog Limiter = Analog limiter +Analog Mapper High End = Analog mapper high-end (axis sensitivity) +Analog Mapper Low End = Analog mapper low-end (inverse deadzone) +Analog Mapper Mode = Analog mapper mode +Analog Stick = Analog stick +AnalogLimiter Tip = When the analog limiter button is pressed +Auto = Автоматично +Auto-centering analog stick = Auto-centering analog stick +Auto-hide buttons after seconds = Auto-hide buttons after seconds +Binds = Binds +Button Opacity = Прозрачност на бутоните +Button style = Button style +Calibrate D-Pad = Calibrate +Calibration = Calibration +Classic = Класик +Combo Key Setting = Combo key setting +Combo Key Setup = Combo key setup +Confine Mouse = Trap mouse within window/display area +Control Mapping = Избиране на контроли +Custom layout... = Edit touch control layout... +Customize tilt = Customize tilt... +D-PAD = D-Pad +Deadzone Radius = Deadzone радиус +DInput Analog Settings = DInput analog settings +Disable D-Pad diagonals (4-way touch) = Изключи D-Pad диагонали (4-way touch) +Glowing borders = Glowing borders +HapticFeedback = Haptic feedback (вибрация) +Ignore gamepads when not focused = Ignore gamepads when not focused +Ignore Windows Key = Игнорирай Windows клавиша (попречва показването на Start меню) +Invert Axes = Invert axes +Invert Tilt along X axis = Invert tilt along X axis +Invert Tilt along Y axis = Invert tilt along Y axis +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Keyboard control settings +L/R Trigger Buttons = L/R trigger buttons +Landscape = Пейзаж +Landscape Auto = Landscape auto +Landscape Reversed = Обърнат пейзаж +Mouse = Mouse settings +Mouse sensitivity = Mouse sensitivity +Mouse smoothing = Mouse smoothing +MouseControl Tip = You can now map mouse in control mapping screen by pressing the 'M' icon. +None (Disabled) = Нищо (изключено) +Off = Off +OnScreen = Управление с докосване на екрана +Portrait = Портрет +Portrait Reversed = Обърнат портрет +PSP Action Buttons = PSP action buttons +Screen Rotation = Въртене на екрана +seconds, 0 : off = seconds, 0 = off +Sensitivity = Чувствителност +Show right analog = Show right analog +Show Touch Pause Menu Button = Покажи бутон „Пауза“ +Thin borders = Thin borders +Tilt Base Radius = Tilt base radius +Tilt Input Type = Tilt input type +Tilt Sensitivity along X axis = Tilt sensitivity along X axis +Tilt Sensitivity along Y axis = Tilt sensitivity along Y axis +To Calibrate = To calibrate, keep device on a flat surface and press "Calibrate". +Touch Control Visibility = Touch control visibility +Use custom right analog = Use custom right analog +Use Mouse Control = Use mouse control +Visibility = Видимост +X = X +X + Y = X + Y +XInput Analog Settings = XInput analog settings +Y = Y + +[CwCheats] +Cheats = Чийтове +Edit Cheat File = Edit cheat file +Enable/Disable All = Включи/Изключи всички чийтове +Import Cheats = Внеси от cheat.db +Options = Опции +Refresh Rate = Refresh rate + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Arial +About PPSSPP... = &Относно PPSSPP... +Auto = &Автоматично +Backend = Rendering &Backend (Restarts PPSSPP) +Bicubic = &Bicubic +Break = Break +Break on Load = Break on load +Buffered Rendering = &Buffered Rendering +Buy Gold = Купи &Gold +Control Mapping... = Контроли... +Debugging = &Debug +Deposterize = &Deposterize +Direct3D9 = &Direct3D9 +Direct3D11 = Direct3D &11 +Disassembly = &Disassembly... +Discord = Discord +Display Layout Editor = Display layout editor... +Display Rotation = Display rotation +Dump Next Frame to Log = D&ump Next Frame to Log +Emulation = &Емулация +Enable Chat = Enable chat +Enable Cheats = Включи чийтове +Enable Sound = Включи &Звук +Exit = &Изход +Extract File... = E&xtract File... +File = Файл +Frame Skipping = &Прескачане на кадри +Frame Skipping Type = Frame skipping type +Fullscreen = Цял екран +Game Settings = Настройки +GE Debugger... = GE Debugge&r... +GitHub = Git&Hub +Hardware Transform = &Hardware Transform +Help = &Помощ +Hybrid = &Hybrid +Hybrid + Bicubic = H&ybrid + Bicubic +Ignore Illegal Reads/Writes = &Ignore Illegal Reads/Writes +Ignore Windows Key = Игнорирай Windows клавиша +Keep PPSSPP On Top = PPSSPP най-отгоре +Landscape = Landscape +Landscape reversed = Landscape reversed +Language... = Език... +Linear = &Linear +Load = Зареди... +Load .sym File... = Lo&ad .sym File... +Load Map File... = Зареди &Map File... +Load State = Зареди състояние +Load State File... = Зареди състояние от файл... +Log Console = &Log Console +Memory View... = Памет изглед... +More Settings... = Още настройки... +Nearest = &Най-близко +Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) +Off = &Изключено +Open Directory... = Отвори директория... +Open from MS:/PSP/GAME... = Отвори от MS:/PSP/GAME... +Open Memory Stick = Отвори от мемори стик +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = &Pause +Pause When Not Focused = Пауза, когато не фокусиран +Portrait = Portrait +Portrait reversed = Portrait reversed +Postprocessing Shader = Postprocessin&g Shader +PPSSPP Forums = PPSSPP &форум +Record = &Record +Record Audio = Record &audio +Record Display = Record &display +Rendering Mode = Rendering M&ode +Rendering Resolution = &Rendering Resolution +Reset = R&eset +Reset Symbol Table = Reset S&ymbol Table +Run = &Run +Save .sym File... = Sav&e .sym File... +Save Map File... = &Запази Map File... +Save State = Запази състояние +Save State File... = Запази състояние на файл... +Savestate Slot = Брой на запазени състояния +Screen Scaling Filter = Scr&een Scaling Filter +Show Debug Statistics = Покажи Debu&g Statistics +Show FPS Counter = Покажи &FPS +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = &Stop +Switch UMD = Смени UMD +Take Screenshot = Направи снимка +Texture Filtering = Текстурно филтриране +Texture Scaling = Текстурно мащабиране +Use Lossless Video Codec (FFV1) = &Use lossless video codec (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = &Vertex Cache +VSync = VS&ync +Vulkan = Vulkan +Window Size = &Размер на прозореца +www.ppsspp.org = Посети www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allocator viewer (Vulkan) +Allow remote debugger = Allow remote debugger +Backspace = Backspace +Block address = Block address +By Address = By address +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Create/Open textures.ini file for current game +Current = Current +Dev Tools = Development tools +DevMenu = DevMenu +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Dump decrypted EBOOT.BIN on game boot +Dump Frame GPU Commands = Dump frame GPU commands +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Enable debug logging +Enter address = Enter address +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Frame profiler +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = Jit compare +JIT debug tools = JIT debug tools +Language = Език +Load language ini = Зареди езиков ini +Log Dropped Frame Statistics = Log dropped frame statistics +Log Level = Log level +Log View = Log view +Logging Channels = Logging channels +Next = Next +No block = No block +Prev = Previous +Random = Random +Replace textures = Replace textures +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Сигурни ли сте, че искате да възстановите всички първоначални настойки?\nКонтролите не са променени.\n\n\nНе може да върнете това действие.\nМоля рестартирайте PPSSPP за да бъдат приложени промените. +RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? +Resume = Resume +Run CPU Tests = Run CPU tests +Save language ini = Запази езиков ini +Save new textures = Save new textures +Shader Viewer = Shader viewer +Show Developer Menu = Покажи developer меню +Show on-screen messages = Show on-screen messages +Stats = Stats +System Information = Системна информация +Texture Replacement = Texture replacement +Toggle Audio Debug = Toggle audio debug +Toggle Freeze = Toggle freeze +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP res +Active = Active +Back = Назад +Cancel = Отмени +Center = Center +ChangingGPUBackends = Changing GPU backends requires PPSSPP to restart. Restart now? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = Choose PPSSPP save folder +Confirm Overwrite = Искате ли да презапишете данните? +Confirm Save = Искате ли да запазите данните? +ConfirmLoad = Зареди тези данни? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Изтрий +Delete all = Delete all +Delete completed = Изтриването завършето. +DeleteConfirm = Този запис ще бъде изтрит.\nСигурни ли сте, че искате да продължите? +DeleteConfirmAll = Наистина ли искате да изтриете\nвсички записани данни за тази игра? +DeleteConfirmGame = Наистина ли искате да изтриете тази игра\nот устройството Ви? Не може да върнете това действие. +DeleteConfirmGameConfig = Do you really want to delete the settings for this game? +DeleteFailed = Unable to delete data. +Deleting = Изтриване\nМоля изчакайте... +Disable All = Disable all +Edit = Edit +Enable All = Enable all +Enter = Enter +Finish = Край +Grid = Grid +Inactive = Inactive +InternalError = An internal error has occurred. +Load = Зареди +Load completed = Зареждането завършено. +Loading = Зареждане\nМоля изчакайте... +LoadingFailed = Unable to load data. +Move = Преместване +Network Connection = Мрежова връзка +NEW DATA = Нови данни +No = Не +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = OK +Old savedata detected = Old savedata detected +Options = Options +Reset = Reset +Resize = Преоразмеряване +Retry = Нов опит +Save = Запази +Save completed = Съхраняването завършено. +Saving = Съхраняване\nМоля изчакайте... +SavingFailed = Unable to save data. +Select = Select +Shift = Shift +Snap = Snap +Space = Space +SSID = SSID +Submit = Submit +Supported = Supported +There is no data = Няма данни. +Toggle All = Toggle all +Toggle List = Toggle list +Unsupported = Unsupported +When you save, it will load on a PSP, but not an older PPSSPP = When you save, it will load on a PSP, but not an older PPSSPP +When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Yes = Да +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = file is compressed (7z).\nPlease decompress first (try 7-Zip or WinRAR). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = Could not save screenshot file. +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll not found. Please install. Or press Yes to try again using Direct3D 9 instead. +D3D11InitializationError = Direct3D 11 initialization error +D3D11Missing = Your operating system version does not include D3D11. Please run Windows Update.\n\nPress Yes to try again using Direct3D 9 instead. +D3D11NotSupported = Your GPU does not appear to support Direct3D 11.\n\nWould you like to try again using Direct3D 9 instead? +Disk full while writing data = Disk full while writing data. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = Грешка при зареждането на файла: +Error reading file = Грешка при четенето на файла. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = Неуспех при определянето на файла. +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Failed initializing graphics. Try upgrading your graphics drivers and DirectX 9 runtime.\n\nWould you like to try switching to OpenGL?\n\nError message: +GenericGraphicsError = Graphics Error +GenericOpenGLError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to DirectX 9?\n\nError message: +GenericVulkanError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to OpenGL?\n\nError message: +InsufficientOpenGLDriver = Засечена е недостатъчна поддръжка на OpenGL !\n\nВашето GPU докладва, че не поддържа OpenGL 2.0, което е нужно на PPSSPP да работи.\n\nМоля уверете се, че видео картата е съвместима с OpenGL 2.0. Ако е, тогава обновете GPU драйверите от сайта на производителя.\n\nПосетете форума на https://forums.ppsspp.org за повече информация. +Just a directory. = Само директория. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = Липсва EBOOT.PBP, грешно определена игра. +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = OpenGL driver error +PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = Засега PPSSPP не поддържа свързване към интернет за DLC, PSN и игрови обновявания. +PS1 EBOOTs are not supported by PPSSPP. = PS1 EBOOT не се поддържа от PPSSPP. +PSX game image detected. = Файла е MODE2 image. PPSSPP не поддържа PS1 игри. +RAR file detected (Require UnRAR) = Файла е архивиран (RAR).\nМоля първо разархивирайте (опитайте с UnRAR). +RAR file detected (Require WINRAR) = Файла е архивиран (RAR).\nМоля първо разархивирайте (опитайте с WinRAR). +Running slow: try frameskip, sound is choppy when slow = Running slow: try frameskip, sound is choppy when slow +Running slow: Try turning off Software Rendering = Running slow: try turning off "software rendering" +Save encryption failed. This save won't work on real PSP = Save encryption failed. This save won't work on real PSP +textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +This is a saved state, not a game. = This is a saved state, not a game. +This is save data, not a game. = This is save data, not a game. +Unable to create cheat file, disk may be full = Unable to create cheat file, disk may be full. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Unable to write savedata, disk may be full. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Warning: Video memory FULL, reducing upscaling and switching to slow caching mode. +Warning: Video memory FULL, switching to slow caching mode = Warning: Video memory FULL, switching to slow caching mode. +ZIP file detected (Require UnRAR) = Файла е архивиран (ZIP).\nМоля първо разархивирайте (опитайте с UnRAR). +ZIP file detected (Require WINRAR) = Файла е архивиран (ZIP).\nМоля първо разархивирайте (опитайте с WinRAR). + +[Game] +Asia = Asia +ConfirmDelete = Изтрий +Create Game Config = Create game config +Create Shortcut = Създай пряк път +Delete Game = Изтрий игра +Delete Game Config = Delete game config +Delete Save Data = Изтрий записа +Europe = Europe +Game = Игра +Game Settings = Настройки +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Data install +Japan = Japan +Korea = Korea +MB = MB +One moment please... = One moment please... +Play = Play +Remove From Recent = Премахни от „Скорошни“ +SaveData = Savedata +Setting Background = Setting background +Show In Folder = Покажи в папка +USA = USA +Use UI background = Use UI background + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = unlimited +(supersampling) = (supersampling) +(upscaling) = (upscaling) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Aggressive +Alternative Speed = Алтернативна скорост +Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Anisotropic Filtering = Anisotropic филтриране +Auto = Автоматично +Auto (1:1) = Автоматично (1:1) +Auto (same as Rendering) = Auto (same as rendering resolution) +Auto FrameSkip = Автоматично пропускане на кадри +Auto Scaling = Auto scaling +Backend = Backend +Balanced = Balanced +Bicubic = Bicubic +BlockTransfer Tip = Some games require this to be On for correct graphics +BlockTransferRequired = Warning: This game requires "simulate block transfer effects" to be set to On. +Both = И двете +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Buffered rendering +BufferedRenderingRequired = Warning: This game requires "rendering mode" to be set to "buffered". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Screen size (in % of the viewport) +Cardboard Screen X Shift = X shift (in % of the blank space) +Cardboard Screen Y Shift = Y shift (in % of the blank space) +Cardboard VR Settings = Google Cardboard VR settings +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU core +Debugging = Debugging +DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. +Deposterize = Deposterize +Deposterize Tip = Fixes visual banding glitches in upscaled textures +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Disable slower effects (speedup) +Disabled = Disabled +Display layout editor = Display layout editor +Display Resolution (HW scaler) = Display resolution (HW scaler) +Dump next frame to log = Dump next frame to log +Enable Cardboard VR = Enable Cardboard VR +FPS = Кадри в сек. +Frame Rate Control = Framerate control +Frame Skipping = Прескачане на кадри +Frame Skipping Type = Frame skipping type +FullScreen = Цял екран +Hack Settings = Hack settings (may cause glitches) +Hardware Tessellation = Hardware tessellation +Hardware Transform = Hardware Transform +hardware transform error - falling back to software = Hardware transform error, falling back to software +HardwareTessellation Tip = Uses hardware to make curves +High = High +Hybrid = Hybrid +Hybrid + Bicubic = Hybrid + Bicubic +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Вътрешна резолюция +Lazy texture caching = Мързеливо текстурно кеширане (ускорява) +Linear = Линеарно +Low = Low +LowCurves = Ниско качествени splines и bezier извивки (ускорява) +LowCurves Tip = Only used by some games, controls smoothness of curves +Lower resolution for effects (reduces artifacts) = Lower resolution for effects (reduces artifacts) +Manual Scaling = Manual scaling +Medium = Medium +Mode = Режим +Must Restart = You must restart PPSSPP for this change to take effect. +Native device resolution = Native device resolution +Nearest = Най-близко +No buffer = No buffer +Non-Buffered Rendering = Skip buffer effects (non-buffered, faster) +None = Нищо +Number of Frames = Number of frames +Off = Изключен +OpenGL = OpenGL +Overlay Information = Обща информация +Partial Stretch = Partial stretch +Percent of FPS = Percent of FPS +Performance = Performance +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Postprocessing shader +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = Rendering mode +Rendering Resolution = Rendering resolution +RenderingMode NonBuffered Tip = Faster, but nothing may draw in some games +Retain changed textures = Retain changed textures (sometimes slower) +RetainChangedTextures Tip = Makes many games slower, but some games a lot faster +Rotation = Rotation +Safe = Safe +Screen layout = Screen layout +Screen Scaling Filter = Screen scaling filter +Show Debug Statistics = Покажи debug инфо +Show FPS Counter = Покажи брояча за кадри в сек. +Simulate Block Transfer = Simulate block transfer effects +SoftGPU Tip = Currently VERY slow +Software Rendering = Software rendering (експериментално) +Software Skinning = Software skinning +SoftwareSkinning Tip = Combine skinned model draws on the CPU, faster in most games +Speed = Скорост +Stretching = Stretching +Texture Filter = Текстурно филтриране +Texture Filtering = Текстурно филтриране +Texture Scaling = Текстурно мащабиране +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Turn off "hardware tessellation": unsupported +Unlimited = Unlimited +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = Upscale level +Upscale Type = Upscale type +UpscaleLevel Tip = CPU heavy - some scaling may be delayed to avoid stutter +Use all displays = Use all displays +Vertex Cache = Vertex cache +VertexCache Tip = Faster, but may cause temporary flicker +VSync = VSync +Vulkan = Vulkan +Window Size = Размер на прозореца +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Изтрий ZIP архива +Install = Инсталирай +Install game from ZIP file? = Инсталирай игра от ZIP архив? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = Инсталирано! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = Auto configure +Autoconfigure for device = Autoconfigure for device +Clear All = Изчисти всички +Default All = Първоначални +Map a new key for = Избери нов клавиш за +Map Key = Map key +Map Mouse = Map mouse +Test Analogs = Test analogs +You can press ESC to cancel. = You can press Esc to cancel. + +[MainMenu] +Browse = Разгледай +Buy PPSSPP Gold = Buy PPSSPP Gold +Choose folder = Choose folder +Credits = Заслуги +PPSSPP Homebrew Store = PPSSPP Homebrew магазина +Exit = Изход +Game Settings = Настройки +Games = Директории +Give PPSSPP permission to access storage = Give PPSSPP permission to access storage +Homebrew & Demos = Homebrew && Demos +How to get games = Как да се сдобия с игри? +How to get homebrew & demos = Как да се сдобия с homebrew && demos? +Load = Зареди игра +Loading... = Loading... +PinPath = Pin +PPSSPP can't load games or save right now = PPSSPP can't load games or save right now +Recent = Последни +SavesAreTemporary = PPSSPP is saving in temporary storage +SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently +SavesAreTemporaryIgnore = Ignore warning +UnpinPath = Unpin +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Аудио +Controls = Контроли +Graphics = Графика +Networking = Networking +System = Система +Tools = Tools + +[MappableControls] +Alt speed 1 = Alt speed 1 +Alt speed 2 = Alt speed 2 +An.Down = Analog Надолу +An.Left = Analog Наляво +An.Right = Analog Надясно +An.Up = Analog Нагоре +Analog limiter = Analog limiter +Analog Stick = Analog stick +Audio/Video Recording = Audio/Video recording +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Axis swap +Circle = Circle +Cross = Cross +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = DevMenu +Down = Dpad Надолу +Dpad = Dpad +Frame Advance = Frame advance +Hold = Hold +Home = Home +L = L +Left = Dpad Наляво +Load State = Зареди състояние +Mute toggle = Mute toggle +Next Slot = Next Slot +None = None +Note = Note +OpenChat = Open chat +Pause = Пауза +R = R +RapidFire = Rapid-fire +Remote hold = Remote hold +Rewind = Rewind +Right = Dpad Надясно +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = RightAn.Down +RightAn.Left = RightAn.Left +RightAn.Right = RightAn.Right +RightAn.Up = RightAn.Up +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Запази състояние +Screen = Screen +Screenshot = Screenshot +Select = Select +SpeedToggle = Speed toggle +Square = Square +Start = Start +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = Toggle fullscreen +Toggle mode = Toggle mode +Triangle = Triangle +Unthrottle = Unthrottle +Up = Dpad Нагоре +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Change MAC address +Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable network chat = Enable network chat +Enable networking = Enable networking/WLAN (beta, may break games) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Network initialized +Please change your Port Offset = Please change your port offset +Port offset = Port offset(0 = PSP compatibility) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Send Discord "Rich Presence" information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = чийтове +Continue = Продължи +Create Game Config = Create game config +Delete Game Config = Delete game config +Exit to menu = Изход до меню +Game Settings = Настройки +Load State = Зареди състояние +Rewind = Превърти до начало +Save State = Запази състояние +Settings = Settings +Switch UMD = Смени UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Color +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Анимация +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT scanlines +FXAA = FXAA Antialiasing +Gamma = Gamma +Grayscale = Сива скала +Intensity = Intensity +InverseColors = Противоположни цветове +Natural = Natural Colors +NaturalA = Natural Colors (no blur) +Off = Изключено +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlines (CRT) +Sharpen = Изостряне +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 Upscaler +VideoSmoothingAA = VideoSmoothingAA +Vignette = Vignette + +[PSPCredits] +all the forum mods = all the forum mods +build server = build server +Buy Gold = Купи Gold +check = Също погледнете Dolphin, най-добрия Wii/GC емулатор: +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = Сътрудници: +created = Създаден от +Discord = Discord +info1 = PPSSPP is intended for educational purposes only. +info2 = Моля уверете се, че имате право на ползване на заглавията. +info3 = Можете да играете, ако притежавате UMD диска или купите дигиталната версия +info4 = от PSN магазина на истиското Ви PSP. +info5 = PSP е търговска марка на Sony, Inc. +iOS builds = iOS builds +license = Свободен софтуер под GPL 2.0+ +list = за списък със съвместими заглавия, форуми и др. +PPSSPP Forums = PPSSPP форум +Privacy Policy = Privacy policy +Share PPSSPP = Сподели PPSSPP +specialthanks = Специални благодарности на: +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = Преведено от: +title = Бърз и гъвкав PSP емулатор +tools = Използвани свободни средства: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = opus10 +translators2 = +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Хвърлете едно око на уеб сайта ни: +written = Написано в C++ за бързина и съвместимост + +[RemoteISO] +Browse Games = Browse games +Local Server Port = Local server port +Manual Mode Client = Manual mode client +Remote disc streaming = Remote disc streaming +Remote Port = Remote port +Remote Server = Remote server +Remote Subdirectory = Remote subdirectory +RemoteISODesc = Games in your recent list will be shared +RemoteISOLoading = Connected, loading game list... +RemoteISOScanning = Scanning... Click "share games" on your server device +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Note: Connect both devices to the same Wi-Fi network +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Settings +Share Games (Server) = Share games (server) +Share on PPSSPP startup = Share on PPSSPP startup +Stop Sharing = Stop sharing +Stopping.. = Stopping... + +[Reporting] +Bad = Bad +FeedbackDelayInfo = Your data is being submitted in the background. +FeedbackDesc = How's the emulation? Let us and the community know! +FeedbackDisabled = Compatibility server reports must be enabled. +FeedbackIncludeCRC = Note: Battery will be used to send a disc CRC +FeedbackIncludeScreen = Include a screenshot +FeedbackSubmitDone = Your data has been submitted. +FeedbackSubmitFail = Could not submit data to server. Try updating PPSSPP. +FeedbackThanks = Thanks for your feedback! +Gameplay = Gameplay +Graphics = Graphics +Great = Great +In-game = In-game +In-game Description = Gets into gameplay, but too buggy to complete +Menu/Intro = Menu/Intro +Menu/Intro Description = Can't get into the game itself +Nothing = Nothing +Nothing Description = Completely broken +OK = OK +Open Browser = Open browser +Overall = Overall +Perfect = Perfect +Perfect Description = Flawless emulation for the entire game - great! +Plays = Plays +Plays Description = Fully playable but might be with glitches +ReportButton = Report feedback +Speed = Speed +Submit Feedback = Submit feedback +SuggestionConfig = See reports on website for good settings. +SuggestionCPUSpeed0 = Disable locked CPU speed setting. +SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this bug). +SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. +SuggestionsNone = This game isn't working for other users too. +SuggestionsWaiting = Submitting and checking other users feedback... +SuggestionUpgrade = Upgrade to a newer PPSSPP build. +SuggestionVerifyDisc = Check your ISO is a good copy of your disc. +Unselected Overall Description = How well does this game emulate? +View Feedback = View all feedbacks + +[Savedata] +Date = Date +Filename = Filename +No screenshot = No screenshot +None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Save Data = Save data +Save States = Save states +Savedata Manager = Savedata manager +Size = Size + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = ВНИМАНИЕ: Chainfire3D засечен, може да създаде проблеми +Failed to load state = Failed to load state +Failed to save state = Failed to save state +fixed = Speed: alternate +GLToolsWarning = WARNING: GLTools detected, may cause problems. +In menu = In menu +Load savestate failed = Load savestate failed +Loaded State = Състояние заредено +Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +LoadStateDoesntExist = Неуспех при зареждане на състояние: Записа не съществува! +LoadStateWrongVersion = Неуспех при зареждане на състояние: Записа е за по-стара версия на PPSSPP! +norewind = No rewind save states available. +Playing = Playing +PressESC = Натиснете ESC за да отворите pause menu-то. +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = Неуспех при запис на състоянието! +Saved State = Състояние запазено +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Speed: alternate 2 +standard = Speed: standard +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = Вече е инсталирано +Connection Error = Грешка при свързването +Install = Инсталирай +Launch Game = Launch game +Loading... = Зареждане... +MB = MB +Size = Големина +Uninstall = Деинсталирай + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d cores) +%d bytes = %d bytes +(none detected) = (none detected) +3D API = 3D API +ABI = ABI +API Version = API version +Audio Information = Audio information +Board = Board +Build Config = Build config +Build Configuration = Build Configuration +Built by = Built by +Core Context = Core context +Cores = Cores +CPU Extensions = CPU extensions +CPU Information = CPU information +CPU Name = Name +D3DCompiler Version = D3DCompiler version +Debug = Debug +Debugger Present = Debugger present +Device Info = Device info +Display Information = Display information +Driver Version = Driver version +EGL Extensions = EGL extensions +Frames per buffer = Frames per buffer +GPU Information = GPU information +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Lang/Region +Memory Page Size = Memory page size +Native Resolution = Native resolution +OGL Extensions = OGL extensions +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 extensions +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 extensions +OpenGL Extensions = OpenGL extensions +Optimal frames per buffer = Optimal frames per buffer +Optimal sample rate = Optimal sample rate +OS Information = OS information +PPSSPP build = PPSSPP build +Refresh rate = Refresh rate +Release = Release +RW/RX exclusive = RW/RX exclusive +Sample rate = Sample rate +Shading Language = Shading language +Sustained perf mode = Sustained perf mode +System Information = System information +System Name = Name +System Version = System version +Threads = Threads +Vendor = Vendor +Vendor (detected) = Vendor (detected) +Version Information = Version information +Vulkan Extensions = Vulkan extensions +Vulkan Features = Vulkan features + +[System] +(broken) = (broken) +12HR = 12ч. +24HR = 24ч. +Auto = Auto +Auto Load Savestate = Auto load savestate +AVI Dump started. = AVI dump started +AVI Dump stopped. = AVI dump stopped +Cache ISO in RAM = Cache full ISO in RAM +Change CPU Clock = Промени емулираната процесорна честота на PSP (unstable) +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Промени прякор +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = Чийтове (експериментално, виж форума) +Clear Recent = Clear "Recent" +Clear Recent Games List = Изчисти списъка с последни игри +Clear UI background = Clear UI background +Confirmation Button = Потвърждаващ бутон +Date Format = Дата +Day Light Saving = Лятно време (+1ч.) +DDMMYYYY = ддммгггг +Decrease size = Decrease size +Developer Tools = Инсрументи на разработчик +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = Емулация +Enable Cheats = Включи чиитове +Enable Compatibility Server Reports = Включи доклади за сървърна съвместимост +Failed to load state. Error in the file system. = Failed to load state. Error in the file system. +Failed to save state. Error in the file system. = Failed to save state. Error in the file system. +Fast (lag on slow storage) = Fast (lag on slow storage) +Fast Memory = Бърза памет (нестабилно) +Force real clock sync (slower, less lag) = Force real clock sync (slower, less lag) +frames, 0:off = frames, 0 = off +Games list settings = Games list settings +General = Основни +Grid icon size = Grid icon size +Help the PPSSPP team = Help the PPSSPP team +Host (bugs, less lag) = Host (bugs, less lag) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Interpreter +IO timing method = I/O timing method +IR Interpreter = IR interpreter +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = Memory Stick inserted +MHz, 0:default = MHz, 0 = default +MMDDYYYY = ммддгггг +Newest Save = Newest save +Not a PSP game = Not a PSP game +Off = Off +Oldest Save = Oldest save +PSP Model = PSP серия +PSP Settings = PSP настройки +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Record audio +Record Display = Record display +Reset Recording on Save/Load State = Reset recording on Save/Load state +Restore Default Settings = Възстанови първоначалните настройки на PPSSPP +Rewind Snapshot Frequency = Rewind snapshot честота („яде“ памет) +Save path in installed.txt = Save path in installed.txt +Save path in My Documents = Save path in My Documents +Savestate Slot = слот за запазено състояние +Savestate slot backups = Savestate slot backups +Screenshots as PNG = Запази снимка в PNG формат +Set UI background... = Set UI background... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Simulate UMD delays +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Storage full +Sustained performance mode = Sustained performance mode +Time Format = Час +UI = Потребителски интерфейс +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) +Use O to confirm = Използвай O за потвърждение +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = Използвай X за потвърждение +VersionCheck = Провери за нова версия на PPSSPP +WARNING: Android battery save mode is on = WARNING: Android battery save mode is On +WARNING: Battery save mode is on = WARNING: Battery save mode is on +YYYYMMDD = ггггммдд + +[Upgrade] +Details = Details +Dismiss = Откажи +Download = Свали +New version of PPSSPP available = Налична е нова версия на PPSSPP diff --git a/assets/lang/ca_ES.ini b/assets/lang/ca_ES.ini new file mode 100644 index 0000000000..51f07013aa --- /dev/null +++ b/assets/lang/ca_ES.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = Motor d'àudio (requereix reiniciar) +AudioBufferingForBluetooth = Memòria intermèdia en Bluetooth (lent) +Auto = Automàtic +Device = Device +DSound (compatible) = DSound (compatible) +Enable Sound = Activeu el so +Global volume = Volum global +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = WASAPI (ràpid) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Analog axis sensitivity +Analog Limiter = Limitador analògic +Analog Mapper High End = Assignació analòg. bàsica (sensibilitat d'eixos) +Analog Mapper Low End = Assignació analòg. avançada (inverteix la zona morta) +Analog Mapper Mode = Mode d'assignació analògica +Analog Stick = Palanca analògica +AnalogLimiter Tip = Quan es pitja el botó del limitador analògic +Auto = Automàtic +Auto-centering analog stick = Centrament automàtic de la palanca analògica +Auto-hide buttons after seconds = Oculteu els botons després de +Binds = Binds +Button Opacity = Transparència dels botons +Button style = Estil dels botons +Calibrate D-Pad = Calibreu la creueta +Calibration = Calibraació +Classic = Clàssic +Combo Key Setting = Paràmetres dels botons combo +Combo Key Setup = Configureu els botons combo +Confine Mouse = Trap mouse within window/display area +Control Mapping = Assigneu els botons +Custom layout... = Personalitzeu els botons +Customize tilt = Personalitzeu l'acceleròmetre... +D-PAD = Creueta +Deadzone Radius = Radi de zona inactiva +DInput Analog Settings = Paràmetres analògics DInput +Disable D-Pad diagonals (4-way touch) = Desactiveu els diagonals de la creueta +Glowing borders = Glowing borders +HapticFeedback = Vibració hàptica +Ignore gamepads when not focused = Ignoreu els comandaments amb la pantalla inactiva +Ignore Windows Key = Ignoreu la tecla de Windows +Invert Axes = Invertiu els eixos +Invert Tilt along X axis = Invertiu la inclinació de l'eix X +Invert Tilt along Y axis = Invertiu la inclinació de l'eix Y +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Paràmetres del teclat +L/R Trigger Buttons = Botons L/R +Landscape = Horitzontal +Landscape Auto = Landscape auto +Landscape Reversed = Horitzontal invertit +Mouse = Configuració del ratolí +Mouse sensitivity = Sensibilitat del ratolí +Mouse smoothing = Suavitat del ratolí +MouseControl Tip = Ara podeu assignar el ratolí en la pantalla d'assignament dels botons pitjant la icona 'M'. +None (Disabled) = Desactivat +Off = No +OnScreen = Mostreu els botons tàctils a la pantalla +Portrait = Vertical +Portrait Reversed = Vertical invertit +PSP Action Buttons = Botons d'acció de la PSP +Screen Rotation = Rotació de la pantalla +seconds, 0 : off = seconds, 0 = no +Sensitivity = Sensibilitat +Show right analog = Show right analog +Show Touch Pause Menu Button = Mostreu el botó de menú +Thin borders = Vores fines +Tilt Base Radius = Tilt base radius +Tilt Input Type = Tipus de control de l'acceleròmetre +Tilt Sensitivity along X axis = Sensibilitat d'inclinació de l'eix X +Tilt Sensitivity along Y axis = Sensibilitat d'inclinació de l'eix Y +To Calibrate = Per a la calibració, poseu l'aparell en una superfície plana i pitgeu «Calibreu» +Touch Control Visibility = Visibilitat del control tàctil +Use custom right analog = Use custom right analog +Use Mouse Control = Utilitzeu el control del ratolí +Visibility = Visibilitat +X = X +X + Y = X + Y +XInput Analog Settings = Paràmetres analògics XInput +Y = Y + +[CwCheats] +Cheats = Trucs +Edit Cheat File = Editeu el fitxer de trucs +Enable/Disable All = Activeu/desactiveu tots els trucs +Import Cheats = Importeu «cheat.db» +Options = Opcions +Refresh Rate = Freqüència de refrescament + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = &Quant a PPSSPP... +Auto = &Automàtic +Backend = Motor &gràfic (requereix reiniciar) +Bicubic = &Bicúbic +Break = Break +Break on Load = Break on load +Buffered Rendering = &Renderitzat en memòria intermèdia +Buy Gold = Compreu la versió &Gold +Control Mapping... = Assigneu els &botons... +Debugging = &Depuració +Deposterize = &Deposteritzeu +Direct3D9 = &Direct3D9 +Direct3D11 = Direct3D11 +Disassembly = &Desensamblador... +Discord = Discord +Display Layout Editor = Editeu la posició dels botons... +Display Rotation = Rotació de la pantalla +Dump Next Frame to Log = Aboca el següent marc al registre +Emulation = &Emulació +Enable Chat = Enable chat +Enable Cheats = Activeu els &trucs +Enable Sound = Activeu el &so +Exit = &Sortiu +Extract File... = E&xtreu el fitxer... +File = &Fitxer +Frame Skipping = &Ometeu marcs +Frame Skipping Type = Frame skipping type +Fullscreen = &Pantalla completa +Game Settings = &Paràmetres de joc +GE Debugger... = Dep&urador GE... +GitHub = GitHub +Hardware Transform = Transformació en &maquinari +Help = A&juda +Hybrid = &Hibrid +Hybrid + Bicubic = Híb&rid i bicúbic +Ignore Illegal Reads/Writes = &Ignoreu lectures i escriptures errònies +Ignore Windows Key = Ignoreu la tecla de Windows +Keep PPSSPP On Top = &Manteniu PPSSPP en primer pla +Landscape = Horitzontal +Landscape reversed = Horitzontal invertit +Language... = &Llengua... +Linear = &Lineal +Load = &Carrega... +Load .sym File... = C&arrega fitxer «.sym»... +Load Map File... = Carrega fitxer «Map»... +Load State = &Carrega estat +Load State File... = Carrega f&itxer d'estat... +Log Console = Consola de re&gistres +Memory View... = Visor de &memòria... +More Settings... = Més &paràmetres... +Nearest = &El més proper +Non-Buffered Rendering = &Renderitzat sense memòria intermèdia (més ràpid) +Off = &No +Open Directory... = Obriu &directori... +Open from MS:/PSP/GAME... = O&briu des de from «MS:/PSP/GAME»... +Open Memory Stick = Obriu «&Memory Stick» +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = &Pausa +Pause When Not Focused = &Pausa quan es canviï de finestra +Portrait = Vertical +Portrait reversed = Vertical invertit +Postprocessing Shader = &Shader de postprocessat +PPSSPP Forums = &Fòrums de PPSSPP +Record = Enregistreu +Record Audio = Enregistreu Àudio +Record Display = Enregistreu la pantalla +Rendering Mode = M%ode de renderització +Rendering Resolution = Ressolcuió de la &renderització Resolution +Reset = R&einicia +Reset Symbol Table = Reinicia la taula de s&ímbols +Run = &Reprendre +Save .sym File... = Desa el fitxer «.sym»... +Save Map File... = &Desa el fitxer «Map»... +Save State = D&esa l'estat +Save State File... = &Desa el fitxer d'estat... +Savestate Slot = Ranura de desa &d'estats +Screen Scaling Filter = Filtre d'escalat de &pantalla +Show Debug Statistics = Mostra estadístiques de &depuació +Show FPS Counter = Mostra comptador de &FPS +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = &Atura +Switch UMD = Canvia UMD +Take Screenshot = &Captura de pantalla +Texture Filtering = Filtrat de te&xtura +Texture Scaling = Escalat de &textura +Use Lossless Video Codec (FFV1) = Fes servir còdec de vídeo sense pèrdua (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = &Memòria cau de vèrtexs +VSync = Sincronització vertical (VS&ync) +Vulkan = Vulkan +Window Size = Mida de la &finestra +www.ppsspp.org = Visita www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allocator viewer (Vulkan) +Allow remote debugger = Allow remote debugger +Backspace = Esborra +Block address = Bloca l'adreça +By Address = Per adreça +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Creeu/Obriu fitxer «textures.ini» per al joc actual +Current = Actual +Dev Tools = Development tools +DevMenu = DevMenu +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Aboca «EBOOT.BIN» desxifrat quan s'iniciï el joc +Dump Frame GPU Commands = Aboca ordres del marc GPU +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Activa el registre +Enter address = Inseriu adreça +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Amideu el rendiment +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = Comparació Jit +JIT debug tools = JIT debug tools +Language = Llengua +Load language ini = Carrega INI d'idioma +Log Dropped Frame Statistics = Registra estadístiques de caigudes de marcs +Log Level = Nivell del registre +Log View = Vegeu el registre +Logging Channels = Canals del registre +Next = Següent +No block = No bloquis +Prev = Anterior +Random = Aleatori +Replace textures = Reemplaceu textures +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Esteu segur que voleu restablir els ajustaments de fàbrica?\nEls canvis en els controls no s'esborraran.\n\nAixò no es pot desfer.\nReinicia PPSSPP per a que els canvis tenguin efecte. +RestoreGameDefaultSettings = Esteu segur que voleu restablir els paràmetres de joc\na els paràmetres per defecte de PPSSPP? +Resume = Resume +Run CPU Tests = Proves de CPU +Save language ini = Desa l'INI de l'idioma +Save new textures = Desa les noves textures +Shader Viewer = Visualitzador de shader +Show Developer Menu = Mostra el menú de desenvolupament +Show on-screen messages = Show on-screen messages +Stats = Estadístiques +System Information = Informació del sistema +Texture Replacement = Reemplaçament de textures +Toggle Audio Debug = Commuta la depuració d'àudio +Toggle Freeze = Commuta la imatge +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP res +Active = Active +Back = Enrere +Cancel = Cancel +Center = Center +ChangingGPUBackends = Changing GPU backends requires PPSSPP to restart. Restart now? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = Choose PPSSPP save folder +Confirm Overwrite = Do you want to overwrite the data? +Confirm Save = Do you want to save this data? +ConfirmLoad = Load this data? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Eliminar +Delete all = Delete all +Delete completed = Esborrat completat +DeleteConfirm = Aquesta partida serà esborrada.\nVols perdre el progrés guardat? +DeleteConfirmAll = Do you really want to delete all\nyour save data for this game? +DeleteConfirmGame = Do you really want to delete this game\nfrom your device? You can't undo this. +DeleteConfirmGameConfig = Do you really want to delete the settings for this game? +DeleteFailed = Unable to delete data. +Deleting = Esborrant\nEspera un moment... +Disable All = Disable all +Edit = Edit +Enable All = Enable all +Enter = Confirmar +Finish = Finalizar +Grid = Grid +Inactive = Inactive +InternalError = An internal error has occurred. +Load = Load +Load completed = Carrega completada +Loading = Carregant\nEspera un moment... +LoadingFailed = Unable to load data. +Move = Move +Network Connection = Network Connection +NEW DATA = NEW DATA +No = No +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = OK +Old savedata detected = Old savedata detected +Options = Options +Reset = Reset +Resize = Resize +Retry = Retry +Save = Save +Save completed = Guardat completat +Saving = Guardant\nEspera un moment... +SavingFailed = Unable to save data. +Select = Seleccionar +Shift = Canviar +Snap = Snap +Space = Space +SSID = SSID +Submit = Submit +Supported = Supported +There is no data = No hi han dades +Toggle All = Toggle all +Toggle List = Toggle list +Unsupported = Unsupported +When you save, it will load on a PSP, but not an older PPSSPP = When you save, it will load on a PSP, but not an older PPSSPP +When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Yes = Sí +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = file is compressed (7z).\nPlease decompress first (try 7-Zip or WinRAR). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = Could not save screenshot file. +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll not found. Please install. Or press Yes to try again using Direct3D 9 instead. +D3D11InitializationError = Direct3D 11 initialization error +D3D11Missing = Your operating system version does not include D3D11. Please run Windows Update.\n\nPress Yes to try again using Direct3D 9 instead. +D3D11NotSupported = Your GPU does not appear to support Direct3D 11.\n\nWould you like to try again using Direct3D 9 instead? +Disk full while writing data = Disk full while writing data. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = Error al carregar l'arxiu +Error reading file = error reading file. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = failed to identify file. +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Failed initializing graphics. Try upgrading your graphics drivers and DirectX 9 runtime.\n\nWould you like to try switching to OpenGL?\n\nError message: +GenericGraphicsError = Graphics Error +GenericOpenGLError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to DirectX 9?\n\nError message: +GenericVulkanError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to OpenGL?\n\nError message: +InsufficientOpenGLDriver = Insufficient OpenGL driver support detected!\n\nYour GPU reports that it does not support OpenGL 2.0. Would you like to try using DirectX instead?\n\nDirectX is currently compatible with less games, but on your GPU it may be the only choice.\n\nVisit the forums at https://forums.ppsspp.org for more information.\n\n +Just a directory. = just a directory. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = no EBOOT.PBP, misidentified game. +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = OpenGL driver error +PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP currently does not support connecting to the Internet for DLC, PSN, or game updates. +PS1 EBOOTs are not supported by PPSSPP. = PS1 EBOOTs are not supported by PPSSPP. +PSX game image detected. = File is a MODE2 image. PPSSPP doesn't support PS1 games. +RAR file detected (Require UnRAR) = file is compressed (RAR).\nPlease decompress first (try UnRAR). +RAR file detected (Require WINRAR) = file is compressed (RAR).\nPlease decompress first (try WinRAR). +Running slow: try frameskip, sound is choppy when slow = Running slow: try frameskip, sound is choppy when slow +Running slow: Try turning off Software Rendering = Running slow: try turning off "software rendering" +Save encryption failed. This save won't work on real PSP = Save encryption failed. This save won't work on real PSP +textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +This is a saved state, not a game. = This is a saved state, not a game. +This is save data, not a game. = This is save data, not a game. +Unable to create cheat file, disk may be full = Unable to create cheat file, disk may be full. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Unable to write savedata, disk may be full. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Warning: Video memory FULL, reducing upscaling and switching to slow caching mode. +Warning: Video memory FULL, switching to slow caching mode = Warning: Video memory FULL, switching to slow caching mode. +ZIP file detected (Require UnRAR) = file is compressed (ZIP).\nPlease decompress first (try UnRAR). +ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompress first (try WinRAR). + +[Game] +Asia = Asia +ConfirmDelete = Delete +Create Game Config = Create game config +Create Shortcut = Create shortcut +Delete Game = Delete game +Delete Game Config = Delete game config +Delete Save Data = Delete savedata +Europe = Europe +Game = Game +Game Settings = Game settings +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Data install +Japan = Japan +Korea = Korea +MB = MB +One moment please... = One moment please... +Play = Play +Remove From Recent = Remove from "Recent" +SaveData = Savedata +Setting Background = Setting background +Show In Folder = Show in folder +USA = USA +Use UI background = Use UI background + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = unlimited +(supersampling) = (supersampling) +(upscaling) = (upscaling) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Aggressive +Alternative Speed = Alternative speed (in %, 0 = unlimited) +Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Anisotropic Filtering = Filtrat anisotròpic +Auto = Auto +Auto (1:1) = Auto (1:1) +Auto (same as Rendering) = Auto (same as rendering resolution) +Auto FrameSkip = Auto frameskip +Auto Scaling = Auto scaling +Backend = Backend +Balanced = Balanced +Bicubic = Bicúbic +BlockTransfer Tip = Some games require this to be On for correct graphics +BlockTransferRequired = Warning: This game requires "simulate block transfer effects" to be set to On. +Both = Both +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Renderizat per buffer +BufferedRenderingRequired = Warning: This game requires "rendering mode" to be set to "buffered". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Screen size (in % of the viewport) +Cardboard Screen X Shift = X shift (in % of the blank space) +Cardboard Screen Y Shift = Y shift (in % of the blank space) +Cardboard VR Settings = Google Cardboard VR settings +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU core +Debugging = Debugging +DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. +Deposterize = Deposteritzar +Deposterize Tip = Fixes visual banding glitches in upscaled textures +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Disable slower effects (speedup) +Disabled = Disabled +Display layout editor = Display layout editor +Display Resolution (HW scaler) = Display resolution (HW scaler) +Dump next frame to log = Dump next frame to log +Enable Cardboard VR = Enable Cardboard VR +FPS = FPS +Frame Rate Control = Framerate control +Frame Skipping = Saltar fotogrames (skip) +Frame Skipping Type = Frame skipping type +FullScreen = Fullscreen +Hack Settings = Hack settings (may cause glitches) +Hardware Tessellation = Hardware tessellation +Hardware Transform = Transformació per maquinari +hardware transform error - falling back to software = Hardware transform error, falling back to software +HardwareTessellation Tip = Uses hardware to make curves +High = High +Hybrid = Híbrid +Hybrid + Bicubic = Hybrid + Bicubic +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Internal resolution +Lazy texture caching = Lazy texture caching (speedup) +Linear = Linear +Low = Low +LowCurves = Spline/Bezier curves quality +LowCurves Tip = Only used by some games, controls smoothness of curves +Lower resolution for effects (reduces artifacts) = Lower resolution for effects (reduces artifacts) +Manual Scaling = Manual scaling +Medium = Medium +Mode = Mode +Must Restart = You must restart PPSSPP for this change to take effect. +Native device resolution = Native device resolution +Nearest = Nearest +No buffer = No buffer +Non-Buffered Rendering = Skip buffer effects (non-buffered, faster) +None = None +Number of Frames = Number of frames +Off = Off +OpenGL = OpenGL +Overlay Information = Overlay information +Partial Stretch = Partial stretch +Percent of FPS = Percent of FPS +Performance = Performance +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Postprocessing shader +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = Rendering mode +Rendering Resolution = Rendering resolution +RenderingMode NonBuffered Tip = Faster, but nothing may draw in some games +Retain changed textures = Retain changed textures (sometimes slower) +RetainChangedTextures Tip = Makes many games slower, but some games a lot faster +Rotation = Rotation +Safe = Safe +Screen layout = Screen layout +Screen Scaling Filter = Screen scaling filter +Show Debug Statistics = Show debug statistics +Show FPS Counter = Show FPS counter +Simulate Block Transfer = Simulate block transfer effects +SoftGPU Tip = Currently VERY slow +Software Rendering = Software rendering (experimental) +Software Skinning = Software skinning +SoftwareSkinning Tip = Combine skinned model draws on the CPU, faster in most games +Speed = Speed +Stretching = Stretching +Texture Filter = Texture filtering +Texture Filtering = Texture filtering +Texture Scaling = Texture scaling +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Turn off "hardware tessellation": unsupported +Unlimited = Unlimited +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = Upscale level +Upscale Type = Upscale type +UpscaleLevel Tip = CPU heavy - some scaling may be delayed to avoid stutter +Use all displays = Use all displays +Vertex Cache = Memòria cau (caché) de vèrtexs +VertexCache Tip = Faster, but may cause temporary flicker +VSync = VSync +Vulkan = Vulkan +Window Size = Window size +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Delete ZIP file +Install = Install +Install game from ZIP file? = Install game from ZIP file? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = Installed! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = Auto configure +Autoconfigure for device = Autoconfigure for device +Clear All = Clear all +Default All = Restore defaults +Map a new key for = Map a new key for +Map Key = Map key +Map Mouse = Map mouse +Test Analogs = Test analogs +You can press ESC to cancel. = You can press Esc to cancel. + +[MainMenu] +Browse = Browse... +Buy PPSSPP Gold = Buy PPSSPP Gold +Choose folder = Choose folder +Credits = Crèdits +PPSSPP Homebrew Store = PPSSPP Homebrew Store +Exit = Sortir +Game Settings = Settings +Games = Games +Give PPSSPP permission to access storage = Give PPSSPP permission to access storage +Homebrew & Demos = Homebrew && Demos +How to get games = How can I get games? +How to get homebrew & demos = How can I get homebrew && demos? +Load = Carregar... +Loading... = Loading... +PinPath = Pin +PPSSPP can't load games or save right now = PPSSPP can't load games or save right now +Recent = Recents +SavesAreTemporary = PPSSPP is saving in temporary storage +SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently +SavesAreTemporaryIgnore = Ignore warning +UnpinPath = Unpin +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Àudio +Controls = Controls +Graphics = Gràfics +Networking = Networking +System = Sistema +Tools = Tools + +[MappableControls] +Alt speed 1 = Alt speed 1 +Alt speed 2 = Alt speed 2 +An.Down = Analog Down +An.Left = Analog Left +An.Right = Analog Right +An.Up = Analog Up +Analog limiter = Analog limiter +Analog Stick = Analog stick +Audio/Video Recording = Audio/Video recording +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Axis swap +Circle = Circle +Cross = Cross +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = DevMenu +Down = Dpad Down +Dpad = Dpad +Frame Advance = Frame advance +Hold = Hold +Home = Home +L = L +Left = Dpad Left +Load State = Load State +Mute toggle = Mute toggle +Next Slot = Next Slot +None = None +Note = Note +OpenChat = Open chat +Pause = Pause +R = R +RapidFire = Rapid-fire +Remote hold = Remote hold +Rewind = Rewind +Right = Dpad Right +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = RightAn.Down +RightAn.Left = RightAn.Left +RightAn.Right = RightAn.Right +RightAn.Up = RightAn.Up +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Save State +Screen = Screen +Screenshot = Screenshot +Select = Select +SpeedToggle = Speed toggle +Square = Square +Start = Start +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = Toggle fullscreen +Toggle mode = Toggle mode +Triangle = Triangle +Unthrottle = Unthrottle +Up = Dpad Up +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Change MAC address +Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable network chat = Enable network chat +Enable networking = Enable networking/WLAN (beta, may break games) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Network initialized +Please change your Port Offset = Please change your port offset +Port offset = Port offset(0 = PSP compatibility) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Send Discord "Rich Presence" information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = Cheats +Continue = Continuar +Create Game Config = Create game config +Delete Game Config = Delete game config +Exit to menu = Exit to menu +Game Settings = Game settings +Load State = Carregar estat +Rewind = Rewind +Save State = Guardar estat +Settings = Configuració +Switch UMD = Switch UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Color +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Cartoon +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT scanlines +FXAA = FXAA Antialiasing +Gamma = Gamma +Grayscale = Grayscale +Intensity = Intensity +InverseColors = Inverse Colors +Natural = Natural Colors +NaturalA = Natural Colors (no blur) +Off = Off +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlines (CRT) +Sharpen = Sharpen +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 Upscaler +VideoSmoothingAA = VideoSmoothingAA +Vignette = Vignette + +[PSPCredits] +all the forum mods = all the forum mods +build server = build server +Buy Gold = Buy Gold +check = Also check out Dolphin, the best Wii/GC emu around: +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = Contributors: +created = Created by +Discord = Discord +info1 = PPSSPP is intended for educational purposes only. +info2 = Please make sure that you own the rights to any games +info3 = you play by owning the UMD or by buying the digital +info4 = download from the PSN store on your real PSP. +info5 = PSP is a trademark by Sony, Inc. +iOS builds = iOS builds +license = Free software under GPL 2.0+ +list = compatibility lists, forums, and development info +PPSSPP Forums = PPSSPP Forums +Privacy Policy = Privacy policy +Share PPSSPP = Share PPSSPP +specialthanks = Special thanks to: +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = this translation by: +title = A fast and portable PSP emulator +tools = Free tools used: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = Dídac Martorell (diMartorell) +translators2 = +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Check out the website: +written = Written in C++ for speed and portability + +[RemoteISO] +Browse Games = Browse games +Local Server Port = Local server port +Manual Mode Client = Manual mode client +Remote disc streaming = Remote disc streaming +Remote Port = Remote port +Remote Server = Remote server +Remote Subdirectory = Remote subdirectory +RemoteISODesc = Games in your recent list will be shared +RemoteISOLoading = Connected, loading game list... +RemoteISOScanning = Scanning... Click "share games" on your server device +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Note: Connect both devices to the same Wi-Fi network +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Settings +Share Games (Server) = Share games (server) +Share on PPSSPP startup = Share on PPSSPP startup +Stop Sharing = Stop sharing +Stopping.. = Stopping... + +[Reporting] +Bad = Bad +FeedbackDelayInfo = Your data is being submitted in the background. +FeedbackDesc = How's the emulation? Let us and the community know! +FeedbackDisabled = Compatibility server reports must be enabled. +FeedbackIncludeCRC = Note: Battery will be used to send a disc CRC +FeedbackIncludeScreen = Include a screenshot +FeedbackSubmitDone = Your data has been submitted. +FeedbackSubmitFail = Could not submit data to server. Try updating PPSSPP. +FeedbackThanks = Thanks for your feedback! +Gameplay = Gameplay +Graphics = Graphics +Great = Great +In-game = In-game +In-game Description = Gets into gameplay, but too buggy to complete +Menu/Intro = Menu/Intro +Menu/Intro Description = Can't get into the game itself +Nothing = Nothing +Nothing Description = Completely broken +OK = OK +Open Browser = Open browser +Overall = Overall +Perfect = Perfect +Perfect Description = Flawless emulation for the entire game - great! +Plays = Plays +Plays Description = Fully playable but might be with glitches +ReportButton = Report feedback +Speed = Speed +Submit Feedback = Submit feedback +SuggestionConfig = See reports on website for good settings. +SuggestionCPUSpeed0 = Disable locked CPU speed setting. +SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this bug). +SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. +SuggestionsNone = This game isn't working for other users too. +SuggestionsWaiting = Submitting and checking other users feedback... +SuggestionUpgrade = Upgrade to a newer PPSSPP build. +SuggestionVerifyDisc = Check your ISO is a good copy of your disc. +Unselected Overall Description = How well does this game emulate? +View Feedback = View all feedbacks + +[Savedata] +Date = Date +Filename = Filename +No screenshot = No screenshot +None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Save Data = Save data +Save States = Save states +Savedata Manager = Savedata manager +Size = Size + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = WARNING: Chainfire3D detected, may cause problems. +Failed to load state = Failed to load state +Failed to save state = Failed to save state +fixed = Velocitat: fixa +GLToolsWarning = WARNING: GLTools detected, may cause problems. +In menu = In menu +Load savestate failed = Load savestate failed +Loaded State = State loaded +Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +LoadStateDoesntExist = Failed to load state: Savestate doesn't exist! +LoadStateWrongVersion = Failed to load state: Savestate is for an older version of PPSSPP! +norewind = No rewind save states available. +Playing = Playing +PressESC = Press ESC to open the pause menu. +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = Failed to save state! +Saved State = State saved +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Speed: alternate 2 +standard = Velocitat: estàndard +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = Already installed +Connection Error = Connection error +Install = Install +Launch Game = Launch game +Loading... = Loading... +MB = MB +Size = Size +Uninstall = Uninstall + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d cores) +%d bytes = %d bytes +(none detected) = (none detected) +3D API = 3D API +ABI = ABI +API Version = API version +Audio Information = Audio information +Board = Board +Build Config = Build config +Build Configuration = Build Configuration +Built by = Built by +Core Context = Core context +Cores = Cores +CPU Extensions = CPU extensions +CPU Information = CPU information +CPU Name = Name +D3DCompiler Version = D3DCompiler version +Debug = Debug +Debugger Present = Debugger present +Device Info = Device info +Display Information = Display information +Driver Version = Driver version +EGL Extensions = EGL extensions +Frames per buffer = Frames per buffer +GPU Information = GPU information +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Lang/Region +Memory Page Size = Memory page size +Native Resolution = Native resolution +OGL Extensions = OGL extensions +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 extensions +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 extensions +OpenGL Extensions = OpenGL extensions +Optimal frames per buffer = Optimal frames per buffer +Optimal sample rate = Optimal sample rate +OS Information = OS information +PPSSPP build = PPSSPP build +Refresh rate = Refresh rate +Release = Release +RW/RX exclusive = RW/RX exclusive +Sample rate = Sample rate +Shading Language = Shading language +Sustained perf mode = Sustained perf mode +System Information = System information +System Name = Name +System Version = System version +Threads = Threads +Vendor = Vendor +Vendor (detected) = Vendor (detected) +Version Information = Version information +Vulkan Extensions = Vulkan extensions +Vulkan Features = Vulkan features + +[System] +(broken) = (broken) +12HR = 12HR +24HR = 24HR +Auto = Auto +Auto Load Savestate = Auto load savestate +AVI Dump started. = AVI dump started +AVI Dump stopped. = AVI dump stopped +Cache ISO in RAM = Cache full ISO in RAM +Change CPU Clock = Change emulated PSP's CPU clock (unstable) +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Change nickname +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = Cheats (experimental, see forums) +Clear Recent = Clear "Recent" +Clear Recent Games List = Clear Recent games list +Clear UI background = Clear UI background +Confirmation Button = Confirmation button +Date Format = Date format +Day Light Saving = Daylight savings +DDMMYYYY = DDMMYYYY +Decrease size = Decrease size +Developer Tools = Developer tools +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emulation +Enable Cheats = Activar trucs +Enable Compatibility Server Reports = Enviar informes de compatibilitat +Failed to load state. Error in the file system. = Failed to load state. Error in the file system. +Failed to save state. Error in the file system. = Failed to save state. Error in the file system. +Fast (lag on slow storage) = Fast (lag on slow storage) +Fast Memory = Memòria ràpida (inestable) +Force real clock sync (slower, less lag) = Force real clock sync (slower, less lag) +frames, 0:off = frames, 0 = off +Games list settings = Games list settings +General = General +Grid icon size = Grid icon size +Help the PPSSPP team = Help the PPSSPP team +Host (bugs, less lag) = Host (bugs, less lag) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Interpreter +IO timing method = I/O timing method +IR Interpreter = IR interpreter +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = Memory Stick inserted +MHz, 0:default = MHz, 0 = default +MMDDYYYY = MMDDYYYY +Newest Save = Newest save +Not a PSP game = Not a PSP game +Off = Off +Oldest Save = Oldest save +PSP Model = PSP model +PSP Settings = PSP settings +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Record audio +Record Display = Record display +Reset Recording on Save/Load State = Reset recording on Save/Load state +Restore Default Settings = Restore PPSSPP's settings to default +Rewind Snapshot Frequency = Rewind snapshot frequency (mem hog) +Save path in installed.txt = Save path in installed.txt +Save path in My Documents = Save path in My Documents +Savestate Slot = Savestate slot +Savestate slot backups = Savestate slot backups +Screenshots as PNG = Save screenshots in PNG format +Set UI background... = Set UI background... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Simulate UMD delays +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Storage full +Sustained performance mode = Sustained performance mode +Time Format = Time format +UI = UI +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) +Use O to confirm = Use O as confirmation button +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = Use X as confirmation button +VersionCheck = Check for new versions of PPSSPP +WARNING: Android battery save mode is on = WARNING: Android battery save mode is On +WARNING: Battery save mode is on = WARNING: Battery save mode is on +YYYYMMDD = YYYYMMDD + +[Upgrade] +Details = Details +Dismiss = Dismiss +Download = Download +New version of PPSSPP available = New version of PPSSPP available diff --git a/assets/lang/cz_CZ.ini b/assets/lang/cz_CZ.ini new file mode 100644 index 0000000000..1ee7ff6e71 --- /dev/null +++ b/assets/lang/cz_CZ.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = Zvukové jádro (vyžaduje restart) +AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) +Auto = Auto +Device = Device +DSound (compatible) = DSound (kompatibilní) +Enable Sound = Povolit zvuk +Global volume = Celková hlasitost +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = WASAPI (rychlé) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Analog axis sensitivity +Analog Limiter = Analogový omezovač +Analog Mapper High End = Vršek analogového mapovače (citlivost osy) +Analog Mapper Low End = Spodek analogového mapovače (převrácené pásmo necitlivosti) +Analog Mapper Mode = Režim analogového mapovače +Analog Stick = Analogová páčka +AnalogLimiter Tip = When the analog limiter button is pressed +Auto = Auto +Auto-centering analog stick = Automatické vystředění analogové páčky +Auto-hide buttons after seconds = Automaticky skrýt tlačítka po určité době +Binds = Binds +Button Opacity = Průhlednost tlačítek +Button style = Styl tlačítek +Calibrate D-Pad = Kalibrovat +Calibration = Kalibrace +Classic = Klasický +Combo Key Setting = Nastavování kombinačních kláves +Combo Key Setup = Nastavení kombinačních kláves +Confine Mouse = Trap mouse within window/display area +Control Mapping = Mapování ovládání +Custom layout... = Upravit rozdělení dotykového ovládání... +Customize tilt = Přizpůsobit náklon... +D-PAD = D-Pad +Deadzone Radius = Poloměr mrtvé zóny +DInput Analog Settings = Nastavení analogu DInput +Disable D-Pad diagonals (4-way touch) = Zakázat diagonální D-Pad (čtyřsměrný dotek) +Glowing borders = Glowing borders +HapticFeedback = Hmatová odezva (vibrace) +Ignore gamepads when not focused = Ignorovat gamepad pokud okno není aktivní +Ignore Windows Key = Zakázat klávesu Windows +Invert Axes = Převrátit osy +Invert Tilt along X axis = Převrátit náklon podle osy X +Invert Tilt along Y axis = Převrátit náklon podle osy Y +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Nastavení ovládání klávesnicí +L/R Trigger Buttons = Levé/Pravé tlačítko spínače +Landscape = Na šířku +Landscape Auto = Landscape auto +Landscape Reversed = Na šířku obráceně +Mouse = Mouse settings +Mouse sensitivity = Mouse sensitivity +Mouse smoothing = Mouse smoothing +MouseControl Tip = You can now map mouse in control mapping screen by pressing the 'M' icon. +None (Disabled) = Žádné (zakázáno) +Off = Vypnuto +OnScreen = Dotykové ovládání na obrazovce +Portrait = Na výšku +Portrait Reversed = Na výšku obráceně +PSP Action Buttons = Tlačítka činností PSP +Screen Rotation = Otočení obrazovky +seconds, 0 : off = vteřin, 0 = vypnuto +Sensitivity = Citlivost +Show right analog = Show right analog +Show Touch Pause Menu Button = Zobrazit tlačítko Nabídky při pozastavení +Thin borders = Tenké okraje +Tilt Base Radius = Tilt base radius +Tilt Input Type = Typ vstupu náklonu +Tilt Sensitivity along X axis = Citlivost náklonu podle osy X +Tilt Sensitivity along Y axis = Citlivost náklonu podle osy Y +To Calibrate = Pro kalibraci mějte zařízení na rovném povrchu a stiskněte "Kalibrovat". +Touch Control Visibility = Viditelnost dotykového ovládání +Use custom right analog = Use custom right analog +Use Mouse Control = Use mouse control +Visibility = Viditelnost +X = X +X + Y = X + Y +XInput Analog Settings = Nastavení analogu XInput +Y = Y + +[CwCheats] +Cheats = Cheaty +Edit Cheat File = Upravit soubor s cheaty +Enable/Disable All = Povolit/Zakázat všechny cheaty +Import Cheats = Importovat z cheat.db +Options = Nastavení +Refresh Rate = Frekvence obnoveni + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = &O PPSSPP... +Auto = &Automaticky +Backend = V&ykreslovací Jádro (Restartuje PPSSPP) +Bicubic = &Bikubická +Break = Break +Break on Load = Break on load +Buffered Rendering = Vykreslování &s vyrovnávací pamětí +Buy Gold = &Koupit zlaté PPSSPP +Control Mapping... = &Mapování ovládání... +Debugging = &Ladění +Deposterize = &Deposterizace +Direct3D9 = &Direct3D9 +Direct3D11 = Direct3D &11 +Disassembly = R&ozebrání strojového kódu... +Discord = Discord +Display Layout Editor = Zobrazit editor rozvržení... +Display Rotation = Otočení obrazovky +Dump Next Frame to Log = &Vypsat příští snímek do záznamu +Emulation = &Emulace +Enable Chat = Enable chat +Enable Cheats = Povolit &cheaty +Enable Sound = Povolit zv&uk +Exit = U&končit +Extract File... = E&xtrahovat soubor... +File = &Soubor +Frame Skipping = Přeskakování &snímků +Frame Skipping Type = Frame skipping type +Fullscreen = Ce&lá obrazovka +Game Settings = &Nastavení hry +GE Debugger... = &Ladění GE... +GitHub = Git&Hub +Hardware Transform = &Hardwarová transformace +Help = Ná&pověda +Hybrid = &Hybridní +Hybrid + Bicubic = H&ybridní + Bikubická +Ignore Illegal Reads/Writes = &Ignorovat nepřípustná čtení/zápisy +Ignore Windows Key = Ignorovat klávesu Windows +Keep PPSSPP On Top = PPSSPP vždy &navrchu +Landscape = Na šířku +Landscape reversed = Na šířku obráceně +Language... = &Jazyk... +Linear = &Lineární +Load = &Načíst... +Load .sym File... = N&ačíst soubor .sym... +Load Map File... = &Načíst soubor mapování... +Load State = N&ačíst stav +Load State File... = Načíst sou&bor stavu... +Log Console = &Konzole záznamu +Memory View... = &Zobrazení paměti... +More Settings... = D&alší nastavení... +Nearest = &Nejbližší +Non-Buffered Rendering = &Přeskočit efekty vyrovnávací paměti (rychlejší, neukládá se do paměti) +Off = &Vypnuto +Open Directory... = &Otevřít adresář... +Open from MS:/PSP/GAME... = O&tevřít z MS:/PSP/GAME... +Open Memory Stick = Otevřít &paměťovou kartu +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = &Pozastavit +Pause When Not Focused = &Pozastavit pokud okno není zaměřeno +Portrait = Na výšku +Portrait reversed = Na výšku obráceně +Postprocessing Shader = &Shader následného zpracování +PPSSPP Forums = &Fóra PPSSPP +Record = &Record +Record Audio = Record &audio +Record Display = Record &display +Rendering Mode = R&ežim vykreslování +Rendering Resolution = Vel&ikost rozlišení vykreslování +Reset = &Resetovat +Reset Symbol Table = &Resetovat tabulku symbolů +Run = &Spustit +Save .sym File... = Uložit sou&bor .sym... +Save Map File... = &Uložit soubor mapování... +Save State = U&ložit stav +Save State File... = &Uložit soubor stavu... +Savestate Slot = Po&zice uloženého stavu +Screen Scaling Filter = Fil&tr změny velikosti obrazovky +Show Debug Statistics = Zobrazit &statistiky ladění +Show FPS Counter = Zobrazit počíta&dlo +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = &Zastavit +Switch UMD = Přepnout UMD +Take Screenshot = &Pořídit snímek obrazovky +Texture Filtering = &Filtrování textur +Texture Scaling = &Změna velikosti textur +Use Lossless Video Codec (FFV1) = &Use lossless video codec (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = Mezipaměť verte&xů +VSync = Vertikální S&ynchronizace +Vulkan = Vulkan +Window Size = &Velikost okna +www.ppsspp.org = Navštivte www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allocator viewer (Vulkan) +Allow remote debugger = Allow remote debugger +Backspace = Backspace +Block address = Adresa bloku +By Address = Podle adresy +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Create/Open textures.ini file for current game +Current = Současný +Dev Tools = Development tools +DevMenu = DevMenu +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Vypsat dešifrovaný EBOOT.BIN při načtení hry +Dump Frame GPU Commands = Vypsat příkazy snímku pro grafický procesor +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Povolit záznam při ladění +Enter address = Zadejte adresu +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Profilovač snímku +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = Porovnání JIT +JIT debug tools = JIT debug tools +Language = Jazyk +Load language ini = Načíst ini s jazykem +Log Dropped Frame Statistics = Log dropped frame statistics +Log Level = Úroveň záznamu +Log View = Zobrazení záznamu +Logging Channels = Kanály záznamu +Next = Další +No block = Žádný blok +Prev = Předchozí +Random = Náhodné +Replace textures = Replace textures +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Jste si jisti obnovou všech nastavení zpět na jejich výchozí hodnoty?\nNastavení kontroly mapování nebude změněno.\n\nToto nelze vrátit zpět.\nPo obnově nastavení prosím restartujte PPSSPP. +RestoreGameDefaultSettings = Jste si jisti obnovou nastavení hry\nzpět na výchozí hodnoty PPSSPP? +Resume = Resume +Run CPU Tests = Spustit zkoušky CPU +Save language ini = Uložit ini s jazykem +Save new textures = Save new textures +Shader Viewer = Prohlížeč shaderů +Show Developer Menu = Zobrazit nabídku pro vývojáře +Show on-screen messages = Show on-screen messages +Stats = Statistiky +System Information = Informace o systému +Texture Replacement = Texture replacement +Toggle Audio Debug = Přepnout ladění zvuku +Toggle Freeze = Přepnout zamrznutí +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP rozlišení +Active = Active +Back = Zpět +Cancel = Zrušit +Center = Na střed +ChangingGPUBackends = Změna grafického jádra vyžaduje restart PPSSPP. Chcete tak učinit nyní?? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = Zvolit složku pro ukládání dat PPSSPP +Confirm Overwrite = Chcete tato data přepsat?? +Confirm Save = Chcete tato data uložit? +ConfirmLoad = Načíst tyto data? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Smazat +Delete all = Smazat vše +Delete completed = Mazání dokončeno. +DeleteConfirm = Tato uložená data budou smazána.\nOpravdu chcete pokračovat? +DeleteConfirmAll = Opravdu chcete smazat všechna\nvaše uložená data pro tuto hru? +DeleteConfirmGame = Opravdu chcete tuto hru smazat\nze svého zařízení? Toto nelze vrátit zpět. +DeleteConfirmGameConfig = Opravdu chcete smazat nastavení této hry? +DeleteFailed = Nelze smazat data. +Deleting = Probíhá mazání\nČekejte prosím... +Disable All = Disable all +Edit = Edit +Enable All = Enable all +Enter = Potvrdit +Finish = Potvrdit +Grid = Grid +Inactive = Inactive +InternalError = An internal error has occurred. +Load = Načíst +Load completed = Načítání dokončeno. +Loading = Načítání\nČekejte prosím... +LoadingFailed = Nelze načíst data. +Move = Přesunout +Network Connection = Síťové připojení +NEW DATA = NOVÁ DATA +No = Ne +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = OK +Old savedata detected = Zjištěna stará uložená data +Options = Volby +Reset = Resetovat +Resize = Velikost +Retry = Zkusit znovu +Save = Uložit +Save completed = Ukládání dokončeno. +Saving = Ukládání\nČekejte prosím... +SavingFailed = Nelze uložit data. +Select = Vybrat +Shift = Shift +Snap = Snap +Space = Mezera +SSID = SSID +Submit = Odeslat +Supported = Supported +There is no data = Žádná data k dispozici. +Toggle All = Přepnout vše +Toggle List = Toggle list +Unsupported = Unsupported +When you save, it will load on a PSP, but not an older PPSSPP = Pokud uložíte, můžete hru načíst na PSP, ale ne na starší verzi PPSSPP +When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Yes = Ano +Zoom = Přiblížení + +[Error] +7z file detected (Require 7-Zip) = Soubor je zabalen (7z).\nNejdříve ho musíte rozbalit (zkuste 7-Zip nebo WinRAR). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = Soubor se snímkem obrazovky nelze uložit. +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll not found. Please install. Or press Yes to try again using Direct3D 9 instead. +D3D11InitializationError = Direct3D 11 initialization error +D3D11Missing = Your operating system version does not include D3D11. Please run Windows Update.\n\nPress Yes to try again using Direct3D 9 instead. +D3D11NotSupported = Your GPU does not appear to support Direct3D 11.\n\nWould you like to try again using Direct3D 9 instead? +Disk full while writing data = Při zápisu dat došlo k zaplnění disku. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = Chyba při načítání souboru. +Error reading file = Chyba při čtení souboru. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = Nelze identifikovat soubor. +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Failed initializing graphics. Try upgrading your graphics drivers and DirectX 9 runtime.\n\nWould you like to try switching to OpenGL?\n\nError message: +GenericGraphicsError = Graphics Error +GenericOpenGLError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to DirectX 9?\n\nError message: +GenericVulkanError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to OpenGL?\n\nError message: +InsufficientOpenGLDriver = Zjištěna nedostatečná podpora ovladače OpenGL!\n\nVaše grafická karta hlásí, že nepodporuje OpenGL 2.0. Chtěli byste místo toho zkusit použít DirectX?.\n\nDirectX je nyní kompatibilní s menším počtem her, ale ve vašem případě je to pravděpodobně vaše jediná volba.\n\nPro další informace navštivte fóra na https://forums.ppsspp.org.\n\n +Just a directory. = Jenom adresář. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = Žádný EBOOT.PBP, hra špatně identifikována. +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = Chyba ovladače OpenGL +PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP nyní nepodporuje připojení k Internetu ke stažení DLC, aktualizací her, nebo pro PSN. +PS1 EBOOTs are not supported by PPSSPP. = PPSSPP nepodporuje EBOOT z PS1. +PSX game image detected. = Soubor je obraz MODE2. PPSSPP nepodporuje hry pro PS1. +RAR file detected (Require UnRAR) = Soubor je komprimován (RAR).\nNejdříve ho prosím rozbalte (zkuste UnRAR). +RAR file detected (Require WINRAR) = Soubor je komprimován (RAR).\nNejdříve ho prosím rozbalte (zkuste WinRAR). +Running slow: try frameskip, sound is choppy when slow = Running slow: try frameskip, sound is choppy when slow +Running slow: Try turning off Software Rendering = Running slow: try turning off "software rendering" +Save encryption failed. This save won't work on real PSP = Zašifrování uložené hry selhalo. Tato uložená hra nebude fungovat na skutečném PSP +textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +This is a saved state, not a game. = This is a saved state, not a game. +This is save data, not a game. = This is save data, not a game. +Unable to create cheat file, disk may be full = Nelze vytvořit soubor s cheaty, disk může být plný. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Nelze zapsat data uložené hry, disk je možná zaplněn. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Varování: Video paměť je PLNÁ, zvětšení je zmenšeno a režim změněn na pomalé ukládání do mezipaměti. +Warning: Video memory FULL, switching to slow caching mode = Varování: Video paměť je PLNÁ, režim změněn na pomalé ukládání do mezipaměti. +ZIP file detected (Require UnRAR) = Soubor je komprimován (ZIP).\nNejdříve ho prosím rozbalte (zkuste UnRAR). +ZIP file detected (Require WINRAR) = Soubor je komprimován (ZIP).\nNejdříve ho prosím rozbalte (zkuste WinRAR). + +[Game] +Asia = Asia +ConfirmDelete = Smazat +Create Game Config = Vytvořit nastavení hry +Create Shortcut = Vytvořit zkratku +Delete Game = Smazat hru +Delete Game Config = Smazat nastavení hry +Delete Save Data = Smazat uložená data +Europe = Europe +Game = Hra +Game Settings = Nastavení hry +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Instalace dat +Japan = Japan +Korea = Korea +MB = MB +One moment please... = One moment please... +Play = Hrát +Remove From Recent = Odstranit z "Nedávné" +SaveData = Uložená data +Setting Background = Setting background +Show In Folder = Zobrazit ve složce +USA = USA +Use UI background = Use UI background + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = neomezeno +(supersampling) = (supersampling) +(upscaling) = (zvětšení) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Agresivní +Alternative Speed = Alternativní rychlost (v %, 0 = neomezeno) +Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Anisotropic Filtering = Anizotropní filtrování +Auto = Automaticky +Auto (1:1) = Automatické (1:1) +Auto (same as Rendering) = Automaticky (stejné jako rozlišení vykreslování) +Auto FrameSkip = Automatické přeskakování snímků +Auto Scaling = Automatické zvětšení +Backend = Jádro +Balanced = Vyrovnané +Bicubic = Bikubická +BlockTransfer Tip = Some games require this to be On for correct graphics +BlockTransferRequired = Warning: This game requires "simulate block transfer effects" to be set to On. +Both = Obojí +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Vykreslování s vyrovnávací pamětí +BufferedRenderingRequired = Warning: This game requires "rendering mode" to be set to "buffered". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Velikost obrazovky (v % výřezu) +Cardboard Screen X Shift = Posunutí osy X (v % prázdného prostoru) +Cardboard Screen Y Shift = Posunutí osy Y (v % prázdného prostoru) +Cardboard VR Settings = Nastavení Google Cardboard VR +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU core +Debugging = Ladění +DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. +Deposterize = Deposterizace +Deposterize Tip = Fixes visual banding glitches in upscaled textures +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Zakázat pomalejší efekty (zrychlení) +Disabled = Disabled +Display layout editor = Zobrazit editor rozvržení +Display Resolution (HW scaler) = Rozlišení obrazovky (Hardwarové zvětšení) +Dump next frame to log = Vypsat příští snímek do záznamu +Enable Cardboard VR = Enable Cardboard VR +FPS = FPS +Frame Rate Control = Kontrola frekvence snímků +Frame Skipping = Přeskakování snímků +Frame Skipping Type = Frame skipping type +FullScreen = Režim celé obrazovky +Hack Settings = Nastavení hacků (Mohou způsobit problémy) +Hardware Tessellation = Hardware tessellation +Hardware Transform = Hardwarová transformace +hardware transform error - falling back to software = Chyba hardwarové transformace, bude použita softwarová +HardwareTessellation Tip = Uses hardware to make curves +High = Vysoká +Hybrid = Hybridní +Hybrid + Bicubic = Hybridní + Bikubická +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Vnitřní rozlišení +Lazy texture caching = Líné ukládání textur do mezipaměti (zrychlení) +Linear = Lineární +Low = Nízké +LowCurves = Kvalita křivek/Beziérových křivek +LowCurves Tip = Only used by some games, controls smoothness of curves +Lower resolution for effects (reduces artifacts) = Nižší rozlišení efektů (snižuje artefakty) +Manual Scaling = Ruční zvětšení +Medium = Střední +Mode = Režim +Must Restart = Aby došlo k použití těchto změn, je nutné PPSSPP restartovat. +Native device resolution = Původní rozlišení zařízení +Nearest = Nejbližší +No buffer = No buffer +Non-Buffered Rendering = Přeskočit efekty vyrovnávací paměti (rychlejší, neukládá se do paměti) +None = Nezobrazovat +Number of Frames = Number of frames +Off = Vypnuto +OpenGL = OpenGL +Overlay Information = Informace v překryvu +Partial Stretch = Částečné roztažení +Percent of FPS = Percent of FPS +Performance = Výkon +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Shader následného zpracování +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = Režim vykreslování +Rendering Resolution = Rozlišení vykreslování +RenderingMode NonBuffered Tip = Faster, but nothing may draw in some games +Retain changed textures = Zachovat změněné textury (někdy pomalejší) +RetainChangedTextures Tip = Makes many games slower, but some games a lot faster +Rotation = Otočení +Safe = Bezpečné +Screen layout = Screen layout +Screen Scaling Filter = Filtr změny velikosti obrazovky +Show Debug Statistics = Zobrazit statistiky ladění +Show FPS Counter = Zobrazit počítadlo +Simulate Block Transfer = Simulovat efekty přesunu bloků +SoftGPU Tip = Currently VERY slow +Software Rendering = Softwarové vykreslování (experimentální) +Software Skinning = Textury aplikuje software +SoftwareSkinning Tip = Combine skinned model draws on the CPU, faster in most games +Speed = Rychlost +Stretching = Roztažení +Texture Filter = Filtr textur +Texture Filtering = Filtrování textur +Texture Scaling = Změna velikosti textur +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Turn off "hardware tessellation": unsupported +Unlimited = Neomezené +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = Úroveň zvětšení +Upscale Type = Typ zvětšení +UpscaleLevel Tip = CPU heavy - some scaling may be delayed to avoid stutter +Use all displays = Use all displays +Vertex Cache = Mezipaměť vertexů +VertexCache Tip = Faster, but may cause temporary flicker +VSync = Vertikální synchronizace +Vulkan = Vulkan +Window Size = Velikost okna +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Smazat soubor ZIP +Install = Nainstalovat +Install game from ZIP file? = Instalovat hru ze souboru ZIP? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = Instalováno! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = Automatické nastavení +Autoconfigure for device = Automaticky nastavit pro zařízení +Clear All = Vše vyčistit +Default All = Obnovit výchozí +Map a new key for = Mapovat novou klávesu pro +Map Key = Map key +Map Mouse = Map mouse +Test Analogs = Vyzkoušet +You can press ESC to cancel. = You can press Esc to cancel. + +[MainMenu] +Browse = Procházet... +Buy PPSSPP Gold = Buy PPSSPP Gold +Choose folder = Choose folder +Credits = Seznam tvůrců +PPSSPP Homebrew Store = Obchodu nezávislých her PPSSPP +Exit = Ukončit +Game Settings = Nastavení +Games = Hry +Give PPSSPP permission to access storage = Dát PPSSPP oprávnění k přístupu do úložiště +Homebrew & Demos = Ukázky a Nezávislé hry +How to get games = Jak můžu získat hry +How to get homebrew & demos = Jak můžu získat nezávislé hry a ukázky +Load = Nahrát... +Loading... = Loading... +PinPath = Připnout +PPSSPP can't load games or save right now = PPSSPP can't load games or save right now +Recent = Nedávné +SavesAreTemporary = PPSSPP is saving in temporary storage +SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently +SavesAreTemporaryIgnore = Ignore warning +UnpinPath = Odepnout +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Zvuk +Controls = Ovládání +Graphics = Grafika +Networking = Síť +System = Systém +Tools = Nástroje + +[MappableControls] +Alt speed 1 = Alt speed 1 +Alt speed 2 = Alt speed 2 +An.Down = Analog Dolů +An.Left = Analog Doleva +An.Right = Analog Doprava +An.Up = Analog Nahoru +Analog limiter = Analogový omezovač +Analog Stick = Analogová páčka +Audio/Video Recording = Audio/Video recording +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Výměna osy +Circle = Circle +Cross = Cross +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = Menu pro vývojáře +Down = Dpad Dolů +Dpad = Dpad +Frame Advance = Frame advance +Hold = Hold +Home = Home +L = L +Left = Dpad Doleva +Load State = Uložit stav +Mute toggle = Mute toggle +Next Slot = Další pozice +None = None +Note = Note +OpenChat = Open chat +Pause = Pauza +R = R +RapidFire = Rychlá palba +Remote hold = Remote hold +Rewind = Přetočit +Right = Dpad Doprava +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = PravýAn.Dolů +RightAn.Left = PravýAn.Doleva +RightAn.Right = PravýAn.Doprava +RightAn.Up = PravýAn.Nahoru +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Načíst stav +Screen = Screen +Screenshot = Screenshot +Select = Select +SpeedToggle = Přepnutí rychlosti +Square = Square +Start = Start +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = Toggle fullscreen +Toggle mode = Toggle mode +Triangle = Triangle +Unthrottle = Odškrcení +Up = Dpad Nahoru +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Navštívit fórum Ad Hoc Multiplayer +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Změnit MAC adresu +Change proAdhocServer Address = Změnit IP adresu serveru PRO ad hoc (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Povolit zabudovaný server PRO ad hoc +Enable network chat = Enable network chat +Enable networking = Povolit síť/WLAN (zkušební verze, může způsobit chyby) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Síť zavedena +Please change your Port Offset = Please change your port offset +Port offset = Odchylka portu (0 = Kompatibilita s PSP) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Send Discord "Rich Presence" information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = Cheaty +Continue = Pokračovat +Create Game Config = Vytvořit nastavení hry +Delete Game Config = Smazat nastavení hry +Exit to menu = Návrat do nabídky +Game Settings = Nastavení hry +Load State = Načíst stav +Rewind = Přetočit +Save State = Uložit stav +Settings = Nastavení +Switch UMD = Přepnout UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Barva +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Animák +ColorCorrection = Color correction +Contrast = Contrast +CRT = Skenovací řádky CRT +FXAA = Vyhlazování hran FXAA +Gamma = Gamma +Grayscale = Stupně šedi +Intensity = Intensity +InverseColors = Inverzní barvy +Natural = Přirozené barvy +NaturalA = Natural Colors (no blur) +Off = Vypnuto +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Skenovací řádky (CRT) +Sharpen = Zostřit +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Zvyšovač rozlišení Spline36 +VideoSmoothingAA = VideoSmoothingAA +Vignette = Viněta + +[PSPCredits] +all the forum mods = all the forum mods +build server = build server +Buy Gold = Koupit Zlaté PPSSPP +check = Vyzkoušejte také Dolphin, nejlepší emulátor Wii/GC vůbec: +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = Přispěvatelé: +created = Vytvořil +Discord = Discord +info1 = PPSSPP je určen pouze pro studijní účely. +info2 = Ujistěte se, prosím, že vlastníte práva ke všem hrám, +info3 = které hrajete tím, že UMD vlastníte, nebo koupí +info4 = digitálního produktu z obchodu PSN na vašem skutečném PSP. +info5 = PSP je obchodní značkou Sony. +iOS builds = iOS builds +license = Svobodný software s licencí GPL 2.0+ +list = seznamy kompatibilit, fóra a informace o vývoji +PPSSPP Forums = Fóra PPSSPP +Privacy Policy = Privacy policy +Share PPSSPP = Sdílet PPSSPP +specialthanks = Zvláštní poděkování patří: +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = český překlad vytvořili: +title = Rychlý a přenosný emulátor PSP +tools = Použité svobodné nástroje: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = tondyno, Tsbook +translators2 = +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Navštivte naši stránku: +written = Vytvořeno v jazyce C++ pro rychlost a přenosnost + +[RemoteISO] +Browse Games = Browse games +Local Server Port = Local server port +Manual Mode Client = Manual mode client +Remote disc streaming = Remote disc streaming +Remote Port = Remote port +Remote Server = Remote server +Remote Subdirectory = Remote subdirectory +RemoteISODesc = Games in your recent list will be shared +RemoteISOLoading = Connected, loading game list... +RemoteISOScanning = Scanning... Click "share games" on your server device +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Note: Connect both devices to the same Wi-Fi network +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Settings +Share Games (Server) = Share games (server) +Share on PPSSPP startup = Share on PPSSPP startup +Stop Sharing = Stop sharing +Stopping.. = Stopping... + +[Reporting] +Bad = Špatná +FeedbackDelayInfo = Your data is being submitted in the background. +FeedbackDesc = Jaká je emulace? Dejte nám a komunitě vědět! +FeedbackDisabled = Compatibility server reports must be enabled. +FeedbackIncludeCRC = Note: Battery will be used to send a disc CRC +FeedbackIncludeScreen = Include a screenshot +FeedbackSubmitDone = Your data has been submitted. +FeedbackSubmitFail = Could not submit data to server. Try updating PPSSPP. +FeedbackThanks = Thanks for your feedback! +Gameplay = Hratelnost +Graphics = Grafika +Great = Skvělá +In-game = Ve hře +In-game Description = Gets into gameplay, but too buggy to complete +Menu/Intro = Menu/Úvod +Menu/Intro Description = Can't get into the game itself +Nothing = Vůbec nejde +Nothing Description = Completely broken +OK = Ujde +Open Browser = Otevřít prohlížeč +Overall = Celkově +Perfect = Skvělá +Perfect Description = Flawless emulation for the entire game - great! +Plays = Jde hrát +Plays Description = Fully playable but might be with glitches +ReportButton = Zpětná vazba +Speed = Rychlost +Submit Feedback = Odeslat zpětnou vazbu +SuggestionConfig = See reports on website for good settings. +SuggestionCPUSpeed0 = Disable locked CPU speed setting. +SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this bug). +SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. +SuggestionsNone = This game isn't working for other users too. +SuggestionsWaiting = Submitting and checking other users feedback... +SuggestionUpgrade = Upgrade to a newer PPSSPP build. +SuggestionVerifyDisc = Check your ISO is a good copy of your disc. +Unselected Overall Description = How well does this game emulate? +View Feedback = View all feedbacks + +[Savedata] +Date = Date +Filename = Filename +No screenshot = Žádný snímek obazovky +None yet. Things will appear here after you save. = Zatím žádné. Položky zde budou zobrazeny, až uložíte hru. +Save Data = Data uložených her +Save States = Uložené stavy +Savedata Manager = Správa uložených dat +Size = Size + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = VAROVÁNÍ: Zjištěn Chainfire3D, může způsobit problémy. +Failed to load state = Načtení stavu selhalo +Failed to save state = Uložení stavu selhalo +fixed = Rychlost: alternativní +GLToolsWarning = VAROVÁNÍ: Zjištěny GLTools, můžou způsobovat problémy +In menu = In menu +Load savestate failed = Načtení uloženého stavu selhalo +Loaded State = Stav načten +Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +LoadStateDoesntExist = Nepodařilo se načíst stav: Uložený stav neexistuje! +LoadStateWrongVersion = Nepodařilo se načíst stav: Stav je pro starší verzi PPSSPP! +norewind = Nejsou dostupné žádné uložené stavy pro přetočení. +Playing = Playing +PressESC = Stiskněte ESC k otevření nabídky při pozastavení. +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = Nepodařilo se uložit stav! +Saved State = Stav uložen +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Speed: alternate 2 +standard = Rychlost: standardní +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = Již instalováno +Connection Error = Chyba připojení +Install = Nainstalovat +Launch Game = Spustit hru +Loading... = Načítání... +MB = MB +Size = Velikost +Uninstall = Odinstalovat + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d cores) +%d bytes = %d bytes +(none detected) = (none detected) +3D API = 3D API +ABI = ABI +API Version = API version +Audio Information = Audio information +Board = Board +Build Config = Build config +Build Configuration = Build Configuration +Built by = Built by +Core Context = Core context +Cores = Cores +CPU Extensions = CPU extensions +CPU Information = CPU information +CPU Name = Name +D3DCompiler Version = D3DCompiler version +Debug = Debug +Debugger Present = Debugger present +Device Info = Device info +Display Information = Display information +Driver Version = Driver version +EGL Extensions = EGL extensions +Frames per buffer = Frames per buffer +GPU Information = GPU information +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Lang/Region +Memory Page Size = Memory page size +Native Resolution = Native resolution +OGL Extensions = OGL extensions +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 extensions +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 extensions +OpenGL Extensions = OpenGL extensions +Optimal frames per buffer = Optimal frames per buffer +Optimal sample rate = Optimal sample rate +OS Information = OS information +PPSSPP build = PPSSPP build +Refresh rate = Refresh rate +Release = Release +RW/RX exclusive = RW/RX exclusive +Sample rate = Sample rate +Shading Language = Shading language +Sustained perf mode = Sustained perf mode +System Information = System information +System Name = Name +System Version = System version +Threads = Threads +Vendor = Vendor +Vendor (detected) = Vendor (detected) +Version Information = Version information +Vulkan Extensions = Vulkan extensions +Vulkan Features = Vulkan features + +[System] +(broken) = (rozbité) +12HR = 12HOD +24HR = 24HOD +Auto = Auto +Auto Load Savestate = Auto load savestate +AVI Dump started. = AVI dump started +AVI Dump stopped. = AVI dump stopped +Cache ISO in RAM = Uložit celé ISO do RAM +Change CPU Clock = Změnit hodiny emulovaného procesoru PSP (nestabilní) +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Změnit přezdívku +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = Cheaty (experimentální, viz fóra) +Clear Recent = Clear "Recent" +Clear Recent Games List = Vyčistit seznam nedávných her +Clear UI background = Clear UI background +Confirmation Button = Tlačítko potvrzení +Date Format = Formát data +Day Light Saving = Letní čas +DDMMYYYY = DDMMRRRR +Decrease size = Decrease size +Developer Tools = Nástroje pro vývojáře +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emulace +Enable Cheats = Povolit Cheaty +Enable Compatibility Server Reports = Povolit hlášení pro server kompatibility +Failed to load state. Error in the file system. = Načtení stavu selhalo. Chyba v systému souborů. +Failed to save state. Error in the file system. = Failed to save state. Error in the file system. +Fast (lag on slow storage) = Rychlá (zasekává se na pomalém úložišti) +Fast Memory = Rychlá paměť (nestabilní) +Force real clock sync (slower, less lag) = Vynutit skutečný soulad hodin (pomalejší, méně sekání) +frames, 0:off = snímky, 0 = vypnuto +Games list settings = Games list settings +General = Obecné +Grid icon size = Grid icon size +Help the PPSSPP team = Pomozte týmu PPSSPP +Host (bugs, less lag) = Hostitel (chyby, zasekává se méně) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Interpreter +IO timing method = Metoda časování vstupu/výstupu +IR Interpreter = IR interpreter +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = Memory Stick inserted +MHz, 0:default = MHz, 0 = výchozí +MMDDYYYY = MMDDRRRR +Newest Save = Newest save +Not a PSP game = Toto není hra PSP +Off = Vypnuto +Oldest Save = Oldest save +PSP Model = Model PSP +PSP Settings = Nastavení PSP +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Record audio +Record Display = Record display +Reset Recording on Save/Load State = Reset recording on Save/Load state +Restore Default Settings = Obnovit výchozí nastavení PPSSPP +Rewind Snapshot Frequency = Četnost snímků přetočení (žrout paměti) +Save path in installed.txt = Cesta pro uložení dat je installed.txt +Save path in My Documents = Cesta pro uložení dat je v Dokumentech +Savestate Slot = Pozice uložené hry +Savestate slot backups = Savestate slot backups +Screenshots as PNG = Ukládat snímky obrazovky ve formátu PNG +Set UI background... = Set UI background... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Simulovat zpoždění UMD +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Úložiště je plné +Sustained performance mode = Sustained performance mode +Time Format = Formát času +UI = Uživatelské rozhraní +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) +Use O to confirm = Použít O jako tlačítko potvrzení +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = Použít X jako tlačítko potvrzení +VersionCheck = Zkontrolovat dostupnost nové verze PPSSPP +WARNING: Android battery save mode is on = WARNING: Android battery save mode is On +WARNING: Battery save mode is on = WARNING: Battery save mode is on +YYYYMMDD = RRRRMMDD + +[Upgrade] +Details = Details +Dismiss = Později +Download = Stáhnout +New version of PPSSPP available = Je dostupná nová verze PPSSPP diff --git a/assets/lang/da_DK.ini b/assets/lang/da_DK.ini new file mode 100644 index 0000000000..4ad533794b --- /dev/null +++ b/assets/lang/da_DK.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = Lyd backend +AudioBufferingForBluetooth = Bluetooth-venlig buffer (langsommere) +Auto = Automatisk +Device = Device +DSound (compatible) = DirectSound (kompatibel) +Enable Sound = Aktiver lyd +Global volume = Global volume +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = WASAPI (hurtig) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Analog axis sensitivity +Analog Limiter = Analog begrænser +Analog Mapper High End = Analog mapper high-end (axis sensitivity) +Analog Mapper Low End = Analog mapper low-end (om dødzone) +Analog Mapper Mode = Analog mapper mode +Analog Stick = Analog stick +AnalogLimiter Tip = Når den analoge begrænser knap er trykket ned +Auto = Automatisk +Auto-centering analog stick = Auto-centering analog stick +Auto-hide buttons after seconds = Auto-gem knapper efter sekunder +Binds = Binds +Button Opacity = Knapgennemsigtighed +Button style = Knap stil +Calibrate D-Pad = Kalibrer +Calibration = Kalibrering +Classic = Klassisk +Combo Key Setting = Combo key indstillinger +Combo Key Setup = Combo key opsætning +Confine Mouse = Begræns mus indenfor vindue/skærmområde +Control Mapping = Ændre tasteplaceringen +Custom layout... = Tilpas layout... +Customize tilt = Tilpas tilt... +D-PAD = D-Pad +Deadzone Radius = Dødzone radius +DInput Analog Settings = DInput analog settings +Disable D-Pad diagonals (4-way touch) = Deaktiver D-Pad diagonaler (4-vejs touch) +Glowing borders = Glowing borders +HapticFeedback = Haptisk feedback (vibration) +Ignore gamepads when not focused = Ignorer gamepads når ikke i fokus +Ignore Windows Key = Ignorer Windows taste +Invert Axes = Omvendte akser +Invert Tilt along X axis = Omvendt tilt langs X aksen +Invert Tilt along Y axis = Omvendt tilt langs Y aksen +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Tastaturindstillinger +L/R Trigger Buttons = L/R trigger knapper +Landscape = Landskab +Landscape Auto = Landscape auto +Landscape Reversed = Omvendt landskab +Mouse = Instillinger af mus +Mouse sensitivity = Følsomhed af muss +Mouse smoothing = Udjævning af mus +MouseControl Tip = Du kan nu mappe musen i kontrol mapningsskærmen ved at trykke på 'M' ikonet. +None (Disabled) = Ingen (deaktiveret) +Off = Slukket +OnScreen = Touch billedskærmsknapper +Portrait = Portræt +Portrait Reversed = Omvendt portræt +PSP Action Buttons = PSP action knapper +Screen Rotation = Skærm rotation +seconds, 0 : off = sekunder, 0 = slukket +Sensitivity = Følsomhed +Show right analog = Show right analog +Show Touch Pause Menu Button = Vis pause menu knap +Thin borders = Tynde rammer +Tilt Base Radius = Tilt base radius +Tilt Input Type = Tilt input type +Tilt Sensitivity along X axis = Tilt følsomhed langs X aksen +Tilt Sensitivity along Y axis = Tilt følsomhed langs Y aksen +To Calibrate = Hold enheden på flad overflade for at kalibrere og tryk på "Kalibrer". +Touch Control Visibility = Touch kontrol synlighed +Use custom right analog = Use custom right analog +Use Mouse Control = Brug musekontol +Visibility = Synlighed +X = X +X + Y = X + Y +XInput Analog Settings = XInput analog indstillinger +Y = Y + +[CwCheats] +Cheats = Snyd +Edit Cheat File = Editer snydefil +Enable/Disable All = Aktiver/Deaktiver alle snyd +Import Cheats = Importer fra cheat.db +Options = Optioner +Refresh Rate = Opdateringsrate + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = &Om PPSSPP... +Auto = &Auto +Backend = Rendering &Backend (Genstarter PPSSPP) +Bicubic = &Bicubisk +Break = Break +Break on Load = Break on load +Buffered Rendering = &Buffered rendering +Buy Gold = Køb PPSSPP &guld +Control Mapping... = &Ændre tasteplaceringen... +Debugging = Fe&jlfind +Deposterize = &Deposterize +Direct3D9 = &Direct3D9 +Direct3D11 = Direct3D11 +Disassembly = &Disassembly... +Discord = Discord +Display Layout Editor = Display layout editor... +Display Rotation = Display rotation +Dump Next Frame to Log = G&em næste frame i loggen +Emulation = &Emulation +Enable Chat = Enable chat +Enable Cheats = Aktiver &snyd +Enable Sound = Aktiver l&yd +Exit = &Afslut +Extract File... = U&dpak fil... +File = &Fil +Frame Skipping = &Frame skipping +Frame Skipping Type = Frame skipping type +Fullscreen = Fu&ldskærm +Game Settings = &Spilindstillinger +GE Debugger... = GE debugge&r... +GitHub = GitHub +Hardware Transform = &Hardware transformering +Help = &Hjælp +Hybrid = &Hybrid +Hybrid + Bicubic = H&ybrid + Bicubisk +Ignore Illegal Reads/Writes = &Ignorer ulovlige læsninger/skrivninger +Ignore Windows Key = Ignorer Windows taste +Keep PPSSPP On Top = &PPSSPP altid i forgrunden +Landscape = Landscape +Landscape reversed = Landscape reversed +Language... = S&prog... +Linear = &Lineær +Load = &Hent... +Load .sym File... = &Hent .sym fil... +Load Map File... = Hent m&ap fil... +Load State = He&nt spil-status +Load State File... = Hen&t spil-status fil... +Log Console = &Log konsol +Memory View... = Hukommelseso&versigt... +More Settings... = &Flere indstillinger... +Nearest = &Nærmest +Non-Buffered Rendering = &Skip buffer effekter (ikke-bufferet, hurtigere) +Off = &Slukket +Open Directory... = &Åben katalog... +Open from MS:/PSP/GAME... = Å&ben fra MS:/PSP/GAME... +Open Memory Stick = Åben h&ukommelsesstick +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = &Pause +Pause When Not Focused = P&ause når ikke i fokus +Portrait = Portræt +Portrait reversed = Omvendt portræt +Postprocessing Shader = Efterbehandlin&gs shader +PPSSPP Forums = PPSSPP &forum +Record = Optag +Record Audio = Optag Lyd +Record Display = Optag Skærm +Rendering Mode = Rendering t&ilstand +Rendering Resolution = &Render opløsning +Reset = &Nulstil +Reset Symbol Table = Nulstil s&ymboltabel +Run = &Kør +Save .sym File... = Ge&m .sym fil... +Save Map File... = &Gem map fil... +Save State = &Gem spil-status +Save State File... = Gem &spil-status fil... +Savestate Slot = &Lagerplads for spil-status +Screen Scaling Filter = Skæ&rmskaleringafilter +Show Debug Statistics = &Vis fejlfindingsstatistik +Show FPS Counter = Vis &FPS +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = &Stop +Switch UMD = Skift UMD +Take Screenshot = &Tag skærmdump +Texture Filtering = Te&xturfilter +Texture Scaling = &Texturskalering +Use Lossless Video Codec (FFV1) = Brug Tabsfri Video Codec (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = &Vertexcache +VSync = VS&ync +Vulkan = Vulkan +Window Size = &Vinduesstørrelse +www.ppsspp.org = Besøg www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allocator viewer (Vulkan) +Allow remote debugger = Allow remote debugger +Backspace = Backspace +Block address = Bloker adresse +By Address = Efter adresse +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Opret/Åben textures.ini fil for aktuelle spil +Current = Aktuelle +Dev Tools = Development tools +DevMenu = DevMenu +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Dump dekrypteret EBOOT.BIN ved spil boot +Dump Frame GPU Commands = Drop frame GPU kommandoer +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Aktiver fejlfindingslogning +Enter address = Indtast adresse +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Frame profiler +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = Jit sammenlign +JIT debug tools = JIT debug tools +Language = Sprog +Load language ini = Hent sprog ini +Log Dropped Frame Statistics = Log Droppede Frames Statistik +Log Level = Logniveau +Log View = Log visning +Logging Channels = Logkanaler +Next = Næste +No block = Ingen blokering +Prev = Forrige +Random = Tilfældig +Replace textures = Erstat textures +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Er du sikker på at du vil sætte indstillinger tilbage til standard?\nIndstilling af tasteplacering ændres ikke.\n\n\nDu kan ikke fortryde.\nGenstart venligst PPSSPP for at ændringer aktiveres. +RestoreGameDefaultSettings = Er du sikker på at du vil nustille de spilspecifikke\nindstillinger tilbage til standard? +Resume = Resume +Run CPU Tests = Kør CPU test +Save language ini = Gem sprog ini +Save new textures = Gem nye textures +Shader Viewer = Shader viewer +Show Developer Menu = Vis udviklermenu +Show on-screen messages = Show on-screen messages +Stats = Stats +System Information = System information +Texture Replacement = Texture Erstatning +Toggle Audio Debug = Toggle audio debug +Toggle Freeze = Skift freeze +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP res +Active = Active +Back = Tilbage +Cancel = Annuler +Center = Center +ChangingGPUBackends = Det er nødvendigt at genstarte PPSSPP for at ændre GPU backend. Genstart nu? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = Vælg hvilken folder PPSSPP gemmer i +Confirm Overwrite = Vil du overskrive dette data? +Confirm Save = Vil du gemme dette data? +ConfirmLoad = Hent dette data? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Slet +Delete all = Slet alt +Delete completed = Slettet. +DeleteConfirm = Alt gemt data vil blive slettet.\nEr du sikker på at du vil fortsætte? +DeleteConfirmAll = Vil du virkelig slette alle\nspil-status for dette spil? +DeleteConfirmGame = Vil du virkelig slette dette spil\nfra din enhed? Du kan ikke fortryde. +DeleteConfirmGameConfig = Vil du virkelig slette opsætningen for dette spil? +DeleteFailed = Ikke muligt at slette data. +Deleting = Sletter\nVent venligst... +Disable All = Disable all +Edit = Edit +Enable All = Enable all +Enter = Enter +Finish = Slut +Grid = Grid +Inactive = Inactive +InternalError = An internal error has occurred. +Load = Hent +Load completed = Hentet. +Loading = Henter\nVent venligst... +LoadingFailed = Ikke muligt at indlæse data. +Move = Flyt +Network Connection = Netværksforbindelse +NEW DATA = NY DATA +No = Nej +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = OK +Old savedata detected = Gamle savedata fundet +Options = Optioner +Reset = Nulstil +Resize = Størrelse +Retry = Prøv igen +Save = Gem +Save completed = Gemt. +Saving = Gemmer\nVent venligst... +SavingFailed = Ikke muligt at gemme data. +Select = Vælg +Shift = Shift +Snap = Snap +Space = Space +SSID = SSID +Submit = Indsend +Supported = Supported +There is no data = Der findes ingen data. +Toggle All = Skift alle +Toggle List = Toggle list +Unsupported = Unsupported +When you save, it will load on a PSP, but not an older PPSSPP = Når du gemmer vil det kunne hentes på en PSP men ikke på en ældre PPSSPP +When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Yes = Ja +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = Fil er pakket (7z).\nPak venligst ud først (prøv 7-Zip eller WinRAR). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = Kunne ikke gemme skærmbilledefilen. +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll not found. Please install. Or press Yes to try again using Direct3D 9 instead. +D3D11InitializationError = Direct3D 11 initialization error +D3D11Missing = Your operating system version does not include D3D11. Please run Windows Update.\n\nPress Yes to try again using Direct3D 9 instead. +D3D11NotSupported = Your GPU does not appear to support Direct3D 11.\n\nWould you like to try again using Direct3D 9 instead? +Disk full while writing data = Disk fuld imens data skrives. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = Fejl ved hentning af fil: +Error reading file = Fejl ved læsning af fil. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = Kunne ikke identificere fil. +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Kunne ikke initialisere grafik. Prøv at opdatere dine grafikdrivere og DirectX 9 runtime.\n\nVil du prøve at skifte til OpenGL?\n\nFejlbesked: +GenericGraphicsError = Grafikfejl +GenericOpenGLError = Kunne ikke initialisere grafik. Prøv at opdatere dine grafikdrivere.\n\nVil du prøve at skifte til DirectX 9?\n\nFejlbesked: +GenericVulkanError = Kunne ikke initialisere grafik. Prøv at opdatere dine grafikdrivere.\n\nVil du prøve at skifte til OpenGL?\n\nFejlbesked: +InsufficientOpenGLDriver = Ikke tilstrækkelig OpenGL driver understøttelse detekteret!\n\nDin GPU rapporterer at den ikke supporterer OpenGL 2.0, hvilket er nødvendigt for at PPSSPP kan køre.\n\nKontroller at din GPU er kompatibel med OpenGL 2.0. Hvis den er, skal du finde og installere en ny grafik driver fra din GPU leverandørs website.\n\nBesøg forummet på https://forums.ppsspp.org for at få mere information. +Just a directory. = Kun et katalog. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = Ingen EBOOT.PBP, fejlidentificerede spil. +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = OpenGL driver fejl +PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP supporterer i øjeblikket ikke forbindelser til internettet for DLC, PSN, eller spilopdateringer. +PS1 EBOOTs are not supported by PPSSPP. = PS1 EBOOTs er ikke supporteret af PPSSPP. +PSX game image detected. = Fil er et MODE2 image. PPSSPP supporterer ikke PS1 spil. +RAR file detected (Require UnRAR) = Fil er pakket (RAR).\nPak venligst ud først (prøv UnRAR). +RAR file detected (Require WINRAR) = Fil er pakket (RAR).\nPak venligst ud først (prøv WinRAR). +Running slow: try frameskip, sound is choppy when slow = Kører langsomt: prøv frameskip, lyd hakker når langsom +Running slow: Try turning off Software Rendering = Running slow: try turning off "software rendering" +Save encryption failed. This save won't work on real PSP = Save encryption failed. This save won't work on real PSP +textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +This is a saved state, not a game. = This is a saved state, not a game. +This is save data, not a game. = This is save data, not a game. +Unable to create cheat file, disk may be full = Ikke muligt at oprette snydefil, disken kan være fuld. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Kunne ikke gemme data, disk kan være fuld. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Advarsel: Video hukommelse er FULD, reducerer opskalering og skifter til langsom caching tilstand. +Warning: Video memory FULL, switching to slow caching mode = Advarsel: Video hukommelse er FULD, skifter til langsom caching tilstand. +ZIP file detected (Require UnRAR) = Fil er pakket (ZIP).\nPak venligst ud først (prøv UnRAR). +ZIP file detected (Require WINRAR) = Fil er pakket (ZIP).\nPak venligst ud først (prøv WinRAR). + +[Game] +Asia = Asien +ConfirmDelete = Slet +Create Game Config = Opret data konfiguration +Create Shortcut = Opret genvej +Delete Game = Slet spil +Delete Game Config = Slet data konfiguration +Delete Save Data = Slet gemt data +Europe = Europa +Game = Spil +Game Settings = Spilindstillinger +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Data install +Japan = Japan +Korea = Korea +MB = MB +One moment please... = Et øjeblik... +Play = Spil +Remove From Recent = Fjern fra "Nylige" +SaveData = Gem data +Setting Background = Setting background +Show In Folder = Vis i katalog +USA = USA +Use UI background = Brug UI baggrund + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = unlimited +(supersampling) = (supersampling) +(upscaling) = (upscaling) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Aggressiv +Alternative Speed = Alternativ hastighed (i %, 0 = ubegrænset) +Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Anisotropic Filtering = Anisotropisk filtrering +Auto = Automatisk +Auto (1:1) = Automatisk (1:1) +Auto (same as Rendering) = Automatisk (Samme som renderingsopløsning) +Auto FrameSkip = Automatisk frameskip +Auto Scaling = Auto scaling +Backend = Backend +Balanced = Balanceret +Bicubic = Bicubisk +BlockTransfer Tip = Nogle spil kræver at denne er tændt for korrekt grafik +BlockTransferRequired = Advarsel: Dette spil kræver at simulerede blok overførsel tilstand er tændt. +Both = Begge +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Bufferet rendering +BufferedRenderingRequired = Warning: This game requires "rendering mode" to be set to "buffered". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Skærmstørrelse (i % af the visningsfeltet) +Cardboard Screen X Shift = X skift (i % af det ugyldige) +Cardboard Screen Y Shift = Y skift (i % af det ugyldige) +Cardboard VR Settings = Google Cardboard VR indstillinger +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU core +Debugging = Fejlfinding +DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. +Deposterize = Deposterize +Deposterize Tip = Retter visuel banding fejl in opskalerede textures +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Deaktiver langsommere effekter (hurtigere) +Disabled = Disabled +Display layout editor = Display layout editor +Display Resolution (HW scaler) = Skærmopløsning (HW scaler) +Dump next frame to log = Gem næste frame i loggen +Enable Cardboard VR = Enable Cardboard VR +FPS = FPS +Frame Rate Control = Frameratekontrol +Frame Skipping = Frameskipping +Frame Skipping Type = Frame skipping type +FullScreen = Fuldskærm +Hack Settings = Hack indstillinger (kan give fejl) +Hardware Tessellation = Hardware tessellation +Hardware Transform = Hardware transformering +hardware transform error - falling back to software = Hardware transform fejl, falder tilbage til software +HardwareTessellation Tip = Bruger hardware til at lave kurver, bruger altid fast kvalitet +High = Høj +Hybrid = Hybrid +Hybrid + Bicubic = Hybrid + Bicubisk +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Intern opløsning +Lazy texture caching = Træg textur caching (hurtigere) +Linear = Lineær +Low = Lav +LowCurves = Simple spline og bezier-kurver (hurtigere) +LowCurves Tip = Bruges kun af nogle spil, kontrollerer glathed af kurver +Lower resolution for effects (reduces artifacts) = Lavere opløsning for effekter (reducerer artefakter) +Manual Scaling = Manuel scaling +Medium = Medium +Mode = Tilstand +Must Restart = Du må genstarte PPSSPP for at aktivere denne ændring. +Native device resolution = Standard enheds opløsning +Nearest = Nærmest +No buffer = No buffer +Non-Buffered Rendering = Skip buffer effekter (ikke-buffered, hurtigere) +None = Ingen +Number of Frames = Number of frames +Off = Slukket +OpenGL = OpenGL +Overlay Information = Overlay information +Partial Stretch = Delvis strukket +Percent of FPS = Percent of FPS +Performance = Ydelse +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Efterbehandlings shader +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = Rendering tilstand +Rendering Resolution = Render opløsning +RenderingMode NonBuffered Tip = Hurtigere, men intet vises i nogle spil +Retain changed textures = Behold ændrede textures (nogle gange langsommere) +RetainChangedTextures Tip = Gør mange spil langsommere, men nogle spil er meget hurtigere +Rotation = Rotation +Safe = Sikker +Screen layout = Screen layout +Screen Scaling Filter = Skærmskaleringsfilter +Show Debug Statistics = Vis debugstatistik +Show FPS Counter = Vis FPS +Simulate Block Transfer = Simuler blokoverførsel effekter +SoftGPU Tip = Meget langsom i øjeblikket +Software Rendering = Software rendering (eksperiment) +Software Skinning = Software skinning +SoftwareSkinning Tip = Kombiner begrænset model tegning af CPU, hurtigere i fleste spil +Speed = Hastighed +Stretching = Stretching +Texture Filter = Texturfilter +Texture Filtering = Texturfiltrering +Texture Scaling = Texturskalering +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Turn off "hardware tessellation": unsupported +Unlimited = Ubegrænset +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = Opskaleringsniveau +Upscale Type = Opskaleringstype +UpscaleLevel Tip = CPU tung - noget skallering kan belive forsinket for at undgå flimmer +Use all displays = Use all displays +Vertex Cache = Vertexcache +VertexCache Tip = Hurtigere, men kan medføre midlertidig flimmer +VSync = VSync +Vulkan = Vulkan +Window Size = Vinduesstørrelse +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Slet ZIP fil +Install = Installer +Install game from ZIP file? = Installer spil fra ZIP fil? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = Installeret! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = Autokonfigration +Autoconfigure for device = Autokonfiguration af enhed +Clear All = Slet alt +Default All = Sæt til standard +Map a new key for = Map en ny taste for +Map Key = Map key +Map Mouse = Map mouse +Test Analogs = Test analoge +You can press ESC to cancel. = Du kan trykke Esc for at afbryde. + +[MainMenu] +Browse = Gennemse... +Buy PPSSPP Gold = Buy PPSSPP Gold +Choose folder = Choose folder +Credits = Om PPSSPP +PPSSPP Homebrew Store = PPSSPP homebrew butik +Exit = Afslut +Game Settings = Indstillinger +Games = Spil +Give PPSSPP permission to access storage = Giv PPSSPP adgang til at tilgå lager +Homebrew & Demos = Homebrew og Demoer +How to get games = Hvordan man skaffer spil +How to get homebrew & demos = Hvordan man skaffer homebrew og demoer +Load = Hent... +Loading... = Loading... +PinPath = Pin +PPSSPP can't load games or save right now = PPSSPP kan ikke indlæse spil eller gemme lige nu +Recent = Nylig +SavesAreTemporary = PPSSPP is saving in temporary storage +SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently +SavesAreTemporaryIgnore = Ignore warning +UnpinPath = Unpin +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Lyd +Controls = Betjening +Graphics = Grafik +Networking = Netværk +System = System +Tools = Tools + +[MappableControls] +Alt speed 1 = Alt speed 1 +Alt speed 2 = Alt speed 2 +An.Down = Analog ned +An.Left = Analog venstre +An.Right = Analog højre +An.Up = Analog op +Analog limiter = Analog begrænser +Analog Stick = Analogstick +Audio/Video Recording = Audio/Video recording +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Ombyt akser +Circle = Circle +Cross = Cross +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = DevMenu +Down = Dpad ned +Dpad = Dpad +Frame Advance = Frame Fremad +Hold = Hold +Home = Home +L = L +Left = Dpad venstre +Load State = Hent spil-status +Mute toggle = Mute toggle +Next Slot = Næste Slot +None = None +Note = Note +OpenChat = Open chat +Pause = Pause +R = R +RapidFire = Hurtigskydning +Remote hold = Remote hold +Rewind = Spol tilbage +Right = Dpad højre +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = HøjreAn.Ned +RightAn.Left = HøjreAn.Venstre +RightAn.Right = HøjreAn.Højre +RightAn.Up = HøjreAn.Op +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Gem spil-status +Screen = Screen +Screenshot = Screenshot +Select = Select +SpeedToggle = Ændre hastighed +Square = Square +Start = Start +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = Toggle fullscreen +Toggle mode = Toggle mode +Triangle = Triangle +Unthrottle = Turbo +Up = Dpad op +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Besøg Ad Hoc Multiplayer forum +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Ændre MAC adressen +Change proAdhocServer Address = Ændre PRO ad hoc server IP adresse (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Tillad indbygget PRO ad hoc server +Enable network chat = Enable network chat +Enable networking = Aktiver netværk/WLAN (beta, kan ødelægge spilafvikling) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Netværk er initialiseret +Please change your Port Offset = Please change your port offset +Port offset = Port offset(0 = PSP kompatibilitet) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Send Discord "Rich Presence" information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = Snyd +Continue = Fortsæt +Create Game Config = Opret spilkonfiguration +Delete Game Config = Slet spilkonfiguration +Exit to menu = Hovedmenu +Game Settings = Spilindstillinger +Load State = Hent spil-status +Rewind = Spol tilbage +Save State = Gem spil-status +Settings = Indstillinger +Switch UMD = Skift UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Color +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Tegnefilm +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT scanlinier +FXAA = FXAA Antialiasing +Gamma = Gamma +Grayscale = Gråskala +Intensity = Intensity +InverseColors = Inverterede farver +Natural = Naturlige farver +NaturalA = Natural Colors (no blur) +Off = Slukket +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlinier (CRT) +Sharpen = Gør skarpere +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 opskalere +VideoSmoothingAA = VideoSmoothingAA +Vignette = Vignette + +[PSPCredits] +all the forum mods = all the forum mods +build server = build server +Buy Gold = Køb PPSSPP guld +check = Se også Dolphin, den bedste tilgængelige Wii/GC emulator: +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = Bidragsydere: +created = Udviklet af +Discord = Discord +info1 = PPSSPP er kun tiltænkt uddannelsesmæssige formål. +info2 = Vær sikker på at du ejer rettighederne til alle spil +info3 = du spiller ved at eje UMD'en eller ved at købe den digitale +info4 = download fra PSN butikken fra din rigtige PSP. +info5 = PSP er et varemærke af Sony, Inc. +iOS builds = iOS builds +license = Frit software under GPL 2.0+ +list = kompatibilitetslister, fora, og udviklerinfo +PPSSPP Forums = PPSSPP forum +Privacy Policy = Privacy policy +Share PPSSPP = Del PPSSPP +specialthanks = Særlig tak til: +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = denne oversættelse er udført af: +title = En hurtig og portabel PSP emulator +tools = Anvendte frie værktøjer: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = coestergaard +translators2 = +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Mere info på webside: +written = Skrevet i C++ for hastighed og portabilitet + +[RemoteISO] +Browse Games = Browse games +Local Server Port = Local server port +Manual Mode Client = Manual mode client +Remote disc streaming = Remote disc streaming +Remote Port = Remote port +Remote Server = Remote server +Remote Subdirectory = Remote subdirectory +RemoteISODesc = Games in your recent list will be shared +RemoteISOLoading = Connected, loading game list... +RemoteISOScanning = Scanning... Click "share games" on your server device +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Note: Connect both devices to the same Wi-Fi network +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Settings +Share Games (Server) = Share games (server) +Share on PPSSPP startup = Share on PPSSPP startup +Stop Sharing = Stop sharing +Stopping.. = Stopping... + +[Reporting] +Bad = Dårlig +FeedbackDelayInfo = Dine data indsendes i baggrunden. +FeedbackDesc = Hvordan er emulateringen? Lad os og gruppen vide det! +FeedbackDisabled = Compatibility server reports must be enabled. +FeedbackIncludeCRC = Note: Battery will be used to send a disc CRC +FeedbackIncludeScreen = Include a screenshot +FeedbackSubmitDone = Dine data er blevet indsendt. +FeedbackSubmitFail = Kunne ikke indsende data til server. Prøv at opdatere PPSSPP. +FeedbackThanks = Tak for din feedback. +Gameplay = Gameplay +Graphics = Grafik +Great = Fantastisk +In-game = In-game +In-game Description = Kommer ind i spillet, men for fejlfyldt til at afslutte det +Menu/Intro = Menu/Intro +Menu/Intro Description = "Kan ikke komme ind i selve spillet" +Nothing = Ingenting +Nothing Description = Fuldstænding istykker +OK = OK +Open Browser = Åben browser +Overall = Overordnet +Perfect = Perfekt +Perfect Description = Fejlfri emulation for hele spillet - fantastisk! +Plays = Spiller +Plays Description = Fuldt spilbart men kan have små fejl +ReportButton = Raporter feedback +Speed = Hastighed +Submit Feedback = Send feedback +SuggestionConfig = See reports on website for good settings. +SuggestionCPUSpeed0 = Disable locked CPU speed setting. +SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this bug). +SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. +SuggestionsNone = This game isn't working for other users too. +SuggestionsWaiting = Submitting and checking other users feedback... +SuggestionUpgrade = Upgrade to a newer PPSSPP build. +SuggestionVerifyDisc = Check your ISO is a good copy of your disc. +Unselected Overall Description = Hvor godt emuleres spillet? +View Feedback = Se feedback + +[Savedata] +Date = Date +Filename = Filename +No screenshot = No screenshot +None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Save Data = Save data +Save States = Save states +Savedata Manager = Savedata manager +Size = Size + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = ADVARSEL: Chainfire3D detekteret, kan give problemer +Failed to load state = Kunne ikke hente tilstand +Failed to save state = Kunne ikke gemme tilstand +fixed = Hastighed: fast +GLToolsWarning = ADVARSEL: GLTools detekteret, kan give problemer +In menu = In menu +Load savestate failed = Hentning af spil-status fejlede +Loaded State = Indlæste status +Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +LoadStateDoesntExist = Kunne ikke hente status: Spil-status eksisterer ikke! +LoadStateWrongVersion = Kunne ikke hente stauts: Spil-status er for en ældre version af PPSSPP! +norewind = Ingen status for fortrydelse er tilgængelig. +Playing = Playing +PressESC = Tryk ESC for at åbne pause menu. +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = Kunne ikke gemme status! +Saved State = Gemte status +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Speed: alternate 2 +standard = Hastighed: standard +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = Allerede installeret +Connection Error = Forbindelsesfejl +Install = Installer +Launch Game = Start spil +Loading... = Henter... +MB = MB +Size = Størrelse +Uninstall = Afinstaller + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d cores) +%d bytes = %d bytes +(none detected) = (none detected) +3D API = 3D API +ABI = ABI +API Version = API version +Audio Information = Audio information +Board = Board +Build Config = Build config +Build Configuration = Build Configuration +Built by = Built by +Core Context = Core context +Cores = Cores +CPU Extensions = CPU extensions +CPU Information = CPU information +CPU Name = Name +D3DCompiler Version = D3DCompiler version +Debug = Debug +Debugger Present = Debugger present +Device Info = Device info +Display Information = Display information +Driver Version = Driver version +EGL Extensions = EGL extensions +Frames per buffer = Frames per buffer +GPU Information = GPU information +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Lang/Region +Memory Page Size = Memory page size +Native Resolution = Native resolution +OGL Extensions = OGL extensions +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 extensions +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 extensions +OpenGL Extensions = OpenGL extensions +Optimal frames per buffer = Optimal frames per buffer +Optimal sample rate = Optimal sample rate +OS Information = OS information +PPSSPP build = PPSSPP build +Refresh rate = Refresh rate +Release = Release +RW/RX exclusive = RW/RX exclusive +Sample rate = Sample rate +Shading Language = Shading language +Sustained perf mode = Sustained perf mode +System Information = System information +System Name = Name +System Version = System version +Threads = Threads +Vendor = Vendor +Vendor (detected) = Vendor (detected) +Version Information = Version information +Vulkan Extensions = Vulkan extensions +Vulkan Features = Vulkan features + +[System] +(broken) = (ødelagt) +12HR = 12 timer +24HR = 24 timer +Auto = Auto +Auto Load Savestate = Auto load savestate +AVI Dump started. = AVI Dump startet. +AVI Dump stopped. = AVI Dump stoppet. +Cache ISO in RAM = Cache hele ISO i RAM +Change CPU Clock = Ændre emulerede PSPs CPU clock (unstable) +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Ændre kaldenavn +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = Snyd (eksperiment see fora) +Clear Recent = Clear "Recent" +Clear Recent Games List = Slet liste over nylige spil +Clear UI background = Fjern UI baggrund +Confirmation Button = Bekræftelsesknap +Date Format = Datoformat +Day Light Saving = Sommertid +DDMMYYYY = DDMMYYYY +Decrease size = Decrease size +Developer Tools = Udvikler værktøjer +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emulation +Enable Cheats = Tillad snyd +Enable Compatibility Server Reports = Send kompatibilitetsrapporter +Failed to load state. Error in the file system. = Kunne ikke indlæse tilstand. Fejl i filsystemet. +Failed to save state. Error in the file system. = Failed to save state. Error in the file system. +Fast (lag on slow storage) = Hurtig (forsinkelser på langsomt lager) +Fast Memory = Hurtig hukommelse (ustabil) +Force real clock sync (slower, less lag) = Tving rigtig clock sync (langsommere, færre forsinkelser) +frames, 0:off = frames, 0 = off +Games list settings = Games list settings +General = Generel +Grid icon size = Grid icon size +Help the PPSSPP team = Hjælp PPSSPP holdet +Host (bugs, less lag) = Host (fejl, færre forsinkelser) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Fortolker +IO timing method = I/O timing metode +IR Interpreter = IR Interpreter +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = Hukommelsesstik indsat +MHz, 0:default = MHz, 0 = standard +MMDDYYYY = MMDDYYYY +Newest Save = Newest save +Not a PSP game = Not a PSP game +Off = Off +Oldest Save = Oldest save +PSP Model = PSP model +PSP Settings = PSP indstillinger +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Optag lyd +Record Display = Optag skærm +Reset Recording on Save/Load State = Reset recording on Save/Load state +Restore Default Settings = Sæt PPSSPP's indstillinger tilbage til standard +Rewind Snapshot Frequency = Tilbagespol snapshot frekvens (mem hog) +Save path in installed.txt = Gem sti i installed.txt +Save path in My Documents = Gem sti i Mine Dokumenter +Savestate Slot = Lagerplads for spil-status +Savestate slot backups = Savestate slot backups +Screenshots as PNG = Gem skærmdumps i PNG format +Set UI background... = Sæt UI baggrund... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Simuler UMD forsinkelser +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Storage full +Sustained performance mode = Sustained performance mode +Time Format = Tidsformat +UI = UI +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Brug tabsfri Video Codec (FFV1) +Use O to confirm = Brug O som bekræftelsesknap +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = Brug X som bekræftelsesknap +VersionCheck = Søg efter ny version af PPSSPP +WARNING: Android battery save mode is on = WARNING: Android battery save mode is On +WARNING: Battery save mode is on = WARNING: Battery save mode is on +YYYYMMDD = YYYYMMDD + +[Upgrade] +Details = Details +Dismiss = Afvis +Download = Download +New version of PPSSPP available = Ny version af PPSSPP tilgængelig diff --git a/assets/lang/de_DE.ini b/assets/lang/de_DE.ini new file mode 100644 index 0000000000..bafb9ea409 --- /dev/null +++ b/assets/lang/de_DE.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Lautstärke für wechselnde Geschwindigkeit/Turbo +Audio backend = Ton-Backend (Neustart erforderlich) +AudioBufferingForBluetooth = Bluetooth-freundliche Pufferung (langsamer) +Auto = Automatisch +Device = Gerät +DSound (compatible) = DirectSound (kompatibel) +Enable Sound = Ton einschalten +Global volume = Lautstärke +Microphone = Microphone +Microphone Device = Microphone device +Mute = Stumm +Switch on new audio device = Neues Tonausgabegerät anschalten +Use global volume = Benutze globale Lautstärke +WASAPI (fast) = WASAPI (schnell) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Empfindlichkeit der Analogachsen +Analog Limiter = Analogbegrenzer +Analog Mapper High End = Empfindlichkeit der Achsen +Analog Mapper Low End = Tote Zone umkehren +Analog Mapper Mode = Analogstick Achsen +Analog Stick = Analogstick +AnalogLimiter Tip = Wenn die Analogbegrenzer-Taste gedrückt ist +Auto = Automatisch +Auto-centering analog stick = Analogstick automatisch zentrieren +Auto-hide buttons after seconds = Steuerung ausblenden nach ... +Binds = Binds +Button Opacity = Tastentransparenz +Button style = Tastenstil +Calibrate D-Pad = Kalibriere Steuerkreuz +Calibration = Kalibrierung +Classic = Klassisch +Combo Key Setting = Kombo-Tasten Einstellung +Combo Key Setup = Kombo-Tasten Setup +Confine Mouse = Maus in Fenster/sichtbaren Bereich einsperren +Control Mapping = Tastenbelegung ändern +Custom layout... = Layout anpassen +Customize tilt = Neigung anpassen +D-PAD = Steuerkreuz +Deadzone Radius = Radius für tote Zone +DInput Analog Settings = DInput Analog Einstellungen +Disable D-Pad diagonals (4-way touch) = Deaktiviere D-Pad Diagonalen (4-Wege-Touch) +Glowing borders = Leuchtende Ränder +HapticFeedback = Haptisches Feedback (Vibration) +Ignore gamepads when not focused = Ignoriere Gamepads falls nicht fokusiert +Ignore Windows Key = Ignoriere Windowstaste +Invert Axes = Invertiere Achsen +Invert Tilt along X axis = Invertiere Neigen über X-Achse +Invert Tilt along Y axis = Invertiere Neigen über Y-Achse +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Tastatureinstellungen +L/R Trigger Buttons = L/R Schultertasten +Landscape = Querformat +Landscape Auto = Querformat auto +Landscape Reversed = Querformat umgekehrt +Mouse = Einstellung für Maussteuerung +Mouse sensitivity = Mausempfindlichkeit +Mouse smoothing = Mausglättung +MouseControl Tip = Nun können Sie in der Tastenbelegung die Maustasten benutzen in dem Sie auf das 'M' Symbol klicken. +None (Disabled) = Kein (Deaktiviert) +Off = Aus +OnScreen = Touch Bildschirmtasten +Portrait = Hochformat +Portrait Reversed = Hochformat umgekehrt +PSP Action Buttons = PSP Aktionstasten +Screen Rotation = Bildschirmausrichtung +seconds, 0 : off = Sekunden, 0 = Aus +Sensitivity = Empfindlichkeit +Show right analog = Show right analog +Show Touch Pause Menu Button = Zeige Pause-Taste +Thin borders = Dünne Ränder +Tilt Base Radius = Tilt base radius +Tilt Input Type = Eingabetyp für Neigen +Tilt Sensitivity along X axis = Neigungsempfindlichkeit über X-Achse +Tilt Sensitivity along Y axis = Neigungsempfindlichkeit über Y-Achse +To Calibrate = Für eine Kalibrierung legen Sie ihr Gerät auf eine flache Oberfläche und drücken "Kalibrieren". +Touch Control Visibility = Sichtbarkeit der Touchsteuerung +Use custom right analog = Use custom right analog +Use Mouse Control = Benutze Maussteuerung +Visibility = Sichtbarkeit +X = X +X + Y = X + Y +XInput Analog Settings = XInput Analog Einstellungen +Y = Y + +[CwCheats] +Cheats = Cheats +Edit Cheat File = Cheatdatei ändern +Enable/Disable All = Alle (de)aktivieren +Import Cheats = Cheats importieren (aus cheat.db) +Options = Optionen +Refresh Rate = Wiederholfrequenz + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +Font = Roboto Condensed +About PPSSPP... = Über PPSSPP... +Auto = Automatisch +Backend = Grafik-Backend +Bicubic = Bikubisch +Break = Anhalten +Break on Load = Anhalten beim Laden +Buffered Rendering = Gepuffertes Rendern +Buy Gold = Goldversion kaufen +Control Mapping... = Tastenbelegung ändern... +Debugging = Debug +Deposterize = Tonwertverschmelzung +Direct3D9 = Direct3D9 +Direct3D11 = Direct3D11 +Disassembly = Disassembler... +Discord = Discord +Display Layout Editor = Bildschirmlayout Editor... +Display Rotation = Bildschirmdrehung +Dump Next Frame to Log = Nächsten Frame im Log speichern +Emulation = Emulation +Enable Chat = Enable chat +Enable Cheats = Cheats aktivieren +Enable Sound = Ton einschalten +Exit = Beenden +Extract File... = Datei entpacken... +File = Datei +Frame Skipping = Bilder überspringen +Frame Skipping Type = Typ für Bilder überspringen +Fullscreen = Vollbild +Game Settings = Einstellungen +GE Debugger... = GE Debugger... +GitHub = GitHub +Hardware Transform = Hardware Transformierung +Help = Hilfe +Hybrid = Hybrid +Hybrid + Bicubic = Hybrid + Bikubisch +Ignore Illegal Reads/Writes = Ignoriere ungültiges Lesen/Schreiben +Ignore Windows Key = Ignoriere Windowstaste +Keep PPSSPP On Top = PPSSPP immer im Vordergrund +Landscape = Querformat +Landscape reversed = Querformat umgedreht +Language... = Sprache... +Linear = Linear +Load = Laden +Load .sym File... = Lade .sym Datei... +Load Map File... = Lade Map-Datei... +Load State = Stand laden +Load State File... = Lade Spielstanddatei... +Log Console = Logkonsole +Memory View... = Speicheransicht... +More Settings... = Mehr Einstellungen... +Nearest = Nächster Nachbar +Non-Buffered Rendering = Über&springe Puffereffekte (ungepuffert, schneller) +Off = Aus +Open Directory... = Öffne Verzeichnis... +Open from MS:/PSP/GAME... = Öffne aus MS:/PSP/GAME... +Open Memory Stick = Öffne Memorystick +Open New Instance = Open new instance +OpenGL = OpenGL +Pause = Pause +Pause When Not Focused = Pausieren im Hintergrund +Portrait = Hochformat +Portrait reversed = Hochformat umgedreht +Postprocessing Shader = Nachbearbeitungs-Shader +PPSSPP Forums = PPSSPP Forum +Record = Aufzeichnung +Record Audio = Ton aufzeichnen +Record Display = Bildschirm aufzeichnen +Rendering Mode = Rendermodus +Rendering Resolution = Renderauflösung +Reset = Zurücksetzen +Reset Symbol Table = Symboltabelle zurücksetzen +Run = Starten +Save .sym File... = Speichere .sym Datei... +Save Map File... = Speichere Map-Datei... +Save State = Stand speichern +Save State File... = Speichere Spielstanddatei... +Savestate Slot = Speicherplatz +Screen Scaling Filter = Filter für Bildskalierung +Show Debug Statistics = Debugstatistiken anzeigen +Show FPS Counter = FPS anzeigen +Skip Number of Frames = Überspringe Anzahl an Bildern +Skip Percent of FPS = Überspringe Prozent an FPS +Stop = Stop +Switch UMD = UMD wechseln +Take Screenshot = Screenshot aufnehmen +Texture Filtering = Texturfilter +Texture Scaling = Texturskalierung +Use Lossless Video Codec (FFV1) = Benutze verlustfreien Videocodec (FFV1) +Use output buffer for video = Benutze Ausgabepuffer für Video +Vertex Cache = Vertex-Cache +VSync = V-Sync +Vulkan = Vulkan +Window Size = Fenstergröße +www.ppsspp.org = Öffne ppsspp.org +xBRZ = xBRZ + +[Developer] +Allocator Viewer = Allocator viewer (Vulkan) +Allow remote debugger = Erlaube Remote Debugger +Backspace = Rücktaste +Block address = Blockadresse +By Address = Per Adresse +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Erstelle/Öffne textures.ini für aktuelles Spiel +Current = Aktuell +Dev Tools = Entwicklungswerkzeuge +DevMenu = Entwicklermenü +Disabled JIT functionality = Deaktivierte JIT Funktionalität +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Entschlüsselte EBOOT.BIN abspeichern (falls verschlüsselt) +Dump Frame GPU Commands = GPU Befehle des Frames ausgeben +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Aktiviere Logging +Enter address = Adresse eingeben +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Frame Profiler +GPU Driver Test = GPU Treibertest +GPU Profile = GPU profile +Jit Compare = JIT-Vergleich +JIT debug tools = JIT Debug Werkzeuge +Language = Sprache +Load language ini = Sprachdatei laden +Log Dropped Frame Statistics = Statistik für fehlende Einzelbilder loggen +Log Level = Loglevel +Log View = Logbuch +Logging Channels = Logkanäle +Next = Nächstes +No block = Kein Block +Prev = Vorheriges +Random = Zufall +Replace textures = Texturen ersetzen +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Sind Sie sicher, dass Sie alle Standardeinstellungen\n(außer die Tastenbelegung) wiederherstellen wollen?\n\nDies kann nicht rückgängig gemacht werden.\n\nBitte starten Sie PPSSPP nach Wiederherstellung neu. +RestoreGameDefaultSettings = Wollen Sie wirklich die spielspezifischen Einstellungen\nauf die Werkseinstellungen von PPSSPP zurücksetzen? +Resume = Resume +Run CPU Tests = CPU Test starten +Save language ini = Sprachdatei speichern +Save new textures = Speichere neue Texturen +Shader Viewer = Shader-Anzeige +Show Developer Menu = Zeige Entwicklermenü +Show on-screen messages = Show on-screen messages +Stats = Statistiken +System Information = Systeminformationen +Texture Replacement = Austausch von Texturen +Toggle Audio Debug = Ton-Debugging umschalten +Toggle Freeze = Bild einfrieren an/aus +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP Auflösung +Active = Aktiv +Back = Zurück +Cancel = Abbrechen +Center = Zentriert +ChangingGPUBackends = Um das Grafik-Backend zu wechseln, muss PPSSPP neu gestartet werden. Wollen Sie jetzt neustarten? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = Wähle PPSSPP Speicherpfad +Confirm Overwrite = Wollen Sie diese Daten überschreiben? +Confirm Save = Wollen Sie die Daten speichern? +ConfirmLoad = Wollen Sie diese Daten laden? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Löschen +Delete all = Alle löschen +Delete completed = Löschen abgeschlossen +DeleteConfirm = Diese Speicherdaten werden gelöscht.\nWollen Sie wirklich fortfahren? +DeleteConfirmAll = Wollen Sie wirklich alle Spielstände\nfür dieses Spiel löschen? +DeleteConfirmGame = Wollen Sie wirklich dieses Spiel\nvon Ihrem Gerät löschen?\nDies kann nicht rückgängig gemacht werden. +DeleteConfirmGameConfig = Wollen Sie wirklich die spielspezifischen Einstellungen löschen? +DeleteFailed = Daten konnten nicht gelöscht werden. +Deleting = Löschen\nBitte warten... +Disable All = Alle deaktivieren +Edit = Edit +Enable All = Alle aktivieren +Enter = Eingabe +Finish = Fertig +Grid = Gitter +Inactive = Inaktiv +InternalError = An internal error has occurred. +Load = Laden +Load completed = Laden abgeschlossen +Loading = Laden\nBitte warten... +LoadingFailed = Daten konnten nicht geladen werden. +Move = Bewegen +Network Connection = Netzwerkverbindung +NEW DATA = Neue Daten +No = Nein +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = OK +Old savedata detected = Alter Speicherstand entdeckt +Options = Optionen +Reset = Zurücksetzen +Resize = Größe ändern +Retry = Wiederholen +Save = Speichern +Save completed = Speichern abgeschlossen +Saving = Speichern\nBitte warten... +SavingFailed = Daten konnten nicht gespeichert werden. +Select = Auswahl +Shift = Umschalt +Snap = Einrasten +Space = Leertaste +SSID = SSID +Submit = Absenden +Supported = Unterstützt +There is no data = Keine Daten vorhanden +Toggle All = Alle umschalten +Toggle List = Toggle list +Unsupported = Nicht unterstützt +When you save, it will load on a PSP, but not an older PPSSPP = Wenn Sie speichern, kann es von einer PSP gelesen werden, aber nicht von einem älteren PPSSPP +When you save, it will not work on outdated PSP Firmware anymore = Wenn Sie speichern, wird es auf veralteter PSP Firmware nicht mehr funktionieren +Yes = Ja +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = Datei ist komprimiert (7z).\nBitte entpacken Sie diese zuerst (mit 7-Zip oder WinRAR). +A PSP game couldn't be found on the disc. = Ein PSP Spiel konnte nicht auf der Disk gefunden werden. +Cannot boot ELF located outside mountRoot. = Kann ELF außerhalb von mountRoot nicht booten. +Could not save screenshot file = Screenshot konnte nicht gespeichert werden. +D3D9or11 = Direct3D 9? (oder "nein" für Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll nicht gefunden. Bitte installieren oder drücke Ja um stattdessen Direct3D 9 zu benutzen. +D3D11InitializationError = Direct3D 11 Initialisierungsfehler +D3D11Missing = Ihr Betriebssystem beinhaltet kein D3D11. Bitte führen Sie Windows Update aus.\n\nDrücke Ja um stattdessen Direct3D 9 zu benutzen. +D3D11NotSupported = Ihre GPU scheint Direct3D 11 nicht zu unterstützen.\n\nWollen Sie stattdessen Direct3D 9 zu benutzen? +Disk full while writing data = Festplatte hatte während des Schreibens keinen Speicher frei +ELF file truncated - can't load = Gekürzte ELF Datei kann nicht geladen werden +Error loading file = Fehler beim Laden der Datei: +Error reading file = Fehler beim Lesen der Datei. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = Identifikation der Datei fehlgeschlagen. +Failed to load executable: = Laden der Programmdatei fehlgeschlagen: +File corrupt = Datei beschädigt +Game disc read error - ISO corrupt = Fehlerhaftes einlesen der Spieldisk: ISO fehlerhaft. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Initialisierung der Grafik fehlgeschlagen. Aktualisieren Sie Ihre Grafiktreiber und die DirectX 9 Laufzeit.\n\nWollen Sie versuchen auf OpenGL zu wechseln?\n\nFehlermeldung: +GenericGraphicsError = Grafikfehler +GenericOpenGLError = Initialisierung der Grafik fehlgeschlagen. Aktualisieren Sie Ihre Grafiktreiber.\n\nWollen Sie versuchen auf DirectX 9 zu wechseln?\n\nFehlermeldung: +GenericVulkanError = Initialisierung der Grafik fehlgeschlagen. Aktualisieren Sie Ihre Grafiktreiber.\n\nWollen Sie versuchen auf OpenGL zu wechseln?\n\nFehlermeldung: +InsufficientOpenGLDriver = Unzureichende OpenGL Treiberunterstützung!\n\nDie GPU meldet fehlende Unterstützung für OpenGL 2.0, welches PPSSPP zur Zeit zum Betrieb erfordert.\n\nBitte überprüfen Sie, ob Ihre GPU mit OpenGL 2.0 kompatibel ist. Wenn ja, müssen Sie aktuelle Grafikkartentreiber von der Webseite des Herstellers installieren.\n\nFür Näheres besuchen Sie auch das Forum unter https://forums.ppsspp.org . +Just a directory. = Nur ein Verzeichnis. +Missing key = Fehlender Schlüssel +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = Keine EBOOT.PBP, Spiel falsch identifiziert. +Not a valid disc image. = Kein gültiges Disk Image. +OpenGLDriverError = OpenGL Treiberfehler +PPSSPP doesn't support UMD Music. = PPSSPP unterstützt nicht UMD Musik. +PPSSPP doesn't support UMD Video. = PPSSPP unterstützt nicht UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP unterstützt momentan keine Internetverbindung für DLCs, PSN oder Aktualisierungen von Spielen. +PS1 EBOOTs are not supported by PPSSPP. = PS1 EBOOTS werden von PPSSPP nicht unterstützt. +PSX game image detected. = Datei is ein MODE2 Abbild.\nPPSSPP hat keine Unterstützung für PS1-Spiele. +RAR file detected (Require UnRAR) = Datei ist komprimiert (RAR).\nBitte zuerst entpacken (z.B. mit UnRAR). +RAR file detected (Require WINRAR) = Datei ist komprimiert (RAR).\nBitte zuerst entpacken (z.B. mit WinRAR). +Running slow: try frameskip, sound is choppy when slow = Schlechte Bildrate: Benutze "Bilder überspringen", Ton kann ansonsten abgeschnitten klingen +Running slow: Try turning off Software Rendering = Schlechte Bildrate: Versuchen Sie "Software Rendering" auszuschalten +Save encryption failed. This save won't work on real PSP = Speicherstand-Verschlüsselung fehlgeschlagen. Diese Speicherstand wird nicht auf einer echten PSP funktionieren. +textures.ini filenames may not be cross-platform = "textures.ini" Dateinamen sind eventuell nicht plattformübergreifend. +This is a saved state, not a game. = Dies ist kein Spiel sondern ein Speicherstand. +This is save data, not a game. = Dies ist kein Spiel sondern Speicherdaten. +Unable to create cheat file, disk may be full = Cheatdatei konnte nicht geschrieben werden, eventuell volle Festplatte. +Unable to initialize rendering engine. = Initialisierung der Rendering Engine fehlgeschlagen. +Unable to write savedata, disk may be full = Speicherdaten konnten nicht geschrieben werden, eventuell volle Festplatte. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Warnung: Videospeicher VOLL, reduziere Hochskalierung und wechsle zu langsamen Cachemodus. +Warning: Video memory FULL, switching to slow caching mode = Warnung: Videospeicher VOLL, wechsle zu langsamen Cachemodus. +ZIP file detected (Require UnRAR) = Datei ist komprimiert (ZIP).\nBitte zuerst entpacken (z.B. mit UnRAR). +ZIP file detected (Require WINRAR) = Datei ist komprimiert (ZIP).\nBitte zuerst entpacken (z.B. mit WinRAR). + +[Game] +Asia = Asien +ConfirmDelete = Löschen +Create Game Config = Erstelle Spielkonfig. +Create Shortcut = Verknüpfung erstellen +Delete Game = Spiel löschen +Delete Game Config = Lösche Spielkonfig. +Delete Save Data = Spielstand löschen +Europe = Europa +Game = Spiel +Game Settings = Spieleinstellungen +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Dateninstallation +Japan = Japan +Korea = Korea +MB = MB +One moment please... = Bitte warten... +Play = Spielen +Remove From Recent = Aus der Liste entfernen +SaveData = Speicherdaten +Setting Background = Einstellungshintergrund +Show In Folder = Ordner öffnen +USA = USA +Use UI background = Benutze UI Hintergrund + +[Graphics] +% of the void = % vom Leerbereich +% of viewport = % vom Sichtbereich +%, 0:unlimited = %, 0 = unlimitiert +(supersampling) = (supersampling) +(upscaling) = (hochskalierend) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Aggressiv +Alternative Speed = Alternative Geschwindigkeit +Alternative Speed 2 = Alternative Geschwindigkeit 2 (in %, 0 = unlimitiert) +Anisotropic Filtering = Anisotropischer Filter +Auto = Automatisch +Auto (1:1) = Automatisch (1:1) +Auto (same as Rendering) = Automatisch (Renderauflösung) +Auto FrameSkip = Autom. Bilder überspringen +Auto Scaling = Auto Skalierung +Backend = Grafik-Backend +Balanced = Ausgeglichen +Bicubic = Bikubisch +BlockTransfer Tip = Manche Spiele benötigen dies für eine korrekte Darstellung +BlockTransferRequired = Warnung: Dieses Spiel benötigt "Blockübertragungseffekte simulieren". +Both = Beide +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Gepuffertes Rendern +BufferedRenderingRequired = Warnung: Bei diesem Spiel muss "Rendering Modus" auf "Gepuffert" gesetzt werden. +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Bildschirmgröße (in % des Sichtbereichs) +Cardboard Screen X Shift = X Versatz (in % der freien Fläche) +Cardboard Screen Y Shift = Y Versatz (in % der freien Fläche) +Cardboard VR Settings = Google Cardboard VR Einstellungen +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU Kern +Debugging = Debugging +DefaultCPUClockRequired = Warnung: Für dieses Spiel muss die CPU Taktrate auf den Standartwert gestellt sein. +Deposterize = Tonwertverschmelzung +Deposterize Tip = Behebt visuelle Artifakte von hochskalierten Texturen +Device = Gerät +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Deaktiviere langsame Effekte (schneller) +Disabled = Deaktiviert +Display layout editor = Bildschirmlayout Editor +Display Resolution (HW scaler) = Bildschirmauflösung (HW Skalierung) +Dump next frame to log = Nächsten Frame im Log speichern +Enable Cardboard VR = Cardboard VR aktivieren +FPS = FPS +Frame Rate Control = Frameratenkontrolle +Frame Skipping = Bilder überspringen +Frame Skipping Type = Typ für Bilder überspringen +FullScreen = Vollbild +Hack Settings = Hacks (kann zu Fehlern führen) +Hardware Tessellation = Hardware Tessellation +Hardware Transform = Hardware Transformierung +hardware transform error - falling back to software = Hardware Transform Fehler - greife auf Software zurück +HardwareTessellation Tip = Benutzt Hardware zum Zeichnen von Kurven +High = Hoch +Hybrid = Hybrid +Hybrid + Bicubic = Hybrid + Bikubisch +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Interne Auflösung +Lazy texture caching = Träges Textur-Caching (schneller) +Linear = Linear +Low = Niedrig +LowCurves = Bézierkurven Qualität +LowCurves Tip = Diese Option regelt die Qualität von Bezierkurven und Splines +Lower resolution for effects (reduces artifacts) = Niedrigere Auflösung für Effekte (reduziert Artifakte) +Manual Scaling = Manuelle Skalierung +Medium = Mittel +Mode = Modus +Must Restart = Sie müssen PPSSPP neustarten, damit die Änderungen wirksam werden. +Native device resolution = Native Auflösung +Nearest = Nächster Nachbar +No buffer = No buffer +Non-Buffered Rendering = Über&springe Puffereffekte (ungepuffert, schneller) +None = Keine +Number of Frames = Anzahl an Frames +Off = Aus +OpenGL = OpenGL +Overlay Information = Eingeblendete Informationen +Partial Stretch = Teilweise strecken +Percent of FPS = Prozent an FPS +Performance = Leistung +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Nachbearbeitungs-Shader +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = Rendermodus +Rendering Resolution = Renderauflösung +RenderingMode NonBuffered Tip = Schneller, aber keine Anzeige in einigen Spielen +Retain changed textures = Veränderte Texturen behalten (manchmal langsamer) +RetainChangedTextures Tip = Macht viele Spiele langsamer, aber einige andere umso schneller +Rotation = Drehung +Safe = Sicher +Screen layout = Screen layout +Screen Scaling Filter = Filter für Bildskalierung +Show Debug Statistics = Debugstatistiken anzeigen +Show FPS Counter = FPS anzeigen +Simulate Block Transfer = Blockübertragungseffekte simulieren +SoftGPU Tip = Derzeit SEHR langsam +Software Rendering = Software Renderer (experimentell) +Software Skinning = Software Skinning +SoftwareSkinning Tip = Reduziert Grafikbefehle und schneller in Spielen mit erweiterter Skinning-Technik, in anderen Spielen langsamer +Speed = Geschwindigkeit +Stretching = Strecken +Texture Filter = Texturfilter +Texture Filtering = Texturfilterung +Texture Scaling = Texturskalierung +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = "Hardware Tessellierung" ausschalten: Nicht unterstützt +Unlimited = Unbegrenzt +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = Skalierungsgrad +Upscale Type = Skalierungsart +UpscaleLevel Tip = CPU-lastig - einige Skalierungen könnten verzögert sein um Stottern zu vermeiden +Use all displays = Benutze alle Bildschirme +Vertex Cache = Vertex-Cache +VertexCache Tip = Schneller, kann temporäres Flackern verursachen +VSync = V-Sync +Vulkan = Vulkan +Window Size = Fenstergröße +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = ZIP Datei löschen +Install = Installieren +Install game from ZIP file? = Spiel aus ZIP Datei installieren? +Install textures from ZIP file? = Texturen von ZIP Datei installieren? +Installed! = Installiert! +Texture pack doesn't support install = Texturpack unterstützt keine Installation +Zip archive corrupt = ZIP Archiv beschädigt +Zip file does not contain PSP software = ZIP Datei beinhaltet keine PSP Software + +[KeyMapping] +Autoconfigure = Autokonfiguration +Autoconfigure for device = Autokonfiguration für Gerät +Clear All = Alle löschen +Default All = Zurücksetzen +Map a new key for = Drücke zuzuweisende Taste für +Map Key = Taste zuweisen +Map Mouse = Maus zuweisen +Test Analogs = Analogsticks testen +You can press ESC to cancel. = Drücken Sie ESC zum abbrechen. + +[MainMenu] +Browse = Durchsuchen... +Buy PPSSPP Gold = Kaufe PPSSPP Gold +Choose folder = Wähle Ordner +Credits = Mitwirkende +PPSSPP Homebrew Store = PPSSPP Homebrew Store +Exit = Beenden +Game Settings = Einstellungen +Games = Spiele +Give PPSSPP permission to access storage = PPSSPP Speicherzugriff erlauben +Homebrew & Demos = Homebrew && Demos +How to get games = Woher bekomme ich Spiele? +How to get homebrew & demos = Woher bekomme ich Homebrew && Demos? +Load = Laden... +Loading... = Lädt... +PinPath = Anheften +PPSSPP can't load games or save right now = PPSSPP kann gerade keine Spiele laden oder speichern +Recent = Zuletzt gespielt +SavesAreTemporary = PPSSPP speichert in temporären Speicher +SavesAreTemporaryGuidance = Extrahiere PPSSPP um Veränderungen speichern zu können +SavesAreTemporaryIgnore = Ignoriere Warnung +UnpinPath = Losheften +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Ton +Controls = Bedienung +Graphics = Grafik +Networking = Netzwerk +System = System +Tools = Werkzeuge + +[MappableControls] +Alt speed 1 = Alt Geschw. 1 +Alt speed 2 = Alt Geschw. 2 +An.Down = Analogstick Runter +An.Left = Analogstick Links +An.Right = Analogstick Rechts +An.Up = Analogstick Hoch +Analog limiter = Analogbegrenzer +Analog Stick = Analogstick +Audio/Video Recording = Ton/Video Aufnahme +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Achsen invertieren +Circle = Kreis +Cross = Kreuz +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = Entwicklermenü +Down = Steuerkreuz Runter +Dpad = Steuerkreuz +Frame Advance = Einzelbildaufnahme +Hold = Hold +Home = Home +L = L +Left = Steuerkreuz Links +Load State = Stand laden +Mute toggle = Mute toggle +Next Slot = Nächster Stand +None = None +Note = Note +OpenChat = Open chat +Pause = Pause +R = R +RapidFire = Schnellfeuer +Remote hold = Remote hold +Rewind = Zurückspulen +Right = Steuerkreuz Rechts +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = Rechter Analogstick Runter +RightAn.Left = Rechter Analogstick Links +RightAn.Right = Rechter Analogstick Rechts +RightAn.Up = Rechter Analogstick Hoch +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Stand speichern +Screen = Bildschirm +Screenshot = Screenshot +Select = Select +SpeedToggle = Geschw. ändern +Square = Viereck +Start = Start +Texture Dumping = Texturspeicherung +Texture Replacement = Texturersetzung +Toggle Fullscreen = Vollbild umschalten +Toggle mode = Toggle mode +Triangle = Dreieck +Unthrottle = Turbo +Up = Steuerkreuz Hoch +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Besuche das Adhoc Multiplayer Forum +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = MAC-Adresse ändern +Change proAdhocServer Address = proAdhocServer IP-Adresse ändern (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Aktiviere integrierten proAdhocServer +Enable network chat = Enable network chat +Enable networking = Aktiviere Netzwerk/Wlan (Beta) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Ungültige IP oder Hostnamen +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Netzwerk initialisiert +Please change your Port Offset = Please change your port offset +Port offset = Portverschiebung (0 = PSP Kompatibilität) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Sende Discord "Rich Presence" Information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validiere Adresse... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = Cheats +Continue = Fortsetzen +Create Game Config = Erstelle Spielkonfig. +Delete Game Config = Lösche Spielkonfig. +Exit to menu = Hauptmenü +Game Settings = Spieleinstellungen +Load State = Stand laden +Rewind = Zurückspulen +Save State = Stand speichern +Settings = Einstellungen +Switch UMD = UMD wechseln + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HqGLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AAColor +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Cartoon +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT Scanlines +FXAA = FXAA +Gamma = Gamma +Grayscale = Graustufen +Intensity = Intensity +InverseColors = Farben invertieren +Natural = Natürliche Farben +NaturalA = Natürliche Farben (kein Blur) +Off = Aus +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlines +Sharpen = Schärfen +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = UpscaleSpline36 +VideoSmoothingAA = Video Bildglättung +Vignette = Vignette + +[PSPCredits] +all the forum mods = Alle Forenmoderatoren +build server = Build server +Buy Gold = Erwerbe PPSSPP Gold +check = Dolphin, der beste erhältliche Wii/GC Emulator: +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = Mitwirkende: +created = Entwickelt von +Discord = Discord +info1 = PPSSPP ist nur für Lehrzwecke gedacht. +info2 = Versichern Sie sich, dass Sie über die nötigen Rechte der jeweiligen +info3 = gespielten Spiele verfügen, indem Sie eine UMD oder einen digitalen +info4 = Download aus dem PSN Store auf Ihrer echten PSP besitzen. +info5 = PSP ist ein eingetragenes Markenzeichen von Sony, Inc. +iOS builds = iOS builds +license = Freie Software unter GPL 2.0+ +list = Kompatibilitätslisten, Forum und Entwicklungsinfos +PPSSPP Forums = PPSSPP Forum +Privacy Policy = Datenschutzerklärung +Share PPSSPP = Teile PPSSPP +specialthanks = Besonderer Dank an: +specialthanksKeithGalocy = an NVIDIA (hardware, advice) +specialthanksMaxim = für seine fantastische Arbeit am Atrac3+ Decoder +testing = Testing +this translation by = übersetzt von: +title = Ein schneller und portabler PSP Emulator +tools = Verwendete kostenlose Werkzeuge: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = ufdada, PrologTV, Apology11, BrokenCommander +translators2 = +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Mehr Infos auf der Webseite: +written = Programmiert in C++ für Geschwindigkeit und Portabilität + +[RemoteISO] +Browse Games = Spiele durchsuchen +Local Server Port = Lokaler Serverport +Manual Mode Client = Manual mode client +Remote disc streaming = Remote Disc streaming +Remote Port = Remote Port +Remote Server = Remote Server +Remote Subdirectory = Remote Unterzeichnis +RemoteISODesc = Spiele in ihrer "Zuletzt gespielt"-Liste werden freigegeben +RemoteISOLoading = Verbunden, lade Spieleliste... +RemoteISOScanning = Scanne... Klicken Sie "Spiele freigeben" auf ihrem Server +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Hinweis: Verbinden Sie beide Geräte mit dem selben Wi-Fi Netzwerk +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Einstellungen +Share Games (Server) = Spiele freigeben (Server) +Share on PPSSPP startup = Beim Start von PPSSPP freigeben +Stop Sharing = Freigabe stoppen +Stopping.. = Stoppe... + +[Reporting] +Bad = Schlecht +FeedbackDelayInfo = Deine Daten werden im Hintergrund versendet. +FeedbackDesc = Wie ist die Emulation? Lass es uns und die Community wissen! +FeedbackDisabled = Kompatibilitätsberichte müssen aktiviert sein. +FeedbackIncludeCRC = Hinweis: Batterie wird genutzt um einen Disc CRC zu senden +FeedbackIncludeScreen = Einen Screenshot einbinden +FeedbackSubmitDone = Deine Daten wurden abgesendet. +FeedbackSubmitFail = Daten konnten nicht an den Server übermittelt werden. Versuche PPSSPP zu aktualisieren. +FeedbackThanks = Danke für dein Feedback. +Gameplay = Spielbarkeit +Graphics = Grafik +Great = Großartig +In-game = In-game +In-game Description = Geht ins Spiel aber zu verbuggt um komplett spielbar zu sein +Menu/Intro = Menü/Intro +Menu/Intro Description = Spiel zeigt nur Menü, nicht spielbar +Nothing = Nichts +Nothing Description = Spiel startet überhaupt nicht +OK = OK +Open Browser = Browser öffnen +Overall = Allgemein +Perfect = Perfekt +Perfect Description = Einwandfreie Emulation des Spiels - Großartig! +Plays = Spielbar +Plays Description = Komplett spielbar mit vereinzelnten Glitches +ReportButton = Feedback geben +Speed = Geschwindigkeit +Submit Feedback = Feedback absenden +SuggestionConfig = Für gute Einstellungen Berichte auf der Webseite ansehen. +SuggestionCPUSpeed0 = Deaktiviere Einstellung für CPU Drosselung. +SuggestionDowngrade = Eine ältere PPSSPP Version benutzen (diesen Fehler bitte melden). +SuggestionsFound = Andere Benutzer haben bessere Ergebnisse berichtet. Wähle "Zeige Feedback" für nähere Details. +SuggestionsNone = Dieses Spiel funktioniert auch nicht bei anderen Benutzern. +SuggestionsWaiting = Sende und überprüfe das Feedback von anderen Benutzern... +SuggestionUpgrade = Aktualisiere PPSSPP auf eine neuere Version. +SuggestionVerifyDisc = Überprüfe ob die ISO eine gute Kopie von deiner Disk ist. +Unselected Overall Description = Wie gut wird dieses Spiel emuliert? +View Feedback = Zeige Feedback + +[Savedata] +Date = Datum +Filename = Dateiname +No screenshot = Kein Screenshot +None yet. Things will appear here after you save. = Keine gespeicherten Daten zum Anzeigen vorhanden. +Save Data = Speicherdaten +Save States = Speicherstände +Savedata Manager = Speicherdatenverwaltung +Size = Größe + +[Screen] +Cardboard VR OFF = Cardboard VR aus +Chainfire3DWarning = WARNUNG: Chainfire3D erkannt, möglicherweise problematisch +Failed to load state = Laden des Standes fehlgeschlagen +Failed to save state = Speichern des Standes fehlgeschlagen +fixed = Geschwindigkeit: Fest +GLToolsWarning = WARNUNG: GLTools erkannt, dies kann zu Problemen führen. +In menu = Im Menü +Load savestate failed = Laden des Speicherstandes fehlgeschlagen +Loaded State = Spielstand geladen +Loaded. Save in game, restart, and load for less bugs. = Geladen. Speicher im Spiel, starte neu und lade für weniger Fehler. +LoadStateDoesntExist = Fehler beim Laden des Spielstandes: Spielstand existiert nicht! +LoadStateWrongVersion = Fehler beim Laden des Spielstandes: Spielstand ist für eine alte Version von PPSSPP! +norewind = Keine Rückspulfunktion verfügbar. +Playing = Spiele +PressESC = Drücke ESC um das Pausemenü zu öffnen. +replaceTextures_false = Texturen werden nicht länger ersetzt. +replaceTextures_true = Texturersetzung ist aktiviert. +Save State Failed = Erstellung des Spielstands fehlgeschlagen! +Saved State = Spielstand gespeichert +saveNewTextures_false = Speichern von Texturen wurde deaktiviert. +saveNewTextures_true = Texturen werden nun im Speicher abgelegt. +SpeedCustom2 = Geschwindigkeit: Alternativ 2 +standard = Geschwindigkeit: Normal +Untitled PSP game = Titelloses PSP Spiel + +[Store] +Already Installed = Bereits installiert +Connection Error = Verbindungsfehler +Install = Installieren +Launch Game = Spiel starten +Loading... = Lade... +MB = MB +Size = Größe +Uninstall = Deinstallieren + +[SysInfo] +%d (%d per core, %d cores) = %d (%d pro Kern, %d Kerne) +%d bytes = %d Byte +(none detected) = (nichts gefunden) +3D API = 3D API +ABI = ABI +API Version = API Version +Audio Information = Ton Information +Board = Board +Build Config = Erstellungskonfig. +Build Configuration = Erstellungskonfiguration +Built by = Erstellt von +Core Context = Core context +Cores = Kerne +CPU Extensions = CPU Erweiterungen +CPU Information = CPU Information +CPU Name = Name +D3DCompiler Version = D3DCompiler version +Debug = Debug +Debugger Present = Debugger vorhanden +Device Info = Geräteinfo +Display Information = Bildschirminformation +Driver Version = Treiberversion +EGL Extensions = EGL Erweiterungen +Frames per buffer = Bilder pro Zwischenspeicher +GPU Information = GPU Information +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Sprache/Region +Memory Page Size = Seitengröße des Speichers +Native Resolution = Native Auflösung +OGL Extensions = OGL Erweiterungen +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 Erweiterungen +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 Erweiterungen +OpenGL Extensions = OpenGL Erweiterungen +Optimal frames per buffer = Optimale Bilder pro Zwischenspeicher +Optimal sample rate = Optimale Abtastrate +OS Information = Betriebssystem Information +PPSSPP build = PPSSPP build +Refresh rate = Wiederholungsrate +Release = Release +RW/RX exclusive = RW/RX exklusiv +Sample rate = Abtastrate +Shading Language = Shadersprache +Sustained perf mode = Anhaltener Hochleistungsmodus +System Information = System Information +System Name = Name +System Version = System version +Threads = Threads +Vendor = Hersteller +Vendor (detected) = Hersteller (erkannt) +Version Information = Version Information +Vulkan Extensions = Vulkan Erweiterungen +Vulkan Features = Vulkan Besonderheiten + +[System] +(broken) = (kaputt) +12HR = 12 Std +24HR = 24 Std +Auto = Auto +Auto Load Savestate = Spielstand automatisch laden +AVI Dump started. = AVI Dump gestartet. +AVI Dump stopped. = AVI Dump gestoppt. +Cache ISO in RAM = ISO in RAM zwischenspeichern +Change CPU Clock = CPU-Takt ändern (instabil) +Change Memory Stick folder = Ändere Memory Stick Ordner +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Spitznamen ändern +ChangingMemstickPath = Speicherstände oder ähnliche Daten werden nicht in diesen Ordner kopiert.\n\nÄndere Ordner auf dem Memorystick?? +ChangingMemstickPathInvalid = Dieser Pfad sollte nicht genutzt werden um Memory Stick Dateien zu speichern. +ChangingMemstickPathNotExists = Ordner existiert nicht.\n\nSpeicherstände oder ähnliche Daten werden nicht dorthin kopiert.\n\nErstelle neuen Ordner auf dem Memorystick? +Cheats = Cheats (experimentell, siehe Forum) +Clear Recent = Clear "Recent" +Clear Recent Games List = 'Zuletzt gespielt'-Liste leeren +Clear UI background = Menühintergrund löschen +Confirmation Button = Taste zum Bestätigen +Date Format = Datumsformat +Day Light Saving = Sommerzeit +DDMMYYYY = TTMMJJJJ +Decrease size = Decrease size +Developer Tools = Entwicklerwerkzeuge +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emulation +Enable Cheats = Cheats aktivieren +Enable Compatibility Server Reports = Kompatibilitätsberichte einschalten +Failed to load state. Error in the file system. = Laden des Stand ist fehlgeschlagen. Fehler im Dateisystem. +Failed to save state. Error in the file system. = Speichern des Standes ist fehlgeschlagen. Fehler im Dateisystem. +Fast (lag on slow storage) = Schnell (Lag bei langsamen Speicher) +Fast Memory = Schneller Speicher (instabil) +Force real clock sync (slower, less lag) = Erzwinge echte Taktsync (langsamer, weniger lag) +frames, 0:off = Frames, 0 = Aus +Games list settings = Games list settings +General = Allgemein +Grid icon size = Grid icon size +Help the PPSSPP team = PPSSPP Team helfen +Host (bugs, less lag) = Host (Fehlerbehaftet, weniger Lag) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Interpreter +IO timing method = I/O Timing Methode +IR Interpreter = IR Interpreter +Memory Stick Folder = Memorystick Ordner +Memory Stick inserted = MemoryStick eingelegt +MHz, 0:default = MHz, 0 = Standard +MMDDYYYY = MMTTJJJJ +Newest Save = Neuester Spielstand +Not a PSP game = Kein PSP Spiel +Off = Aus +Oldest Save = Ältester Spielstand +PSP Model = PSP Modell +PSP Settings = PSP Einstellungen +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Ton aufzeichnen +Record Display = Bildschirm aufzeichnen +Reset Recording on Save/Load State = Zurücksetzen der Aufnahme bei Laden/Speichern eines Standes +Restore Default Settings = Auf Standardeinstellungen zurücksetzen +Rewind Snapshot Frequency = Zurückspulen-Snapshot Frequenz (Speicherfresser) +Save path in installed.txt = Speicherpfad in installed.txt +Save path in My Documents = Speicherpfad in "Meine Dokumente" +Savestate Slot = Speicherplatz +Savestate slot backups = Backups für Speicherplatz +Screenshots as PNG = Screenshots im PNG-Format speichern +Set UI background... = Setze Menühintergrund... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Simuliere UMD Verzögerungen +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Speicherplatz voll +Sustained performance mode = Anhaltener Hochleistungsmodus +Time Format = Zeitformat +UI = Benutzeroberfläche +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Benutze verlustfreien Videocodec (FFV1) +Use O to confirm = O als Bestätigungstaste +Use output buffer (with overlay) for recording = Benutze Ausgangspuffer (mit Einblendung) für Aufnahme +Use system native keyboard = Use system native keyboard +Use X to confirm = X als Bestätigungstaste +VersionCheck = Überprüfe auf neue Versionen von PPSSPP +WARNING: Android battery save mode is on = WARNUNG: Android Energiesparmodus ist eingeschaltet +WARNING: Battery save mode is on = WARNUNG: Energiesparmodus ist eingeschaltet +YYYYMMDD = JJJJMMTT + +[Upgrade] +Details = Details +Dismiss = Überspringen +Download = Herunterladen +New version of PPSSPP available = Neue PPSSPP Version verfügbar diff --git a/assets/lang/dr_ID.ini b/assets/lang/dr_ID.ini new file mode 100644 index 0000000000..07471fa313 --- /dev/null +++ b/assets/lang/dr_ID.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = Audio backend (restart req.) +AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) +Auto = Auto +Device = Device +DSound (compatible) = DSound (compatible) +Enable Sound = Padenni suarana +Global volume = Global volume +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = WASAPI (fast) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Analog axis sensitivity +Analog Limiter = Analog limiter +Analog Mapper High End = Analog mapper high-end (axis sensitivity) +Analog Mapper Low End = Analog mapper low-end (inverse deadzone) +Analog Mapper Mode = Analog mapper mode +Analog Stick = Analog stick +AnalogLimiter Tip = When the analog limiter button is pressed +Auto = Auto +Auto-centering analog stick = Auto-centering analog stick +Auto-hide buttons after seconds = Auto-hide buttons after seconds +Binds = Binds +Button Opacity = Patembussi dikita tombolo'na +Button style = Button style +Calibrate D-Pad = Calibrate +Calibration = Calibration +Classic = Classic +Combo Key Setting = Combo key setting +Combo Key Setup = Combo key setup +Confine Mouse = Trap mouse within window/display area +Control Mapping = Atoro'i tombolna +Custom layout... = Edit touch control layout... +Customize tilt = Customize tilt... +D-PAD = D-Pad +Deadzone Radius = Deadzone radius +DInput Analog Settings = DInput analog settings +Disable D-Pad diagonals (4-way touch) = Disable D-Pad diagonals (4-way touch) +Glowing borders = Glowing borders +HapticFeedback = Haptic feedback (vibration) +Ignore gamepads when not focused = Ignore gamepads when not focused +Ignore Windows Key = Disable Windows key +Invert Axes = Invert axes +Invert Tilt along X axis = Invert tilt along X axis +Invert Tilt along Y axis = Invert tilt along Y axis +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Keyboard control settings +L/R Trigger Buttons = L/R trigger buttons +Landscape = Landscape +Landscape Auto = Landscape auto +Landscape Reversed = Landscape reversed +Mouse = Mouse settings +Mouse sensitivity = Mouse sensitivity +Mouse smoothing = Mouse smoothing +MouseControl Tip = You can now map mouse in control mapping screen by pressing the 'M' icon. +None (Disabled) = None (disabled) +Off = Off +OnScreen = Tobolo'na jo layar sentu +Portrait = Portrait +Portrait Reversed = Portrait reversed +PSP Action Buttons = PSP action buttons +Screen Rotation = Screen rotation +seconds, 0 : off = seconds, 0 = off +Sensitivity = Sensitivity +Show right analog = Show right analog +Show Touch Pause Menu Button = Show pause menu button +Thin borders = Thin borders +Tilt Base Radius = Tilt base radius +Tilt Input Type = Tilt input type +Tilt Sensitivity along X axis = Tilt sensitivity along X axis +Tilt Sensitivity along Y axis = Tilt sensitivity along Y axis +To Calibrate = To calibrate, keep device on a flat surface and press "Calibrate". +Touch Control Visibility = Touch control visibility +Use custom right analog = Use custom right analog +Use Mouse Control = Use mouse control +Visibility = Visibility +X = X +X + Y = X + Y +XInput Analog Settings = XInput analog settings +Y = Y + +[CwCheats] +Cheats = Cheat +Edit Cheat File = Edit cheat file +Enable/Disable All = Pajalan/Bosian nasan Cheat +Import Cheats = Patamanni cheat.db +Options = Pangpillean +Refresh Rate = Refresh rate + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = &Masala PPSSPP... +Auto = &Yamesa +Backend = Rendering &Backend (Restarts PPSSPP) +Bicubic = &Bicubic +Break = Break +Break on Load = Break on load +Buffered Rendering = &Buffered Rendering +Buy Gold = Alli &Gold +Control Mapping... = C&ontrol Mapping... +Debugging = Debu&g +Deposterize = &Deposterize +Direct3D9 = &Direct3D9 +Direct3D11 = Direct3D &11 +Disassembly = &Disassembly... +Discord = Discord +Display Layout Editor = Display layout editor... +Display Rotation = Display rotation +Dump Next Frame to Log = Ca'b&eranni lako log +Emulation = &Emulasi +Enable Chat = Enable chat +Enable Cheats = Pakeanni &Cheats (Dibosianpole'ra) +Enable Sound = Padenni S&uarana +Exit = E&xit +Extract File... = E&xtract File... +File = &Pail +Frame Skipping = &Frameskip +Frame Skipping Type = Frame skipping type +Fullscreen = Layarponno +Game Settings = &Pangngaturan paningoan +GE Debugger... = GE Debugge&r... +GitHub = Git&Hub +Hardware Transform = &Hardware Transform +Help = &Pabalian +Hybrid = &Hybrid +Hybrid + Bicubic = H&ybrid + Bicubic +Ignore Illegal Reads/Writes = &Ignore Illegal Reads/Writes +Ignore Windows Key = Ignore Windows Key +Keep PPSSPP On Top = &Pa jao tarrui liu PPSSPP +Landscape = Landscape +Landscape reversed = Landscape reversed +Language... = La&nguage... +Linear = &Linear +Load = &Bukka'... +Load .sym File... = Lo&ad .sym File... +Load Map File... = Bukka' Fail &Map... +Load State = Bukka' save-lassi +Load State File... = &Bukka' Pail save-lassi... +Log Console = &Konsol log +Memory View... = Pempakitan &Memory... +More Settings... = &More Settings... +Nearest = &Nearest +Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) +Off = &Mate +Open Directory... = Bukka' &Ngenan... +Open from MS:/PSP/GAME... = Bu&kka' jio mai MS:/PSP/GAME... +Open Memory Stick = Bukka' &Memory Stick +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = &Paus +Pause When Not Focused = &Pause When Not Focused +Portrait = Portrait +Portrait reversed = Portrait reversed +Postprocessing Shader = Postprocessin&g Shader +PPSSPP Forums = PPSSPP &Forumna +Record = &Record +Record Audio = Record &audio +Record Display = Record &display +Rendering Mode = Carana Render +Rendering Resolution = &Resolusinna +Reset = P&apole +Reset Symbol Table = &Bosianpole' Tabel simbol +Run = &Lari +Save .sym File... = Sav&e .sym File... +Save Map File... = &Anna Fail Map... +Save State = Anna save-lassi +Save State File... = &Anna Pail save-lassi... +Savestate Slot = Saves&tate Slot +Screen Scaling Filter = Scr&een Scaling Filter +Show Debug Statistics = Pempakitan Debu&g Statistics +Show FPS Counter = Pempakitan &FPS +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = &Kenden +Switch UMD = Switch UMD +Take Screenshot = &Aalai gambara'na +Texture Filtering = Te&xture Filtering +Texture Scaling = &Texture Scaling +Use Lossless Video Codec (FFV1) = &Use lossless video codec (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = &Vertex Cache +VSync = VS&ync +Vulkan = Vulkan +Window Size = &Window Size +www.ppsspp.org = Meki' lako www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allocator viewer (Vulkan) +Allow remote debugger = Allow remote debugger +Backspace = Backspace +Block address = Block address +By Address = By address +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Create/Open textures.ini file for current game +Current = Current +Dev Tools = Development tools +DevMenu = DevMenu +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Dump decrypted EBOOT.BIN on game boot +Dump Frame GPU Commands = Dump frame GPU commands +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Padenni Log +Enter address = Enter address +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Frame profiler +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = Jit compare +JIT debug tools = JIT debug tools +Language = Bahasa +Load language ini = Bukka' filena to bahasa +Log Dropped Frame Statistics = Log dropped frame statistics +Log Level = Log level +Log View = Log view +Logging Channels = Logging channels +Next = Next +No block = No block +Prev = Previous +Random = Random +Replace textures = Replace textures +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. +RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? +Resume = Resume +Run CPU Tests = Pajalanni tes CPU +Save language ini = Annai filena to bahasa +Save new textures = Save new textures +Shader Viewer = Shader viewer +Show Developer Menu = Show developer menu +Show on-screen messages = Show on-screen messages +Stats = Stats +System Information = Pempakitan to sistem dipake +Texture Replacement = Texture replacement +Toggle Audio Debug = Toggle audio debug +Toggle Freeze = Toggle freeze +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP res +Active = Active +Back = Poleboko' +Cancel = Ah edda pole' +Center = Center +ChangingGPUBackends = Changing GPU backends requires PPSSPP to restart. Restart now? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = Choose PPSSPP save folder +Confirm Overwrite = Eda na ciapa dipasi toppo' te' data? +Confirm Save = Madoangki' annai te' data? +ConfirmLoad = Bukka'mi te' data? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Hapusi +Delete all = Delete all +Delete completed = Terhapusmi. +DeleteConfirm = Ala dihapusmi te' data.\nYake bangmo? +DeleteConfirmAll = Dihapus nasang tongammi te'e\nyake bangmo? +DeleteConfirmGame = Dihapus tongammi te' paningoan?\n Tihapus tongammi dau mane. +DeleteConfirmGameConfig = Do you really want to delete the settings for this game? +DeleteFailed = Unable to delete data. +Deleting = Dihapusmi\nTajammi... +Disable All = Disable all +Edit = Edit +Enable All = Enable all +Enter = Enter +Finish = Mangkami +Grid = Grid +Inactive = Inactive +InternalError = An internal error has occurred. +Load = Load +Load completed = Tibukka'mi. +Loading = Dibukka'i\nTajammi... +LoadingFailed = Unable to load data. +Move = Move +Network Connection = Network Connection +NEW DATA = DATA baru +No = Edda mane +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = Okemi mane +Old savedata detected = Old savedata detected +Options = Options +Reset = Reset +Resize = Resize +Retry = Retry +Save = Save +Save completed = Mangkami dianna. +Saving = Di'annai\nTajammi... +SavingFailed = Unable to save data. +Select = Pillei +Shift = Angka'i +Snap = Snap +Space = Space +SSID = SSID +Submit = Submit +Supported = Supported +There is no data = Ai edda data mane. +Toggle All = Toggle all +Toggle List = Toggle list +Unsupported = Unsupported +When you save, it will load on a PSP, but not an older PPSSPP = When you save, it will load on a PSP, but not an older PPSSPP +When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Yes = Iyo mane +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = file is compressed (7z).\nPlease decompress first (try 7-Zip or WinRAR). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = Could not save screenshot file. +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll not found. Please install. Or press Yes to try again using Direct3D 9 instead. +D3D11InitializationError = Direct3D 11 initialization error +D3D11Missing = Your operating system version does not include D3D11. Please run Windows Update.\n\nPress Yes to try again using Direct3D 9 instead. +D3D11NotSupported = Your GPU does not appear to support Direct3D 11.\n\nWould you like to try again using Direct3D 9 instead? +Disk full while writing data = Disk full while writing data. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = Ai errormi mane: +Error reading file = erormi te' fail mane. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = eda na ditandai te' fail. +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Failed initializing graphics. Try upgrading your graphics drivers and DirectX 9 runtime.\n\nWould you like to try switching to OpenGL?\n\nError message: +GenericGraphicsError = Graphics Error +GenericOpenGLError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to DirectX 9?\n\nError message: +GenericVulkanError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to OpenGL?\n\nError message: +InsufficientOpenGLDriver = Insufficient OpenGL driver support detected!\n\nYour GPU reports that it does not support OpenGL 2.0. Would you like to try using DirectX instead?\n\nDirectX is currently compatible with less games, but on your GPU it may be the only choice.\n\nVisit the forums at https://forums.ppsspp.org for more information.\n\n +Just a directory. = polderra te'e mane. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = eda EBOOT.PBP, tanggia kapang paningoan. +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = OpenGL driver error +PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP currently does not support connecting to the Internet for DLC, PSN, or game updates. +PS1 EBOOTs are not supported by PPSSPP. = Eda na bisa ke paningoan PS1 mane. +PSX game image detected. = File is a MODE2 image. PPSSPP doesn't support PS1 games. +RAR file detected (Require UnRAR) = file is compressed (RAR).\nPlease decompress first (try UnRAR). +RAR file detected (Require WINRAR) = file is compressed (RAR).\nPlease decompress first (try WinRAR). +Running slow: try frameskip, sound is choppy when slow = Running slow: try frameskip, sound is choppy when slow +Running slow: Try turning off Software Rendering = Running slow: try turning off "software rendering" +Save encryption failed. This save won't work on real PSP = Save encryption failed. This save won't work on real PSP +textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +This is a saved state, not a game. = This is a saved state, not a game. +This is save data, not a game. = This is save data, not a game. +Unable to create cheat file, disk may be full = Unable to create cheat file, disk may be full. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Unable to write savedata, disk may be full. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Warning: Video memory FULL, reducing upscaling and switching to slow caching mode. +Warning: Video memory FULL, switching to slow caching mode = Warning: Video memory FULL, switching to slow caching mode. +ZIP file detected (Require UnRAR) = file is compressed (ZIP).\nPlease decompress first (try UnRAR). +ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompress first (try WinRAR). + +[Game] +Asia = Asia +ConfirmDelete = Delete +Create Game Config = Create game config +Create Shortcut = Garaganni shortcut +Delete Game = Delete game +Delete Game Config = Delete game config +Delete Save Data = Delete savedata +Europe = Europe +Game = Paningoan +Game Settings = Pangngaturan Paningoan +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Data install +Japan = Japan +Korea = Korea +MB = MB +One moment please... = One moment please... +Play = Maningo +Remove From Recent = Remove from "Recent" +SaveData = Pangsave +Setting Background = Setting background +Show In Folder = Show in folder +USA = USA +Use UI background = Use UI background + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = unlimited +(supersampling) = (supersampling) +(upscaling) = (upscaling) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Aggressive +Alternative Speed = Lassi to leko'napa +Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Anisotropic Filtering = Panyaring Anisotropic +Auto = Ia mesa +Auto (1:1) = Auto (1:1) +Auto (same as Rendering) = Auto (same as rendering resolution) +Auto FrameSkip = Auto frameskip +Auto Scaling = Auto scaling +Backend = Backend +Balanced = Balanced +Bicubic = Bicubic +BlockTransfer Tip = Some games require this to be On for correct graphics +BlockTransferRequired = Warning: This game requires "simulate block transfer effects" to be set to On. +Both = Pa jio duai +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Buffered rendering +BufferedRenderingRequired = Warning: This game requires "rendering mode" to be set to "buffered". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Screen size (in % of the viewport) +Cardboard Screen X Shift = X shift (in % of the blank space) +Cardboard Screen Y Shift = Y shift (in % of the blank space) +Cardboard VR Settings = Google Cardboard VR settings +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU core +Debugging = Debug +DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. +Deposterize = Deposterize +Deposterize Tip = Fixes visual banding glitches in upscaled textures +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Disable slower effects (speedup) +Disabled = Disabled +Display layout editor = Display layout editor +Display Resolution (HW scaler) = Display resolution (HW scaler) +Dump next frame to log = Palakoi log to gambara' undipa +Enable Cardboard VR = Enable Cardboard VR +FPS = FPS +Frame Rate Control = Atoro'i FRna +Frame Skipping = Frameskip +Frame Skipping Type = Frame skipping type +FullScreen = Layar pol +Hack Settings = Hack settings (may cause glitches) +Hardware Tessellation = Hardware tessellation +Hardware Transform = Sullei Hardware +hardware transform error - falling back to software = Hardware transform error, falling back to software +HardwareTessellation Tip = Uses hardware to make curves +High = High +Hybrid = Hybrid +Hybrid + Bicubic = Hybrid + Bicubic +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Internal resolution +Lazy texture caching = Lazy texture caching (speedup) +Linear = Maruruh +Low = Low +LowCurves = Spline/Bezier curves quality +LowCurves Tip = Only used by some games, controls smoothness of curves +Lower resolution for effects (reduces artifacts) = Lower resolution for effects (reduces artifacts) +Manual Scaling = Manual scaling +Medium = Medium +Mode = Mode +Must Restart = You must restart PPSSPP for this change to take effect. +Native device resolution = Native device resolution +Nearest = To paling mandoppi' +No buffer = No buffer +Non-Buffered Rendering = Skip buffer effects (non-buffered, faster) +None = Danggo'mo +Number of Frames = Number of frames +Off = Mate +OpenGL = OpenGL +Overlay Information = Pempakitan Overlay +Partial Stretch = Partial stretch +Percent of FPS = Percent of FPS +Performance = Performance +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Postprocessing shader +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = Pa marrender i +Rendering Resolution = Rendering resolution +RenderingMode NonBuffered Tip = Faster, but nothing may draw in some games +Retain changed textures = Retain changed textures (sometimes slower) +RetainChangedTextures Tip = Makes many games slower, but some games a lot faster +Rotation = Rotation +Safe = Safe +Screen layout = Screen layout +Screen Scaling Filter = Screen scaling filter +Show Debug Statistics = Padenni Debugna +Show FPS Counter = Padenni FPSna +Simulate Block Transfer = Simulate block transfer effects +SoftGPU Tip = Currently VERY slow +Software Rendering = Pakeanni Software Tampilkan (dicoba-cobara) +Software Skinning = Software skinning +SoftwareSkinning Tip = Combine skinned model draws on the CPU, faster in most games +Speed = Lassinna +Stretching = Stretching +Texture Filter = Panyaring Texture +Texture Filtering = Saring i Texture +Texture Scaling = Petonggoi Texture +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Turn off "hardware tessellation": unsupported +Unlimited = Unlimited +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = Patonggoi skala +Upscale Type = Skala apa mane? +UpscaleLevel Tip = CPU heavy - some scaling may be delayed to avoid stutter +Use all displays = Use all displays +Vertex Cache = Pangnganna Vertex +VertexCache Tip = Faster, but may cause temporary flicker +VSync = VSync +Vulkan = Vulkan +Window Size = Window size +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Delete ZIP file +Install = Install +Install game from ZIP file? = Install game from ZIP file? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = Installed! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = Auto configure +Autoconfigure for device = Autoconfigure for device +Clear All = Paccingngi nasan +Default All = Poleboko' nasan +Map a new key for = Garaganni tombol baru +Map Key = Map key +Map Mouse = Map mouse +Test Analogs = Test analogs +You can press ESC to cancel. = You can press Esc to cancel. + +[MainMenu] +Browse = Browse... +Buy PPSSPP Gold = Buy PPSSPP Gold +Choose folder = Choose folder +Credits = Panggaraganna +PPSSPP Homebrew Store = PPSSPP Homebrew Store +Exit = Pessu'un +Game Settings = Pangngaturan Paningoan +Games = Paningoan +Give PPSSPP permission to access storage = Give PPSSPP permission to access storage +Homebrew & Demos = Homebrew Sola Demo +How to get games = Matumbaki' nampa' paningoan? +How to get homebrew & demos = Matumbaki' nampa' homebrew && demo? +Load = Bukka'... +Loading... = Loading... +PinPath = Pin +PPSSPP can't load games or save right now = PPSSPP can't load games or save right now +Recent = Mane' mangkanna dipaningoan +SavesAreTemporary = PPSSPP is saving in temporary storage +SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently +SavesAreTemporaryIgnore = Ignore warning +UnpinPath = Unpin +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Suarana +Controls = Tombolna +Graphics = Gambara'na +Networking = Networking +System = Sistemna +Tools = Tools + +[MappableControls] +Alt speed 1 = Alt speed 1 +Alt speed 2 = Alt speed 2 +An.Down = An.Jiong +An.Left = An.Kiri +An.Right = An.Kanan +An.Up = An.Jaoh +Analog limiter = Analog limiter +Analog Stick = Analog stick +Audio/Video Recording = Audio/Video recording +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Axis swap +Circle = Circle +Cross = Cross +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = DevMenu +Down = Jiong +Dpad = Dpad +Frame Advance = Frame advance +Hold = Hold +Home = Home +L = L +Left = Kiri +Load State = Load State +Mute toggle = Mute toggle +Next Slot = Next Slot +None = None +Note = Note +OpenChat = Open chat +Pause = Paus +R = R +RapidFire = RapidFire +Remote hold = Remote hold +Rewind = Rewind +Right = Kanan +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = AnKanan.Jiong +RightAn.Left = AnKanan.Kiri +RightAn.Right = AnKanan.Kanan +RightAn.Up = AnKanan.Jaoh +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Save State +Screen = Screen +Screenshot = Screenshot +Select = Select +SpeedToggle = SpeedToggle +Square = Square +Start = Start +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = Toggle fullscreen +Toggle mode = Toggle mode +Triangle = Triangle +Unthrottle = Unthrottle +Up = Jaoh +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Change MAC address +Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable network chat = Enable network chat +Enable networking = Enable networking/WLAN (beta, may break games) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Network initialized +Please change your Port Offset = Please change your port offset +Port offset = Port offset(0 = PSP compatibility) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Send Discord "Rich Presence" information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = Cheats +Continue = Patarruh +Create Game Config = Create game config +Delete Game Config = Delete game config +Exit to menu = Pessun lako menu +Game Settings = Pangngaturanna to paningoan +Load State = Load malassi +Rewind = Rewind +Save State = Save malassi +Settings = Pangngaturan +Switch UMD = Switch UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Color +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Cartoon +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT scanlines +FXAA = FXAA Antialiasing +Gamma = Gamma +Grayscale = Grayscale +Intensity = Intensity +InverseColors = Inverse Colors +Natural = Natural Colors +NaturalA = Natural Colors (no blur) +Off = Off +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlines (CRT) +Sharpen = Sharpen +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 Upscaler +VideoSmoothingAA = VideoSmoothingAA +Vignette = Vignette + +[PSPCredits] +all the forum mods = all the forum mods +build server = build server +Buy Gold = Alli'i Gold +check = Kita to'piki' Dolphin, emu Wii/GC paling marege: +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = Yato bali'i garagai: +created = Yato garagai +Discord = Discord +info1 = Yate' PPSSPP mane dikuara den melajah. +info2 = Yana maningoki' harusra di alli tongan to gamena +info3 = Alli memangmi UMDna ato alli i jo internet +info4 = pakeki' PSP asli le'. +info5 = Sony, Inc yato punnai'i PSP +iOS builds = iOS builds +license = Aplikasi gratis pake GPL 2.0+ +list = Daptar to coco', forum, sola info panggaragaan +PPSSPP Forums = Forumna PPSSPP +Privacy Policy = Privacy policy +Share PPSSPP = Share PPSSPP +specialthanks = Tarimakasi banyak lako: +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = Yato artikanni lako basa duri: mupralsh +title = Emulator PSP malassi +tools = To dipake garagai: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = +translators2 = +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Ollongngi todai situsna mane: +written = Pake C++ digaraka yamo na malassi + +[RemoteISO] +Browse Games = Browse games +Local Server Port = Local server port +Manual Mode Client = Manual mode client +Remote disc streaming = Remote disc streaming +Remote Port = Remote port +Remote Server = Remote server +Remote Subdirectory = Remote subdirectory +RemoteISODesc = Games in your recent list will be shared +RemoteISOLoading = Connected, loading game list... +RemoteISOScanning = Scanning... Click "share games" on your server device +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Note: Connect both devices to the same Wi-Fi network +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Settings +Share Games (Server) = Share games (server) +Share on PPSSPP startup = Share on PPSSPP startup +Stop Sharing = Stop sharing +Stopping.. = Stopping... + +[Reporting] +Bad = Bad +FeedbackDelayInfo = Your data is being submitted in the background. +FeedbackDesc = How's the emulation? Let us and the community know! +FeedbackDisabled = Compatibility server reports must be enabled. +FeedbackIncludeCRC = Note: Battery will be used to send a disc CRC +FeedbackIncludeScreen = Include a screenshot +FeedbackSubmitDone = Your data has been submitted. +FeedbackSubmitFail = Could not submit data to server. Try updating PPSSPP. +FeedbackThanks = Thanks for your feedback! +Gameplay = Gameplay +Graphics = Graphics +Great = Great +In-game = In-game +In-game Description = Gets into gameplay, but too buggy to complete +Menu/Intro = Menu/Intro +Menu/Intro Description = Can't get into the game itself +Nothing = Nothing +Nothing Description = Completely broken +OK = OK +Open Browser = Open browser +Overall = Overall +Perfect = Perfect +Perfect Description = Flawless emulation for the entire game - great! +Plays = Plays +Plays Description = Fully playable but might be with glitches +ReportButton = Report feedback +Speed = Speed +Submit Feedback = Submit feedback +SuggestionConfig = See reports on website for good settings. +SuggestionCPUSpeed0 = Disable locked CPU speed setting. +SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this bug). +SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. +SuggestionsNone = This game isn't working for other users too. +SuggestionsWaiting = Submitting and checking other users feedback... +SuggestionUpgrade = Upgrade to a newer PPSSPP build. +SuggestionVerifyDisc = Check your ISO is a good copy of your disc. +Unselected Overall Description = How well does this game emulate? +View Feedback = View all feedbacks + +[Savedata] +Date = Date +Filename = Filename +No screenshot = No screenshot +None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Save Data = Save data +Save States = Save states +Savedata Manager = Savedata manager +Size = Size + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = WARNING: Chainfire3D detected, may cause problems. +Failed to load state = Failed to load state +Failed to save state = Failed to save state +fixed = Lassinna: sembarang +GLToolsWarning = WARNING: GLTools detected, may cause problems. +In menu = In menu +Load savestate failed = Load savestate failed +Loaded State = Tibukka'mi loadna +Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +LoadStateDoesntExist = Eda nabisa tiload mane: Eda memangpa savena! +LoadStateWrongVersion = Eda nabisa tiload mane: Save to jolora te' PPSSPP! +norewind = No rewind save states available. +Playing = Playing +PressESC = Pissi'ki' ESC ta melako menu. +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = Gagal i mangnganna mane! +Saved State = Tiannami Savena +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Speed: alternate 2 +standard = Lassinna: standar +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = Already installed +Connection Error = Connection error +Install = Install +Launch Game = Launch game +Loading... = Loading... +MB = MB +Size = Size +Uninstall = Uninstall + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d cores) +%d bytes = %d bytes +(none detected) = (none detected) +3D API = 3D API +ABI = ABI +API Version = API version +Audio Information = Audio information +Board = Board +Build Config = Build config +Build Configuration = Build Configuration +Built by = Built by +Core Context = Core context +Cores = Cores +CPU Extensions = CPU extensions +CPU Information = CPU information +CPU Name = Name +D3DCompiler Version = D3DCompiler version +Debug = Debug +Debugger Present = Debugger present +Device Info = Device info +Display Information = Display information +Driver Version = Driver version +EGL Extensions = EGL extensions +Frames per buffer = Frames per buffer +GPU Information = GPU information +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Lang/Region +Memory Page Size = Memory page size +Native Resolution = Native resolution +OGL Extensions = OGL extensions +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 extensions +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 extensions +OpenGL Extensions = OpenGL extensions +Optimal frames per buffer = Optimal frames per buffer +Optimal sample rate = Optimal sample rate +OS Information = OS information +PPSSPP build = PPSSPP build +Refresh rate = Refresh rate +Release = Release +RW/RX exclusive = RW/RX exclusive +Sample rate = Sample rate +Shading Language = Shading language +Sustained perf mode = Sustained perf mode +System Information = System information +System Name = Name +System Version = System version +Threads = Threads +Vendor = Vendor +Vendor (detected) = Vendor (detected) +Version Information = Version information +Vulkan Extensions = Vulkan extensions +Vulkan Features = Vulkan features + +[System] +(broken) = (broken) +12HR = 12jang +24HR = 24jang +Auto = Auto +Auto Load Savestate = Auto load savestate +AVI Dump started. = AVI dump started +AVI Dump stopped. = AVI dump stopped +Cache ISO in RAM = Cache full ISO in RAM +Change CPU Clock = Sullei lassinna to CPU (unstable) +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Sullei Nickname +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = Cheats (dicoba-cobara, kitaki' forum) +Clear Recent = Clear "Recent" +Clear Recent Games List = Hapusu'i daftarna to mane' dopaningoanni +Clear UI background = Clear UI background +Confirmation Button = To dipissi' yake yamo +Date Format = Matumbai to tanggala'? +Day Light Saving = Wattu Musim Malussu +DDMMYYYY = DDMMYYYY +Decrease size = Decrease size +Developer Tools = Pakakasa'na to panggaraga +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = Pang-emulasi +Enable Cheats = Pajalanni to Cheat +Enable Compatibility Server Reports = Laporri lako serverna PPSSPP +Failed to load state. Error in the file system. = Failed to load state. Error in the file system. +Failed to save state. Error in the file system. = Failed to save state. Error in the file system. +Fast (lag on slow storage) = Fast (lag on slow storage) +Fast Memory = Memori malassi (tang stabil) +Force real clock sync (slower, less lag) = Force real clock sync (slower, less lag) +frames, 0:off = frames, 0 = off +Games list settings = Games list settings +General = Yato biasa +Grid icon size = Grid icon size +Help the PPSSPP team = Help the PPSSPP team +Host (bugs, less lag) = Host (bugs, less lag) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Interpreter +IO timing method = I/O timing method +IR Interpreter = IR interpreter +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = Memory Stick inserted +MHz, 0:default = MHz, 0 = default +MMDDYYYY = MMDDYYYY +Newest Save = Newest save +Not a PSP game = Not a PSP game +Off = Off +Oldest Save = Oldest save +PSP Model = PSP model +PSP Settings = Pangngaturan PSP +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Record audio +Record Display = Record display +Reset Recording on Save/Load State = Reset recording on Save/Load state +Restore Default Settings = Restore PPSSPP's settings to default +Rewind Snapshot Frequency = Rewind snapshot frequency (mem hog) +Save path in installed.txt = Save path in installed.txt +Save path in My Documents = Save path in My Documents +Savestate Slot = Savestate slot +Savestate slot backups = Savestate slot backups +Screenshots as PNG = Alai gambara'na PNG +Set UI background... = Set UI background... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Simulate UMD delays +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Storage full +Sustained performance mode = Sustained performance mode +Time Format = Matumbai to wattu? +UI = UI +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) +Use O to confirm = O yake yamo +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = X yake yamo +VersionCheck = Check for new versions of PPSSPP +WARNING: Android battery save mode is on = WARNING: Android battery save mode is On +WARNING: Battery save mode is on = WARNING: Battery save mode is on +YYYYMMDD = YYYYMMDD + +[Upgrade] +Details = Details +Dismiss = Dismiss +Download = Download +New version of PPSSPP available = New version of PPSSPP available diff --git a/assets/lang/en_US.ini b/assets/lang/en_US.ini new file mode 100644 index 0000000000..69f055ddb6 --- /dev/null +++ b/assets/lang/en_US.ini @@ -0,0 +1,1097 @@ +# Thanks for your interest in translating PPSSPP. +# +# Simply copy this file to a new ini file with your language code, +# or use it to update an existing file with that name. +# +# To see a list of codes, view this page: +# https://stackoverflow.com/questions/3191664/list-of-all-locales-and-their-short-codes +# +# Please note, while translating: +# +# Hash/sharp symbols (#) in this file indicate a comment. Lines that begin without one are +# considered to be a part of the actual translations. +# +# The left side of the equals sign indicates "key" values that PPSSPP uses to identify a string. +# If they don't match correctly, PPSSPP won't use them. +# +# Ampersands (&) on the RIGHT side of an equals sign denote an underlined keyboard hotkey. +# The hotkeys are only supported currently in the DesktopUI section, however. +# +# Example 1: &File. This will make it so when you press ALT + F on Windows, it'll open the File menu. +# Example 2: Homebrew && Demos. This would show one real ampersand in the menu. +# +# Happy translating. + +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = Audio backend (restart req.) +AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) +Auto = Auto +Device = Device +DSound (compatible) = DSound (compatible) +Enable Sound = Enable sound +Global volume = Global volume +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = WASAPI (fast) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Analog axis sensitivity +Analog Limiter = Analog limiter +Analog Mapper High End = Analog mapper high-end (axis sensitivity) +Analog Mapper Low End = Analog mapper low-end (inverse deadzone) +Analog Mapper Mode = Analog mapper mode +Analog Stick = Analog stick +AnalogLimiter Tip = When the analog limiter button is pressed +Auto = Auto +Auto-centering analog stick = Auto-centering analog stick +Auto-hide buttons after seconds = Auto-hide buttons after seconds +Binds = Binds +Button Opacity = Buttons opacity +Button style = Button style +Calibrate D-Pad = Calibrate +Calibration = Calibration +Classic = Classic +Combo Key Setting = Combo key setting +Combo Key Setup = Combo key setup +Confine Mouse = Trap mouse within window/display area +Control Mapping = Control mapping +Custom layout... = Edit touch control layout... +Customize tilt = Customize tilt... +D-PAD = D-Pad +Deadzone Radius = Deadzone radius +DInput Analog Settings = DInput analog settings +Disable D-Pad diagonals (4-way touch) = Disable D-Pad diagonals (4-way touch) +Glowing borders = Glowing borders +HapticFeedback = Haptic feedback (vibration) +Ignore gamepads when not focused = Ignore gamepads when not focused +Ignore Windows Key = Disable Windows key +Invert Axes = Invert axes +Invert Tilt along X axis = Invert tilt along X axis +Invert Tilt along Y axis = Invert tilt along Y axis +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Keyboard control settings +L/R Trigger Buttons = L/R trigger buttons +Landscape = Landscape +Landscape Auto = Landscape auto +Landscape Reversed = Landscape reversed +Mouse = Mouse settings +Mouse sensitivity = Mouse sensitivity +Mouse smoothing = Mouse smoothing +MouseControl Tip = You can now map mouse in control mapping screen by pressing the 'M' icon. +None (Disabled) = None (disabled) +Off = Off +OnScreen = On-screen touch controls +Portrait = Portrait +Portrait Reversed = Portrait reversed +PSP Action Buttons = PSP action buttons +Screen Rotation = Screen rotation +seconds, 0 : off = seconds, 0 = off +Sensitivity = Sensitivity +Show right analog = Show right analog +Show Touch Pause Menu Button = Show pause menu button +Thin borders = Thin borders +Tilt Base Radius = Tilt base radius +Tilt Input Type = Tilt input type +Tilt Sensitivity along X axis = Tilt sensitivity along X axis +Tilt Sensitivity along Y axis = Tilt sensitivity along Y axis +To Calibrate = To calibrate, keep device on a flat surface and press "Calibrate". +Touch Control Visibility = Touch control visibility +Use custom right analog = Use custom right analog +Use Mouse Control = Use mouse control +Visibility = Visibility +X = X +X + Y = X + Y +XInput Analog Settings = XInput analog settings +Y = Y + +[CwCheats] +Cheats = Cheats +Edit Cheat File = Edit cheat file +Enable/Disable All = Enable/Disable all Cheats +Import Cheats = Import from cheat.db +Options = Options +Refresh Rate = Refresh rate + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = &About PPSSPP... +Auto = &Auto +Backend = Rendering &backend (restarts PPSSPP) +Bicubic = &Bicubic +Break = Break +Break on Load = Break on load +Buffered Rendering = &Buffered rendering +Buy Gold = Buy &Gold +Control Mapping... = C&ontrol mapping... +Debugging = &Debug +Deposterize = &Deposterize +Direct3D9 = Direct3D &9 +Direct3D11 = Direct3D &11 +Disassembly = &Disassembly... +Discord = Discord +Display Layout Editor = Display layout editor... +Display Rotation = Display rotation +Dump Next Frame to Log = D&ump next frame to log +Emulation = &Emulation +Enable Chat = Enable chat +Enable Cheats = Enable &cheats +Enable Sound = Enable s&ound +Exit = E&xit +Extract File... = E&xtract file... +File = &File +Frame Skipping = &Frame skipping +Frame Skipping Type = Frame skipping type +Fullscreen = Fu&llscreen +Game Settings = &Game settings +GE Debugger... = GE debugge&r... +GitHub = Git&Hub +Hardware Transform = &Hardware transform +Help = &Help +Hybrid = &Hybrid +Hybrid + Bicubic = H&ybrid + bicubic +Ignore Illegal Reads/Writes = &Ignore illegal reads/writes +Ignore Windows Key = Ignore Windows key +Keep PPSSPP On Top = &Keep PPSSPP on top +Landscape = Landscape +Landscape reversed = Landscape reversed +Language... = La&nguage... +Linear = &Linear +Load = &Load... +Load .sym File... = Lo&ad .sym file... +Load Map File... = Load &Map file... +Load State = L&oad state +Load State File... = &Load state file... +Log Console = &Log console +Memory View... = Memory &view... +More Settings... = &More settings... +Nearest = &Nearest +Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) +Off = &Off +Open Directory... = Open &directory... +Open from MS:/PSP/GAME... = O&pen from MS:/PSP/GAME... +Open Memory Stick = Open &Memory Stick +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = &Pause +Pause When Not Focused = &Pause when not focused +Portrait = Portrait +Portrait reversed = Portrait reversed +Postprocessing Shader = Postprocessin&g shader +PPSSPP Forums = PPSSPP &forums +Record = &Record +Record Audio = Record &audio +Record Display = Record &display +Rendering Mode = Rendering m&ode +Rendering Resolution = &Rendering resolution +Reset = R&eset +Reset Symbol Table = Reset s&ymbol table +Run = &Run +Save .sym File... = Sav&e .sym file... +Save Map File... = &Save map file... +Save State = S&ave state +Save State File... = &Save state file... +Savestate Slot = Saves&tate slot +Screen Scaling Filter = Scr&een scaling filter +Show Debug Statistics = Show debu&g statistics +Show FPS Counter = Show &FPS counter +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = &Stop +Switch UMD = Switch UMD +Take Screenshot = &Take screenshot +Texture Filtering = Te&xture filtering +Texture Scaling = &Texture scaling +Use Lossless Video Codec (FFV1) = &Use lossless video codec (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = &Vertex cache +VSync = VS&ync +Vulkan = Vulkan +Window Size = &Window size +www.ppsspp.org = Visit www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allocator viewer (Vulkan) +Allow remote debugger = Allow remote debugger +Backspace = Backspace +Block address = Block address +By Address = By address +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Create/Open textures.ini file for current game +Current = Current +Dev Tools = Development tools +DevMenu = DevMenu +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Dump decrypted EBOOT.BIN on game boot +Dump Frame GPU Commands = Dump frame GPU commands +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Enable debug logging +Enter address = Enter address +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Frame profiler +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = JIT compare +JIT debug tools = JIT debug tools +Language = Language +Load language ini = Load language ini +Log Dropped Frame Statistics = Log dropped frame statistics +Log Level = Log level +Log View = Log view +Logging Channels = Logging channels +Next = Next +No block = No block +Prev = Previous +Random = Random +Replace textures = Replace textures +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. +RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? +Resume = Resume +Run CPU Tests = Run CPU tests +Save language ini = Save language ini +Save new textures = Save new textures +Shader Viewer = Shader viewer +Show Developer Menu = Show developer menu +Show on-screen messages = Show on-screen messages +Stats = Stats +System Information = System information +Texture Replacement = Texture replacement +Toggle Audio Debug = Toggle audio debug +Toggle Freeze = Toggle freeze +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP res +Active = Active +Back = Back +Cancel = Cancel +Center = Center +ChangingGPUBackends = Changing GPU backends requires PPSSPP to restart. Restart now? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = Choose PPSSPP save folder +Confirm Overwrite = Do you want to overwrite the data? +Confirm Save = Do you want to save this data? +ConfirmLoad = Load this data? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Delete +Delete all = Delete all +Delete completed = Delete completed. +DeleteConfirm = This save data will be deleted.\nAre you sure you want to continue? +DeleteConfirmAll = Do you really want to delete all\nyour save data for this game? +DeleteConfirmGame = Do you really want to delete this game\nfrom your device? You can't undo this. +DeleteConfirmGameConfig = Do you really want to delete the settings for this game? +DeleteFailed = Unable to delete data. +Deleting = Deleting\nPlease wait... +Disable All = Disable all +Edit = Edit +Enable All = Enable all +Enter = Enter +Finish = Finish +Grid = Grid +Inactive = Inactive +InternalError = An internal error has occurred. +Load = Load +Load completed = Load completed. +Loading = Loading\nPlease Wait... +LoadingFailed = Unable to load data. +Move = Move +Network Connection = Network Connection +NEW DATA = NEW DATA +No = No +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = OK +Old savedata detected = Old savedata detected +Options = Options +Reset = Reset +Resize = Resize +Retry = Retry +Save = Save +Save completed = Save completed. +Saving = Saving\nPlease wait... +SavingFailed = Unable to save data. +Select = Select +Shift = Shift +Snap = Snap +Space = Space +SSID = SSID +Submit = Submit +Supported = Supported +There is no data = There is no data. +Toggle All = Toggle all +Toggle List = Toggle list +Unsupported = Unsupported +When you save, it will load on a PSP, but not an older PPSSPP = When you save, it will load on a PSP, but not an older PPSSPP +When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Yes = Yes +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = File is compressed (7z).\nPlease decompress first (try 7-Zip or WinRAR). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = Could not save screenshot file. +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll not found. Please install. Or press Yes to try again using Direct3D 9 instead. +D3D11InitializationError = Direct3D 11 initialization error +D3D11Missing = Your operating system version does not include D3D11. Please run Windows Update.\n\nPress Yes to try again using Direct3D 9 instead. +D3D11NotSupported = Your GPU does not appear to support Direct3D 11.\n\nWould you like to try again using Direct3D 9 instead? +Disk full while writing data = Disk full while writing data. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = Could not load game. +Error reading file = Error reading file. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = Failed to identify file. +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Failed initializing graphics. Try upgrading your graphics drivers and DirectX 9 runtime.\n\nWould you like to try switching to OpenGL?\n\nError message: +GenericGraphicsError = Graphics Error +GenericOpenGLError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to DirectX 9?\n\nError message: +GenericVulkanError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to OpenGL?\n\nError message: +InsufficientOpenGLDriver = Insufficient OpenGL driver support detected!\n\nYour GPU reports that it does not support OpenGL 2.0. Would you like to try using DirectX instead?\n\nDirectX is currently compatible with less games, but on your GPU it may be the only choice.\n\nVisit the forums at https://forums.ppsspp.org for more information.\n\n +Just a directory. = Just a directory. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = No EBOOT.PBP, misidentified game. +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = OpenGL driver error +PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP currently does not support connecting to the Internet for DLC, PSN, or game updates. +PS1 EBOOTs are not supported by PPSSPP. = PS1 EBOOTs are not supported by PPSSPP. +PSX game image detected. = File is a MODE2 image. PPSSPP doesn't support PS1 games. +RAR file detected (Require UnRAR) = File is compressed (RAR).\nPlease decompress first (try UnRAR). +RAR file detected (Require WINRAR) = File is compressed (RAR).\nPlease decompress first (try WinRAR). +Running slow: try frameskip, sound is choppy when slow = Running slow: try frameskip, sound is choppy when slow +Running slow: Try turning off Software Rendering = Running slow: try turning off "software rendering" +Save encryption failed. This save won't work on real PSP = Save encryption failed. This save won't work on real PSP +textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +This is a saved state, not a game. = This is a saved state, not a game. +This is save data, not a game. = This is save data, not a game. +Unable to create cheat file, disk may be full = Unable to create cheat file, disk may be full. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Unable to write savedata, disk may be full. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Warning: Video memory FULL, reducing upscaling and switching to slow caching mode. +Warning: Video memory FULL, switching to slow caching mode = Warning: Video memory FULL, switching to slow caching mode. +ZIP file detected (Require UnRAR) = File is compressed (ZIP).\nPlease decompress first (try UnRAR). +ZIP file detected (Require WINRAR) = File is compressed (ZIP).\nPlease decompress first (try WinRAR). + +[Game] +Asia = Asia +ConfirmDelete = Delete +Create Game Config = Create game config +Create Shortcut = Create shortcut +Delete Game = Delete game +Delete Game Config = Delete game config +Delete Save Data = Delete savedata +Europe = Europe +Game = Game +Game Settings = Game settings +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Data install +Japan = Japan +Korea = Korea +MB = MB +One moment please... = One moment please... +Play = Play +Remove From Recent = Remove from "Recent" +SaveData = Savedata +Setting Background = Setting background +Show In Folder = Show in folder +USA = USA +Use UI background = Use UI background + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = unlimited +(supersampling) = (supersampling) +(upscaling) = (upscaling) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Aggressive +Alternative Speed = Alternative speed (in %, 0 = unlimited) +Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Anisotropic Filtering = Anisotropic filtering +Auto = Auto +Auto (1:1) = Auto (1:1) +Auto (same as Rendering) = Auto (same as rendering resolution) +Auto FrameSkip = Auto frameskip +Auto Scaling = Auto scaling +Backend = Backend +Balanced = Balanced +Bicubic = Bicubic +BlockTransfer Tip = Some games require this to be On for correct graphics +BlockTransferRequired = Warning: This game requires "simulate block transfer effects" to be set to On. +Both = Both +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Buffered rendering +BufferedRenderingRequired = Warning: This game requires "rendering mode" to be set to "buffered". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Screen size (in % of the viewport) +Cardboard Screen X Shift = X shift (in % of the blank space) +Cardboard Screen Y Shift = Y shift (in % of the blank space) +Cardboard VR Settings = Google Cardboard VR settings +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU core +Debugging = Debugging +DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. +Deposterize = Deposterize +Deposterize Tip = Fixes visual banding glitches in upscaled textures +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Disable slower effects (speedup) +Disabled = Disabled +Display layout editor = Display layout editor +Display Resolution (HW scaler) = Display resolution (HW scaler) +Dump next frame to log = Dump next frame to log +Enable Cardboard VR = Enable Cardboard VR +Features = Features +FPS = FPS +Frame Rate Control = Framerate control +Frame Skipping = Frame skipping +Frame Skipping Type = Frame skipping type +FullScreen = Fullscreen +Hack Settings = Hack settings (may cause glitches) +Hardware Tessellation = Hardware tessellation +Hardware Transform = Hardware transform +hardware transform error - falling back to software = Hardware transform error, falling back to software +HardwareTessellation Tip = Uses hardware to make curves +High = High +Hybrid = Hybrid +Hybrid + Bicubic = Hybrid + Bicubic +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Internal resolution +Lazy texture caching = Lazy texture caching (speedup) +Linear = Linear +Low = Low +LowCurves = Spline/Bezier curves quality +LowCurves Tip = Only used by some games, controls smoothness of curves +Lower resolution for effects (reduces artifacts) = Lower resolution for effects (reduces artifacts) +Manual Scaling = Manual scaling +Medium = Medium +Mode = Mode +Must Restart = You must restart PPSSPP for this change to take effect. +Native device resolution = Native device resolution +Nearest = Nearest +No buffer = No buffer +Non-Buffered Rendering = Skip buffer effects (non-buffered, faster) +None = None +Number of Frames = Number of frames +Off = Off +OpenGL = OpenGL +Overlay Information = Overlay information +Partial Stretch = Partial stretch +Percent of FPS = Percent of FPS +Performance = Performance +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Postprocessing shader +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = Rendering mode +Rendering Resolution = Rendering resolution +RenderingMode NonBuffered Tip = Faster, but nothing may draw in some games +Retain changed textures = Retain changed textures (sometimes slower) +RetainChangedTextures Tip = Makes many games slower, but some games a lot faster +Rotation = Rotation +Safe = Safe +Screen layout = Screen layout +Screen Scaling Filter = Screen scaling filter +Show Debug Statistics = Show debug statistics +Show FPS Counter = Show FPS counter +Simulate Block Transfer = Simulate block transfer effects +SoftGPU Tip = Currently VERY slow +Software Rendering = Software rendering (slow) +Software Skinning = Software skinning +SoftwareSkinning Tip = Combine skinned model draws on the CPU, faster in most games +Speed = Speed +Stretching = Stretching +Texture Filter = Texture filtering +Texture Filtering = Texture filtering +Texture Scaling = Texture scaling +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Turn off "hardware tessellation": unsupported +Unlimited = Unlimited +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = Upscale level +Upscale Type = Upscale type +UpscaleLevel Tip = CPU heavy - some scaling may be delayed to avoid stutter +Use all displays = Use all displays +Vertex Cache = Vertex cache +VertexCache Tip = Faster, but may cause temporary flicker +VSync = VSync +Vulkan = Vulkan +Window Size = Window size +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Delete ZIP file +Install = Install +Install game from ZIP file? = Install game from ZIP file? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = Installed! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = Auto configure +Autoconfigure for device = Autoconfigure for device +Clear All = Clear all +Default All = Restore defaults +Map a new key for = Map a new key for +Map Key = Map key +Map Mouse = Map mouse +Test Analogs = Test analogs +You can press ESC to cancel. = You can press Esc to cancel. + +[MainMenu] +Browse = Browse... +Buy PPSSPP Gold = Buy PPSSPP Gold +Choose folder = Choose folder +Credits = Credits +PPSSPP Homebrew Store = PPSSPP Homebrew Store +Exit = Exit +Game Settings = Settings +Games = Games +Give PPSSPP permission to access storage = Give PPSSPP permission to access storage +Homebrew & Demos = Homebrew && Demos +How to get games = How can I get games? +How to get homebrew & demos = How can I get homebrew && demos? +Load = Load... +Loading... = Loading... +PinPath = Pin +PPSSPP can't load games or save right now = PPSSPP can't load games or save right now +Recent = Recent +SavesAreTemporary = PPSSPP is saving in temporary storage +SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently +SavesAreTemporaryIgnore = Ignore warning +UnpinPath = Unpin +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Audio +Controls = Controls +Graphics = Graphics +Networking = Networking +System = System +Tools = Tools + +[MappableControls] +Alt speed 1 = Alt speed 1 +Alt speed 2 = Alt speed 2 +An.Down = Analog Down +An.Left = Analog Left +An.Right = Analog Right +An.Up = Analog Up +Analog limiter = Analog limiter +Analog Stick = Analog stick +Audio/Video Recording = Audio/Video recording +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Axis swap +Circle = Circle +Cross = Cross +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = DevMenu +Down = Dpad Down +Dpad = Dpad +Frame Advance = Frame advance +Hold = Hold +Home = Home +L = L +Left = Dpad Left +Load State = Load state +Mute toggle = Mute toggle +Next Slot = Next slot +None = None +Note = Note +OpenChat = Open chat +Pause = Pause +R = R +RapidFire = Rapid-fire +Remote hold = Remote hold +Rewind = Rewind +Right = Dpad Right +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = RightAn.Down +RightAn.Left = RightAn.Left +RightAn.Right = RightAn.Right +RightAn.Up = RightAn.Up +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Save state +Screen = Screen +Screenshot = Screenshot +Select = Select +SpeedToggle = Speed toggle +Square = Square +Start = Start +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = Toggle fullscreen +Toggle mode = Toggle mode +Triangle = Triangle +Unthrottle = Unthrottle +Up = Dpad Up +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Change MAC address +Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable network chat = Enable network chat +Enable networking = Enable networking/WLAN (beta, may break games) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Network initialized +Please change your Port Offset = Please change your port offset +Port offset = Port offset (0 = PSP compatibility) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Send Discord "Rich Presence" information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = Cheats +Continue = Continue +Create Game Config = Create game config +Delete Game Config = Delete game config +Exit to menu = Exit to menu +Game Settings = Game settings +Load State = Load state +Rewind = Rewind +Save State = Save state +Settings = Settings +Switch UMD = Switch UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Color +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Cartoon +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT scanlines +FXAA = FXAA Antialiasing +Gamma = Gamma +Grayscale = Grayscale +Intensity = Intensity +InverseColors = Inverse Colors +Natural = Natural Colors +NaturalA = Natural Colors (no blur) +Off = Off +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlines (CRT) +Sharpen = Sharpen +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 Upscaler +VideoSmoothingAA = Video Smoothing AA +Vignette = Vignette + +[PSPCredits] +all the forum mods = all the forum mods +build server = build server +Buy Gold = Buy Gold +check = Also check out Dolphin, the best Wii/GC emu around: +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = Contributors: +created = Created by +Discord = Discord +info1 = PPSSPP is intended for educational purposes only. +info2 = Please make sure that you own the rights to any games +info3 = you play by owning the UMD or by buying the digital +info4 = download from the PSN store on your real PSP. +info5 = PSP is a trademark by Sony, Inc. +iOS builds = iOS builds +license = Free software under GPL 2.0+ +list = compatibility lists, forums, and development info +PPSSPP Forums = PPSSPP Forums +Privacy Policy = Privacy policy +Share PPSSPP = Share PPSSPP +specialthanks = Special thanks to: +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = this translation by: +title = A fast and portable PSP emulator +tools = Free tools used: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = MrYadro, mgaver, VIRGINKLM, raven02 +translators2 = sum2012, vnctdj, unknownbrackets, ufdada +translators3 = The Dax, wuspring, hrydgard, adrian17 +translators4 = papel +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Check out the website: +written = Written in C++ for speed and portability + +[RemoteISO] +Browse Games = Browse games +Local Server Port = Local server port +Manual Mode Client = Manually configure client +Remote disc streaming = Remote disc streaming +Remote Port = Remote port +Remote Server = Remote server +Remote Subdirectory = Remote subdirectory +RemoteISODesc = Games in your "Recent" list will be shared +RemoteISOLoading = Connected, loading game list... +RemoteISOScanning = Scanning... Click "share games" on your server device +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Note: Connect both devices to the same Wi-Fi network +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Settings +Share Games (Server) = Share games (server) +Share on PPSSPP startup = Share on PPSSPP startup +Stop Sharing = Stop sharing +Stopping.. = Stopping... + +[Reporting] +Bad = Bad +FeedbackDelayInfo = Your data is being submitted in the background. +FeedbackDesc = How's the emulation? Let us and the community know! +FeedbackDisabled = Compatibility server reports must be enabled. +FeedbackIncludeCRC = Note: Battery will be used to send a disc CRC +FeedbackIncludeScreen = Include a screenshot +FeedbackSubmitDone = Your data has been submitted. +FeedbackSubmitFail = Could not submit data to server. Try updating PPSSPP. +FeedbackThanks = Thanks for your feedback! +Gameplay = Gameplay +Graphics = Graphics +Great = Great +In-game = In-game +In-game Description = Gets into gameplay, but too buggy to complete +Menu/Intro = Menu/Intro +Menu/Intro Description = Can't get into the game itself +Nothing = Nothing +Nothing Description = Completely broken +OK = OK +Open Browser = Open reporting website +Overall = Overall +Perfect = Perfect +Perfect Description = Flawless emulation for the entire game - great! +Plays = Plays +Plays Description = Fully playable but might be with glitches +ReportButton = Report feedback +Speed = Speed +Submit Feedback = Submit feedback +SuggestionConfig = See reports on website for good settings. +SuggestionCPUSpeed0 = Disable locked CPU speed setting. +SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this bug). +SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. +SuggestionsNone = This game isn't working for other users too. +SuggestionsWaiting = Submitting and checking other users feedback... +SuggestionUpgrade = Upgrade to a newer PPSSPP build. +SuggestionVerifyDisc = Check your ISO is a good copy of your disc. +Unselected Overall Description = How well does this game emulate? +View Feedback = View all feedbacks + +[Savedata] +Date = Date +Filename = Filename +No screenshot = No screenshot +None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Save Data = Save data +Save States = Save states +Savedata Manager = Savedata manager +Size = Size + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = WARNING: Chainfire3D detected, may cause problems. +Failed to load state = Failed to load state +Failed to save state = Failed to save state +fixed = Speed: alternate +GLToolsWarning = WARNING: GLTools detected, may cause problems. +In menu = In menu +Load savestate failed = Load savestate failed +Loaded State = State loaded +Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +LoadStateDoesntExist = Failed to load state: Savestate doesn't exist! +LoadStateWrongVersion = Failed to load state: Savestate is for an older version of PPSSPP! +norewind = No rewind save states available. +Playing = Playing +PressESC = Press ESC to open the pause menu. +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = Failed to save state! +Saved State = State saved +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Speed: alternate 2 +standard = Speed: standard +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = Already installed +Connection Error = Connection error +Install = Install +Launch Game = Launch game +Loading... = Loading... +MB = MB +Size = Size +Uninstall = Uninstall + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d cores) +%d bytes = %d bytes +(none detected) = (none detected) +3D API = 3D API +ABI = ABI +API Version = API version +Audio Information = Audio information +Board = Board +Build Config = Build config +Build Configuration = Build Configuration +Built by = Built by +Core Context = Core context +Cores = Cores +CPU Extensions = CPU extensions +CPU Information = CPU information +CPU Name = Name +D3DCompiler Version = D3DCompiler version +Debug = Debug +Debugger Present = Debugger present +Device Info = Device info +Display Information = Display information +Driver Version = Driver version +EGL Extensions = EGL extensions +Frames per buffer = Frames per buffer +GPU Information = GPU information +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Lang/Region +Memory Page Size = Memory page size +Native Resolution = Native resolution +OGL Extensions = OGL extensions +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 extensions +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 extensions +OpenGL Extensions = OpenGL extensions +Optimal frames per buffer = Optimal frames per buffer +Optimal sample rate = Optimal sample rate +OS Information = OS information +PPSSPP build = PPSSPP build +Refresh rate = Refresh rate +Release = Release +RW/RX exclusive = RW/RX exclusive +Sample rate = Sample rate +Shading Language = Shading language +Sustained perf mode = Sustained perf mode +System Information = System information +System Name = Name +System Version = System version +Threads = Threads +Vendor = Vendor +Vendor (detected) = Vendor (detected) +Version Information = Version information +Vulkan Extensions = Vulkan extensions +Vulkan Features = Vulkan features + +[System] +(broken) = (broken) +12HR = 12HR +24HR = 24HR +Auto = Auto +Auto Load Savestate = Auto load savestate +AVI Dump started. = AVI dump started +AVI Dump stopped. = AVI dump stopped +Cache ISO in RAM = Cache full ISO in RAM +Change CPU Clock = Change emulated PSP's CPU clock (unstable) +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Change nickname +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = Cheats (experimental, see forums) +Clear Recent = Clear "Recent" +Clear Recent Games List = Clear "Recent" list +Clear UI background = Clear UI background +Confirmation Button = Confirmation button +Date Format = Date format +Day Light Saving = Daylight savings +DDMMYYYY = DDMMYYYY +Decrease size = Decrease size +Developer Tools = Developer tools +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emulation +Enable Cheats = Enable cheats +Enable Compatibility Server Reports = Enable compatibility server reports +Failed to load state. Error in the file system. = Failed to load state. Error in the file system. +Failed to save state. Error in the file system. = Failed to save state. Error in the file system. +Fast (lag on slow storage) = Fast (lag on slow storage) +Fast Memory = Fast memory (unstable) +Force real clock sync (slower, less lag) = Force real clock sync (slower, less lag) +frames, 0:off = frames, 0 = off +Games list settings = Games list settings +General = General +Grid icon size = Grid icon size +Help the PPSSPP team = Help the PPSSPP team +Host (bugs, less lag) = Host (bugs, less lag) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Interpreter +IO timing method = I/O timing method +IR Interpreter = IR interpreter +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = Memory Stick inserted +MHz, 0:default = MHz, 0 = default +MMDDYYYY = MMDDYYYY +Newest Save = Newest save +Not a PSP game = Not a PSP game +Off = Off +Oldest Save = Oldest save +PSP Model = PSP model +PSP Settings = PSP settings +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Record audio +Record Display = Record display +Reset Recording on Save/Load State = Reset recording on Save/Load state +Restore Default Settings = Restore PPSSPP's settings to default +Rewind Snapshot Frequency = Rewind snapshot frequency (mem hog) +Save path in installed.txt = Save path in installed.txt +Save path in My Documents = Save path in My Documents +Savestate Slot = Savestate slot +Savestate slot backups = Savestate slot backups +Screenshots as PNG = Save screenshots in PNG format +Set UI background... = Set UI background... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Simulate UMD delays +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Storage full +Sustained performance mode = Sustained performance mode +Time Format = Time format +UI = UI +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) +Use O to confirm = Use O as confirmation button +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = Use X as confirmation button +VersionCheck = Check for new versions of PPSSPP +WARNING: Android battery save mode is on = WARNING: Android battery save mode is On +WARNING: Battery save mode is on = WARNING: Battery save mode is on +YYYYMMDD = YYYYMMDD + +[Upgrade] +Details = Details +Dismiss = Dismiss +Download = Download +New version of PPSSPP available = New version of PPSSPP available diff --git a/assets/lang/es_ES.ini b/assets/lang/es_ES.ini new file mode 100644 index 0000000000..48ebf1d73d --- /dev/null +++ b/assets/lang/es_ES.ini @@ -0,0 +1,1066 @@ +[Audio] +Alternate speed volume = Alternar velocidad de sonido +Audio backend = Motor de audio (requiere reiniciar) +AudioBufferingForBluetooth = Búfer compatible con bluetooth (lento) +Auto = Automático +Device = Dispositivo +DSound (compatible) = DSound (compatible) +Enable Sound = Activar sonido +Global volume = Volumen global +Microphone = Micrófono +Microphone Device = Dispositivo de entrada +Mute = Silenciar +Switch on new audio device = Cambiar a dispositivo de audio nuevo +Use global volume = Usar volúmen global +WASAPI (fast) = WASAPI (rápido) + +[Controls] +Analog auto-rotation speed = Velocidad auto rotación del analóg. +Analog Axis Sensitivity = Sensibilidad de los ejes analóg. +Analog Limiter = Limitador analógico +Analog Mapper High End = Asignación analóg. básica (sensibilidad de ejes) +Analog Mapper Low End = Asignación analóg. avanzada (invierte la zona muerta) +Analog Mapper Mode = Modo de asignación analógica +Analog Stick = Stick analógico +AnalogLimiter Tip = Cuando se pulsa el botón del limitador analógico +Auto = Automática +Auto-centering analog stick = Auto-centrado del stick analógico +Auto-hide buttons after seconds = Ocultar botones después de +Binds = Binds +Button Opacity = Transparencia de botones +Button style = Estilo de botones +Calibrate D-Pad = Calibrar cruceta +Calibration = Calibración +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 layout... = Diseño personalizado... +Customize tilt = Personalizar acelerómetro +D-PAD = Cruceta +Deadzone Radius = Radio de zona inactiva +DInput Analog Settings = Ajustes analógicos DInput +Disable D-Pad diagonals (4-way touch) = Desactivar diagonales de cruceta +Glowing borders = Bordes brillantes +HapticFeedback = Vibración háptica +Ignore gamepads when not focused = Ignorar mandos con pantalla inactiva +Ignore Windows Key = Ignorar tecla de Windows +Invert Axes = Invertir ejes +Invert Tilt along X axis = Invertir inclinación del eje X +Invert Tilt along Y axis = Invertir inclinación del eje Y +Keep this button pressed when right analog is pressed = Presionar este botón cuando el analóg. derecho se presione +Keyboard = Ajustes de teclado +L/R Trigger Buttons = botones L/R +Landscape = Horizontal +Landscape Auto = Horizontal Automático +Landscape Reversed = Horizontal invertido +Mouse = Ajustes de ratón +Mouse sensitivity = Sensibilidad del ratón +Mouse smoothing = Suavidad del ratón +MouseControl Tip = Puedes mapear el ratón en los ajustes de controles presionando el icono 'M'. +None (Disabled) = Desactivado +Off = No +OnScreen = Controles táctiles en pantalla +Portrait = Vertical +Portrait Reversed = Vertical invertido +PSP Action Buttons = Botones de acción +Screen Rotation = Rotación de pantalla +seconds, 0 : off = segundos, 0 = no +Sensitivity = Sensibilidad +Show right analog = Motrar analógico derecho +Show Touch Pause Menu Button = Mostrar botón de menú +Thin borders = Bordes finos +Tilt Base Radius = Radio base de inclinación +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". +Touch Control Visibility = Visibilidad del control táctil +Use custom right analog = Usar analógico derecho personalizado +Use Mouse Control = Usar el control del ratón +Visibility = Mostrar... +X = X +X + Y = X + Y +XInput Analog Settings = Ajustes analógicos XInput +Y = Y + +[CwCheats] +Cheats = Trucos +Edit Cheat File = Editar archivo de trucos +Enable/Disable All = Activar/desactivar todos los trucos +Import Cheats = Importar "cheat.db" +Options = Opciones +Refresh Rate = Frecuencia de actualización + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = &Acerca de PPSSPP... +Auto = &Automático +Backend = Motor &gráfico (requiere reiniciar) +Bicubic = &Bicúbico +Break = Romper +Break on Load = Romper en carga +Buffered Rendering = &Dibujado por búfer +Buy Gold = Comprar versión &Gold +Control Mapping... = Asignar &botones... +Debugging = &Depuración +Deposterize = &Deposterizar +Direct3D9 = &Direct3D9 +Direct3D11 = Direct3D &11 +Disassembly = &Desensamblador... +Discord = Discord +Display Layout Editor = Editar posición de botones... +Display Rotation = Rotación de pantalla +Dump Next Frame to Log = &Volcar siguiente cuadro a registro +Emulation = &Emulación +Enable Chat = Activar C&hat +Enable Cheats = Activar &trucos (requiere reiniciar) +Enable Sound = Activar s&onido +Exit = &Salir +Extract File... = E&xtraer archivo... +File = &Archivo +Frame Skipping = &Saltar cuadros +Frame Skipping Type = Tipo de salto de cuadros +Fullscreen = &Pantalla completa +Game Settings = A&justes de juego +GE Debugger... = Dep&urador GE... +GitHub = Git&Hub +Hardware Transform = Transformación por &hardware +Help = A&yuda +Hybrid = &Híbrido +Hybrid + Bicubic = Híb&rido y bicúbico +Ignore Illegal Reads/Writes = &Ignorar lecturas/escrituras erróneas +Ignore Windows Key = Ignorar tecla de &Windows +Keep PPSSPP On Top = &Mantener PPSSPP en primer plano +Landscape = A&paisado +Landscape reversed = Apaisado &invertido +Language... = &Idioma... +Linear = &Lineal +Load = &Cargar... +Load .sym File... = Cargar archivo ".&sym"... +Load Map File... = &Cargar archivo "Map"... +Load State = &Cargar estado +Load State File... = Cargar a&rchivo de estado... +Log Console = Consola de re&gistros... +Memory View... = Visor de &memoria... +More Settings... = Más &opciones... +Nearest = &Cercano +Non-Buffered Rendering = &Saltar efectos del búfer (rápido) +Off = &No +Open Directory... = &Abrir carpeta... +Open from MS:/PSP/GAME... = A&brir desde "ms0:/PSP/GAME"... +Open Memory Stick = Abrir "&Memory Stick" +Open New Instance = Abrir nueva ins&tancia +OpenGL = &OpenGL +Pause = &Pausar +Pause When Not Focused = &Pausar al cambiar de ventana +Portrait = &Vertical +Portrait reversed = Vertical &invertido +Postprocessing Shader = &Shader de postprocesado +PPSSPP Forums = &Foro de PPSSPP +Record = G&rabar +Record Audio = Grabar &audio +Record Display = Grabar &pantalla +Rendering Mode = M&odo de renderizado +Rendering Resolution = &Resolución de renderizado +Reset = Re&iniciar +Reset Symbol Table = &Reiniciar tabla de símbolos +Run = &Reanudar +Save .sym File... = Guardar archivo ".&sym"... +Save Map File... = &Guardar archivo "Map"... +Save State = &Guardar estado +Save State File... = G&uardar archivo de estado... +Savestate Slot = Ranura de guardar &estados +Screen Scaling Filter = Filtro de escalado de &pantalla +Show Debug Statistics = Mostrar &estadísticas de depuración +Show FPS Counter = &Mostrar contador de FPS +Skip Number of Frames = Saltar nº de cuadros +Skip Percent of FPS = Saltar % de cuadros +Stop = P&arar +Switch UMD = Cambiar &UMD +Take Screenshot = Capturar &pantalla +Texture Filtering = &Filtrado de texturas +Texture Scaling = &Escalado de texturas +Use Lossless Video Codec (FFV1) = Usar códec de vídeo sin pérdida (&FFV1) +Use output buffer for video = Usar salida de búfer para vídeo +Vertex Cache = &Caché de vértices +VSync = Sincronización &vertical +Vulkan = &Vulkan +Window Size = &Tamaño de ventana +www.ppsspp.org = &Sitio oficial +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Visor del asignador (Vulkan) +Allow remote debugger = Permitir depurador remoto +Backspace = Borrar +Block address = Bloquear dirección +By Address = Por dirección +Copy savestates to memstick root = Copiar estados guardados en la raíz de la Memory Stick +Create/Open textures.ini file for current game = Crear/Abrir archivo "textures.ini" para el juego actual +Current = Actual +Dev Tools = Herramientas de desarrollo +DevMenu = DevMenu +Disabled JIT functionality = Desactivar funcionalidad JIT +Draw Frametimes Graph = Dibujar gráfico de cuadros +Dump Decrypted Eboot = Volcar "EBOOT.BIN" descifrado al iniciar el juego +Dump Frame GPU Commands = Volcar comandos GPU del cuadro +Enable driver bug workarounds = Activar arreglos alternativos para fallos de drivers +Enable Logging = Activar registro +Enter address = Insertar dirección +FPU = FPU +Frame Profiler = Medir rendimiento +Framedump tests = Tests de volcado de cuadros +GPU Driver Test = Test de controlador GPU +GPU Profile = Perfil GPU +Jit Compare = Comparación JIT +JIT debug tools = Herramientas de depuración JIT +Language = Idioma +Load language ini = Cargar INI de idioma +Log Dropped Frame Statistics = Registrar estadísticas de caídas de fotogramas +Log Level = Nivel de registro +Log View = Ver el registro +Logging Channels = Canales de registro +Next = Siguiente +No block = No bloquear +Prev = Anterior +Random = Aleatorio +Replace textures = Reemplazar texturas +Reset limited logging = Reiniciar registro limitado +RestoreDefaultSettings = ¿Seguro que quieres volver a los ajustes de fábrica?\nLos cambios en los controles no se borrarán.\n\nNo puedes deshacer esto.\nReinicia PPSSPP para que los cambios tengan efecto. +RestoreGameDefaultSettings = ¿Seguro que quieres reestablecer los ajustes del juego\na los ajustes por defecto de PPSSPP? +Resume = Reanudar +Run CPU Tests = Pruebas de CPU +Save language ini = Guardar INI de idioma +Save new textures = Guardar texturas nuevas +Shader Viewer = Visor de shader +Show Developer Menu = Mostrar menú de desarrollo +Show on-screen messages = Mostrar mensajes en pantalla +Stats = Estadísticas +System Information = Información del sistema +Texture Replacement = Reemplazo de texturas +Toggle Audio Debug = Parar/Reanudar depuración de audio +Toggle Freeze = Parar/Reanudar imagen +Touchscreen Test = Test de pantalla táctil +VFPU = VFPU + +[Dialog] +* PSP res = * PSP res +Active = Activo +Back = Atrás +Cancel = Cancelar +Center = Centrar +ChangingGPUBackends = Cambiar el motor gráfico requiere reiniciar PPSSPP.\n¿Reiniciar ahora? +ChangingInflightFrames = Cambiar el búfer de comando de gráficos requiere reiniciar PPSSPP.\n¿Reiniciar ahora? +Channel: = Canal: +Choose PPSSPP save folder = Elige la carpeta de guardado de PPSSPP. +Confirm Overwrite = ¿Deseas sobreescribir los datos? +Confirm Save = ¿Deseas guardar estos datos? +ConfirmLoad = ¿Deseas cargar estos datos guardados? +ConnectingAP = Conectando al punto de acceso.\nPor favor espera... +ConnectingPleaseWait = Conectando.\nPor favor espera... +ConnectionName = Nombre de la conexión +Corrupted Data = Datos corruptos +Delete = Borrar +Delete all = Borrar todo +Delete completed = Borrado completado. +DeleteConfirm = Este archivo de datos se borrará.\n¿Seguro que quieres borrarlo? +DeleteConfirmAll = ¿Seguro que quieres borrar todos\nlos datos de guardado de este juego? +DeleteConfirmGame = ¿Seguro que quieres borrar este juego?\nEsta operación no se puede deshacer. +DeleteConfirmGameConfig = ¿Seguro que quieres borrar la configuración de este juego? +DeleteFailed = los datos no se pudieron borrar. +Deleting = Borrando\nEspera un momento... +Disable All = Desactivar todo +Edit = Editar +Enable All = Activar todo +Enter = Intro +Finish = Terminar +Grid = Cuadrícula +Inactive = Inactivo +InternalError = Ha ocurrido un error interno. +Load = Cargar +Load completed = Carga completada. +Loading = Cargando\nEspera un momento... +LoadingFailed = Los datos no se pudieron cargar. +Move = Posición +Network Connection = Conexión de red +NEW DATA = NUEVOS DATOS DE PARTIDA +No = No +ObtainingIP = Obteniendo direcciónnn IP.\nPor favor espera... +OK = Aceptar +Old savedata detected = Detectados datos de partida antiguos. +Options = Opciones +Reset = Reiniciar +Resize = Tamaño +Retry = Reintentar +Save = Guardar +Save completed = Guardado completado. +Saving = Guardando\nEspera un momento... +SavingFailed = Los datos no se pudieron guardar. +Select = Seleccionar +Shift = Alternar +Snap = Malla +Space = Espacio +SSID = SSID +Submit = Enviar +Supported = Soportado +There is no data = La tarjeta de memoria está vacía. +Toggle All = Cambiar todo +Toggle List = Ver lista +Unsupported = No soportado +When you save, it will load on a PSP, but not an older PPSSPP = Cuando guardes, la partida cargará en una PSP, pero no en versiones antiguas de PPSSPP. +When you save, it will not work on outdated PSP Firmware anymore = Cuando guardes, no volverá a funcionar en un firmware de PSP antiguo. +Yes = Sí +Zoom = Acercar + +[Error] +7z file detected (Require 7-Zip) = Es un archivo comprimido (en 7z).\nPor lo que necesita ser descomprimido (usa 7-Zip o WinRAR). +A PSP game couldn't be found on the disc. = No se pudo encontrar un juego de PSP en el disco. +Cannot boot ELF located outside mountRoot. = No se pudo inicar el ELF localizado fuera del mountRoot. +Could not save screenshot file = No se pudo guardar la captura de pantalla. +D3D9or11 = Direct3D 9? (o "no" para Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll no encontrado. Por favor instala. O presiona Sí para probar con Direct3D 9. +D3D11InitializationError = Error de inicialización de Direct3D 11. +D3D11Missing = Tu sistema operativo no incluye D3D11. Por favor ejecuta Windows Update.\n\nPresiona Sí para probar con Direct3D 9. +D3D11NotSupported = Tu GPU parece que no soporta Direct3D 11.\n\n¿Quieres probar de nuevo con Direct3D 9? +Disk full while writing data = El disco se ha llenado durante la escritura de datos. +ELF file truncated - can't load = Archivo ELF defectuoso - No se puede cargar +Error loading file = Error al cargar el archivo +Error reading file = Error al leer el archivo +Failed initializing CPU/Memory = Fallo inicializando CPU o memoria. +Failed to identify file = No se pudo identificar el archivo +Failed to load executable: = Fallo al cargar el ejecutable: +File corrupt = Archivo corrupto +Game disc read error - ISO corrupt = Error de lectura: ISO corrupta. +GenericAllStartupError = Error al iniciar los gráficos. Prueba a actualizar tu controlador gráfico. +GenericBackendSwitchCrash = PPSSPP falló durante la inicialización de los gráficos. Prueba a actualizar los controladores gráficos.\n\nSe ha cambiado el motor gráfico: +GenericDirect3D9Error = Error al iniciar los gráficos. Prueba a actualizar tu controlador gráfico o las librerías DirectX 9.\n\n¿Quieres probar cambiando a OpenGL?\n\nMensaje de error: +GenericGraphicsError = Error de los gráficos. +GenericOpenGLError = Error al iniciar los gráficos. Prueba a actualizar tu controlador gráfico.\n\n¿Quieres probar cambiando a DirectX 9?\n\nMensaje de error: +GenericVulkanError = Error al iniciar los gráficos. Prueba a actualizar tu controlador gráfico.\n\n¿Quieres probar cambiando a OpenGL?\n\nMensaje de error: +InsufficientOpenGLDriver = Soporte insuficiente del controlador OpenGL detectado.\n\nTu tarjeta gráfica indica que no soporta OpenGL 2.0. ¿Quieres probar a usar DirectX en su lugar?\n\nPor ahora DirectX es compatible con menos juegos, pero con tu tarjeta gráfica puede que sea la única opción disponible.\n\nVisita los foros en "https://forums.ppsspp.org" para más información. +Just a directory. = Sólo es una carpeta. +Missing key = Clave perdida. +MsgErrorCode = Código de error: +MsgErrorSavedataDataBroken = Los datos de guardado se ha corrompido. +MsgErrorSavedataMSFull = Memory Stick llena. Revisa tu almacenamiento. +MsgErrorSavedataNoData = Aviso: ningún archivo de guardado encontrado. +MsgErrorSavedataNoMS = Memory Stick no instertada. +No EBOOT.PBP, misidentified game = Falta el "EBOOT.PBP", juego mal identificado +Not a valid disc image. = Imagen de disco no válida. +OpenGLDriverError = Error del controlador OpenGL +PPSSPP doesn't support UMD Music. = PPSSPP no soporta UMDs de Música. +PPSSPP doesn't support UMD Video. = PPSSPP no soporta UMDs de Vídeo. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP reproduce juegos de PSP, no de PlayStation 1 o 2. +PPSSPPDoesNotSupportInternet = De momento PPSSPP no soporta las funciones de red para actualizaciones de juegos, DLCs o PSN. +PS1 EBOOTs are not supported by PPSSPP. = PPSSPP no puede ejecutar los EBOOTs de PS1. +PSX game image detected. = El archivo es una imagen "MODE2", y PPSSPP no soporta juegos de PSX. +RAR file detected (Require UnRAR) = Es un archivo comprimido (en RAR).\nPor lo que necesita ser descomprimido (usa UnRAR). +RAR file detected (Require WINRAR) = Es un archivo comprimido (en RAR).\nPor lo que necesita ser descomprimido (usa WinRAR). +Running slow: try frameskip, sound is choppy when slow = Funcionando lento: prueba a activar el salto de cuadros, el sonido se entrecorta. +Running slow: Try turning off Software Rendering = Funcionando lento: prueba a desactivar "renderizado por software" +Save encryption failed. This save won't work on real PSP = Error al cifrar los datos guardados. No funcionarán en una PSP real. +textures.ini filenames may not be cross-platform = Los nombres del archivo "textures.ini" no pueden ser multiplataforma. +This is a saved state, not a game. = Esto es un estado de guardado, no un juego. +This is save data, not a game. = Esto es un dato de guardado, no un juego. +Unable to create cheat file, disk may be full = No se pudo crear el archivo de trucos, el dico podría estar lleno. +Unable to initialize rendering engine. = No se pudo iniciar el motor de renderizado. +Unable to write savedata, disk may be full = No se pudieron escribir los datos de guardado, el disco podría estar lleno. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = AVISO: memoria de vídeo LLENA, reciendo escalado y cambiando a modo de caché lento. +Warning: Video memory FULL, switching to slow caching mode = AVISO: memoria de vídeo LLENA, cambiando a modo de caché lento. +ZIP file detected (Require UnRAR) = Es un archivo comprimido (en ZIP).\nPor lo que necesita ser descomprimido (usa UnRAR). +ZIP file detected (Require WINRAR) = Es un archivo comprimido (en ZIP).\nPor lo que necesita ser descomprimido (usa WinRAR). +[Game] +Asia = Asia +ConfirmDelete = Confirmar +Create Game Config = Crear config. del juego +Create Shortcut = Crear acceso directo +Delete Game = Borrar juego +Delete Game Config = Borrar config. del juego +Delete Save Data = Borrar datos +Europe = Europa +Game = Juego +Game Settings = Ajustes de juego +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Instalación de datos +Japan = Japón +Korea = Korea +MB = MB +One moment please... = Un momento por favor... +Play = Jugar +Remove From Recent = Borrar de recientes +SaveData = Datos +Setting Background = Ajustar imagen de fondo +Show In Folder = Mostrar en carpeta +USA = USA +Use UI background = Usar imagen de fondo +[Graphics] +% of the void = % de vacío +% of viewport = % de ventana gráfica +%, 0:unlimited = %, 0 = ilimitado +(supersampling) = (súper muestreo) +(upscaling) = (escalado) +1x PSP = PSP ×1 +2x = ×2 +2x PSP = PSP ×2 +3x = ×3 +3x PSP = PSP ×3 +4x = ×4 +4x PSP = PSP ×4 +5x = ×5 +5x PSP = PSP ×5 +6x PSP = PSP ×6 +7x PSP = PSP ×7 +8x = ×8 +8x PSP = PSP ×8 +9x PSP = PSP ×9 +10x PSP = PSP ×10 +16x = ×16 +Aggressive = Agresivo +Alternative Speed = Velocidad alternativa (%, 0 = ilimitada) +Alternative Speed 2 = Velocidad alternativa 2 (%, 0 = ilimitada) +Anisotropic Filtering = Filtrado anisotrópico +Auto = Automático +Auto (1:1) = Automático (1:1) +Auto (same as Rendering) = Automático (igual a la de renderizado) +Auto FrameSkip = Salto de cuadros automático +Auto Scaling = Autoescalado +Backend = Motor gráfico +Balanced = Equilibrado +Bicubic = Bicúbico +BlockTransfer Tip = Algunos juegos necesitan esta opción para evitar errores gráficos. +BlockTransferRequired = AVISO: Este juego requiere activar Simular efectos "block transfer". +Both = Ambos +Buffer graphics commands (faster, input lag) = Comandos de búfer gráfico (faster, input lag) +Buffered Rendering = Dibujado por búfer +BufferedRenderingRequired = AVISO: este juego requiere "modo de renderizado" en "por búfer". +Camera = Cámara +Camera Device = Dispositivo de cámara +Cardboard Screen Size = Tamaño de pantalla (en % del área visual) +Cardboard Screen X Shift = Desplazamiento horizontal (en % del espacio en blanco) +Cardboard Screen Y Shift = Desplazamiento vertical (en % del espacio en blanco) +Cardboard VR Settings = Ajustes de "Google Cardboard VR" +Cheats = Trucos +Clear Speedhack = Limpiar memoria de cuadro en el primer uso (rápido) +ClearSpeedhack Tip = A veces más rápido (sobre todo en móviles). Puede causar errores gráficos +CPU Core = Núcleo de CPU +Debugging = Depuración +DefaultCPUClockRequired = AVISO: Este juego requiere reloj de CPU por defecto. +Deposterize = Deposterizar +Deposterize Tip = Arregla pequeños errores en las texturas causadas por el escalado +Device = Dispositivo +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Desactivar efectos más lentos (rápido) +Disabled = Desactivado +Display layout editor = Editor del área de pantalla... +Display Resolution (HW scaler) = Resolución de pantalla (escalado por hardware) +Dump next frame to log = Volcar siguiente cuadro al registro +Enable Cardboard VR = Activar Cardboard VR +FPS = FPS +Frame Rate Control = Control de tasa de cuadros (FPS) +Frame Skipping = Saltar cuadros +Frame Skipping Type = Tipo de salto de cuadros +FullScreen = Pantalla completa +Hack Settings = Ajustes de hacks (causarán errores gráficos) +Hardware Tessellation = Teselado por hardware +Hardware Transform = Transformación por hardware +hardware transform error - falling back to software = Error de transformación por hardware, cambiando a software. +HardwareTessellation Tip = Dibuja las curvas por hardware, usando siempre una calidad fija. +High = Alta +Hybrid = Híbrido +Hybrid + Bicubic = Híbrido y bicúbico +Ignore camera notch when centering = Ignorar notch de la cámara usando centrado de imagen. +Internal Resolution = Resolución interna +Lazy texture caching = Caché de texturas diferido (rápido) +Linear = Lineal +Low = Baja +LowCurves = Calidad de curvas bézier +LowCurves Tip = Aumenta/reduce significativamente el renderizado de curvas Bézier +Lower resolution for effects (reduces artifacts) = Efectos en baja resolución (reduce errores gráficos) +Manual Scaling = Escalado manual +Medium = Intermedia +Mode = Modo +Must Restart = Debes reiniciar PPSSPP para aplicar este cambio. +Native device resolution = Resolución nativa del dispositivo +Nearest = Pixelado +No buffer = Sin búfer +Non-Buffered Rendering = Saltar efectos del búfer +None = No +Number of Frames = Nº de cuadros +Off = No +OpenGL = OpenGL +Overlay Information = Información en pantalla +Partial Stretch = Estirado parcial +Percent of FPS = % de FPS +Performance = Rendimiento +Postprocessing effect = Efecto de postprocesado +Postprocessing Shader = Shader de postprocesado +Recreate Activity = Recrear actividad +Render duplicate frames to 60hz = Renderizar cuadros duplicados a 60Hz +RenderDuplicateFrames Tip = Puede hacer la imagen más fluida in juegos con una tasa de cuadros más baja +Rendering Mode = Modo de renderizado +Rendering Resolution = Resolución de renderizado +RenderingMode NonBuffered Tip = Rápido, pero no se verá nada en algunos juegos +Retain changed textures = Mantener texturas cambiadas +RetainChangedTextures Tip = Hace muchos juegos más lentos, pero unos pocos mucho más rápidos +Rotation = Rotación +Safe = Seguro +Screen layout = Diseño de pantalla +Screen Scaling Filter = Filtro de escalado de pantalla +Show Debug Statistics = Mostrar estadísticas de depuración +Show FPS Counter = Mostrar contador de FPS +Simulate Block Transfer = Simular efectos "block transfer" +SoftGPU Tip = Actualmente MUY lento +Software Rendering = Renderizado por software +Software Skinning = "Skinning" por software +SoftwareSkinning Tip = Reduce la carga de dibujado, rápido en juegos con técnicas de skinning avanzadas, pero lento en otros. +Speed = Velocidad +Stretching = Estirar +Texture Filter = Filtro de texturas +Texture Filtering = Filtrado de texturas +Texture Scaling = Escalado de texturas +Texture Shader = Shader de textura +Turn off Hardware Tessellation - unsupported = Desactiva "teselado por hardware": no 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 = Exigente CPU - algunos escalados se pueden retrasar para evitar tirones +Use all displays = Usar todas las pantallas +Vertex Cache = Caché de vértices +VertexCache Tip = Rápido, pero puede causar parpadeo temporal +VSync = Sincronización vertical +Vulkan = Vulkan +Window Size = Tamaño de ventana +xBRZ = xBRZ +[InstallZip] +Delete ZIP file = Borrar archivo ZIP +Install = Instalar +Install game from ZIP file? = ¿Instalar juego desde archivo ZIP? +Install textures from ZIP file? = Instalar texturas desde archivo ZIP? +Installed! = ¡Instalado! +Texture pack doesn't support install = Pack de texturas no soporte instalación +Zip archive corrupt = Archivo ZIP corrupto +Zip file does not contain PSP software = El archivo ZIP no contiene software de PSP + +[KeyMapping] +Autoconfigure = Autoconfigurar +Autoconfigure for device = Autoconfigurar para dispositivo +Clear All = Borrar todo +Default All = Restaurar +Map a new key for = Pulsa una tecla para +Map Key = Mapear tecla +Map Mouse = Mapear ratón +Test Analogs = Probar analóg. +You can press ESC to cancel. = Puedes presionar ESC para cancelar. + +[MainMenu] +Browse = Buscar... +Buy PPSSPP Gold = Comprar Gold +Choose folder = Elegir carpeta +Credits = Créditos +PPSSPP Homebrew Store = Tienda de Homebrew de PPSSPP +Exit = Salir +Game Settings = Ajustes +Games = Juegos +Give PPSSPP permission to access storage = Dar permiso a PPSSPP para acceder al almacenamiento +Homebrew & Demos = Homebrew y demos +How to get games = ¿Cómo consigo juegos? +How to get homebrew & demos = ¿Cómo consigo homebrew y demos? +Load = Cargar... +Loading... = Cargando... +PinPath = Anclar +PPSSPP can't load games or save right now = PPSSPP no puede cargar o guardar partidas en este momento. +Recent = Recientes +SavesAreTemporary = PPSSPP está guardando en almacenamiento temporal +SavesAreTemporaryGuidance = Extraer PPSSPP en algún lado para guardar permanentemente +SavesAreTemporaryIgnore = Ignorar avisos +UnpinPath = Desanclar +www.ppsspp.org = Sitio oficial +[MainSettings] +Audio = Sonido +Controls = Controles +Graphics = Gráficos +Networking = Juego en red +System = Sistema +Tools = Herramientas +[MappableControls] +Alt speed 1 = Vel. Alt. 1 +Alt speed 2 = Vel. Alt. 2 +An.Down = Stick abajo +An.Left = Stick izquierda +An.Right = Stick derecha +An.Up = Stick arriba +Analog limiter = Limitador analóg. +Analog Stick = Stick analógico +Audio/Video Recording = Grabar Audio/Vídeo +Auto Analog Rotation (CCW) = Rotación automática analóg. (CCW) +Auto Analog Rotation (CW) = Rotación automática analóg. (CW) +AxisSwap = Invertir ejes +Circle = Círculo +Cross = Equis +D-pad down = D-pad abajo +D-pad left = D-pad izquierda +D-pad right = D-pad derecha +D-pad up = D-pad arriba +DevMenu = DevMenu +Down = Cruceta abajo +Dpad = Cruceta +Frame Advance = Avanzar fotograma +Hold = Mantener +Home = Inicio +L = L +Left = Cruceta izquierda +Load State = Cargar estado +Mute toggle = Alternar silenciar +Next Slot = Siguiente ranura +None = Ninguno +Note = Nota +OpenChat = Abrir Chat +Pause = Pausa +R = R +RapidFire = Fuego rápido +Remote hold = Mantener remoto +Rewind = Rebobinar +Right = Cruceta derecha +Right Analog Stick (tap to customize) = Stick analógico derecho (toca para configurar) +RightAn.Down = StickDer. abaj. +RightAn.Left = StickDer. izq. +RightAn.Right = StickDer. der. +RightAn.Up = StickDer. arrib. +Rotate Analog (CCW) = Rotación analóg. (CCW) +Rotate Analog (CW) = Rotación analóg. (CW) +Save State = Guardar estado +Screen = Pantalla +Screenshot = Captura de pantalla +Select = Select +SpeedToggle = Alternar veloc. +Square = Cuadrado +Start = Start +Texture Dumping = Volcar texturas +Texture Replacement = Reemplazar texturas +Toggle Fullscreen = Cambiar a pantalla completa +Toggle mode = Alternar modo +Triangle = Triángulo +Unthrottle = Modo turbo +Up = Cruceta arriba +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN +[Networking] +Adhoc Multiplayer forum = Visitar foro de juego en red +AdHoc Server = Servidor AdHoc +AdhocServer Failed to Bind Port = Servidor Adhoc falló al unir puerto. +Auto = Automático +Bottom Center = Inferior centrado +Bottom Left = Inferior izquierda +Bottom Right = Inferior derecha +Center Left = Centrado izquierdo +Center Right = Centrado derecho +Change Mac Address = Cambiar dirección MAC +Change proAdhocServer Address = Cambiar dirección de proAdhocServer (localhost = varias instancias) +Chat = Chat +Chat Button Position = Posición del botón de chat +Chat Here = Chat aquí +Chat Screen Position = Posición del chat +Disconnected from AdhocServer = Desconectado del servidor Adhoc +DNS Error Resolving = Resolviendo error DNS +Enable built-in PRO Adhoc Server = Activar servidor "Adhoc PRO" integrado +Enable network chat = Activar chat de red +Enable networking = Activar juego en red/WLAN (beta) +Enable UPnP = Activar UPnP +EnableQuickChat = Activar chat rápido +Enter a new PSP nickname = Introducir nuevo nick PSP +Enter Quick Chat 1 = Entrar chat rápido 1 +Enter Quick Chat 2 = Entrar chat rápido 2 +Enter Quick Chat 3 = Entrar chat rápido 3 +Enter Quick Chat 4 = Entrar chat rápido 4 +Enter Quick Chat 5 = Entrar chat rápido 5 +Error = Error +Failed to Bind Localhost IP = Fallo al unirse a la IP localhost +Failed to Bind Port = Fallo al unir puerto +Failed to connect to Adhoc Server = Fallo al conectar al servidor Adhoc +Forced First Connect = Primera conexión forzada (más rápida) +Invalid IP or hostname = IP o nombre host inválido +Minimum Timeout = Tiempo de espera mínimo (en ms, 0 por defecto) +Misc = Otros ajustes (por defecto = compatibilidad) +Network Initialized = Juego en red iniciado +Please change your Port Offset = Por favor cambia el offset del puerto. +Port offset = Variar puerto de red (0 = compatible con PSP) +proAdhocServer Address: = Dirección del servidor Adhoc: +Quick Chat 1 = Chat rápido 1 +Quick Chat 2 = Chat rápido 2 +Quick Chat 3 = Chat rápido 3 +Quick Chat 4 = Chat rápido 4 +Quick Chat 5 = Chat rápido 5 +QuickChat = Chat rápido +Send = Enviar +Send Discord Presence information = Enviar información a Discord "Rich Presence" +TCP No Delay = TCP Sin retardo(más rápido) +Top Center = Superior centrado +Top Left = Superior izquierda +Top Right = Superior derecha +Unable to find UPnP device = Dispositivo UPnP no encontrado +UPnP (port-forwarding) = UPnP (redirección de puertos) +UPnP need to be reinitialized = UPnP debe reinicializarse +UPnP use original port = Usar puerto UPnP de PSP (más compatible) +Validating address... = Validando dirección... +WLAN Channel = Canal WLAN +You're in Offline Mode, go to lobby or online hall = Estás en modo offline, ve al lobby o a la sala online + +[Pause] +Cheats = Trucos +Continue = Continuar +Create Game Config = Crear config. del juego +Delete Game Config = Borrar config. del juego +Exit to menu = Salir al menú +Game Settings = Ajustes del juego +Load State = Cargar estado +Rewind = Rebobinar +Save State = Guardar estado +Settings = Ajustes generales +Switch UMD = Cambiar UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (configuración duplicada, se usará la anterior) +4xHqGLSL = 4xHQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA + color +Amount = Cantidad +Black border = Bordes negros +Bloom = Brillo +Brightness = Brillo +Cartoon = Dibujos animados +ColorCorrection = Corrección de color +Contrast = Contraste +CRT = Pantalla de tubo (CRT) +FXAA = FXAA +Gamma = Gamma +Grayscale = Escala de grises +Intensity = Intensidad +InverseColors = Invertir colores +Natural = Colores naturales +NaturalA = Colores naturales (sin difuminar) +Off = No +Power = Poder +PSPColor = PSP color +Saturation = Saturación +Scanlines = Monitor con "scanlines" +Sharpen = Afilado +SSAA(Gauss) = Super muestreo AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Escalado en Spline36 +VideoSmoothingAA = Vídeo suavizado AA +Vignette = Viñeta + +[PSPCredits] +all the forum mods = Todos los foros de Mods +build server = Servidor de compilaciones +Buy Gold = Comprar PPSSPP +check = También te recomendamos el emulador de GC/Wii Dolphin: +CheckOutPPSSPP = Prueba PPSSPP, el mejor emulador de PSP: https://www.ppsspp.org/ +contributors = Colaboradores: +created = Creado por: +Discord = Discord +info1 = Sólo para propósitos educativos +info2 = Asegúrate de tener los derechos de cualquier juego +info3 = que uses, ya sea del UMD original o de una copia digital +info4 = de PSN con tu PSP original. +info5 = PSP es una marca registrada de Sony Corporation. +iOS builds = Compilaciones iOS +license = Software libre bajo licencia GPL 2.0+ +list = foro oficial, hilos de discusión y lista de compatibilidad +PPSSPP Forums = Foro PPSSPP +Privacy Policy = Política de privacidad +Share PPSSPP = Compartir... +specialthanks = Agradecimientos especiales a: +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = Por su trabajo en el decodificador Atrac3+ +testing = Testeando +this translation by = Traducido por: +title = Emulador de PSP rápido y portable +tools = Software libre utilizado: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = PpmeiS, Puniasterus y Swyter. +translators2 = +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Sitio web oficial: +written = Escrito en lenguaje C++ para una mejor portabilidad y velocidad + +[RemoteISO] +Browse Games = Buscar juegos +Local Server Port = Puerto del servidor local +Manual Mode Client = Cliente en modo manual +Remote disc streaming = Streaming de disco remoto +Remote Port = Puerto remoto +Remote Server = Servidor remoto +Remote Subdirectory = Subdirectorio remoto +RemoteISODesc = Los juegos en tu lista de recientes se compartirán +RemoteISOLoading = Conectado, cargando lista de juegos... +RemoteISOScanning = Escaneando... Click "compartir juegos" en tu dispositivo servidor +RemoteISOScanningTimeout = Escaneando...revisa la configuración del Firewall del escritorio. +RemoteISOWifi = Nota: conectar ambos dispositivos a la misma red WiFi +RemoteISOWinFirewall = AVISO: Firewall de Windows está bloqueando el acceso +Settings = Ajustes +Share Games (Server) = Compartir juegos (servidor) +Share on PPSSPP startup = Compartir al iniciar PPSSPP +Stop Sharing = Parar de compartir +Stopping.. = Parando... + +[Reporting] +Bad = Malos +FeedbackDelayInfo = Tus datos están siendo enviados en segundo plano. +FeedbackDesc = ¿Cómo va el juego? ¡Que lo sepa la comunidad! +FeedbackDisabled = El servicio de informes de compatibilidad debe estar habilitado. +FeedbackIncludeCRC = Nota: Se usará batería para enviar el CRC del disco. +FeedbackIncludeScreen = Incluye una captura de pantalla +FeedbackSubmitDone = Tus datos han sido enviados. +FeedbackSubmitFail = No se pudo enviar los datos al servidor. prueba a actualizar PPSSPP. +FeedbackThanks = ¡gracias por tu feedback! +Gameplay = Jugabilidad +Graphics = Gráficos +Great = Geniales +In-game = Funciona +In-game Description = Llega al juego, pero con muchos fallos +Menu/Intro = Menú/Intro +Menu/Intro Description = No se puede entrar en el juego +Nothing = Nada +Nothing Description = Completamente roto +OK = Buenos +Open Browser = Abrir navegador +Overall = General +Perfect = Perfecto +Perfect Description = Emulación fluida durante todo el juego - ¡genial! +Plays = Jugable +Plays Description = 100% jugable pero puede haber errores gráficos +ReportButton = Informar de error +Speed = Velocidad +Submit Feedback = Enviar feedback +SuggestionConfig = Ver reportes en la web para una buena configuración. +SuggestionCPUSpeed0 = Desactivar bloqueo de velocidad CPU. +SuggestionDowngrade = Volver a una versión de PPSSPP más antigua (por favor reportar error). +SuggestionsFound = Otros usuarios han reportado mejores resultados. Toca "Ver Feedback" para más detalles. +SuggestionsNone = Este juego tampoco funciona para otros usuarios. +SuggestionsWaiting = Enviando y verificando feedback de otros usuarios... +SuggestionUpgrade = Actualizar a una build de PPSSPP más reciente. +SuggestionVerifyDisc = Verifica que tu ISO es una copia válida del disco. +Unselected Overall Description = ¿Cómo de bien va el juego? +View Feedback = Ver todos los feedbacks + +[Savedata] +Date = Fecha +Filename = Nombre +No screenshot = Sin captura de pantalla +None yet. Things will appear here after you save. = No hay datos. Una vez guardes partida aparecerán aquí. +Save Data = Datos +Save States = Estados +Savedata Manager = Administrador de partidas guardadas +Size = Tamaño + +[Screen] +Cardboard VR OFF = Cardboard VR apagado +Chainfire3DWarning = AVISO: "Chainfire3D" detectado, puede causar problemas. +Failed to load state = Error al cargar el estado +Failed to save state = Error al guardar el estado +fixed = Velocidad: alternativa +GLToolsWarning = AVISO: "GLTools" detectado, puede causar problemas. +In menu = En menú +Load savestate failed = Error al cargar el estado guardado +Loaded State = Estado cargado +Loaded. Save in game, restart, and load for less bugs. = Cargado. Guarda la partida, reinicia, y recarga para menos errores. +LoadStateDoesntExist = Error al cargar el estado: no existe el archivo. +LoadStateWrongVersion = Error al cargar el estado: el archivo es de una versión anterior de PPSSPP. +norewind = No hay estados guardados de rebobinado disponibles. +Playing = Reproduciendo... +PressESC = Presiona Esc para abrir el menú de pausa. +replaceTextures_false = Las texturas no serán reemplazadas. +replaceTextures_true = Reemplazo de texturas activado. +Save State Failed = Error al guardar el estado. +Saved State = Estado guardado +saveNewTextures_false = Guardado de texturas desactivado. +saveNewTextures_true = Las texturas serán guardadas en disco. +SpeedCustom2 = Velocidad: Alternar 2 +standard = Velocidad: estándar +Untitled PSP game = Juego de PSP sin título. + +[Store] +Already Installed = Ya instalado +Connection Error = Error de conexión +Install = Instalar +Launch Game = Iniciar juego +Loading... = Cargando... +MB = MB +Size = Tamaño +Uninstall = Desinstalar + +[SysInfo] +%d (%d per core, %d cores) = %d (%d por núcleo, %d núcleos) +%d bytes = %d bytes +(none detected) = (ninguno detectado) +3D API = API 3D +ABI = Arquitectura +API Version = Versión de API +Audio Information = Información del audio +Board = Placa +Build Config = Info. compilación +Build Configuration = Configuración de la compilación +Built by = Compilado por +Core Context = Context de núcleo +Cores = Núcleos +CPU Extensions = Extensiones CPU +CPU Information = Información de la CPU +CPU Name = Nombre +D3DCompiler Version = Versión D3DCompiler +Debug = Desarrollo +Debugger Present = Depurador presente +Device Info = Info. del dispositivo +Display Information = Información de la pantalla +Driver Version = Versión de controlador +EGL Extensions = Extensiones EGL +Frames per buffer = Cuadros por búfer +GPU Information = Información de la GPU +High precision float range = Alta precisión de rango flotante +High precision int range = Rango de alta precisión de int +Lang/Region = Idioma/Región +Memory Page Size = Tamaño de página de memoria +Native Resolution = Resolución nativa +OGL Extensions = Extensiones OGL +OpenGL ES 2.0 Extensions = Extensiones OpenGL 2.0 +OpenGL ES 3.0 Extensions = Extensiones OpenGL 3.0 +OpenGL Extensions = Extensiones OpenGL +Optimal frames per buffer = Cuadros por búfer óptimos +Optimal sample rate = Frecuencia de muestreo óptima +OS Information = Información del Sistema Operativo +PPSSPP build = Compilación PPSSPP +Refresh rate = frecuencia de actualización +Release = Lanzamiento +RW/RX exclusive = RW/RX exclusivo +Sample rate = Frecuencia de muestreo +Shading Language = Lenguaje de sombreado +Sustained perf mode = Modo de rendimiento sostenido +System Information = Información del sistema +System Name = Nombre +System Version = Versión del sistema +Threads = Hilos +Vendor = Modelo +Vendor (detected) = Proveedor +Version Information = Información de la versión +Vulkan Extensions = Extensiones Vulkan +Vulkan Features = Funciones Vulkan + +[System] +(broken) = (roto) +12HR = 12 horas +24HR = 24 horas +Auto = Automático +Auto Load Savestate = Carga automática de estados de guardado +AVI Dump started. = Volcado AVI iniciado +AVI Dump stopped. = Volcado AVI parado +Cache ISO in RAM = Cargar ISO completa en RAM +Change CPU Clock = Velocidad CPU PSP (inestable) +Change Memory Stick folder = Cambiar directorio de Memory Stick +Change Memory Stick Size = Cambiar tamaño de Memory Stick (GB) +Change Nickname = Cambiar apodo PSP +ChangingMemstickPath = Partidas guardadas, estados y otros datos no serán copiados a este directorio.\n\nCambiar directorio de la Memory Stick? +ChangingMemstickPathInvalid = Esa ruta no se pudo utilizar para guardar los archivos de la Memory Stick. +ChangingMemstickPathNotExists = Ese directorio todavía no existe.\n\nPartidas guardadas, estados y otros datos no serán copiados a este directorio.\n\nCrear nuevo directorio para la Memory Stick? +Cheats = Trucos (beta, ver foros) +Clear Recent = Limpiar "Recientes" +Clear Recent Games List = Borrar lista de juegos recientes +Clear UI background = Borrar imagen de fondo +Confirmation Button = Botón de confirmación +Date Format = Formato de fecha +Day Light Saving = Horario de verano +DDMMYYYY = DD/MM/AAAA +Decrease size = Reducir tamaño +Developer Tools = Herramientas de desarrollo +Display Extra Info = Mostrar información extra +Display Games on a grid = Mostrar "Juegos" en una cuadrícula +Display Homebrew on a grid = Mostrar "Homebrew && Demos" en una cuadrícula +Display Recent on a grid = Mostrar "Recientes" en una cuadrícula +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emulación +Enable Cheats = Activar trucos +Enable Compatibility Server Reports = Enviar informes de compatibilidad +Failed to load state. Error in the file system. = Error al cargar el estado. Error en el sistema de archivos. +Failed to save state. Error in the file system. = Error al guardar estado. Error en el sistema de archivos. +Fast (lag on slow storage) = Rápido (lag en almac. lento) +Fast Memory = Memoria rápida (inestable) +Force real clock sync (slower, less lag) = Forzar sinc. real de reloj (lento, menos lag) +frames, 0:off = cuadros, 0 = no +Games list settings = Ajsutes de la lista de juegos +General = General +Grid icon size = Tamaño de iconos de cuadrícula +Help the PPSSPP team = Ayuda al equipo de PPSSPP +Host (bugs, less lag) = Anfitrión (errores, menos lag) +I/O on thread (experimental) = E/S en hilo (experimental) +Ignore bad memory accesses = Ignorar malos accesos a la memoria +Increase size = Aumentar tamaño +Interpreter = Intérprete +IO timing method = Método de sincronización de E/S +IR Interpreter = IR intérprete +Memory Stick Folder = Directorio de la Memory Stick +Memory Stick inserted = Memory Stick insertada +MHz, 0:default = MHz, 0 = predeterminado +MMDDYYYY = MM/DD/AAAA +Newest Save = Partida guardada más reciente +Not a PSP game = No es un juego de PSP +Off = No +Oldest Save = Partida guardada más antigua +PSP Model = Modelo de PSP +PSP Settings = Ajustes de PSP +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Grabar audio +Record Display = Grabar pantalla +Reset Recording on Save/Load State = Reiniciar grabación al cargar/guardar estado +Restore Default Settings = Reestablecer ajustes +Rewind Snapshot Frequency = Frecuencia de rebobinado instantánea (+ memoria) +Save path in installed.txt = Carpeta de guardado en "installed.txt" +Save path in My Documents = Carpeta de guardado en "Mis documentos" +Savestate Slot = Ranura de estado guardado +Savestate slot backups = Ranura de backups de estados guardados +Screenshots as PNG = Capturas en PNG +Set UI background... = Definir imagen de fondo... +Show ID = Mostrar ID +Show region flag = Mostrar bandera de región +Simulate UMD delays = Simular retardo UMD +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = No queda espacio +Sustained performance mode = Modo de rendimiento sostenido +Time Format = Formato de hora +UI = Interfaz de usuario +UI Sound = Sonido de interfaz +undo %c = Restaurar %c +Use Lossless Video Codec (FFV1) = Usar codec de vídeo sin pérdida (FFV1) +Use O to confirm = Confirmar con el botón O +Use output buffer (with overlay) for recording = Usar salida de búfer (con capa) para grabar +Use system native keyboard = Usar sistema nativo de teclado +Use X to confirm = Confirmar con el botón X +VersionCheck = Buscar actualizaciones de PPSSPP +WARNING: Android battery save mode is on = AVISO: el ahorro de batería Android está activado +WARNING: Battery save mode is on = AVISO: el ahorro de batería está activado +YYYYMMDD = AAAA/MM/DD + +[Upgrade] +Details = Detalles +Dismiss = Cancelar +Download = Descargar +New version of PPSSPP available = Nueva versión de PPSSPP disponible diff --git a/assets/lang/es_LA.ini b/assets/lang/es_LA.ini new file mode 100644 index 0000000000..480f7525c0 --- /dev/null +++ b/assets/lang/es_LA.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = Motor de audio (req. reiniciar) +AudioBufferingForBluetooth = Buffer amigable con Bluetooth (enlentece) +Auto = Automático +Device = Dispositivo +DSound (compatible) = DSound (compatible) +Enable Sound = Activar Sonido +Global volume = Volumen global +Microphone = Micrófono +Microphone Device = Dispositivo de entrada +Mute = Silenciar +Switch on new audio device = Cambiar al nuevo dispositivo de audio +Use global volume = Usar volumen global +WASAPI (fast) = WASAPI (rápido) + +[Controls] +Analog auto-rotation speed = Vel. de rotación auto. de Analog +Analog Axis Sensitivity = Sensibilidad de ejes de Analog +Analog Limiter = Limitador de Analog +Analog Mapper High End = Asignación Analog básica (sensibilidad de ejes) +Analog Mapper Low End = Asignación Analog avanzada (invierte la zona muerta) +Analog Mapper Mode = Modo de asignación de Analog +Analog Stick = Analog stick +AnalogLimiter Tip = Cuando se presiona el botón de Limitador de Analog +Auto = Automática +Auto-centering analog stick = Auto-centrado del Analog stick +Auto-hide buttons after seconds = Ocultar botones después de segundos +Binds = Enlazados +Button Opacity = Transparencia de botones +Button style = Estilo de botones +Calibrate D-Pad = Calibrar +Calibration = Calibración +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 layout... = Editar pantalla táctil... +Customize tilt = Personalizar acelerómetro... +D-PAD = D-Pad +Deadzone Radius = Radio de zona inactiva +DInput Analog Settings = Configuraciones de Analog de DInput +Disable D-Pad diagonals (4-way touch) = Desactivar diagonales de D-Pad\n(Toque de 4 direcciones) +Glowing borders = Bordes brillantes +HapticFeedback = Vibración háptica +Ignore gamepads when not focused = Ignorar pads con pantalla inactiva +Ignore Windows Key = Ignorar tecla de Windows +Invert Axes = Invertir ejes +Invert Tilt along X axis = Invertir inclinación del eje X +Invert Tilt along Y axis = Invertir inclinación del eje Y +Keep this button pressed when right analog is pressed = Mantenga presionada esta tecla cuando el analog derecho es presionado +Keyboard = Ajustes de teclado +L/R Trigger Buttons = botones L/R +Landscape = Apaisado +Landscape Auto = Apaisado automático +Landscape Reversed = Apaisado invertido +Mouse = Ajustes de ratón +Mouse sensitivity = Sensibilidad del ratón +Mouse smoothing = Suavidad del ratón +MouseControl Tip = Puedes controlar el ratón en la pantalla de controles presionando el icono 'M'. +None (Disabled) = None (Desactivado) +Off = Off +OnScreen = Controles en pantalla +Portrait = Retrato +Portrait Reversed = Retrato invertido +PSP Action Buttons = Botones de acción PSP +Screen Rotation = Rotación de pantalla +seconds, 0 : off = Segundos, 0 = apagado +Sensitivity = Sensibilidad +Show right analog = Mostrar Analog derecho +Show Touch Pause Menu Button = Mostrar botón de menú Pause +Thin borders = Bordes finos +Tilt Base Radius = Radio base de inclinación +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". +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 +Visibility = Visibilidad +X = X +X + Y = X + Y +XInput Analog Settings = Configuraciones de Analog de XInput +Y = Y + +[CwCheats] +Cheats = Trampas +Edit Cheat File = Editar archivo de trampas +Enable/Disable All = Activar/desactivar todas las trampas +Import Cheats = Importar cheat.db +Options = Opciones +Refresh Rate = Frecuencia de actualización + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = VL Gothic +About PPSSPP... = &Acerca de PPSSPP... +Auto = &Automático +Backend = Motor &gráfico (requiere reiniciar) +Bicubic = &Bicúbico +Break = Romper +Break on Load = Romper en carga +Buffered Rendering = &Renderizado por búfer +Buy Gold = Comprar versión &Gold +Control Mapping... = Asignar &botones... +Debugging = &Depuración +Deposterize = &Deposterizar +Direct3D9 = &Direct3D 9 +Direct3D11 = Direct3D &11 +Disassembly = &Desensamblador... +Discord = Discord +Display Layout Editor = Editar posición de botones... +Display Rotation = Rotación de pantalla +Dump Next Frame to Log = &Volcar siguiente cuadro a registro +Emulation = &Emulación +Enable Chat = Activar chat +Enable Cheats = Activar &trampas +Enable Sound = Activar s&onido +Exit = &Salir +Extract File... = E&xtraer archivo... +File = &Archivo +Frame Skipping = &Salto de Frames +Frame Skipping Type = Tipo de salto de frames +Fullscreen = &Pantalla completa +Game Settings = A&justes de juego +GE Debugger... = Dep&urador GE... +GitHub = Git&Hub +Hardware Transform = Transformación por &hardware +Help = A&yuda +Hybrid = &Híbrido +Hybrid + Bicubic = Híb&rido y bicúbico +Ignore Illegal Reads/Writes = &Ignorar lecturas/escrituras erróneas +Ignore Windows Key = Ignorar tecla de &Windows +Keep PPSSPP On Top = &Mantener PPSSPP en primer plano +Landscape = Apaisado +Landscape reversed = Apaisado inverso +Language... = &Idioma... +Linear = &Lineal +Load = &Cargar... +Load .sym File... = Cargar archivo .&sym... +Load Map File... = &Cargar archivo Map... +Load State = &Cargar estado +Load State File... = Cargar a&rchivo de estado... +Log Console = Consola de re&gistros... +Memory View... = Visor de &memoria... +More Settings... = Más &opciones... +Nearest = &Cercano +Non-Buffered Rendering = &Saltar efectos por búfer (Desactiva búfer, rápido) +Off = &No +Open Directory... = &Abrir carpeta... +Open from MS:/PSP/GAME... = A&brir desde ms0:/PSP/GAME... +Open Memory Stick = Abrir &Memory Stick +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = &Pausar +Pause When Not Focused = &Pausar al cambiar de ventana +Portrait = Retrato +Portrait reversed = Retrato inverso +Postprocessing Shader = &Shader de postprocesado +PPSSPP Forums = &Foro de PPSSPP +Record = G&rabar +Record Audio = Grabar &audio +Record Display = Grabar &display +Rendering Mode = M&odo de renderizado +Rendering Resolution = &Resolución de renderizado +Reset = Re&iniciar +Reset Symbol Table = &Reiniciar tabla de símbolos +Run = &Reanudar +Save .sym File... = Guardar archivo .&sym... +Save Map File... = &Guardar archivo Map... +Save State = &Guardar estado +Save State File... = G&uardar archivo de estado... +Savestate Slot = Ranura de guardar &estados +Screen Scaling Filter = Filtro de escalado de &pantalla +Show Debug Statistics = Mostrar &estadísticas de depuración +Show FPS Counter = &Mostrar contador de FPS +Skip Number of Frames = Saltar número de frames +Skip Percent of FPS = Saltar porcentaje de FPS +Stop = P&arar +Switch UMD = Cambiar &UMD +Take Screenshot = Capturar &pantalla +Texture Filtering = &Filtrado de texturas +Texture Scaling = &Escalado de texturas +Use Lossless Video Codec (FFV1) = Usar codec de Video sin pérdida (&FFV1) +Use output buffer for video = Usar salida de búfer para vídeo +Vertex Cache = &Caché de vértices +VSync = Sincronización &vertical +Vulkan = Vulkan +Window Size = &Tamaño de ventana +www.ppsspp.org = Vi&sita www.ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Visor de localizador (Vulkan) +Allow remote debugger = Admitir depurador remoto +Backspace = Borrar +Block address = Bloquear dirección +By Address = Por dirección +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Crear/Abrir archivo textures.ini para el juego actual +Current = Actual +Dev Tools = Herramientas de\ndesarrollador +DevMenu = Menú Depuración +Disabled JIT functionality = Apagar funcionalidad de JIT +Draw Frametimes Graph = Mostrar gráfica de tiempos de frames +Dump Decrypted Eboot = Volcar EBOOT.BIN descifrado al iniciar el juego +Dump Frame GPU Commands = Volcar comandos GPU del cuadro +Enable driver bug workarounds = Activar arreglos alternativos para fallos de drivers +Enable Logging = Activar registro +Enter address = Insertar dirección +FPU = FPU +Framedump tests = Pruebas de volcado de frames +Frame Profiler = Perfilado de frame +GPU Driver Test = Probar controlador GPU +GPU Profile = Perfil de GPU +Jit Compare = Comparar JIT +JIT debug tools = Herr. de depuración de JIT +Language = Idioma +Load language ini = Cargar INI de idioma +Log Dropped Frame Statistics = Registrar estadísticas de frames caídos +Log Level = Nivel de registro +Log View = Ver el registro +Logging Channels = Canales de registro +Next = Siguiente +No block = No bloquear +Prev = Atras +Random = Aleatorio +Replace textures = Remplazar texturas +Reset limited logging = Reiniciar registro límitado +RestoreDefaultSettings = ¿Seguro que quieres volver a los ajustes de fábrica?\nLos cambios en los controles no se borrarán.\n\nNo puedes deshacer esto.\nReinicia PPSSPP para que los cambios tengan efecto. +RestoreGameDefaultSettings = ¿Seguro que quieres reestablecer los ajustes del juego\na los ajustes por defecto de PPSSPP? +Resume = Reanudar +Run CPU Tests = Ejecutando pruebas de CPU +Save language ini = Guardar INI de idioma +Save new textures = Guardar nuevas texturas +Shader Viewer = Visor de shader +Show Developer Menu = Mostrar menú de desarrollador +Show on-screen messages = Mostrar mensajes en pantalla +Stats = Estadísticas +System Information = Información del sistema +Texture Replacement = Remplazar texturas +Toggle Audio Debug = Parar/Reanudar depuración de audio +Toggle Freeze = Parar/Reanudar imagen +Touchscreen Test = Probar pantalla táctil +VFPU = VFPU + +[Dialog] +* PSP res = * PSP res +Active = Activo +Back = Atrás +Cancel = Cancelar +Center = Centrar +ChangingGPUBackends = Cambiar el GPU requiere reiniciar PPSSPP.\n¿Reiniciar ahora? +ChangingInflightFrames = Cambiar el almacenamiento en búfer de comandos gráficos requiere que PPSSPP se reinicie.\n¿Reiniciar ahora? +Channel: = Channel: +Choose PPSSPP save folder = Elige la carpeta de guardado de PPSSPP. +Confirm Overwrite = Hay archivos existentes,\n¿Deseas sobreescribirlos? +Confirm Save = ¿Deseas guardar estos datos? +ConfirmLoad = ¿Deseas cargar estos datos guardados? +ConnectingAP = Conectando a un punto de acceso.\nEspere un momento... +ConnectingPleaseWait = Conectando \nEspere un momento... +ConnectionName = Nombre de conexión +Corrupted Data = Datos dañados +Delete = Borrar +Delete all = Borrar todos +Delete completed = Borrado terminado. +DeleteConfirm = Estos archivos son borrados.\n¿Estás seguro/a? +DeleteConfirmAll = ADVERTENCIA:\nTodos los archivos de guardado serán borrados.\n¿Estás seguro/a? +DeleteConfirmGame = ADVERTENCIA:\nEste juego será borrado para siempre y no puedes deshacerlo.\n¿Estás seguro/a? +DeleteConfirmGameConfig = ADVERTENCIA:\nLos archivos de preferencias de este juego serán borrados.\n¿Estás seguro/a? +DeleteFailed = Los archivos no se pudieron borrar. +Deleting = Borrando\nPor favor espere... +Disable All = Apagar todo +Edit = Edit +Enable All = Activar todo +Enter = Confirmar +Finish = Terminar +Grid = Cuadrícula +Inactive = Inactivo +InternalError = An internal error has occurred. +Load = Abrir +Load completed = Datos cargados. +Loading = Cargando\nPor favor espere... +LoadingFailed = Los datos no se pudieron cargar. +Move = Mover +Network Connection = Conexión de red +NEW DATA = NO HAY DATOS +No = No +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = OK +Old savedata detected = Detectados datos de partida antiguos. +Options = Opciones +Reset = Reiniciar +Resize = Tamaño +Retry = Reintentar +Save = Guardar +Save completed = Datos almacenados. +Saving = Guardando\nPor Favor espere... +SavingFailed = Los datos no se pudieron guardar. +Select = Seleccionar +Shift = Alternar +Snap = Chasquido +Space = Espacio +SSID = SSID +Submit = Enviar +Supported = Soportado +There is no data = Aquí no hay datos. +Toggle All = Cambiar todo +Toggle List = Cambiar lista +Unsupported = No es soportado +When you save, it will load on a PSP, but not an older PPSSPP = Cuando guardes, la partida cargará en una PSP, pero no en versiones antiguas de PPSSPP. +When you save, it will not work on outdated PSP Firmware anymore = Cuando guardes, la partida puede no funcionar en una PSP con firmware desactualizado. +Yes = Sí +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = Es un archivo comprimido (7z).\nPor favor, descomprima primero (usa 7-Zip o WinRAR). +A PSP game couldn't be found on the disc. = No se detecta el juego de PSP en el disco. +Cannot boot ELF located outside mountRoot. = No puede iniciar ELF localizado fuera de mountRoot. +Could not save screenshot file = No se pudo guardar la captura de pantalla. +D3D9or11 = ¿Direct3D 9? (o "no" para Direct3D 11) +D3D11CompilerMissing = No se encuentra el archivo D3DCompiler_47.dll.\nEste archivo es requisito para iniciar Direct3D 11, por lo cual debe instalarlo.\n¿Quieres cambiar a Direct3D 9? +D3D11InitializationError = No se ha inicializado correctamente Direct3D 11 +D3D11Missing = Tu versión de Windows no soporta D3D11. Utilice Windows Update por favor.\n¿Quieres cambiar a Direct3D 9? +D3D11NotSupported = Tu GPU no soporta Direct3D 11.\n¿Quieres cambiar a Direct3D 9? +Disk full while writing data = El disco se ha llenado durante la escritura de datos. +ELF file truncated - can't load = Archivo ELF truncado: no se puede cargar +Error loading file = Error al cargar archivo. +Error reading file = Error al leer el archivo. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = No se pudo identificar el archivo. +Failed to load executable: = Falló al cargar ejecutable: +File corrupt = Archivo corrupto +Game disc read error - ISO corrupt = Falló al cargar disco de juego: ISO corrupta. +GenericAllStartupError = Falló al iniciar los gráficos de cualquier API. Intenta actualizar los drivers de los gráficos y de otros. +GenericBackendSwitchCrash = Falló al iniciar los gráficos. Intenta actualizar los drivers de los gráficos.\n\nLa API de los gráficos ha sido cambiado: +GenericDirect3D9Error = Falló al iniciar los gráficos. Intenta actualizar los drivers de los gráficos y el runtime de DirectX 9.\n\n¿Quieres probar a usar OpenGL 2.0 en su lugar?\n\nMensaje de error: +GenericGraphicsError = Error de graficos +GenericOpenGLError = Falló al iniciar los gráficos. Intenta actualizar los drivers de los gráficos.\n\n¿Quieres probar a usar DirectX 9 en su lugar?\n\nMensaje de error: +GenericVulkanError = Falló al iniciar los gráficos. Intenta actualizar los drivers de los gráficos.\n\n¿Quieres probar a usar OpenGL 2.0 en su lugar?\n\nMensaje de error: +InsufficientOpenGLDriver = Soporte insuficiente del driver OpenGL detectado.\n\nTu tarjeta gráfica indica que no soporta OpenGL 2.0. ¿Quieres probar a usar DirectX en su lugar?\n\nPor ahora DirectX es compatible con menos juegos, pero con tu tarjeta gráfica puede que sea la única opción disponible.\n\nVisita los foros en https://forums.ppsspp.org para más información. +Just a directory. = Sólo es una carpeta. +Missing key = No se encuentra la tecla. +MsgErrorCode = Código de error: +MsgErrorSavedataDataBroken = Los datos de guardado se dañaron. +MsgErrorSavedataMSFull = Memory Stick está lleno. Verifica el espacio. +MsgErrorSavedataNoData = ADVERTENCIA: no se encontró datos de guardado. +MsgErrorSavedataNoMS = No se insertó la Memory Stick. +No EBOOT.PBP, misidentified game = Falta el archivo EBOOT.PBP, juego mal identificado. +Not a valid disc image. = No es un disco válido. +OpenGLDriverError = Error del driver OpenGL +PPSSPP doesn't support UMD Music. = PPSSPP no soporta canciones de UMD. +PPSSPP doesn't support UMD Video. = PPSSPP no soporta videos de UMD. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP solo soporta juegos de PSP y no soporta juegos de PS1 o PS2. +PPSSPPDoesNotSupportInternet = Por ahora PPSSPP no soporta las funciones de red para actualizaciones de juegos, DLCs o PSN. +PS1 EBOOTs are not supported by PPSSPP. = PPSSPP no soporta los EBOOTs de PSX. +PSX game image detected. = El archivo es una imagen MODE2. PPSSPP no soporta juegos de PSX. +RAR file detected (Require UnRAR) = Es un archivo comprimido (RAR).\nPor favor, descomprima primero (usa UnRAR). +RAR file detected (Require WINRAR) = Es un archivo comprimido (RAR).\nPor favor, descomprima primero (usa WinRAR). +Running slow: try frameskip, sound is choppy when slow = Se ejecuta lento:\nIntenta saltar cuadros, puede sonar mal debido a la ralentización. +Running slow: Try turning off Software Rendering = Se ejecuta lento:\nIntenta desactivar "renderizado por software". +Save encryption failed. This save won't work on real PSP = Falló al cifrar los datos guardados. No funcionarán en una PSP real. +textures.ini filenames may not be cross-platform = Los nombres del archivo "textures.ini" pueden no ser multiplataforma. +This is a saved state, not a game. = Este es un estado guardado en vez de un juego. +This is save data, not a game. = Esta es una carpeta de datos guardado en vez de un juego. +Unable to create cheat file, disk may be full = No se pudo crear el archivo de trampas, el disco podría estar lleno. +Unable to initialize rendering engine. = No se pudo inicializar el motor de renderizado. +Unable to write savedata, disk may be full = No se pudieron escribir los datos de guardado, el disco podría estar lleno. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = ADVERTENCIA: VRAM lleno, reduciendo escalado y cambiando al modo cache lento. +Warning: Video memory FULL, switching to slow caching mode = ADVERTENCIA: VRAM lleno, cambiando al modo cache lento. +ZIP file detected (Require UnRAR) = Es un archivo comprimido (ZIP).\nPor favor, descomprima primero (usa UnRAR). +ZIP file detected (Require WINRAR) = Es un archivo comprimido (ZIP).\nPor favor, descomprima primero (usa WinRAR). + +[Game] +Asia = Asia +ConfirmDelete = Borrar +Create Game Config = Crear config. del juego +Create Shortcut = Crear acceso directo +Delete Game = Borrar juego +Delete Game Config = Borrar config. del juego +Delete Save Data = Borrar datos +Europe = Europe\n(Europa) +Game = Juego +Game Settings = Ajustes de juego +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Instalación de datos +Japan = Japan\n(Japón) +Korea = Korea\n(Corea) +MB = MB +One moment please... = Espere un momento... +Play = Jugar +Remove From Recent = Borrar de "recientes" +SaveData = Datos +Setting Background = Configurar fondo +Show In Folder = Mostrar en carpeta +USA = USA\n(Norteamérica) +Use UI background = Usar fondo como interfaz + +[Graphics] +% of the void = % del vacío +% of viewport = % de ventana gráfica +%, 0:unlimited = %, 0 = ilimitado +(supersampling) = (supersampleado) +(upscaling) = (escalado) +1x PSP = PSP ×1 +2x = ×2 +2x PSP = PSP ×2 +3x = ×3 +3x PSP = PSP ×3 +4x = ×4 +4x PSP = PSP ×4 +5x = ×5 +5x PSP = PSP ×5 +6x PSP = PSP ×6 +7x PSP = PSP ×7 +8x = ×8 +8x PSP = PSP ×8 +9x PSP = PSP ×9 +10x PSP = PSP ×10 +16x = ×16 +Aggressive = Agresivo +Alternative Speed = Velocidad alternativa (en %, 0 = ilimitada) +Alternative Speed 2 = Velocidad alternativa 2 (en %, 0 = ilimitada) +Anisotropic Filtering = Filtrado Anisotrópico +Auto = Automático +Auto (1:1) = Automático (1:1) +Auto (same as Rendering) = Automático (igual a la de renderizado) +Auto FrameSkip = Salto de cuadros automático +Auto Scaling = Escalado automático +Backend = Motor gráfico +Balanced = Balanceado +Bicubic = Bicúbico +BlockTransfer Tip = Algunos juegos requieren activarlo para corregir gráficos. +BlockTransferRequired = Advertencia: Este juego requiere activar Simular efectos de transferencia de bloque. +Both = Ambos +Buffer graphics commands (faster, input lag) = Comandos gráficos de búfer (acelera, lag de controles) +Buffered Rendering = Renderizado con Buffer +BufferedRenderingRequired = Advertencia: Este juego requiere renderizado puesto a buffer. +Camera = Cámara +Camera Device = Dispositivo de cámara +Cardboard Screen Size = Tamaño de pantalla (en % del área visual) +Cardboard Screen X Shift = Desplazamiento X (en % del espacio en blanco) +Cardboard Screen Y Shift = Desplazamiento Y (en % del espacio en blanco) +Cardboard VR Settings = Configurar Google Cardboard VR +Cheats = Trampas +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = Núcleo de CPU +Debugging = Depuración +DefaultCPUClockRequired = ADVERTENCIA: Este juego req. poner por défecto el reloj de CPU. +Deposterize = Deposterizado +Deposterize Tip = Arregla glitches de banda visual en texturas causadas por el escalado. +Device = Dispositivo +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Desactivar efectos más lentos (rápido) +Disabled = Apagado +Display layout editor = Editor del área de pantalla... +Display Resolution (HW scaler) = Resolución de pantalla (escalado por HW) +Dump next frame to log = Volcar siguiente cuadro al registro +Enable Cardboard VR = Activar Cardboard VR +FPS = FPS +Frame Rate Control = Control de Framerate +Frame Skipping = Salto de Frames +Frame Skipping Type = Tipo de Salto de Frames +FullScreen = Pantalla completa +Hack Settings = Ajustes de hacks (puede causar glitches) +Hardware Tessellation = Teselado por Hardware +Hardware Transform = Transformación por Hardware +hardware transform error - falling back to software = Error de transformación por hardware, cambiando a software. +HardwareTessellation Tip = Usa hardware para crear curvas. +High = Alta +Hybrid = Híbrido +Hybrid + Bicubic = Híbrido + bicúbico +Ignore camera notch when centering = Ignorar muesca de la cámara al centrar +Internal Resolution = Resolución interna +Lazy texture caching = Caché de texturas diferido (rápido) +Linear = Lineal +Low = Baja +LowCurves = Calidad de curvas bézier/Spline +LowCurves Tip = Controla la calidad de las curvas renderizadas, pero solo se utiliza en ciertos juegos. +Lower resolution for effects (reduces artifacts) = Efectos en baja resolución\n(reduce artefactos) +Manual Scaling = Escalado manual +Medium = Media +Mode = Modo +Must Restart = Debes reiniciar PPSSPP para aplicar este cambio. +Native device resolution = Resolución nativa del dispositivo +Nearest = Pixelado +No buffer = No hay búfer +Non-Buffered Rendering = Saltar efectos por búfer (Desactiva búfer, rápido) +None = No +Number of Frames = Número de Frames +Off = Apagado +OpenGL = OpenGL +Overlay Information = Información en pantalla +Partial Stretch = Estirado parcial +Percent of FPS = % de FPS +Performance = Rendimiento +Postprocessing effect = Efectos de postprocesado +Postprocessing Shader = Shader de postprocesado +Recreate Activity = Recrear actividad +Render duplicate frames to 60hz = Procesar frames duplicados a 60 Hz +RenderDuplicateFrames Tip = Puede hacer que el framerate sea más suave en juegos que se ejecutan a framerates más bajos +Rendering Mode = Modo de renderizado +Rendering Resolution = Resolución de renderizado +RenderingMode NonBuffered Tip = Acelera, pero no puede dibujar en algunos juegos +Retain changed textures = Retener texturas cambiadas\n(A veces se ralentiza) +RetainChangedTextures Tip = Ralentiza muchos juegos, pero acelera algunos +Rotation = Rotación +Safe = Seguro +Screen layout = Screen layout +Screen Scaling Filter = Filtro de escalado de pantalla +Show Debug Statistics = Mostrar estadísticas de depuración +Show FPS Counter = Mostrar contador de FPS +Simulate Block Transfer = Simular efectos de transferencia de bloque +SoftGPU Tip = Actualmente ENLENTECE mucho +Software Rendering = Renderizado por software (experimental) +Software Skinning = Skineado por software +SoftwareSkinning Tip = Combina dibujados de modelo de skineado en la CPU. Acelera muchos juegos pero enlentece otros. +Speed = Velocidad +Stretching = Estirar +Texture Filter = Filtro de texturas +Texture Filtering = Filtrado de texturas +Texture Scaling = Escalado de texturas +Texture Shader = Texture shader +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 cortes +Use all displays = Usar todas las muestras +Vertex Cache = Caché con Vértices +VertexCache Tip = Acelera, pero puede fallar temporalmente +VSync = VSync +Vulkan = Vulkan +Window Size = Tamaño de ventana +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Borrar archivo ZIP +Install = Instalar +Install game from ZIP file? = ¿Instalar juego desde un archivo ZIP? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = ¡Instalado! +Texture pack doesn't support install = El paquete de texturas no es compatible con la instalación +Zip archive corrupt = Archivo ZIP corrupto +Zip file does not contain PSP software = El archivo ZIP no contiene software PSP + +[KeyMapping] +Autoconfigure = Autoconfigurar +Autoconfigure for device = Autoconfigurar para dispositivo +Clear All = Borrar todo +Default All = Restaurar +Map a new key for = Presiona una tecla para +Map Key = Asignar tecla +Map Mouse = Asignar ratón +Test Analogs = Probar analogs +You can press ESC to cancel. = Puedes presionar Esc para cancelar. + +[MainMenu] +Browse = Buscar... +Buy PPSSPP Gold = Comprar PPSSPP Gold +Choose folder = Seleccionar carpeta +Credits = Créditos +PPSSPP Homebrew Store = Tienda de Homebrew de PPSSPP +Exit = Salir +Game Settings = Preferencias +Games = Juegos +Give PPSSPP permission to access storage = Pedir permiso a PPSSPP para acceder a la tienda +Homebrew & Demos = Homebrew y Demos +How to get games = ¿Cómo consigo juegos? +How to get homebrew & demos = ¿Cómo consigo homebrew y demos? +Load = Cargar... +Loading... = Cargando... +PinPath = Anclar +PPSSPP can't load games or save right now = PPSSPP no puede abrir juegos o guardarlos por ahora. +Recent = Recientes +SavesAreTemporary = PPSSPP está guardando en almacenamiento temporal +SavesAreTemporaryGuidance = Extraer PPSSPP en cualquier parte para guardar para siempre +SavesAreTemporaryIgnore = Ignorar advertencias +UnpinPath = Desanclar +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Audio +Controls = Controles +Graphics = Gráficos +Networking = Juego en red +System = Sistema +Tools = Herramientas + +[MappableControls] +Alt speed 1 = Vel. Alt. 1 +Alt speed 2 = Vel. Alt. 2 +An.Down = An. abajo +An.Left = An. izquierda +An.Right = An. derecha +An.Up = An. arriba +Analog limiter = Limitador Analog +Analog Stick = Analog stick +Audio/Video Recording = Grabar audio/video +Auto Analog Rotation (CCW) = Rotación analógica automática (CCW) +Auto Analog Rotation (CW) = Rotación analógica automática (CW) +AxisSwap = Invertir ejes +Circle = ○ +Cross = × +D-pad down = PDM Abajo +D-pad left = PDM Izquierda +D-pad right = PDM Derecha +D-pad up = PDM Arriba +DevMenu = Menú Depuración +Down = Abajo +Dpad = Punto de mira +Frame Advance = Avanzar Frame +Hold = Mantener +Home = PSHome +L = L +Left = Izquierda +Load State = Cargar estado +Mute toggle = Alternar silencio +Next Slot = Siguiente ranura +None = None +Note = Sonido +OpenChat = Abrir chat +Pause = Pausa +R = R +RapidFire = Disparo rápido +Remote hold = Mantener remotamente +Rewind = Retroceso +Right = Derecha +Right Analog Stick (tap to customize) = Analog stick derecho\n(Toca para personalizar) +RightAn.Down = An.Der. abaj. +RightAn.Left = An.Der. izq. +RightAn.Right = An.Der. der. +RightAn.Up = An.Der. arrib. +Rotate Analog (CCW) = Rotación analógica (CCW) +Rotate Analog (CW) = Rotación analógica (CW) +Save State = Guardar estado +Screen = Pantalla +Screenshot = Capturapantalla +Select = Select +SpeedToggle = Alternar veloc. +Square = □ +Start = Start +Texture Dumping = Dumpear textura +Texture Replacement = Remplazo de textura +Toggle Fullscreen = Alternar pantalla completa +Toggle mode = Alternar modo +Triangle = △ +Unthrottle = Modo turbo +Up = Arriba +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Visitar foro de juego en red +AdHoc Server = Servidor Ad Hoc +AdhocServer Failed to Bind Port = Servidor Ad hoc falló al unir puerto. +Auto = Auto +Bottom Center = Abajo +Bottom Left = Abajo Izquierda +Bottom Right = Abajo Derecha +Center Left = Izquierda +Center Right = Derecha +Change Mac Address = Cambiar dirección MAC +Change proAdhocServer Address = Cambiar dirección IP de\nservidor PRO ad hoc (localhost = multiple instances) +Chat = Chat +Chat Button Position = Posición del botón de chat +Chat Here = Escriba aquí +Chat Screen Position = Posición de la pantalla de chat +Disconnected from AdhocServer = Desconectado del servidor ad hoc +DNS Error Resolving = Resolviendo error DNS +Enable built-in PRO Adhoc Server = Activar servidor ad hoc PRO integrado +Enable network chat = Activar chat de red +Enable networking = Activar juego en red/WLAN\n(beta, puede dañar juegos) +Enable UPnP = Activar UPnP (necesita algunos segundos para detectar) +EnableQuickChat = Activar quick chat +Enter a new PSP nickname = Ingrese un nuevo nombre de usuario de PSP +Enter Quick Chat 1 = Entrar quick chat 1 +Enter Quick Chat 2 = Entrar quick chat 2 +Enter Quick Chat 3 = Entrar quick chat 3 +Enter Quick Chat 4 = Entrar quick chat 4 +Enter Quick Chat 5 = Entrar quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Fallo al conectar al servidor ad hoc +Forced First Connect = Primera conexión forzada (más rápida) +Invalid IP or hostname = IP o nombre de host no válido +Minimum Timeout = Tiempo de espera mínimo (en ms, 0 = por defecto) +Misc = Otros ajustes (por defecto = compatibilidad con PSP) +Network Initialized = Juego en red iniciado +Please change your Port Offset = Por favor cambia el offset del puerto. +Port offset = Variar puerto de red (0 = compatibilidad con PSP) +proAdhocServer Address: = Dirección del servidor Adhoc: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Enviar +Send Discord Presence information = Enviar información al Discord "Rich Presence" +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Arriba +Top Left = Arriba Izquierda +Top Right = Arriba Derecha +Unable to find UPnP device = No se encuentra el dispositivo UPnP +UPnP (port-forwarding) = UPnP (redirección de puertos) +UPnP need to be reinitialized = UPnP debe reinicializarse +UPnP use original port = Usar puerto UPnP de PSP (activado = más compatible con PSP ) +Validating address... = Validando dirección ... +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 = Trampas +Continue = Continuar +Create Game Config = Crear config. del juego +Delete Game Config = Borrar config. del juego +Exit to menu = Salir al menú +Game Settings = Ajustes del juego +Load State = Cargar estado +Rewind = Rebobinar +Save State = Guardar estado +Settings = Ajustes generales +Switch UMD = Cambiar UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (configuraciones duplicadas, se usará la anterior) +4xHqGLSL = 4×HQ GLSL +5xBR = 5×BR +5xBR-lv2 = 5×BR-lv2 +AAColor = AA + Color +Amount = Amontonado +Black border = Borde negro +Bloom = resplandecedor +Brightness = Brillo +Cartoon = Caricaturas +ColorCorrection = Corregir color +Contrast = Contrast +CRT = Pantalla TV (CRT) +FXAA = FXAA Antialiasing +Gamma = Gamma +Grayscale = Escala de grises +Intensity = Intensidad +InverseColors = Invertir colores +Natural = Colores naturales +NaturalA = Colores naturales (sin desenfoques) +Off = Apagado +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Líneas de escáneo (CRT) +Sharpen = Afilado +SSAA(Gauss) = Supersampleado AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Escalado en Spline36 +VideoSmoothingAA = Vídeo suavizado AA +Vignette = Viñeta + +[PSPCredits] +all the forum mods = Todos los foros de Mods +build server = build server +Buy Gold = Comprar\nPPSSPP Gold +check = También te recomendamos el emulador de Wii/GC Dolphin +CheckOutPPSSPP = Prueba PPSSPP, el mejor emulador de PSP: https://www.ppsspp.org/ +contributors = Colaboradores: +created = Creador: +Discord = Discord +info1 = Únicamente para propósito educativo +info2 = Por favor asegúrate de que tienes los derechos de cualquier juego +info3 = que uses, ya si dispones del UMD original o de una copia digital +info4 = de PSN con tu PSP original. +info5 = PSP es una marca registrada de Sony Corporation +iOS builds = Construcciones de iOS +license = Software Libre bajo licencia GPL 2.0+ +list = foro oficial, hilos de discusión y lista de compatibilidad +PPSSPP Forums = Foro PPSSPP +Privacy Policy = Política de privacidad +Share PPSSPP = Compartir... +specialthanks = Agradecimientos especiales a: +specialthanksKeithGalocy = NVIDIA (hardware, anuncios) +specialthanksMaxim = Por su trabajo en el decodificador Atrac3+ +testing = Probando +this translation by = Traducido por: +title = Emulador de PSP rápido y portable +tools = Software libre utilizado: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = VR0 +translators2 = +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Sitio web oficial +written = Escrito en lenguaje C++ para una mejor portabilidad y velocidad + +[RemoteISO] +Browse Games = Buscar juegos +Local Server Port = Puerto del servidor local +Manual Mode Client = Clíente modo manual +Remote disc streaming = Streaming de disco remoto +Remote Port = Puerto remoto +Remote Server = Servidor remoto +Remote Subdirectory = Subcarpeta remota +RemoteISODesc = Juegos en la lista reciente será compartida +RemoteISOLoading = Conectado, cargando juegos... +RemoteISOScanning = Escaneando... Presione Compartir juegos desde tu servidor +RemoteISOScanningTimeout = Escaneando... Verifica las opciones de tu cortafuegos de escritorio +RemoteISOWifi = Aviso: Conecta al menos dos dispositivos a la misma red Wi-Fi +RemoteISOWinFirewall = ADVERTENCIA: cortafuegos de Windows está bloqueando el acceso +Settings = Opciones +Share Games (Server) = Compartir juegos (servidor) +Share on PPSSPP startup = Compartir al empezar PSSPP +Stop Sharing = Parar +Stopping.. = Deteniendo... + +[Reporting] +Bad = Mal +FeedbackDelayInfo = Tus datos se están enviando al fondo. +FeedbackDesc = ¿Cómo va el juego? ¡Que lo sepa la comunidad! +FeedbackDisabled = El servidor de reportes debe activarse. +FeedbackIncludeCRC = Aviso: la pila puede ser usada para enviar CRC de disco +FeedbackIncludeScreen = Incluir una capturapantalla +FeedbackSubmitDone = Tus datos ya fueron enviados. +FeedbackSubmitFail = No puede enviar tus datos al servidor. Prueba actualizando PPSSPP. +FeedbackThanks = Gracias por tu reporte. +Gameplay = Jugabilidad +Graphics = Gráficos +Great = Geniales +In-game = Funciona +In-game Description = Funciona en jugabilidad pero no es posible completarlo. +Menu/Intro = Menu/Intro +Menu/Intro Description = No se puede entrar al mismo juego. +Nothing = Nada +Nothing Description = Completamente roto. +OK = OK +Open Browser = Abrir navegador +Overall = General +Perfect = Perfecto +Perfect Description = Perfecta emulación para este juego. +Plays = Jugable +Plays Description = Perfecta jugabilidad pero puede tener glitches. +ReportButton = Informar de error +Speed = Velocidad +Submit Feedback = Enviar feedback +SuggestionConfig = Ver reportes en la web para una buena configuración. +SuggestionCPUSpeed0 = Apagar bloqueo de velocidad CPU. +SuggestionDowngrade = Volver a una versión de PPSSPP más antigua (por favor reportar error). +SuggestionsFound = Otros usuarios han reportado mejores resultados. Toca "Ver Feedback" para más detalles. +SuggestionsNone = Este juego tampoco funciona para otros usuarios. +SuggestionsWaiting = Enviando y verificando feedback de otros usuarios... +SuggestionUpgrade = Actualizar a una build de PPSSPP más reciente. +SuggestionVerifyDisc = Verifica que tu ISO es una copia válida del disco. +Unselected Overall Description = ¿Como podrá emular este juego? +View Feedback = Ver feedback + +[Savedata] +Date = Fecha +Filename = Nombre de archivo +No screenshot = No hay capturas de pantalla. +None yet. Things will appear here after you save. = No hay datos. Una vez que guardes partida aparecerán aquí. +Save Data = Datos +Save States = Estados +Savedata Manager = Administrador de partidas guardadas +Size = Tamaño + +[Screen] +Cardboard VR OFF = Cardboard VR apagado +Chainfire3DWarning = ADVERTENCIA: Chainfire3D detectado, puede causar problemas. +Failed to load state = Error al abrir el estado +Failed to save state = Error al guardar el estado +fixed = Velocidad: fija +GLToolsWarning = ADVERTENCIA: GLTools detectado, puede causar problemas. +In menu = En menú +Load savestate failed = Falló al abrir el estado +Loaded State = Cargado estado +Loaded. Save in game, restart, and load for less bugs. = Cargado. Guarda la partida, reinicia, y recarga para menos bugs. +LoadStateDoesntExist = Error al cargar: no existe el archivo. +LoadStateWrongVersion = Error al cargar: archivo incompatible con esta versión o está dañado. +norewind = No hay estados de retroceso disponibles. +Playing = Reproduciendo +PressESC = ESC: Pausar emulador. +replaceTextures_false = Texturas ya no son remplazadas. +replaceTextures_true = Remplazo de texturas activado. +Save State Failed = Falló al guardar estado. +Saved State = Estado almacenado. +saveNewTextures_false = No se guarda las texturas. +saveNewTextures_true = Las texturas se guardan en el almacenamiento local. +SpeedCustom2 = VEL: Alternada 2 +standard = VEL: Normal +Untitled PSP game = Juego de PSP sin título. + +[Store] +Already Installed = Ya instalado +Connection Error = Error de conexión +Install = Instalar +Launch Game = Lanzar juego +Loading... = Cargando... +MB = MB +Size = Tamaño +Uninstall = Desinstalar + +[SysInfo] +%d (%d per core, %d cores) = %d (%d por núcleo, %d núcleos) +%d bytes = %d bytes +(none detected) = (No se ha detectado) +3D API = API 3D +ABI = ABI +API Version = Versión de la API +Audio Information = Info de audio +Board = Placa +Build Config = Configuración de construcción +Build Configuration = Configuración de construcción +Built by = Construído por +Core Context = Contexto de núcleo +Cores = Núcleos +CPU Extensions = Extensiones de CPU +CPU Information = Info de CPU +CPU Name = Nombre +D3DCompiler Version = Versión del compilador D3D +Debug = Depuración +Debugger Present = Depurador presente +Device Info = Info de dispositivo +Display Information = Info de tamaño +Driver Version = Versión de driver +EGL Extensions = Extensiones EGL +Frames per buffer = Frames por buffer +GPU Information = Info de GPU +High precision float range = High precision float range +High precision int range = Rango interno de gran presición +Lang/Region = Idioma/Región +Memory Page Size = Tamaño de páginado +Native Resolution = Resulusión nátiva +OGL Extensions = Extensiones OGL +OpenGL ES 2.0 Extensions = Extensiones OpenGL ES 2.0 +OpenGL ES 3.0 Extensions = Extensiones OpenGL ES 3.0 +OpenGL Extensions = Extensiones OpenGL +Optimal frames per buffer = Frames por buffer Óptimos +Optimal sample rate = Rango de muestra óptima +OS Information = Info de sistema +PPSSPP build = Construcción de PPSSPP +Refresh rate = Tasa de refresco +Release = Lanzamiento +RW/RX exclusive = Exclusivo de RW/RX +Sample rate = Ratio de muestra +Shading Language = Lenguaje de shader +Sustained perf mode = Modo rendimiento sostenido +System Information = Información del sistema +System Name = Nombre +System Version = Versión del sistema +Threads = Temas +Vendor = Vendor +Vendor (detected) = Vendor (detectado) +Version Information = Info de versión +Vulkan Extensions = Extensiones Vulkan +Vulkan Features = Funciones Vulkan + +[System] +(broken) = (dañado) +12HR = 12HR +24HR = 24HR +Auto = Automático +Auto Load Savestate = Carga automática de estados de guardado +AVI Dump started. = Grabación iniciada. +AVI Dump stopped. = Grabación detenida. +Cache ISO in RAM = Cargar ISO completa en RAM +Change CPU Clock = Cambiar velocidad de CPU de PSP (inestable) +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +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 = Trampas (experimental, ver foros) +Clear Recent = Destruir "recientes" +Clear Recent Games List = Borrar lista de juegos recientes +Clear UI background = Borrar fondo de interfaz +Confirmation Button = Botón de confirmación +Date Format = Formato de fecha +Day Light Saving = Horario de verano +DDMMYYYY = DDMMYYYY +Decrease size = Reducir tamaño +Developer Tools = Herramientas de desarrollador +Display Extra Info = Display extra info +Display Games on a grid = Mostrar "Juegos" en una cuadrícula +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 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. +Fast (lag on slow storage) = Rápido (lag en almac. lento) +Fast Memory = Memoria Rápida (inestable) +Force real clock sync (slower, less lag) = Forzar sinc. real de reloj (lento, menos lag) +frames, 0:off = frames, 0 = apagar +Games list settings = Configuración de la lista de juegos +General = General +Grid icon size = Tamaño de icono de cuadrícula +Help the PPSSPP team = Ayuda al equipo de PPSSPP +Host (bugs, less lag) = Anfitrión (con bugs pero menos lag) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Aumentar tamaño +Interpreter = Interprete +IO timing method = Método de sincronización\nde E/S +IR Interpreter = Interprete IR +Memory Stick Folder = Carpeta de Memory Stick +Memory Stick inserted = Memory Stick insertada +MHz, 0:default = MHz, 0 = por defecto +MMDDYYYY = MMDDYYYY +Newest Save = Nuevos datos de guardado +Not a PSP game = No es un juego de PSP +Off = Apagado +Oldest Save = Antiguos datos de guardado +PSP Model = Modelo de PSP +PSP Settings = Ajustes de PSP +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Grabar Audio +Record Display = Grabar pantalla +Reset Recording on Save/Load State = Reiniciar grabación al abrir/guardar estados +Restore Default Settings = Reestablecer ajustes +Rewind Snapshot Frequency = Frecuencia de retroceso de\ninstantánea (ahoga memoria) +Save path in installed.txt = Guardar ruta en installed.txt +Save path in My Documents = Guardar ruta en Documents\n(Mis documentos en Windows XP) +Savestate Slot = Ranura de estado guardado +Savestate slot backups = Copias de seguridad de estado guardado +Screenshots as PNG = Capturas en PNG +Set UI background... = Colocar fondo de interfaz... +Show ID = Mostrar ID +Show region flag = Mostrar bandera de región +Simulate UMD delays = Simular retraso de UMD +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Almacenamiento lleno +Sustained performance mode = Modo de rendimiento sostenido +Time Format = Formato de hora +UI = Interfaz de usuario +UI Sound = UI sound +undo %c = Restaurar %c +Use Lossless Video Codec (FFV1) = Usar codec de vídeo sin pérdida (FFV1) +Use O to confirm = Confirmar con ○ +Use output buffer (with overlay) for recording = Usar búfer de salida (con overlay) para grabar +Use system native keyboard = Use system native keyboard +Use X to confirm = Confirmar con × +VersionCheck = Buscar actualizaciones de PPSSPP +WARNING: Android battery save mode is on = ADVERTENCIA: Modo ahorro activado en Android +WARNING: Battery save mode is on = ADVERTENCIA: Modo ahorro activado +YYYYMMDD = YYYYMMDD + +[Upgrade] +Details = Details +Dismiss = Cancelar +Download = Descargar +New version of PPSSPP available = Nueva versión de PPSSPP disponible diff --git a/assets/lang/fa_IR.ini b/assets/lang/fa_IR.ini new file mode 100644 index 0000000000..0a36b43492 --- /dev/null +++ b/assets/lang/fa_IR.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = ‎صدا (نیاز به ریستارت) API +AudioBufferingForBluetooth = ‎بافر مناسب هندزفری بلوتوث (کند تر) +Auto = ‎اتوماتیک +Device = Device +DSound (compatible) = ‎DSound (پشتیبانی بهتر) +Enable Sound = ‎فعال کردن صدا +Global volume = ‎بلندی صدا +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = ‎WASAPI (سریع) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = ‎حساسیت محور آنالوگ +Analog Limiter = ‎محدود کننده آنالوگ +Analog Mapper High End = ‎تنظیم حد بالای آنالوگ (حساسیت محور) +Analog Mapper Low End = ‎تنظیم حد پایین آنالوگ (معکوس کننده ناحیه غیر فعال) +Analog Mapper Mode = ‎نوع تنظیم کننده آنالوگ +Analog Stick = ‎دسته آنالوگ +AnalogLimiter Tip = ‎هنگامی که دکمه محدود کننده آنالوگ فشرده شود +Auto = ‎اتوماتیک +Auto-centering analog stick = ‎تنظیم مرکز آنالوگ به صورت خودکار +Auto-hide buttons after seconds = ‎مخفی کردن دکمه ها به صورت خودکار (به ثانیه) +Binds = Binds +Button Opacity = ‎شفافیت دکمه ها +Button style = ‎تم دکمه ها +Calibrate D-Pad = ‎کالیبره کردن +Calibration = ‎کالیبره کردن +Classic = ‎کلاسیک +Combo Key Setting = ‎تنظیم کلید های ترکیبی +Combo Key Setup = ‎تنظیم کلید های ترکیبی +Confine Mouse = ‎محدود کردن موس به ناحیه درون پنجره +Control Mapping = ‎تنظیمات کنترلر +Custom layout... = ‎...ویرایش چیدمان دکمه های تاچ +Customize tilt = ‎تنظیمات شتاب سنج +D-PAD = D-Pad +Deadzone Radius = ‎شعاع ناحیه غیر فعال +DInput Analog Settings = ‎DInput تنظیمات آنالوگ +Disable D-Pad diagonals (4-way touch) = ‎غیر فعال کردن جهت های قطری (تاچ ۴ جهته) +Glowing borders = Glowing borders +HapticFeedback = ‎لرزش +Ignore gamepads when not focused = ‎هنگامی که پنجره فعال نباشد گیم پد کار نکند +Ignore Windows Key = ‎غیر فعال کردن کلید ویندوز +Invert Axes = ‎معکوس کردن محورها +Invert Tilt along X axis = ‎X معکوس کردن شتاب سنج در جهت +Invert Tilt along Y axis = ‎Y معکوس کردن شتاب سنج در جهت +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = ‎تنظیمات کیبورد +L/R Trigger Buttons = ‎L/R دکمه های +Landscape = ‎افقی +Landscape Auto = Landscape auto +Landscape Reversed = ‎افقی وارونه +Mouse = ‎تنظیمات موس +Mouse sensitivity = ‎حساسیت موس +Mouse smoothing = ‎روان کردن حرکت موس +MouseControl Tip = ‎در قسمت تنظیمات کنترلر میتوانید از دکمه های موس استفاده کنید M با انتخاب آیکون +None (Disabled) = ‎هیچ کدام (غیر فعال) +Off = ‎خاموش +OnScreen = ‎نمایش کنترل های لمسی +Portrait = ‎عمودی +Portrait Reversed = ‎عمودی وارونه +PSP Action Buttons = ‎Action دکمه های +Screen Rotation = ‎چرخش صفحه +seconds, 0 : off = ‎به ثانیه، 0 : خاموش +Sensitivity = ‎حساسیت +Show right analog = Show right analog +Show Touch Pause Menu Button = ‎نمایش دکمه توقف بازی +Thin borders = ‎حاشیه نازک +Tilt Base Radius = Tilt base radius +Tilt Input Type = ‎...استفاده از شتاب سنج به عنوان +Tilt Sensitivity along X axis = ‎X حساسیت شتاب سنج در جهت +Tilt Sensitivity along Y axis = ‎Y حساسیت شتاب سنج در جهت +To Calibrate = ‎برای کالیبره کردن، دستگاه را روی سطح صافی گذاشته و "کالیبره کردن" را بزنید +Touch Control Visibility = ‎نشان دادن دکمه های تاچ +Use custom right analog = Use custom right analog +Use Mouse Control = ‎استفاده از موس +Visibility = ‎نمایش +X = X +X + Y = X + Y +XInput Analog Settings = ‎XInput تنظیمات آنالوگ +Y = Y + +[CwCheats] +Cheats = ‎کد های تقلب +Edit Cheat File = ‎ویرایش فایل کد ها +Enable/Disable All = ‎فعال/غیرفعال کردن همه ی کدهای تقلب +Import Cheats = ‎cheat.db وارد کردن از +Options = ‎تنظیمات +Refresh Rate = Refresh rate + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = ‎...PPSSPP درباره +Auto = ‎اتوماتیک +Backend = ‎Rendering &Backend (ریستارت میشود PPSSPP) +Bicubic = &Bicubic +Break = Break +Break on Load = Break on load +Buffered Rendering = ‎رندر کردن از بافر +Buy Gold = ‎خرید نسخه طلایی +Control Mapping... = ‎...تنظیمات کنترلر +Debugging = ‎دیباگ +Deposterize = &Deposterize +Direct3D9 = &Direct3D9 +Direct3D11 = Direct3D &11 +Disassembly = ‎...جداسازی قطعات +Discord = Discord +Display Layout Editor = ‎ویرایشگر چیدمان صفحه +Display Rotation = ‎چرخش صفحه +Dump Next Frame to Log = ‎تخلیه فریم بعدی به فایل لاگ +Emulation = ‎شبیه سازی +Enable Chat = Enable chat +Enable Cheats = ‎(فعال سازی کدهای تقلب (نیاز به راه اندازی دوباره +Enable Sound = ‎فعال سازی صدا +Exit = ‎خروج +Extract File... = ‎...استخراج فایل +File = ‎فایل +Frame Skipping = ‎ردکردن فریم +Frame Skipping Type = Frame skipping type +Fullscreen = ‎تمام صفحه +Game Settings = ‎تنظیمات بازی +GE Debugger... = GE Debugge&r... +GitHub = Git&Hub +Hardware Transform = ‎&استفاده از سخت افزار در پردازش +Help = ‎راهنما +Hybrid = ‎Hybrid (ترکیبی) +Hybrid + Bicubic = Hybrid + Bicubic +Ignore Illegal Reads/Writes = ‎نادیده گرفتن نوشتن/خواندن غیر مجاز +Ignore Windows Key = ‎نادیده گرفتن کلید ویندوز +Keep PPSSPP On Top = ‎روی سایر پنجره ها باشد PPSSPP +Landscape = ‎افقی +Landscape reversed = ‎افقی وارونه +Language... = La&nguage... +Linear = ‎خطی +Load = ‎... بارگیری +Load .sym File... = Lo&ad .sym File... +Load Map File... = ‎... Map بارگیری فایل +Load State = ‎بارگیری سریع +Load State File... = ‎... بارگیری فایل ذخیره سریع +Log Console = ‎کنسول لاگ +Memory View... = ‎...نمایش مموری +More Settings... = ‎...تنظیمات بیشتر +Nearest = ‎نزدیک ترین +Non-Buffered Rendering = ‎رد کردن اثرات بافر (سریع تر) +Off = ‎خاموش +Open Directory... = ‎... بازکردن مسیر +Open from MS:/PSP/GAME... = ‎MS:/PSP/GAME... بازکردن از +Open Memory Stick = ‎بازکردن مموری استیک +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = ‎مکث +Pause When Not Focused = ‎هنگامی که پنجره فعال نباشد بازی متوقف شود +Portrait = ‎عمودی +Portrait reversed = ‎عمودی وارونه +Postprocessing Shader = ‎اضافه کردن افکت +PPSSPP Forums = ‎PPSSPP انجمن های +Record = ‎ضبط کردن +Record Audio = ‎ضبط صدا +Record Display = ‎ضبط صفحه +Rendering Mode = ‎حالت رندرینگ +Rendering Resolution = ‎رزولوشن رندرینگ +Reset = ‎راه اندازی دوباره +Reset Symbol Table = ‎Symbol تنظیم مجدد جدول +Run = ‎اجرا +Save .sym File... = Sav&e .sym File... +Save Map File... = ‎... Map ذخیره فایل +Save State = ‎ذخیره سریع +Save State File... = ‎... ذخیره فایل سریع +Savestate Slot = ‎مکان ذخیره سریع +Screen Scaling Filter = ‎فیلتر تغییر سایز صفحه +Show Debug Statistics = ‎نمایش وضعیت دیباگ +Show FPS Counter = ‎نمایش شمارنده فریم بر ثانیه +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = ‎توقف +Switch UMD = ‎تغییر دیسک +Take Screenshot = ‎گرفتن اسکرین شات +Texture Filtering = ‎فیلتر تکسچر +Texture Scaling = ‎تغییر سایز تکسچر +Use Lossless Video Codec (FFV1) = ‎(FFV1) استفاده از کدک بدون دستکاری +Use output buffer for video = Use output buffer for video +Vertex Cache = ‎Vertex کش کردن +VSync = VS&ync +Vulkan = Vulkan +Window Size = ‎سایز پنجره +www.ppsspp.org = ‎بزنید www.&ppsspp.org سری به +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allocator viewer (Vulkan) +Allow remote debugger = Allow remote debugger +Backspace = Backspace +Block address = Block address +By Address = By address +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Create/Open textures.ini file for current game +Current = Current +Dev Tools = Development tools +DevMenu = DevMenu +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Dump decrypted EBOOT.BIN on game boot +Dump Frame GPU Commands = Dump frame GPU commands +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = ‎روشن کردن لاگ باگ ها +Enter address = Enter address +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Frame profiler +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = Jit compare +JIT debug tools = JIT debug tools +Language = ‎زبان +Load language ini = ‎ini بارگیری فایل زبان با فرمت +Log Dropped Frame Statistics = Log dropped frame statistics +Log Level = Log level +Log View = Log view +Logging Channels = Logging channels +Next = Next +No block = No block +Prev = Previous +Random = Random +Replace textures = Replace textures +Reset limited logging = Reset limited logging +RestoreDefaultSettings = ‎آیا شما می خواهید که تمامی تنظیمات به حالت اولیه خود باز گردند؟\n.تنظیمات کنترلر هیچ تغییری نمی کنند\n\n\n.تنظیمات دیگر قابل بازیابی نخواهند بود\n.پس از تایید شبیه ساز را دوباره راه اندازی کنید +RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? +Resume = Resume +Run CPU Tests = ‎CPU اجرای تست +Save language ini = ‎ini ذخیره فایل زبان با فرمت +Save new textures = Save new textures +Shader Viewer = Shader viewer +Show Developer Menu = Show developer menu +Show on-screen messages = Show on-screen messages +Stats = Stats +System Information = ‎اطلاعات سیستم +Texture Replacement = Texture replacement +Toggle Audio Debug = Toggle audio debug +Toggle Freeze = Toggle freeze +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP res +Active = Active +Back = ‎برگشت +Cancel = ‎انصراف +Center = Center +ChangingGPUBackends = Changing GPU backends requires PPSSPP to restart. Restart now? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = Choose PPSSPP save folder +Confirm Overwrite = ‎آیا می خواهید که دیتا ها را بازنویسی کنید؟ +Confirm Save = ‎آیا می خواهید که این دیتا را ذخیره نمایید؟ +ConfirmLoad = ‎بارگیری این دیتا؟ +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = ‎حذف +Delete all = Delete all +Delete completed = ‎.حذف شد +DeleteConfirm = ‎این دیتای ذخیره شده حذف خواهد شد.\nآیا از حذف آن مطمئن هستید؟ +DeleteConfirmAll = ‎آیا شما می خواهید که همه ی\nدیتاهای ذخیره این بازی را حذف نمایید؟ +DeleteConfirmGame = ‎آیا شما می خواهید این بازی را\n.از دستگاه خود حذف کنید؟ نمی توانید آن را برگردانید +DeleteConfirmGameConfig = Do you really want to delete the settings for this game? +DeleteFailed = Unable to delete data. +Deleting = ‎در حال حذف کردن\n...منتظر بمانید +Disable All = Disable all +Edit = Edit +Enable All = Enable all +Enter = ‎ورود +Finish = ‎پایان +Grid = Grid +Inactive = Inactive +InternalError = An internal error has occurred. +Load = ‎بارگیری +Load completed = ‎.بارگیری نکمیل شد +Loading = ‎درحال بارگیری\n...منتظر بمانید +LoadingFailed = Unable to load data. +Move = Move +Network Connection = Network Connection +NEW DATA = ‎دیتای جدید +No = ‎خیر +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = ‎تایید +Old savedata detected = Old savedata detected +Options = Options +Reset = Reset +Resize = Resize +Retry = Retry +Save = ‎ذخیره +Save completed = ‎.ذخیره تکمیل شد +Saving = ‎در حال ذخیره\n...منتظر بمانید +SavingFailed = Unable to save data. +Select = ‎انتخاب +Shift = ‎تغییر +Snap = Snap +Space = Space +SSID = SSID +Submit = Submit +Supported = Supported +There is no data = ‎.دیتایی وجود ندارد +Toggle All = Toggle all +Toggle List = Toggle list +Unsupported = Unsupported +When you save, it will load on a PSP, but not an older PPSSPP = When you save, it will load on a PSP, but not an older PPSSPP +When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Yes = ‎بله +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = file is compressed (7z).\nPlease decompress first (try 7-Zip or WinRAR). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = Could not save screenshot file. +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll not found. Please install. Or press Yes to try again using Direct3D 9 instead. +D3D11InitializationError = Direct3D 11 initialization error +D3D11Missing = Your operating system version does not include D3D11. Please run Windows Update.\n\nPress Yes to try again using Direct3D 9 instead. +D3D11NotSupported = Your GPU does not appear to support Direct3D 11.\n\nWould you like to try again using Direct3D 9 instead? +Disk full while writing data = Disk full while writing data. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = ‎:خطا در بارگیری فایل +Error reading file = ‎.خطا در خواندن فایل +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = ‎.شناسایی فایل ناموفق بود +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Failed initializing graphics. Try upgrading your graphics drivers and DirectX 9 runtime.\n\nWould you like to try switching to OpenGL?\n\nError message: +GenericGraphicsError = Graphics Error +GenericOpenGLError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to DirectX 9?\n\nError message: +GenericVulkanError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to OpenGL?\n\nError message: +InsufficientOpenGLDriver = Insufficient OpenGL driver support detected!\n\nYour GPU reports that it does not support OpenGL 2.0. Would you like to try using DirectX instead?\n\nDirectX is currently compatible with less games, but on your GPU it may be the only choice.\n\nVisit the forums at https://forums.ppsspp.org for more information.\n\n +Just a directory. = ‎.فقط یک مسیر +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = ‎.در بازی ناموجود است EBOOT.PBP فایل +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = OpenGL driver error +PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP currently does not support connecting to the Internet for DLC, PSN, or game updates. +PS1 EBOOTs are not supported by PPSSPP. = ‎.پشتیبانی نمی شوند PS1 ایبوت های PPSSPP در نرم افزار +PSX game image detected. = ‎.است PSX را امتحان کنید؟ این یک بازی MODE2 آیا می خواهید بازی های +RAR file detected (Require UnRAR) = ‎\n.فشرده سازی شده است RAR این فایل با فرمت\n.آن را از حالت فشرده خارج کنید UnRAR لطفا با نرم افزار +RAR file detected (Require WINRAR) = ‎\n.فشرده سازی شده است RAR این فایل با فرمت\n.آن را از حالت فشرده خارج کنید WinRAR لطفا با نرم افزار +Running slow: try frameskip, sound is choppy when slow = Running slow: try frameskip, sound is choppy when slow +Running slow: Try turning off Software Rendering = Running slow: try turning off "software rendering" +Save encryption failed. This save won't work on real PSP = Save encryption failed. This save won't work on real PSP +textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +This is a saved state, not a game. = This is a saved state, not a game. +This is save data, not a game. = This is save data, not a game. +Unable to create cheat file, disk may be full = Unable to create cheat file, disk may be full. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Unable to write savedata, disk may be full. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Warning: Video memory FULL, reducing upscaling and switching to slow caching mode. +Warning: Video memory FULL, switching to slow caching mode = Warning: Video memory FULL, switching to slow caching mode. +ZIP file detected (Require UnRAR) = ‎\n.فشرده سازی شده است ZIP این فایل با فرمت\n.آن را از حالت فشرده خارج کنید UnRAR لطفا با نرم افزار +ZIP file detected (Require WINRAR) = ‎\n.فشرده سازی شده است ZIP این فایل با فرمت\n.آن را از حالت فشرده خارج کنید WinRAR لطفا با نرم افزار + +[Game] +Asia = Asia +ConfirmDelete = Delete +Create Game Config = Create game config +Create Shortcut = ‎ساخت میانبر +Delete Game = Delete game +Delete Game Config = Delete game config +Delete Save Data = Delete savedata +Europe = Europe +Game = ‎بازی +Game Settings = ‎تنظیمات بازی +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Data install +Japan = Japan +Korea = Korea +MB = MB +One moment please... = One moment please... +Play = ‎بازی کردن +Remove From Recent = Remove from "Recent" +SaveData = ‎دیتای ذخیره +Setting Background = Setting background +Show In Folder = Show in folder +USA = USA +Use UI background = Use UI background + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = unlimited +(supersampling) = (supersampling) +(upscaling) = (upscaling) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = ‎شدید +Alternative Speed = ‎سرعت ثانویه +Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Anisotropic Filtering = ‎Anisotropic فیلتر +Auto = ‎اتوماتیک +Auto (1:1) = Auto (1:1) +Auto (same as Rendering) = ‎خودکار (مانند رزولوشن رندرینگ) +Auto FrameSkip = ‎پرش فریم خودکار +Auto Scaling = ‎تنظیم سایز خودکار +Backend = ‎گرافیکی API +Balanced = ‎متعادل +Bicubic = Bicubic +BlockTransfer Tip = ‎در بعضی بازی ها برای نشان دادن درست گرافیک نیاز است +BlockTransferRequired = ‎دارد "simulate block transfer effects" هشدار:این گزینه نیاز به روشن بودن +Both = ‎سرعت + فریم بر ثانیه +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = ‎رندر کردن از بافر +BufferedRenderingRequired = ‎تنظیم باشد "buffered" هشدار: برای این بازی "حالت رندرینگ" باید روی +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Screen size (in % of the viewport) +Cardboard Screen X Shift = X shift (in % of the blank space) +Cardboard Screen Y Shift = Y shift (in % of the blank space) +Cardboard VR Settings = ‎Google Cardboard VR تنظیمات عینک +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = ‎CPU هسته +Debugging = ‎دیباگ کردن +DefaultCPUClockRequired = ‎باید روی پیش فرض تنظیم باشد CPU هشدار: برای این بازی سرعت +Deposterize = Deposterize +Deposterize Tip = ‎مشکل نواری شدن در تکسچر های تغییر سایز یافته را رفع می کند +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = ‎غیر فعال کردن افکت های کند (افزایش سرعت) +Disabled = Disabled +Display layout editor = ‎ویرایشگر چیدمان صفحه +Display Resolution (HW scaler) = ‎رزولوشن صفحه +Dump next frame to log = ‎ریختن فریم بعدی به فایل لاگ +Enable Cardboard VR = Enable Cardboard VR +FPS = ‎فریم بر ثانیه +Frame Rate Control = ‎کنترل سرعت فریم +Frame Skipping = ‎ردکردن فریم +Frame Skipping Type = Frame skipping type +FullScreen = ‎تمام صفحه +Hack Settings = ‎تنظیمات هک ها (میتواند باعث باگ شود) +Hardware Tessellation = Hardware tessellation +Hardware Transform = ‎استفاده از سخت افزار در پردازش +hardware transform error - falling back to software = ‎خطا در پردازش سخت افزاری، سوییچ به نرم افزار +HardwareTessellation Tip = ‎استفاده از سخت افزار در رسم منحنی ها. کیفیت ثابت میماند +High = ‎زیاد +Hybrid = ‎Hybrid (ترکیبی) +Hybrid + Bicubic = Hybrid + Bicubic +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = ‎رزولوشن داخلی +Lazy texture caching = ‎کش کردن تکسچر های ماندگار (افزایش سرعت) +Linear = ‎خطی +Low = ‎کم +LowCurves = ‎Spline/Bezier کیفیت منحنی های +LowCurves Tip = ‎فقط در تعدادی بازی استفاده میشود، کیفیت منحنی ها را کنترل میکند +Lower resolution for effects (reduces artifacts) = ‎کاهش رزولوشن افکت ها (کاهش باگ گرافیکی) +Manual Scaling = ‎تغییر سایز دستی +Medium = ‎متوسط +Mode = ‎حالت +Must Restart = ‎برای اعمال این تنظیم باید برنامه را ریستارت کنید +Native device resolution = ‎رزولوشن دستگاه +Nearest = ‎نزدیک ترین +No buffer = No buffer +Non-Buffered Rendering = ‎رد کردن اثر بافر (سریع تر) +None = ‎هیچ +Number of Frames = Number of frames +Off = ‎خاموش +OpenGL = OpenGL +Overlay Information = ‎Overlay اطلاعات +Partial Stretch = ‎کشیدگی جزئی +Percent of FPS = Percent of FPS +Performance = Performance +Postprocessing effect = Postprocessing effects +Postprocessing Shader = ‎افکت پس-پردازش +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = ‎حالت رندرینگ +Rendering Resolution = ‎رزولوشن رندرینگ +RenderingMode NonBuffered Tip = ‎سریع تر، اما در بعضی بازی ها ممکن است چیزی نشان ندهد +Retain changed textures = ‎کش کردن تکسچر های تغییر یافته (بعضی مواقع کندتر) +RetainChangedTextures Tip = ‎برای بسیاری از بازی ها کندتر و برای بعضی سریع تر +Rotation = ‎چرخش +Safe = ‎امن +Screen layout = Screen layout +Screen Scaling Filter = ‎فیلتر تغییر ساز صفحه +Show Debug Statistics = ‎نمایش اطلاعات دیباگ +Show FPS Counter = ‎نمایش شمارنده فریم بر ثانیه +Simulate Block Transfer = Simulate block transfer effects +SoftGPU Tip = Currently VERY slow +Software Rendering = ‎(رندر نرم افزاری (آزمایشی +Software Skinning = Software skinning +SoftwareSkinning Tip = ‎در اکثر بازی ها سریع تر ،CPU دار در skin ترکیب رسم مدل های +Speed = ‎سرعت +Stretching = ‎کشیدن +Texture Filter = ‎فیلتر تکسچر +Texture Filtering = ‎فیلتر کردن تکسچر +Texture Scaling = ‎تغییر سایز تکسچر ها +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Turn off "hardware tessellation": unsupported +Unlimited = ‎نامحدود +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = ‎میزان افزایش سایز +Upscale Type = ‎نوع افزایش سایز +UpscaleLevel Tip = ‎زیاد کار میکشد CPU از +Use all displays = ‎استفاده از همه نمایشگر ها +Vertex Cache = ‎Vertex کش +VertexCache Tip = ‎سریع تر، اما ممکن است باعث لرزش موقتی شود +VSync = VSync +Vulkan = Vulkan +Window Size = ‎سایز پنجره +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Delete ZIP file +Install = Install +Install game from ZIP file? = Install game from ZIP file? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = Installed! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = Auto configure +Autoconfigure for device = Autoconfigure for device +Clear All = ‎پاکسازی همه +Default All = ‎پیشفرض همه +Map a new key for = ‎برای این دکمه یک کلید انتخاب کنید +Map Key = Map key +Map Mouse = Map mouse +Test Analogs = Test analogs +You can press ESC to cancel. = You can press Esc to cancel. + +[MainMenu] +Browse = ‎...جستجو +Buy PPSSPP Gold = Buy PPSSPP Gold +Choose folder = Choose folder +Credits = ‎درباره +PPSSPP Homebrew Store = PPSSPP Homebrew Store +Exit = ‎خروج +Game Settings = ‎تنظیمات بازی +Games = ‎بازی ها +Give PPSSPP permission to access storage = ‎داده شود PPSSPP اجازه دسترسی به حافظه به +Homebrew & Demos = ‎Homebrew و Demos بازی +How to get games = ‎چگونه بازی دریافت کنیم؟ +How to get homebrew & demos = ‎دریافت کنیم؟ homebrew و demos چگونه بازی های +Load = ‎...بار گذاری +Loading... = Loading... +PinPath = Pin +PPSSPP can't load games or save right now = PPSSPP can't load games or save right now +Recent = ‎آخرین بازی ها +SavesAreTemporary = PPSSPP is saving in temporary storage +SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently +SavesAreTemporaryIgnore = Ignore warning +UnpinPath = Unpin +www.ppsspp.org = ‎وبسایت شبیه ساز + +[MainSettings] +Audio = ‎صدا +Controls = ‎کنترل ها +Graphics = ‎گرافیک +Networking = ‎شبکه +System = ‎سیستم +Tools = ‎ابزار ها + +[MappableControls] +Alt speed 1 = Alt speed 1 +Alt speed 2 = Alt speed 2 +An.Down = An.Down +An.Left = An.Left +An.Right = An.Right +An.Up = An.Up +Analog limiter = Analog limiter +Analog Stick = Analog stick +Audio/Video Recording = Audio/Video recording +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Axis swap +Circle = Circle +Cross = Cross +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = DevMenu +Down = Down +Dpad = Dpad +Frame Advance = Frame advance +Hold = Hold +Home = Home +L = L +Left = Left +Load State = Load State +Mute toggle = Mute toggle +Next Slot = Next Slot +None = None +Note = Note +OpenChat = Open chat +Pause = Pause +R = R +RapidFire = RapidFire +Remote hold = Remote hold +Rewind = Rewind +Right = Right +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = RightAn.Down +RightAn.Left = RightAn.Left +RightAn.Right = RightAn.Right +RightAn.Up = RightAn.Up +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Save State +Screen = Screen +Screenshot = Screenshot +Select = Select +SpeedToggle = SpeedToggle +Square = Square +Start = Start +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = Toggle fullscreen +Toggle mode = Toggle mode +Triangle = Triangle +Unthrottle = Unthrottle +Up = Up +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Change MAC address +Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable network chat = Enable network chat +Enable networking = Enable networking/WLAN (beta, may break games) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Network initialized +Please change your Port Offset = Please change your port offset +Port offset = Port offset(0 = PSP compatibility) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Send Discord "Rich Presence" information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = ‎کد تقلب +Continue = ‎ادامه بازی +Create Game Config = ‎ساختن تنظیمات بازی +Delete Game Config = ‎حذف تنظیمات بازی +Exit to menu = ‎خروج به منو +Game Settings = ‎تنظیمات بازی +Load State = ‎بارگیری سریع +Rewind = ‎به عقب رفتن +Save State = ‎ذخیره سریع +Settings = ‎تنظیمات +Switch UMD = ‎تغییر دیسک + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Color +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Cartoon +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT scanlines +FXAA = FXAA Antialiasing +Gamma = Gamma +Grayscale = Grayscale +Intensity = Intensity +InverseColors = Inverse Colors +Natural = Natural Colors +NaturalA = Natural Colors (no blur) +Off = Off +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlines (CRT) +Sharpen = Sharpen +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 Upscaler +VideoSmoothingAA = VideoSmoothingAA +Vignette = Vignette + +[PSPCredits] +all the forum mods = all the forum mods +build server = build server +Buy Gold = ‎نسخه طلایی نرم افزار +check = ‎.موجود Wii/GC و سری هم به شبیه ساز دلفین بزنید، بهترین شبیه ساز +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = ‎:همکاران +created = ‎PPSSPP سازنده نرم افزار +Discord = Discord +info1 = ‎.فقط برای اهداف آموزشی ساخته شده است PPSSPP +info2 = ‎لطفا کپی رایت هر بازی را رعایت کنید +info3 = ‎و مطمئن شوید که شما صاحب اصلی آن بازی هستید +info4 = ‎.واقعی خود دارا هستید PSP دانلود و بر روی PSN و یا آن را از فروشگاه +info5 = ‎.یک محصول کنسول بازی و دستگاهی تجاری از سوی شرکت سونی است PSP +iOS builds = iOS builds +license = ‎GPL 2.0+ نرم افزار رایگان تحت +list = ‎...لیست بازی های سازگار ، انجمن ها و اطلاعات دیگر +PPSSPP Forums = ‎PPSSPP انجمن های +Privacy Policy = Privacy policy +Share PPSSPP = Share PPSSPP +specialthanks = ‎:تشکر ویژه +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = ‎:ترجمه شده توسط +title = ‎PSP یک شبیه ساز سریع و پرتابل از +tools = ‎:ابزار های رایگان استفاده شده +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = Leopard20 +translators2 = ‎آراس رضایی +translators3 = mail: id.arasrezaei@yahoo.com +translators4 = web: www.tempworld.ir +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = ‎:سری به وبسایت بزنید +written = ‎نوشته شده است C++ برای سریع و پرتابل بودن، نرم افزار با زبان برنامه نویسی + +[RemoteISO] +Browse Games = Browse games +Local Server Port = Local server port +Manual Mode Client = Manual mode client +Remote disc streaming = Remote disc streaming +Remote Port = Remote port +Remote Server = Remote server +Remote Subdirectory = Remote subdirectory +RemoteISODesc = Games in your recent list will be shared +RemoteISOLoading = Connected, loading game list... +RemoteISOScanning = Scanning... Click "share games" on your server device +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Note: Connect both devices to the same Wi-Fi network +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Settings +Share Games (Server) = Share games (server) +Share on PPSSPP startup = Share on PPSSPP startup +Stop Sharing = Stop sharing +Stopping.. = Stopping... + +[Reporting] +Bad = Bad +FeedbackDelayInfo = Your data is being submitted in the background. +FeedbackDesc = How's the emulation? Let us and the community know! +FeedbackDisabled = Compatibility server reports must be enabled. +FeedbackIncludeCRC = Note: Battery will be used to send a disc CRC +FeedbackIncludeScreen = Include a screenshot +FeedbackSubmitDone = Your data has been submitted. +FeedbackSubmitFail = Could not submit data to server. Try updating PPSSPP. +FeedbackThanks = Thanks for your feedback! +Gameplay = Gameplay +Graphics = Graphics +Great = Great +In-game = In-game +In-game Description = Gets into gameplay, but too buggy to complete +Menu/Intro = Menu/Intro +Menu/Intro Description = Can't get into the game itself +Nothing = Nothing +Nothing Description = Completely broken +OK = OK +Open Browser = Open browser +Overall = Overall +Perfect = Perfect +Perfect Description = Flawless emulation for the entire game - great! +Plays = Plays +Plays Description = Fully playable but might be with glitches +ReportButton = Report feedback +Speed = Speed +Submit Feedback = Submit feedback +SuggestionConfig = See reports on website for good settings. +SuggestionCPUSpeed0 = Disable locked CPU speed setting. +SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this bug). +SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. +SuggestionsNone = This game isn't working for other users too. +SuggestionsWaiting = Submitting and checking other users feedback... +SuggestionUpgrade = Upgrade to a newer PPSSPP build. +SuggestionVerifyDisc = Check your ISO is a good copy of your disc. +Unselected Overall Description = How well does this game emulate? +View Feedback = View all feedbacks + +[Savedata] +Date = Date +Filename = Filename +No screenshot = No screenshot +None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Save Data = Save data +Save States = Save states +Savedata Manager = Savedata manager +Size = Size + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = WARNING: Chainfire3D detected, may cause problems. +Failed to load state = Failed to load state +Failed to save state = Failed to save state +fixed = ‎سرعت: متناوب +GLToolsWarning = WARNING: GLTools detected, may cause problems. +In menu = In menu +Load savestate failed = Load savestate failed +Loaded State = ‎بارگیری شد +Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +LoadStateDoesntExist = ‎!خطا در بارگیری: هیچ ذخیره ی سریعی پیدا نشد +LoadStateWrongVersion = ‎!است PPSSPP خطا در بارگیری: ذخیره موجود برای ورژن های پایین تر +norewind = No rewind save states available. +Playing = Playing +PressESC = ‎.را برای منوی سریع فشار دهید ESC دکمه +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = ‎!خطا در ذخیره سازی +Saved State = ‎ذخیره شد +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Speed: alternate 2 +standard = ‎سرعت: استاندارد +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = Already installed +Connection Error = Connection error +Install = Install +Launch Game = Launch game +Loading... = Loading... +MB = MB +Size = Size +Uninstall = Uninstall + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d cores) +%d bytes = %d bytes +(none detected) = (none detected) +3D API = 3D API +ABI = ABI +API Version = API version +Audio Information = Audio information +Board = Board +Build Config = Build config +Build Configuration = Build Configuration +Built by = Built by +Core Context = Core context +Cores = Cores +CPU Extensions = CPU extensions +CPU Information = CPU information +CPU Name = Name +D3DCompiler Version = D3DCompiler version +Debug = Debug +Debugger Present = Debugger present +Device Info = Device info +Display Information = Display information +Driver Version = Driver version +EGL Extensions = EGL extensions +Frames per buffer = Frames per buffer +GPU Information = GPU information +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Lang/Region +Memory Page Size = Memory page size +Native Resolution = Native resolution +OGL Extensions = OGL extensions +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 extensions +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 extensions +OpenGL Extensions = OpenGL extensions +Optimal frames per buffer = Optimal frames per buffer +Optimal sample rate = Optimal sample rate +OS Information = OS information +PPSSPP build = PPSSPP build +Refresh rate = Refresh rate +Release = Release +RW/RX exclusive = RW/RX exclusive +Sample rate = Sample rate +Shading Language = Shading language +Sustained perf mode = Sustained perf mode +System Information = System information +System Name = Name +System Version = System version +Threads = Threads +Vendor = Vendor +Vendor (detected) = Vendor (detected) +Version Information = Version information +Vulkan Extensions = Vulkan extensions +Vulkan Features = Vulkan features + +[System] +(broken) = (broken) +12HR = ‎12 ساعت +24HR = ‎24 ساعت +Auto = ‎خودکار +Auto Load Savestate = Auto load savestate +AVI Dump started. = AVI dump started +AVI Dump stopped. = AVI dump stopped +Cache ISO in RAM = ‎در رم ISO کش کردن کل +Change CPU Clock = ‎(ناپایدار) CPU تغییر سرعت +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = ‎تغییر نام +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = ‎(کد های تقلب (به انجمن ها سری بزنید +Clear Recent = Clear "Recent" +Clear Recent Games List = ‎پاک کردن لیست آخرین بازی ها +Clear UI background = ‎پاک کردن تصویر پس زمینه برنامه +Confirmation Button = ‎دکمه تایید +Date Format = ‎فرمت تاریخ +Day Light Saving = ‎ساعت تابستانی +DDMMYYYY = ‎سال/ماه/روز +Decrease size = Decrease size +Developer Tools = ‎تنظیمات توسعه دهندگان +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = ‎شبیه سازی +Enable Cheats = ‎فعال کردن کدهای تقلب +Enable Compatibility Server Reports = ‎فعال کردن گزارش های سازگاری سرور +Failed to load state. Error in the file system. = Failed to load state. Error in the file system. +Failed to save state. Error in the file system. = Failed to save state. Error in the file system. +Fast (lag on slow storage) = ‎سریع (در حافظه های کند باعث لگ میشود) +Fast Memory = ‎(مموری سریع (ناپایدار +Force real clock sync (slower, less lag) = ‎واقعی (کندتر، لگ کمتر) CPU اجبار به همگام سازی سرعت +frames, 0:off = ‎تعداد فریم، 0 : خاموش +Games list settings = Games list settings +General = ‎عمومی +Grid icon size = Grid icon size +Help the PPSSPP team = Help the PPSSPP team +Host (bugs, less lag) = ‎دستگاه (دارای باگ، لگ کمتر) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Interpreter +IO timing method = ‎(ورودی/خروجی) I/O روش زمان بندی +IR Interpreter = IR interpreter +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = ‎گذاشته شده PSP مموری در +MHz, 0:default = MHz, 0 = ‎پیش فرض +MMDDYYYY = ‎سال/روز/ماه +Newest Save = Newest save +Not a PSP game = ‎نیست PSP بازی +Off = ‎خاموش +Oldest Save = Oldest save +PSP Model = ‎PSP مدل +PSP Settings = ‎PSP تنظیمات +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = ‎ضبط صدا +Record Display = ‎ضبط صفحه +Reset Recording on Save/Load State = Reset recording on Save/Load state +Restore Default Settings = ‎به حالت اولیه PPSSPP بازگشت تنظیمات +Rewind Snapshot Frequency = ‎تعداد فریم ذخیره شده برای به عقب رفتن (مصرف زیاد رم) +Save path in installed.txt = Save path in installed.txt +Save path in My Documents = Save path in My Documents +Savestate Slot = Savestate slot +Savestate slot backups = Savestate slot backups +Screenshots as PNG = ‎باشد PNG اسکرین شات با فرمت +Set UI background... = ‎... تنظیم تصویر پس زمینه +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = ‎شبیه سازی تاخیر خواندن دیسک +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = ‎حاقظه پر است +Sustained performance mode = Sustained performance mode +Time Format = ‎فرمت زمان +UI = ‎زبان برنامه +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) +Use O to confirm = ‎برای قبول کردن O استفاده از +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = ‎برای قبول کردن X استفاده از +VersionCheck = ‎PPSSPP بررسی آخرین ورژن +WARNING: Android battery save mode is on = ‎هشدار: حالت ذخیره باتری اندروید فعال است +WARNING: Battery save mode is on = ‎هشدار: حالت ذخیره باتری فعال است +YYYYMMDD = ‎روز/ماه/سال + +[Upgrade] +Details = Details +Dismiss = Dismiss +Download = Download +New version of PPSSPP available = New version of PPSSPP available diff --git a/assets/lang/fi_FI.ini b/assets/lang/fi_FI.ini new file mode 100644 index 0000000000..d22ea3f445 --- /dev/null +++ b/assets/lang/fi_FI.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = Audio backend (restart req.) +AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) +Auto = Auto +Device = Device +DSound (compatible) = DSound (compatible) +Enable Sound = Ota äänet käyttöön +Global volume = Global volume +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = WASAPI (fast) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Analog axis sensitivity +Analog Limiter = Analog limiter +Analog Mapper High End = Analog mapper high-end (axis sensitivity) +Analog Mapper Low End = Analog mapper low-end (inverse deadzone) +Analog Mapper Mode = Analog mapper mode +Analog Stick = Analog stick +AnalogLimiter Tip = When the analog limiter button is pressed +Auto = Auto +Auto-centering analog stick = Auto-centering analog stick +Auto-hide buttons after seconds = Auto-hide buttons after seconds +Binds = Binds +Button Opacity = Painikkeiden peittävyys +Button style = Button style +Calibrate D-Pad = Calibrate +Calibration = Calibration +Classic = Classic +Combo Key Setting = Combo key setting +Combo Key Setup = Combo key setup +Confine Mouse = Trap mouse within window/display area +Control Mapping = Control mapping +Custom layout... = Edit touch control layout... +Customize tilt = Customize tilt... +D-PAD = D-Pad +Deadzone Radius = Deadzone radius +DInput Analog Settings = DInput analog settings +Disable D-Pad diagonals (4-way touch) = Disable D-Pad diagonals (4-way touch) +Glowing borders = Glowing borders +HapticFeedback = Haptic feedback (vibration) +Ignore gamepads when not focused = Ignore gamepads when not focused +Ignore Windows Key = Disable Windows key +Invert Axes = Invert axes +Invert Tilt along X axis = Invert tilt along X axis +Invert Tilt along Y axis = Invert tilt along Y axis +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Keyboard control settings +L/R Trigger Buttons = L/R trigger buttons +Landscape = Landscape +Landscape Auto = Landscape auto +Landscape Reversed = Landscape reversed +Mouse = Mouse settings +Mouse sensitivity = Mouse sensitivity +Mouse smoothing = Mouse smoothing +MouseControl Tip = You can now map mouse in control mapping screen by pressing the 'M' icon. +None (Disabled) = None (disabled) +Off = Off +OnScreen = Kosketusnäytön kontrollit +Portrait = Portrait +Portrait Reversed = Portrait reversed +PSP Action Buttons = PSP action buttons +Screen Rotation = Screen rotation +seconds, 0 : off = seconds, 0 = off +Sensitivity = Sensitivity +Show right analog = Show right analog +Show Touch Pause Menu Button = Show pause menu button +Thin borders = Thin borders +Tilt Base Radius = Tilt base radius +Tilt Input Type = Tilt input type +Tilt Sensitivity along X axis = Tilt sensitivity along X axis +Tilt Sensitivity along Y axis = Tilt sensitivity along Y axis +To Calibrate = To calibrate, keep device on a flat surface and press "Calibrate". +Touch Control Visibility = Touch control visibility +Use custom right analog = Use custom right analog +Use Mouse Control = Use mouse control +Visibility = Visibility +X = X +X + Y = X + Y +XInput Analog Settings = XInput analog settings +Y = Y + +[CwCheats] +Cheats = Cheats +Edit Cheat File = Edit cheat file +Enable/Disable All = Enable/Disable all Cheats +Import Cheats = Import from cheat.db +Options = Options +Refresh Rate = Refresh rate + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = &About PPSSPP... +Auto = &Auto +Backend = Rendering &Backend (Restarts PPSSPP) +Bicubic = &Bicubic +Break = Break +Break on Load = Break on load +Buffered Rendering = &Buffered Rendering +Buy Gold = Buy &Gold +Control Mapping... = C&ontrol Mapping... +Debugging = &Debug +Deposterize = &Deposterize +Direct3D9 = &Direct3D9 +Direct3D11 = Direct3D &11 +Disassembly = &Disassembly... +Discord = Discord +Display Layout Editor = Display layout editor... +Display Rotation = Display rotation +Dump Next Frame to Log = D&ump Next Frame to Log +Emulation = &Emulation +Enable Chat = Enable chat +Enable Cheats = Enable &Cheats +Enable Sound = Enable S&ound +Exit = E&xit +Extract File... = E&xtract File... +File = &File +Frame Skipping = &Frame skipping +Frame Skipping Type = Frame skipping type +Fullscreen = Fu&llscreen +Game Settings = &Game Settings +GE Debugger... = GE Debugge&r... +GitHub = Git&Hub +Hardware Transform = &Hardware Transform +Help = &Help +Hybrid = &Hybrid +Hybrid + Bicubic = H&ybrid + Bicubic +Ignore Illegal Reads/Writes = &Ignore Illegal Reads/Writes +Ignore Windows Key = Ignore Windows Key +Keep PPSSPP On Top = &Keep PPSSPP on Top +Landscape = Landscape +Landscape reversed = Landscape reversed +Language... = La&nguage... +Linear = &Linear +Load = &Load... +Load .sym File... = Lo&ad .sym File... +Load Map File... = Load &Map File... +Load State = L&oad State +Load State File... = &Load State File... +Log Console = &Log Console +Memory View... = Memory &View... +More Settings... = &More Settings... +Nearest = &Nearest +Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) +Off = &Off +Open Directory... = Open &Directory... +Open from MS:/PSP/GAME... = O&pen from MS:/PSP/GAME... +Open Memory Stick = Open &Memory Stick +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = &Pause +Pause When Not Focused = &Pause When Not Focused +Portrait = Portrait +Portrait reversed = Portrait reversed +Postprocessing Shader = Postprocessin&g Shader +PPSSPP Forums = PPSSPP &Forums +Record = &Record +Record Audio = Record &audio +Record Display = Record &display +Rendering Mode = Rendering M&ode +Rendering Resolution = &Rendering Resolution +Reset = R&eset +Reset Symbol Table = Reset S&ymbol Table +Run = &Run +Save .sym File... = Sav&e .sym File... +Save Map File... = &Save Map File... +Save State = S&ave State +Save State File... = &Save State File... +Savestate Slot = Saves&tate Slot +Screen Scaling Filter = Scr&een Scaling Filter +Show Debug Statistics = Show Debu&g Statistics +Show FPS Counter = Show &FPS Counter +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = &Stop +Switch UMD = Switch UMD +Take Screenshot = &Take Screenshot +Texture Filtering = Te&xture Filtering +Texture Scaling = &Texture Scaling +Use Lossless Video Codec (FFV1) = &Use lossless video codec (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = &Vertex Cache +VSync = VS&ync +Vulkan = Vulkan +Window Size = &Window Size +www.ppsspp.org = Visit www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allocator viewer (Vulkan) +Allow remote debugger = Allow remote debugger +Backspace = Backspace +Block address = Block address +By Address = By address +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Create/Open textures.ini file for current game +Current = Current +Dev Tools = Development tools +DevMenu = DevMenu +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Dump decrypted EBOOT.BIN on game boot +Dump Frame GPU Commands = Dump frame GPU commands +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Ota virheenkorjauksen kirjaaminen käyttöön +Enter address = Enter address +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Frame profiler +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = Jit compare +JIT debug tools = JIT debug tools +Language = Language +Load language ini = Lataa kielipaketti +Log Dropped Frame Statistics = Log dropped frame statistics +Log Level = Log level +Log View = Log view +Logging Channels = Logging channels +Next = Next +No block = No block +Prev = Previous +Random = Random +Replace textures = Replace textures +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. +RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? +Resume = Resume +Run CPU Tests = Suorita suoritin testi +Save language ini = Tallenna kielipaketti +Save new textures = Save new textures +Shader Viewer = Shader viewer +Show Developer Menu = Show developer menu +Show on-screen messages = Show on-screen messages +Stats = Stats +System Information = System information +Texture Replacement = Texture replacement +Toggle Audio Debug = Toggle audio debug +Toggle Freeze = Toggle freeze +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP res +Active = Active +Back = Takaisin +Cancel = Cancel +Center = Center +ChangingGPUBackends = Changing GPU backends requires PPSSPP to restart. Restart now? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = Choose PPSSPP save folder +Confirm Overwrite = Do you want to overwrite the data? +Confirm Save = Do you want to save this data? +ConfirmLoad = Load this data? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Poista +Delete all = Delete all +Delete completed = Poisto onnistui. +DeleteConfirm = Tämä tallennus poistetaan.\nHaluatko varmasti jatkaa? +DeleteConfirmAll = Do you really want to delete all\nyour save data for this game? +DeleteConfirmGame = Do you really want to delete this game\nfrom your device? You can't undo this. +DeleteConfirmGameConfig = Do you really want to delete the settings for this game? +DeleteFailed = Unable to delete data. +Deleting = Poistetaan\nOdota... +Disable All = Disable all +Edit = Edit +Enable All = Enable all +Enter = Enter +Finish = Valmis +Grid = Grid +Inactive = Inactive +InternalError = An internal error has occurred. +Load = Load +Load completed = Lataus onnistui. +Loading = Ladataan\nOdota... +LoadingFailed = Unable to load data. +Move = Move +Network Connection = Network Connection +NEW DATA = NEW DATA +No = Ei +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = OK +Old savedata detected = Old savedata detected +Options = Options +Reset = Reset +Resize = Resize +Retry = Retry +Save = Save +Save completed = Tallennus onnistui. +Saving = Tallentaa\nOdota... +SavingFailed = Unable to save data. +Select = Valitse +Shift = Shift +Snap = Snap +Space = Space +SSID = SSID +Submit = Submit +Supported = Supported +There is no data = Dataa ei ole. +Toggle All = Toggle all +Toggle List = Toggle list +Unsupported = Unsupported +When you save, it will load on a PSP, but not an older PPSSPP = When you save, it will load on a PSP, but not an older PPSSPP +When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Yes = Kyllä +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = file is compressed (7z).\nPlease decompress first (try 7-Zip or WinRAR). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = Could not save screenshot file. +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll not found. Please install. Or press Yes to try again using Direct3D 9 instead. +D3D11InitializationError = Direct3D 11 initialization error +D3D11Missing = Your operating system version does not include D3D11. Please run Windows Update.\n\nPress Yes to try again using Direct3D 9 instead. +D3D11NotSupported = Your GPU does not appear to support Direct3D 11.\n\nWould you like to try again using Direct3D 9 instead? +Disk full while writing data = Disk full while writing data. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = Tiedoston latausvirhe. +Error reading file = error reading file. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = failed to identify file. +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Failed initializing graphics. Try upgrading your graphics drivers and DirectX 9 runtime.\n\nWould you like to try switching to OpenGL?\n\nError message: +GenericGraphicsError = Graphics Error +GenericOpenGLError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to DirectX 9?\n\nError message: +GenericVulkanError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to OpenGL?\n\nError message: +InsufficientOpenGLDriver = Insufficient OpenGL driver support detected!\n\nYour GPU reports that it does not support OpenGL 2.0. Would you like to try using DirectX instead?\n\nDirectX is currently compatible with less games, but on your GPU it may be the only choice.\n\nVisit the forums at https://forums.ppsspp.org for more information.\n\n +Just a directory. = just a directory. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = no EBOOT.PBP, misidentified game. +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = OpenGL driver error +PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP currently does not support connecting to the Internet for DLC, PSN, or game updates. +PS1 EBOOTs are not supported by PPSSPP. = PS1 EBOOTs are not supported by PPSSPP. +PSX game image detected. = File is a MODE2 image. PPSSPP doesn't support PS1 games. +RAR file detected (Require UnRAR) = file is compressed (RAR).\nPlease decompress first (try UnRAR). +RAR file detected (Require WINRAR) = file is compressed (RAR).\nPlease decompress first (try WinRAR). +Running slow: try frameskip, sound is choppy when slow = Running slow: try frameskip, sound is choppy when slow +Running slow: Try turning off Software Rendering = Running slow: try turning off "software rendering" +Save encryption failed. This save won't work on real PSP = Save encryption failed. This save won't work on real PSP +textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +This is a saved state, not a game. = This is a saved state, not a game. +This is save data, not a game. = This is save data, not a game. +Unable to create cheat file, disk may be full = Unable to create cheat file, disk may be full. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Unable to write savedata, disk may be full. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Warning: Video memory FULL, reducing upscaling and switching to slow caching mode. +Warning: Video memory FULL, switching to slow caching mode = Warning: Video memory FULL, switching to slow caching mode. +ZIP file detected (Require UnRAR) = file is compressed (ZIP).\nPlease decompress first (try UnRAR). +ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompress first (try WinRAR). + +[Game] +Asia = Asia +ConfirmDelete = Delete +Create Game Config = Create game config +Create Shortcut = Create shortcut +Delete Game = Delete game +Delete Game Config = Delete game config +Delete Save Data = Delete savedata +Europe = Europe +Game = Game +Game Settings = Game settings +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Data install +Japan = Japan +Korea = Korea +MB = MB +One moment please... = One moment please... +Play = Play +Remove From Recent = Remove from "Recent" +SaveData = Savedata +Setting Background = Setting background +Show In Folder = Show in folder +USA = USA +Use UI background = Use UI background + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = unlimited +(supersampling) = (supersampling) +(upscaling) = (upscaling) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Aggressive +Alternative Speed = Vaihtoehtoinen nopeus +Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Anisotropic Filtering = Anisotrooppisen suodatus +Auto = Auto +Auto (1:1) = Auto (1:1) +Auto (same as Rendering) = Auto (same as rendering resolution) +Auto FrameSkip = Auto frameskip +Auto Scaling = Auto scaling +Backend = Backend +Balanced = Balanced +Bicubic = Bicubic +BlockTransfer Tip = Some games require this to be On for correct graphics +BlockTransferRequired = Warning: This game requires "simulate block transfer effects" to be set to On. +Both = Molemmat +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Puskuroitu renderointi +BufferedRenderingRequired = Warning: This game requires "rendering mode" to be set to "buffered". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Screen size (in % of the viewport) +Cardboard Screen X Shift = X shift (in % of the blank space) +Cardboard Screen Y Shift = Y shift (in % of the blank space) +Cardboard VR Settings = Google Cardboard VR settings +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU core +Debugging = Debugging +DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. +Deposterize = Deposterize +Deposterize Tip = Fixes visual banding glitches in upscaled textures +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Disable slower effects (speedup) +Disabled = Disabled +Display layout editor = Display layout editor +Display Resolution (HW scaler) = Display resolution (HW scaler) +Dump next frame to log = Dump next frame to log +Enable Cardboard VR = Enable Cardboard VR +FPS = FPS +Frame Rate Control = Framerate control +Frame Skipping = Ruudun ohitus +Frame Skipping Type = Frame skipping type +FullScreen = Koko näyttö +Hack Settings = Hack settings (may cause glitches) +Hardware Tessellation = Hardware tessellation +Hardware Transform = Laitteistomuunnos +hardware transform error - falling back to software = Hardware transform error, falling back to software +HardwareTessellation Tip = Uses hardware to make curves +High = High +Hybrid = Hybridi +Hybrid + Bicubic = Hybrid + Bicubic +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Internal resolution +Lazy texture caching = Lazy texture caching (speedup) +Linear = Lineaarinen +Low = Low +LowCurves = Spline/Bezier curves quality +LowCurves Tip = Only used by some games, controls smoothness of curves +Lower resolution for effects (reduces artifacts) = Lower resolution for effects (reduces artifacts) +Manual Scaling = Manual scaling +Medium = Medium +Mode = Mode +Must Restart = You must restart PPSSPP for this change to take effect. +Native device resolution = Native device resolution +Nearest = Lähin +No buffer = No buffer +Non-Buffered Rendering = Skip buffer effects (non-buffered, faster) +None = Ei mitään +Number of Frames = Number of frames +Off = Off +OpenGL = OpenGL +Overlay Information = Overlay information +Partial Stretch = Partial stretch +Percent of FPS = Percent of FPS +Performance = Performance +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Postprocessing shader +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = Rendering mode +Rendering Resolution = Rendering resolution +RenderingMode NonBuffered Tip = Faster, but nothing may draw in some games +Retain changed textures = Retain changed textures (sometimes slower) +RetainChangedTextures Tip = Makes many games slower, but some games a lot faster +Rotation = Rotation +Safe = Safe +Screen layout = Screen layout +Screen Scaling Filter = Screen scaling filter +Show Debug Statistics = Näytä virheenkorjaustilastot +Show FPS Counter = Näytä FPS-laskuri +Simulate Block Transfer = Simulate block transfer effects +SoftGPU Tip = Currently VERY slow +Software Rendering = Ohjelmistopohjainen renderointi (kokeellinen) +Software Skinning = Software skinning +SoftwareSkinning Tip = Combine skinned model draws on the CPU, faster in most games +Speed = Nopeus +Stretching = Stretching +Texture Filter = Tekstuurisuodatin +Texture Filtering = Tekstuurin suodatus +Texture Scaling = Tekstuurin skaalaus +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Turn off "hardware tessellation": unsupported +Unlimited = Unlimited +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = Upscale level +Upscale Type = Upscale type +UpscaleLevel Tip = CPU heavy - some scaling may be delayed to avoid stutter +Use all displays = Use all displays +Vertex Cache = Verteksivälimuisti +VertexCache Tip = Faster, but may cause temporary flicker +VSync = VSync +Vulkan = Vulkan +Window Size = Window size +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Delete ZIP file +Install = Install +Install game from ZIP file? = Install game from ZIP file? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = Installed! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = Auto configure +Autoconfigure for device = Autoconfigure for device +Clear All = Clear all +Default All = Restore defaults +Map a new key for = Map a new key for +Map Key = Map key +Map Mouse = Map mouse +Test Analogs = Test analogs +You can press ESC to cancel. = You can press Esc to cancel. + +[MainMenu] +Browse = Browse... +Buy PPSSPP Gold = Buy PPSSPP Gold +Choose folder = Choose folder +Credits = Tekijät +PPSSPP Homebrew Store = PPSSPP Homebrew Store +Exit = Sulje +Game Settings = Peliasetukset +Games = Pelit +Give PPSSPP permission to access storage = Give PPSSPP permission to access storage +Homebrew & Demos = Kotitekoiset ja demot +How to get games = Miten saadaan pelejä +How to get homebrew & demos = How can I get homebrew && demos? +Load = Lataa... +Loading... = Loading... +PinPath = Pin +PPSSPP can't load games or save right now = PPSSPP can't load games or save right now +Recent = Äskettäin +SavesAreTemporary = PPSSPP is saving in temporary storage +SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently +SavesAreTemporaryIgnore = Ignore warning +UnpinPath = Unpin +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Ääni +Controls = Kontrollit +Graphics = Grafiikka +Networking = Networking +System = Järjestelmä +Tools = Tools + +[MappableControls] +Alt speed 1 = Alt speed 1 +Alt speed 2 = Alt speed 2 +An.Down = Analog Down +An.Left = Analog Left +An.Right = Analog Right +An.Up = Analog Up +Analog limiter = Analog limiter +Analog Stick = Analog stick +Audio/Video Recording = Audio/Video recording +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Axis swap +Circle = Circle +Cross = Cross +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = DevMenu +Down = Dpad Down +Dpad = Dpad +Frame Advance = Frame advance +Hold = Hold +Home = Home +L = L +Left = Dpad Left +Load State = Load State +Mute toggle = Mute toggle +Next Slot = Next Slot +None = None +Note = Note +OpenChat = Open chat +Pause = Pause +R = R +RapidFire = Rapid-fire +Remote hold = Remote hold +Rewind = Rewind +Right = Dpad Right +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = RightAn.Down +RightAn.Left = RightAn.Left +RightAn.Right = RightAn.Right +RightAn.Up = RightAn.Up +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Save State +Screen = Screen +Screenshot = Screenshot +Select = Select +SpeedToggle = Speed toggle +Square = Square +Start = Start +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = Toggle fullscreen +Toggle mode = Toggle mode +Triangle = Triangle +Unthrottle = Unthrottle +Up = Dpad Up +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Change MAC address +Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable network chat = Enable network chat +Enable networking = Enable networking/WLAN (beta, may break games) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Network initialized +Please change your Port Offset = Please change your port offset +Port offset = Port offset(0 = PSP compatibility) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Send Discord "Rich Presence" information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = Cheats +Continue = Jatka +Create Game Config = Create game config +Delete Game Config = Delete game config +Exit to menu = Exit to menu +Game Settings = Game settings +Load State = Lataa tilanne +Rewind = Rewind +Save State = Tallenna tilanne +Settings = Asetukset +Switch UMD = Switch UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Color +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Cartoon +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT scanlines +FXAA = FXAA Antialiasing +Gamma = Gamma +Grayscale = Grayscale +Intensity = Intensity +InverseColors = Inverse Colors +Natural = Natural Colors +NaturalA = Natural Colors (no blur) +Off = Off +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlines (CRT) +Sharpen = Sharpen +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 Upscaler +VideoSmoothingAA = VideoSmoothingAA +Vignette = Vignette + +[PSPCredits] +all the forum mods = all the forum mods +build server = build server +Buy Gold = Buy Gold +check = Also check out Dolphin, the best Wii/GC emu around: +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = Contributors: +created = Luonut +Discord = Discord +info1 = PPSSPP is intended for educational purposes only. +info2 = Please make sure that you own the rights to any games +info3 = you play by owning the UMD or by buying the digital +info4 = download from the PSN store on your real PSP. +info5 = PSP is a trademark by Sony, Inc. +iOS builds = iOS builds +license = Ilmainen ohjelmisto GPL 2.0+ +list = compatibility lists, forums, and development info +PPSSPP Forums = PPSSPP Forums +Privacy Policy = Privacy policy +Share PPSSPP = Share PPSSPP +specialthanks = Special thanks to: +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = this translation by: +title = A fast and portable PSP emulator +tools = Free tools used: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = +translators2 = +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Check out the website: +written = Written in C++ for speed and portability + +[RemoteISO] +Browse Games = Browse games +Local Server Port = Local server port +Manual Mode Client = Manual mode client +Remote disc streaming = Remote disc streaming +Remote Port = Remote port +Remote Server = Remote server +Remote Subdirectory = Remote subdirectory +RemoteISODesc = Games in your recent list will be shared +RemoteISOLoading = Connected, loading game list... +RemoteISOScanning = Scanning... Click "share games" on your server device +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Note: Connect both devices to the same Wi-Fi network +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Settings +Share Games (Server) = Share games (server) +Share on PPSSPP startup = Share on PPSSPP startup +Stop Sharing = Stop sharing +Stopping.. = Stopping... + +[Reporting] +Bad = Bad +FeedbackDelayInfo = Your data is being submitted in the background. +FeedbackDesc = How's the emulation? Let us and the community know! +FeedbackDisabled = Compatibility server reports must be enabled. +FeedbackIncludeCRC = Note: Battery will be used to send a disc CRC +FeedbackIncludeScreen = Include a screenshot +FeedbackSubmitDone = Your data has been submitted. +FeedbackSubmitFail = Could not submit data to server. Try updating PPSSPP. +FeedbackThanks = Thanks for your feedback! +Gameplay = Gameplay +Graphics = Graphics +Great = Great +In-game = In-game +In-game Description = Gets into gameplay, but too buggy to complete +Menu/Intro = Menu/Intro +Menu/Intro Description = Can't get into the game itself +Nothing = Nothing +Nothing Description = Completely broken +OK = OK +Open Browser = Open browser +Overall = Overall +Perfect = Perfect +Perfect Description = Flawless emulation for the entire game - great! +Plays = Plays +Plays Description = Fully playable but might be with glitches +ReportButton = Report feedback +Speed = Speed +Submit Feedback = Submit feedback +SuggestionConfig = See reports on website for good settings. +SuggestionCPUSpeed0 = Disable locked CPU speed setting. +SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this bug). +SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. +SuggestionsNone = This game isn't working for other users too. +SuggestionsWaiting = Submitting and checking other users feedback... +SuggestionUpgrade = Upgrade to a newer PPSSPP build. +SuggestionVerifyDisc = Check your ISO is a good copy of your disc. +Unselected Overall Description = How well does this game emulate? +View Feedback = View all feedbacks + +[Savedata] +Date = Date +Filename = Filename +No screenshot = No screenshot +None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Save Data = Save data +Save States = Save states +Savedata Manager = Savedata manager +Size = Size + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = WARNING: Chainfire3D detected, may cause problems. +Failed to load state = Failed to load state +Failed to save state = Failed to save state +fixed = Nopeus: vaihtoehtoinen +GLToolsWarning = WARNING: GLTools detected, may cause problems. +In menu = In menu +Load savestate failed = Load savestate failed +Loaded State = Tilanne ladattu +Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +LoadStateDoesntExist = Tilanteen lataaminen epäonnistui: Tallennusta ei ole olemassa! +LoadStateWrongVersion = Tilanteen lataaminen epäonnistui: Tallennus on vanhemmalle PPSSPP-versiolle! +norewind = No rewind save states available. +Playing = Playing +PressESC = Press ESC to open the pause menu. +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = Tilanteen tallentaminen epäonnistui! +Saved State = Tilanne tallennettu +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Speed: alternate 2 +standard = Nopeus: normaali +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = Already installed +Connection Error = Connection error +Install = Install +Launch Game = Launch game +Loading... = Loading... +MB = MB +Size = Size +Uninstall = Uninstall + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d cores) +%d bytes = %d bytes +(none detected) = (none detected) +3D API = 3D API +ABI = ABI +API Version = API version +Audio Information = Audio information +Board = Board +Build Config = Build config +Build Configuration = Build Configuration +Built by = Built by +Core Context = Core context +Cores = Cores +CPU Extensions = CPU extensions +CPU Information = CPU information +CPU Name = Name +D3DCompiler Version = D3DCompiler version +Debug = Debug +Debugger Present = Debugger present +Device Info = Device info +Display Information = Display information +Driver Version = Driver version +EGL Extensions = EGL extensions +Frames per buffer = Frames per buffer +GPU Information = GPU information +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Lang/Region +Memory Page Size = Memory page size +Native Resolution = Native resolution +OGL Extensions = OGL extensions +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 extensions +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 extensions +OpenGL Extensions = OpenGL extensions +Optimal frames per buffer = Optimal frames per buffer +Optimal sample rate = Optimal sample rate +OS Information = OS information +PPSSPP build = PPSSPP build +Refresh rate = Refresh rate +Release = Release +RW/RX exclusive = RW/RX exclusive +Sample rate = Sample rate +Shading Language = Shading language +Sustained perf mode = Sustained perf mode +System Information = System information +System Name = Name +System Version = System version +Threads = Threads +Vendor = Vendor +Vendor (detected) = Vendor (detected) +Version Information = Version information +Vulkan Extensions = Vulkan extensions +Vulkan Features = Vulkan features + +[System] +(broken) = (broken) +12HR = 12HR +24HR = 24HR +Auto = Auto +Auto Load Savestate = Auto load savestate +AVI Dump started. = AVI dump started +AVI Dump stopped. = AVI dump stopped +Cache ISO in RAM = Cache full ISO in RAM +Change CPU Clock = Change emulated PSP's CPU clock (unstable) +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Vaihda nimimerkkiä +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = Cheats (experimental, see forums) +Clear Recent = Clear "Recent" +Clear Recent Games List = Clear Recent games list +Clear UI background = Clear UI background +Confirmation Button = Confirmation button +Date Format = Date format +Day Light Saving = Kesäaika +DDMMYYYY = DDMMYYYY +Decrease size = Decrease size +Developer Tools = Kehittäjätyökalut +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emulation +Enable Cheats = Ota huijaukset käyttöön +Enable Compatibility Server Reports = Ota yhteensopivat palvelinilmoitukset käyttöön +Failed to load state. Error in the file system. = Failed to load state. Error in the file system. +Failed to save state. Error in the file system. = Failed to save state. Error in the file system. +Fast (lag on slow storage) = Fast (lag on slow storage) +Fast Memory = Nopea muisti (epävakaa) +Force real clock sync (slower, less lag) = Force real clock sync (slower, less lag) +frames, 0:off = frames, 0 = off +Games list settings = Games list settings +General = General +Grid icon size = Grid icon size +Help the PPSSPP team = Help the PPSSPP team +Host (bugs, less lag) = Host (bugs, less lag) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Interpreter +IO timing method = I/O timing method +IR Interpreter = IR interpreter +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = Memory Stick inserted +MHz, 0:default = MHz, 0 = default +MMDDYYYY = MMDDYYYY +Newest Save = Newest save +Not a PSP game = Not a PSP game +Off = Off +Oldest Save = Oldest save +PSP Model = PSP model +PSP Settings = PSP settings +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Record audio +Record Display = Record display +Reset Recording on Save/Load State = Reset recording on Save/Load state +Restore Default Settings = Restore PPSSPP's settings to default +Rewind Snapshot Frequency = Rewind snapshot frequency (mem hog) +Save path in installed.txt = Save path in installed.txt +Save path in My Documents = Save path in My Documents +Savestate Slot = Savestate slot +Savestate slot backups = Savestate slot backups +Screenshots as PNG = Save screenshots in PNG format +Set UI background... = Set UI background... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Simulate UMD delays +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Storage full +Sustained performance mode = Sustained performance mode +Time Format = Time format +UI = UI +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) +Use O to confirm = Use O as confirmation button +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = Use X as confirmation button +VersionCheck = Check for new versions of PPSSPP +WARNING: Android battery save mode is on = WARNING: Android battery save mode is On +WARNING: Battery save mode is on = WARNING: Battery save mode is on +YYYYMMDD = YYYYMMDD + +[Upgrade] +Details = Details +Dismiss = Dismiss +Download = Download +New version of PPSSPP available = New version of PPSSPP available diff --git a/assets/lang/fr_FR.ini b/assets/lang/fr_FR.ini new file mode 100644 index 0000000000..e93af14827 --- /dev/null +++ b/assets/lang/fr_FR.ini @@ -0,0 +1,1063 @@ +[Audio] +Alternate speed volume = Volume en vitesse alternative +Audio backend = Back-end du son (redémarrage requis) +AudioBufferingForBluetooth = Mémoire tampon adaptée au Bluetooth (+ lent) +Auto = Automatique +Device = Périphérique de sortie +DSound (compatible) = DirectSound (compatible) +Enable Sound = Activer le son +Global volume = Volume global +Microphone = Micro +Microphone Device = Micro +Mute = Muet +Switch on new audio device = Basculer sur le nouveau périphérique de sortie +Use global volume = Utiliser le volume global +WASAPI (fast) = WASAPI (rapide) + +[Controls] +Analog auto-rotation speed = Vitesse de rotation automatique du stick analogique +Analog Axis Sensitivity = Sensibilité des axes analogiques +Analog Limiter = Limiteur analogique +Analog Mapper High End = Assignation analogique avancée (sensibilité des axes) +Analog Mapper Low End = Assignation analogique basique (inverse la zone morte) +Analog Mapper Mode = Mode d'assignation analogique +Analog Stick = Stick analogique +AnalogLimiter Tip = Quand le bouton "Limiteur analogique" est pressé +Auto = Automatique +Auto-centering analog stick = Centrage automatique du stick analogique +Auto-hide buttons after seconds = Cacher automatiquement les boutons après... +Binds = Assignation +Button Opacity = Transparence des boutons +Button style = Style des boutons +Calibrate D-Pad = Étalonner +Calibration = Étalonnage +Classic = Classique +Combo Key Setting = Paramétrage des touches combo +Combo Key Setup = Paramétrer les touches combo +Confine Mouse = Capturer la souris dans la fenêtre/zone d'affichage +Control Mapping = Réassignation des touches +Custom layout... = Disposition personnalisée... +Customize tilt = Personnaliser inclinaison analogique... +D-PAD = Croix directionnelle +Deadzone Radius = Rayon de la zone morte +DInput Analog Settings = Réglages analogiques DirectInput +Disable D-Pad diagonals (4-way touch) = Désactiver les diagonales de la croix directionnelle +Glowing borders = Bordures lumineuses +HapticFeedback = Retour haptique (vibrations) +Ignore gamepads when not focused = Ignorer manettes si non ciblé +Ignore Windows Key = Ignorer la touche Windows (désactive le Menu Démarrer) +Invert Axes = Inversement des axes +Invert Tilt along X axis = Inverser l'inclinaison analogique sur l'axe X +Invert Tilt along Y axis = Inverser l'inclinaison analogique sur l'axe Y +Keep this button pressed when right analog is pressed = Garder ce bouton activé quand le stick droit est utilisé +Keyboard = Paramètres des commandes clavier +L/R Trigger Buttons = Gâchettes L/R +Landscape = Paysage +Landscape Auto = Paysage automatique +Landscape Reversed = Paysage inversé +Mouse = Paramètres de la souris +Mouse sensitivity = Sensibilité de la souris +Mouse smoothing = Lissage du déplacement de la souris +MouseControl Tip = Vous pouvez maintenant utiliser la souris dans l'écran de réassignation des touches en cliquant sur le bouton "M". +None (Disabled) = Désactivée +Off = Désactivé +OnScreen = Commandes tactiles +Portrait = Portrait +Portrait Reversed = Portrait inversé +PSP Action Buttons = Boutons d'action +Screen Rotation = Rotation de l'écran +seconds, 0 : off = secondes, 0 = off +Sensitivity = Sensibilité +Show right analog = Afficher le stick droit +Show Touch Pause Menu Button = Afficher le bouton Pause tactile +Thin borders = Bordures fines +Tilt Base Radius = Modifier la zone morte avec l'inclinaison analogique +Tilt Input Type = Type inclinaison analogique +Tilt Sensitivity along X axis = Sensibilité de l'inclinaison analogique sur l'axe X +Tilt Sensitivity along Y axis = Sensibilité de l'inclinaison analogique sur l'axe Y +To Calibrate = Pour étalonner, poser l'appareil sur une surface plane et presser "Étalonner". +Touch Control Visibility = Visibilité des commandes tactiles +Use custom right analog = Utiliser le stick droit personnalisé +Use Mouse Control = Utiliser la souris dans les jeux +Visibility = Visibilité +X = Axe X +X + Y = Axe X + axe Y +XInput Analog Settings = Réglages analogiques XInput +Y = Axe Y + +[CwCheats] +Cheats = Codes de triche +Edit Cheat File = Modifier le fichier de triche +Enable/Disable All = Tout activer/désactiver +Import Cheats = Importer des codes de triche +Options = Options +Refresh Rate = Taux de rafraîchissement + +[DesktopUI] +# PPSSPP peut utiliser n'importe quelle police installée sur votre système. +# Il suffit d'écrire son nom exact à la place de "???" et de supprimer le "#" devant "Font". +#Font = ??? +About PPSSPP... = &À propos de PPSSPP... +Auto = &Automatique +Backend = Rendu &back-end (redémarre PPSSPP) +Bicubic = &Bicubique +Break = Arrêter +Break on Load = Arrêter au lancement +Buffered Rendering = &Mise en mémoire tampon +Buy Gold = Acheter la version &Gold +Control Mapping... = R&éassignation des touches... +Debugging = &Débogage +Deposterize = &Améliorer +Direct3D9 = Direct3D &9 +Direct3D11 = Direct3D &11 +Disassembly = Dés&assembleur +Discord = Discord +Display Layout Editor = Éditeur d'affichage... +Display Rotation = Rotation de l'affichage +Dump Next Frame to Log = &Dump de l'image suivante dans le journal +Emulation = &Émulation +Enable Chat = Activer le chat +Enable Cheats = Activ&er les codes de triche (redémarre le jeu) +Enable Sound = Activer le &son +Exit = &Quitter +Extract File... = E&xtraire fichier... +File = &Fichier +Frame Skipping = &Saut d'images +Frame Skipping Type = Type de saut d'images +Fullscreen = P&lein écran +Game Settings = &Paramètres +GE Debugger... = Dé&bogueur du moteur graphique +GitHub = Git&Hub +Hardware Transform = Tra&nsformation matérielle +Help = &Aide +Hybrid = &Hybride +Hybrid + Bicubic = Hybride &+ Bicubique +Ignore Illegal Reads/Writes = &Ignorer les lectures/écritures interdites +Ignore Windows Key = Ignorer la touche &Windows +Keep PPSSPP On Top = &Garder PPSSPP au premier plan +Landscape = Paysage +Landscape reversed = Paysage inversé +Language... = Langue&... +Linear = &Linéaire +Load = &Charger... +Load .sym File... = C&harger fichier .sym... +Load Map File... = &Charger fichier .map... +Load State = C&harger état +Load State File... = Ch&arger fichier d'état +Log Console = &Journal de débogage +Memory View... = &Visionneur de mémoire +More Settings... = &Plus de paramètres... +Nearest = Le plus &proche +Non-Buffered Rendering = &Pas d'effets en mémoire tampon (hack de vitesse) +Off = &Désactivé +Open Directory... = Ouvrir &répertoire... +Open from MS:/PSP/GAME... = Ouvrir depuis ms0:/PSP/&GAME/... +Open Memory Stick = Ouvrir la &Memory Stick +Open New Instance = Ouvrir une nouvelle instance +OpenGL = &OpenGL +Pause = &Pause +Pause When Not Focused = Mettre en pa&use si pas au premier plan +Portrait = Portrait +Portrait reversed = Portrait inversé +Postprocessing Shader = S&haders de post-traitement +PPSSPP Forums = Visiter le &forum de PPSSPP +Record = E&nregistrer +Record Audio = Enregistrer le &son +Record Display = Enregistrer l'&affichage +Rendering Mode = &Mode de rendu +Rendering Resolution = &Définition du rendu +Reset = &Redémarrer +Reset Symbol Table = &Réinitialiser la table des symboles +Run = &Lancer +Save .sym File... = Sa&uvegarder fichier .sym... +Save Map File... = &Sauvegarder fichier .map... +Save State = &Sauvegarder état +Save State File... = Sa&uvegarder fichier d'état +Savestate Slot = &Emplacement d'état +Screen Scaling Filter = Filtre &de mise à l'échelle de l'écran +Show Debug Statistics = &Montrer les statistiques de débogage +Show FPS Counter = M&ontrer la vitesse d'émulation +Skip Number of Frames = Sauter un nombre d'images +Skip Percent of FPS = Sauter un pourcentage de FPS +Stop = &Arrêter +Switch UMD = Changer d'UMD +Take Screenshot = &Faire une capture d'écran +Texture Filtering = &Filtrage des textures +Texture Scaling = Mise à l'échelle des &textures +Use Lossless Video Codec (FFV1) = Utiliser un &codec vidéo sans perte (FFV1) +Use output buffer for video = Utiliser une mémoire tampon pour la vidéo +Vertex Cache = &Cache vertex +VSync = Synchronisation &verticale +Vulkan = Vulkan +Window Size = Ta&ille de la fenêtre +www.ppsspp.org = Visiter le site officiel de &PPSSPP +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Visionneur d'allocateur (Vulkan) +Allow remote debugger = Autoriser le débogueur distant +Backspace = Retour arrière +Block address = Adresse du bloc +By Address = Par adresse +Copy savestates to memstick root = Copier les états sauvegardés à la racine de la Memory Stick +Create/Open textures.ini file for current game = Créer/Ouvrir le fichier "textures.ini" pour le jeu en cours +Current = Actuel +Dev Tools = Outils de développement +DevMenu = MenuDev +Disabled JIT functionality = Fonctionnalité JIT désactivée +Draw Frametimes Graph = Dessiner le graphique des temps d'image +Dump Decrypted Eboot = Créer un EBOOT.BIN déchiffré au lancement du jeu +Dump Frame GPU Commands = Dump des commandes GPU de l'image +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Activer le journal de débogage +Enter address = Entrer une adresse +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Profileur d'image +GPU Driver Test = Test du pilote du GPU +GPU Profile = Profilage du GPU +Jit Compare = Comparaison JIT +JIT debug tools = Outils de débogage JIT +Language = Langue +Load language ini = Charger fichier de langue +Log Dropped Frame Statistics = Enregistrer les statistiques sur les pertes d'images +Log Level = Niveau du journal +Log View = Voir le journal +Logging Channels = Filtres du journal de débogage +Next = Suivant +No block = Pas de bloc +Prev = Précédent +Random = Aléatoire +Replace textures = Remplacer les textures +Reset limited logging = Réinitialiser le journal limité +RestoreDefaultSettings = Êtes-vous sûr de vouloir restaurer tous les paramètres (sauf\nla réassignation des commandes) par défaut ?\n\nVous ne pourrez pas revenir en arrière.\nVeuillez redémarrer PPSSPP pour appliquer\nles changements. +RestoreGameDefaultSettings = Êtes-vous sûr de vouloir restaurer tous les paramètres\nspécifiques au jeu à leur valeur par défaut de PPSSPP ? +Resume = Reprendre +Run CPU Tests = Exécuter des tests CPU +Save language ini = Sauvegarder fichier de langue +Save new textures = Sauvegarder les nouvelles textures +Shader Viewer = Visionneur de shader +Show Developer Menu = Montrer le menu développeur "MenuDev" +Show on-screen messages = Afficher les messages à l'écran +Stats = Statistiques +System Information = Informations système +Texture Replacement = Remplacement de textures +Toggle Audio Debug = Activer/Désactiver le débogage audio +Toggle Freeze = Geler/Dégeler l'image +Touchscreen Test = Test de l'écran tactile +VFPU = VFPU + +[Dialog] +* PSP res = × définition PSP +Active = Actif +Back = Retour +Cancel = Annuler +Center = Centrer +ChangingGPUBackends = Changer de rendu back-end nécessite de\nredémarrer PPSSPP.\nRedémarrer maintenant ? +ChangingInflightFrames = Modifier la mise en mémoire tampon des commandes graphiques nécessite le redémarrage de PPSSPP. Redémarrer maintenant ? +Channel: = Canal : +Choose PPSSPP save folder = Veuillez choisir le dossier de sauvegarde de PPSSPP. +Confirm Overwrite = Voulez-vous écraser les données ? +Confirm Save = Voulez-vous sauvegarder les données ? +ConfirmLoad = Charger ces données ? +ConnectingAP = Connexion au point d'accès\nVeuillez patienter... +ConnectingPleaseWait = Connexion en cours\nVeuillez patienter... +ConnectionName = Nom de la connexion +Corrupted Data = Données corrompues +Delete = Supprimer +Delete all = Tout supprimer +Delete completed = Suppression terminée. +DeleteConfirm = Cette sauvegarde va être supprimée.\nÊtes-vous sûr de vouloir continuer ? +DeleteConfirmAll = Voulez-vous vraiment supprimer toutes les\nsauvegardes de ce jeu ?\nCette action est définitive. +DeleteConfirmGame = Voulez-vous vraiment supprimer ce jeu de votre système ?\nCette action est définitive. +DeleteConfirmGameConfig = Voulez-vous vraiment supprimer les paramètres pour ce jeu ? +DeleteFailed = Suppression impossible. +Deleting = Suppression\nVeuillez patienter... +Disable All = Tout désactiver +Edit = Éditer +Enable All = Tout activer +Enter = Entrer +Finish = Terminer +Grid = Grille +Inactive = Inactif +InternalError = Une erreur interne est survenue. +Load = Charger +Load completed = Chargement terminé. +Loading = Chargement\nVeuillez patienter... +LoadingFailed = Chargement impossible. +Move = Déplacer +Network Connection = Connexion réseau +NEW DATA = NOUVELLES DONNÉES +No = Non +ObtainingIP = Obtention de l'adresse IP\nVeuillez patienter... +OK = OK +Old savedata detected = Ancienne sauvegarde détectée +Options = Options +Reset = Remise à 0 +Resize = Zoomer +Retry = Réessayer +Save = Sauvegarder +Save completed = Sauvegarde terminée. +Saving = Sauvegarde\nVeuillez patienter... +SavingFailed = Sauvegarde impossible. +Select = Sélectionner +Shift = Majuscule +Snap = Aligner +Space = Espace +SSID = SSID +Submit = Envoyer +Supported = Supporté +There is no data = Aucune donnée trouvée. +Toggle All = Tout cocher +Toggle List = Afficher liste +Unsupported = Non supporté +When you save, it will load on a PSP, but not an older PPSSPP = Si vous sauvegardez, le chargement sera possible sur une PSP, mais pas sur une ancienne version de PPSSPP. +When you save, it will not work on outdated PSP Firmware anymore = Si vous sauvegardez, le chargement ne sera plus possible sur une PSP avec un ancien firmware. +Yes = Oui +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = Le fichier est compressé (.7z).\nVeuillez d'abord le décompresser (essayez 7-Zip ou WinRAR). +A PSP game couldn't be found on the disc. = Aucun jeu PSP n'a été trouvé sur le disque. +Cannot boot ELF located outside mountRoot. = Impossible de démarrer le fichier ELF situé en dehors du mountRoot. +Could not save screenshot file = Impossible d'enregistrer la capture d'écran. +D3D9or11 = Direct3D 9 ? (ou "non" pour Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll introuvable. Veuillez l'installer.\n\nOu pressez Oui pour réessayer avec Direct3D 9 à la place. +D3D11InitializationError = Erreur d'initialisation de Direct3D 11. +D3D11Missing = La version de votre système d'exploitation n'inclut pas Direct3D 11. Veuillez installer les mises à jour de Windows Update.\n\nOu pressez Oui pour réessayer avec Direct3D 9 à la place. +D3D11NotSupported = Votre GPU semble incompatible avec Direct3D 11.\n\nVoulez-vous essayer avec Direct3D 9 à la place ? +Disk full while writing data = Disque plein lors de l'écriture des données. +ELF file truncated - can't load = Fichier ELF tronqué - chargement impossible +Error loading file = Chargement du fichier impossible. +Error reading file = Erreur lors de la lecture du fichier. +Failed initializing CPU/Memory = Échec d'initialisation du CPU ou de la mémoire +Failed to identify file = L'identification du fichier a échoué. +Failed to load executable: = Le chargement de l'exécutable a échoué : +File corrupt = Fichier corrompu +Game disc read error - ISO corrupt = Erreur de lecture du disque de jeu : ISO corrompu. +GenericAllStartupError = Échec du démarrage de PPSSPP avec tous les back-ends graphiques.\n\nEssayez de mettre à jour les pilotes graphiques et autres. +GenericBackendSwitchCrash = Plantage lors du démarrage de PPSSPP.\n\nC'est généralement dû à un problème de pilotes graphiques. Essayez de mettre à jour les pilotes graphiques.\n\nLe back-end graphique a été changé : +GenericDirect3D9Error = Initialisation graphique échouée. Essayez de mettre à jour le pilote graphique et DirectX 9.\n\nVoulez-vous essayer d'utiliser OpenGL?\n\nMessage d'erreur : +GenericGraphicsError = Erreur de graphismes +GenericOpenGLError = Initialisation graphique échouée. Essayez de mettre à jour le pilote graphique.\n\nVoulez-vous essayer d'utiliser DirectX 9?\n\nMessage d'erreur : +GenericVulkanError = Initialisation graphique échouée. Essayez de mettre à jour le pilote graphique.\n\nVoulez-vous essayer d'utiliser OpenGL?\n\nMessage d'erreur : +InsufficientOpenGLDriver = Compatibilité insuffisante du pilote OpenGL détecté !\n\nVotre carte graphique (GPU) indique qu'elle est incompatible avec OpenGL 2.0. Veuillez mettre à jour le pilote de votre GPU.\n\nSi cela ne corrige pas le problème, vous pouvez essayer d'utiliser DirectX.\n\nDirectX n'est pas compatible avec tous les jeux, mais ce pourrait être le seul choix possible avec votre GPU.\n\nVisitez le forum à l'adresse https://forums.ppsspp.org pour plus d'informations.\n\n +Just a directory. = Seulement un répertoire... +Missing key = Clé manquante +MsgErrorCode = Code d'erreur : +MsgErrorSavedataDataBroken = La sauvegarde est corrompue. +MsgErrorSavedataMSFull = La Memory Stick est pleine. Vérifier l'espace de stockage. +MsgErrorSavedataNoData = Avertissement : Aucune sauvegarde trouvée. +MsgErrorSavedataNoMS = Memory Stick non insérée. +No EBOOT.PBP, misidentified game = Pas de EBOOT.PBP, jeu mal identifié. +Not a valid disc image. = Image de disque invalide. +OpenGLDriverError = Erreur de pilote OpenGL +PPSSPP doesn't support UMD Music. = PPSSPP ne prend pas en charge les UMD de musique. +PPSSPP doesn't support UMD Video. = PPSSPP ne prend pas en charge les UMD vidéos. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP prend en charge les jeux PSP, pas les jeux PS1 ni PS2. +PPSSPPDoesNotSupportInternet = Pour le moment, PPSSPP ne permet pas de se connecter à Internet pour accéder aux contenus téléchargeables, au PSN ou à des mises à jour de jeux. +PS1 EBOOTs are not supported by PPSSPP. = Les EBOOTs de PS1 ne sont pas pris en charge par PPSSPP. +PSX game image detected. = Le fichier est une image MODE2. Les jeux PS1 ne sont pas pris en charge. +RAR file detected (Require UnRAR) = Le fichier est compressé (.rar).\nVeuillez d'abord le décompresser (essayez UnRAR). +RAR file detected (Require WINRAR) = Le fichier est compressé (.rar).\nVeuillez d'abord le décompresser (essayez WinRAR). +Running slow: try frameskip, sound is choppy when slow = Exécution lente : Essayer le "saut d'images",\nle son est saccadé quand l'exécution est lente. +Running slow: Try turning off Software Rendering = Exécution lente : Essayez de désactiver "rendu logiciel" +Save encryption failed. This save won't work on real PSP = Chiffrement de la sauvegarde échoué. Cette sauvegarde ne fonctionnera pas sur une PSP. +textures.ini filenames may not be cross-platform = Les noms des fichiers "textures.ini" peuvent ne pas être multiplateformes. +This is a saved state, not a game. = Ceci est un état sauvegardé, pas un jeu. +This is save data, not a game. = Ceci est une sauvegarde, pas un jeu. +Unable to create cheat file, disk may be full = Impossible de créer le fichier de codes de triche, le disque dur est peut-être plein. +Unable to initialize rendering engine. = Impossible d'initialiser le moteur de rendu. +Unable to write savedata, disk may be full = Impossible d'enregistrer la sauvegarde, le disque dur est peut-être plein. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Avertissement : Mémoire vidéo PLEINE, réduction de l'upscaling et passage en mode de cache lent. +Warning: Video memory FULL, switching to slow caching mode = Avertissement : Mémoire vidéo PLEINE, passage en mode de cache lent. +ZIP file detected (Require UnRAR) = Le fichier est compressé (.zip).\nVeuillez d'abord le décompresser (essayez UnRAR). +ZIP file detected (Require WINRAR) = Le fichier est compressé (.zip).\nVeuillez d'abord le décompresser (essayez WinRAR). + +[Game] +Asia = Asie +ConfirmDelete = Confirmer +Create Game Config = Créer config. de jeu +Create Shortcut = Créer un raccourci +Delete Game = Supprimer jeu +Delete Game Config = Supprimer config. de jeu +Delete Save Data = Supprimer sauvegardes +Europe = Europe +Game = Jeu  +Game Settings = Paramètres du jeu +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Installation des données  +Japan = Japon +Korea = Corée +MB = Mo +One moment please... = Veuillez patienter... +Play = Jouer +Remove From Recent = Supprimer de "Récemment" +SaveData = Sauvegarde  +Setting Background = Paramétrage du fond d'écran +Show In Folder = Montrer dans dossier +USA = USA +Use UI background = Utiliser le fond d'écran + +[Graphics] +% of the void = % de l'espace vide +% of viewport = % de la zone d'affichage +%, 0:unlimited = %, 0 = illimitée +(supersampling) = (supersampling) +(upscaling) = (upscaling) +1x PSP = PSP ×1 +2x = 2× +2x PSP = PSP ×2 +3x = 3× +3x PSP = PSP ×3 +4x = 4× +4x PSP = PSP ×4 +5x = 5× +5x PSP = PSP ×5 +6x PSP = PSP ×6 +7x PSP = PSP ×7 +8x = 8× +8x PSP = PSP ×8 +9x PSP = PSP ×9 +10x PSP = PSP ×10 +16x = 16× +Aggressive = Agressif +Alternative Speed = Vitesse alternative 1 (en %, 0 = illimitée) +Alternative Speed 2 = Vitesse alternative 2 (en %, 0 = illimitée) +Anisotropic Filtering = Filtrage anisotrope +Auto = Automatique +Auto (1:1) = Automatique (1:1) +Auto (same as Rendering) = Automatique (comme la définition du rendu) +Auto FrameSkip = Saut d'images automatique +Auto Scaling = Mise à l'échelle auto +Backend = Rendu back-end +Balanced = Équilibré +Bicubic = Bicubique +BlockTransfer Tip = Certains jeux requièrent l'activation de ce paramètre pour obtenir des graphismes corrects +BlockTransferRequired = Avertissement : Ce jeu requiert l'activation de "Simuler les effets de transfert de bloc". +Both = Vitesse + FPS +Buffer graphics commands (faster, input lag) = Commandes graphiques en mémoire tampon (+ rapide, + lag entrée) +Buffered Rendering = Mise en mémoire tampon +BufferedRenderingRequired = Avertissement : Ce jeu requiert "mode de rendu" réglé sur "Mise en mémoire tampon". +Camera = Caméra +Camera Device = Caméra +Cardboard Screen Size = Taille de l'écran (en % de la zone d'affichage) +Cardboard Screen X Shift = Déplacement horizontal (en % de l'espace vide) +Cardboard Screen Y Shift = Déplacement vertical (en % de l'espace vide) +Cardboard VR Settings = Paramètres de Google Cardboard VR +Cheats = Codes de triche +Clear Speedhack = Effacer la mémoire tampon des images à la première utilisation (hack de vitesse) +ClearSpeedhack Tip = Parfois plus rapide (surtout sur les appareils mobiles), peut créer des bugs graphiques +CPU Core = Méthode CPU +Debugging = Débogage +DefaultCPUClockRequired = Avertissement : Ce jeu requiert la fréquence CPU par défaut. +Deposterize = Améliorer +Deposterize Tip = Corrige le bug graphique qui fait apparaître des bandes dans les textures mises à l'échelle +Device = Appareil +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Désactiver les effets les plus lourds (gain de vitesse) +Disabled = Désactivé +Display layout editor = Éditeur d'affichage +Display Resolution (HW scaler) = Définition d'affichage (mise à l'échelle matérielle) +Dump next frame to log = Dump de l'image suivante dans le journal +Enable Cardboard VR = Activer Cardboard VR +FPS = FPS +Frame Rate Control = Contrôle de la fréquence de rafraîchissement des images +Frame Skipping = Saut d'images +Frame Skipping Type = Type de saut d'images +FullScreen = Plein écran +Hack Settings = Paramètres "hack" (crée des bugs graphiques) +Hardware Tessellation = Tessellation matérielle +Hardware Transform = Transformation matérielle +hardware transform error - falling back to software = Erreur de transformation matérielle, retour au logiciel. +HardwareTessellation Tip = Utilise le matériel pour créer les courbes +High = Haute +Hybrid = Hybride +Hybrid + Bicubic = Hybride + Bicubique +Ignore camera notch when centering = Ignorer l'encoche de la caméra lors du centrage +Internal Resolution = Définition interne +Lazy texture caching = Mise en cache paresseuse des textures (gain de vitesse) +Linear = Linéaire +Low = Basse +LowCurves = Qualité des courbes de Bézier et splines +LowCurves Tip = Seulement utilisé par certains jeux, contrôle le lissage des courbes +Lower resolution for effects (reduces artifacts) = Réduire définition des effets (réduit artéfacts) +Manual Scaling = Mise à l'échelle man. +Medium = Moyenne +Mode = Mode +Must Restart = Vous devez redémarrer PPSSPP pour que cette modification prenne effet. +Native device resolution = Définition native de l'appareil +Nearest = Le plus proche +No buffer = 0 +Non-Buffered Rendering = Pas d'effets en mémoire tampon (hack vitesse) +None = Aucun +Number of Frames = Nombre d'images +Off = Désactivé +OpenGL = OpenGL +Overlay Information = Informations incrustées à l'écran +Partial Stretch = Étirement partiel +Percent of FPS = Pourcentage de FPS +Performance = Performances +Postprocessing effect = Effets de post-traitement +Postprocessing Shader = Shaders de post-traitement +Recreate Activity = Recréer l'animation +Render duplicate frames to 60hz = Dupliquer les images pour atteindre 60 Hz +RenderDuplicateFrames Tip = Peut améliorer la fluidité dans les jeux qui fonctionnent à des fréquences d'images plus faibles +Rendering Mode = Mode de rendu +Rendering Resolution = Définition du rendu +RenderingMode NonBuffered Tip = Plus rapide, mais pour certains jeux rien ne s'affichera +Retain changed textures = Conserver les textures modifiées (seulement certains jeux) +RetainChangedTextures Tip = Ralentit de nombreux jeux, mais beaucoup plus rapide pour quelques autres +Rotation = Rotation +Safe = Prudent +Screen layout = Disposition de l'écran +Screen Scaling Filter = Filtre de mise à l'échelle de l'écran +Show Debug Statistics = Montrer les statistiques de débogage +Show FPS Counter = Montrer les compteurs +Simulate Block Transfer = Simuler les effets de transfert de bloc +SoftGPU Tip = VRAIMENT lent actuellement +Software Rendering = Rendu logiciel (expérimental) +Software Skinning = Enveloppe logicielle +SoftwareSkinning Tip = Combine l'affichage des modèles enveloppés sur le CPU, plus rapide dans la plupart des jeux +Speed = Vitesse +Stretching = Étirement +Texture Filter = Filtre de textures +Texture Filtering = Filtrage des textures +Texture Scaling = Mise à l'échelle des textures +Texture Shader = Shader de textures +Turn off Hardware Tessellation - unsupported = Veuillez désactiver "Tessellation matérielle" : non supportée +Unlimited = Illimité +Up to 1 = Max 1 +Up to 2 = Max 2 +Upscale Level = Niveau de mise à l'échelle +Upscale Type = Type de mise à l'échelle +UpscaleLevel Tip = Lourd pour le CPU, certaines mises à l'échelle peuvent être différées pour éviter les saccades +Use all displays = Utiliser tous les écrans +Vertex Cache = Cache vertex +VertexCache Tip = Plus rapide, mais peut causer des scintillements temporaires +VSync = Synchronisation verticale +Vulkan = Vulkan +Window Size = Taille de la fenêtre +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Supprimer le fichier ZIP +Install = Installer +Install game from ZIP file? = Installer le jeu depuis le fichier ZIP ? +Install textures from ZIP file? = Installer les textures depuis le fichier ZIP ? +Installed! = Installé ! +Texture pack doesn't support install = Le pack de textures ne peut pas être installé +Zip archive corrupt = Archive ZIP corrompue +Zip file does not contain PSP software = Le fichier ZIP ne contient pas de logiciel PSP + +[KeyMapping] +Autoconfigure = Configuration automatique +Autoconfigure for device = Configuration automatique pour l'appareil +Clear All = Réinitialiser +Default All = Par défaut +Map a new key for = Choisir une nouvelle touche pour +Map Key = Assigner une touche +Map Mouse = Assigner un contrôle de souris +Test Analogs = Tester sticks +You can press ESC to cancel. = Vous pouvez presser "Échap" pour annuler. + +[MainMenu] +Browse = Parcourir... +Buy PPSSPP Gold = Soutenir PPSSPP +Choose folder = Choisir un dossier +Credits = Crédits +PPSSPP Homebrew Store = PPSSPP Homebrew Store +Exit = Quitter +Game Settings = Paramètres +Games = Jeux +Give PPSSPP permission to access storage = Autoriser PPSSPP à accéder au stockage +Homebrew & Demos = Homebrews && Démos +How to get games = Comment obtenir des jeux ? +How to get homebrew & demos = Comment obtenir des homebrews et des démos ? +Load = Charger... +Loading... = Chargement... +PinPath = Épingler +PPSSPP can't load games or save right now = PPSSPP ne peut pas charger de jeux ou sauvegarder pour le moment +Recent = Récemment +SavesAreTemporary = PPSSPP sauvegarde actuellement dans un emplacement temporaire +SavesAreTemporaryGuidance = Extrayez PPSSPP quelque part pour sauvegarder de façon permanente +SavesAreTemporaryIgnore = Ignorer l'avertissement +UnpinPath = Détacher +www.ppsspp.org = Visiter le site officiel + +[MainSettings] +Audio = Son +Controls = Commandes +Graphics = Graphismes +Networking = Réseau +System = Système +Tools = Outils + +[MappableControls] +Alt speed 1 = Vitesse alternative 1 +Alt speed 2 = Vitesse alternative 2 +An.Down = Bas stick +An.Left = Gauche stick +An.Right = Droite stick +An.Up = Haut stick +Analog limiter = Limiteur analogique +Analog Stick = Stick analogique +Audio/Video Recording = Enreg. audio/vidéo +Auto Analog Rotation (CCW) = Rotation auto stick analogique (anti-horaire) +Auto Analog Rotation (CW) = Rotation auto stick analogique (horaire) +AxisSwap = Inverser axes +Circle = Rond +Cross = Croix +D-pad down = Bas croix directionnelle +D-pad left = Gauche croix directionnelle +D-pad right = Droite croix directionnelle +D-pad up = Haut croix directionnelle +DevMenu = Outils développement +Down = Bas +Dpad = Croix directionnelle +Frame Advance = Avance d'image +Hold = Verrouillage +Home = Home +L = L +Left = Gauche +Load State = Charger état +Mute toggle = Muet +Next Slot = Emplacement suivant +None = Aucun +Note = Note +OpenChat = Ouvrir chat +Pause = Pause +R = R +RapidFire = Tir rapide +Remote hold = Verrouillage distant +Rewind = Rembobiner +Right = Droite +Right Analog Stick (tap to customize) = Stick analogique droit (toucher pour personnaliser) +RightAn.Down = Bas stick droit +RightAn.Left = Gauche stick droit +RightAn.Right = Droite stick droit +RightAn.Up = Haut stick droit +Rotate Analog (CCW) = Rot. anti-horaire stick +Rotate Analog (CW) = Rot. horaire stick +Save State = Sauvegarder état +Screen = Écran +Screenshot = Capture d'écran +Select = Select +SpeedToggle = Choix vitesse +Square = Carré +Start = Start +Texture Dumping = Extraire textures +Texture Replacement = Remplacer textures +Toggle Fullscreen = Plein écran +Toggle mode = Mode basculement +Triangle = Triangle +Unthrottle = Vitesse max +Up = Haut +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Visiter le forum "Ad Hoc Multiplayer" +AdHoc Server = Serveur ad hoc +AdhocServer Failed to Bind Port = Échec de liaison du port par le serveur ad hoc +Auto = Automatique +Bottom Center = En bas au centre +Bottom Left = En bas à gauche +Bottom Right = En bas à droite +Center Left = Au centre à gauche +Center Right = Au centre à droite +Change Mac Address = Modifier l'adresse MAC +Change proAdhocServer Address = Modifier l'adresse IP du serveur ad hoc (localhost = plusieurs instances) +Chat = Chat +Chat Button Position = Position du bouton de chat +Chat Here = Écrire ici +Chat Screen Position = Position de la zone de chat +Disconnected from AdhocServer = Déconnecté du serveur ad hoc +DNS Error Resolving = Erreur DNS pour résoudre +Enable built-in PRO Adhoc Server = Activer le serveur ad hoc intégré +Enable network chat = Activer le chat +Enable networking = Activer le réseau/WLAN (expérimental) +Enable UPnP = Activer UPnP (nécessite quelques secondes pour la détection) +EnableQuickChat = Activer le chat rapide +Enter a new PSP nickname = Entrer un nouveau pseudo +Enter Quick Chat 1 = Entrer le chat rapide 1 +Enter Quick Chat 2 = Entrer le chat rapide 2 +Enter Quick Chat 3 = Entrer le chat rapide 3 +Enter Quick Chat 4 = Entrer le chat rapide 4 +Enter Quick Chat 5 = Entrer le chat rapide 5 +Error = Erreur +Failed to Bind Localhost IP = Échec de liaison de l'IP localhost +Failed to Bind Port = Échec de liaison du port +Failed to connect to Adhoc Server = Échec de connexion au serveur ad hoc +Forced First Connect = Première connexion forcée (connexion plus rapide) +Invalid IP or hostname = IP ou nom de domaine invalide +Minimum Timeout = Temps d'expiration minimum (forçage en ms, 0 = par défaut) +Misc = Divers (par défaut = compatibilité PSP) +Network Initialized = Réseau initialisé ! +Please change your Port Offset = Veuillez changer votre décalage de port +Port offset = Décalage de port (0 = compatibilité PSP) +proAdhocServer Address: = Adresse du serveur ad hoc : +Quick Chat 1 = Chat rapide 1 +Quick Chat 2 = Chat rapide 2 +Quick Chat 3 = Chat rapide 3 +Quick Chat 4 = Chat rapide 4 +Quick Chat 5 = Chat rapide 5 +QuickChat = Chat rapide +Send = Envoyer +Send Discord Presence information = Envoyer l'information "Rich Presence" de Discord +TCP No Delay = TCP No Delay (TCP plus rapide) +Top Center = En haut au centre +Top Left = En haut à gauche +Top Right = En haut à droite +Unable to find UPnP device = Appareil UPnP introuvable +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) +Validating address... = Validation de l'adresse... +WLAN Channel = Canal WLAN +You're in Offline Mode, go to lobby or online hall = Vous êtes en mode hors ligne, allez dans le hall en ligne. + +[Pause] +Cheats = Codes de triche +Continue = Continuer +Create Game Config = Créer config. de jeu +Delete Game Config = Supprimer config. de jeu +Exit to menu = Retour au menu +Game Settings = Paramètres du jeu +Load State = Charger état +Rewind = Rembobinage +Save State = Sauvegarder état +Settings = Paramètres +Switch UMD = Changer d'UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (paramètre dupliqué, l'ajustement précédent sera utilisé) +4xHqGLSL = GLSL HQ ×4 +5xBR = 5×BR +5xBR-lv2 = 5×BR-lv2 +AAColor = Anticrénelage des couleurs +Amount = Quantité +Black border = Bordure noire +Bloom = Flou lumineux +Brightness = Luminosité +Cartoon = Cartoon +ColorCorrection = Correction des couleurs +Contrast = Contraste +CRT = Lignes de balayage CRT +FXAA = Anticrénelage FXAA +Gamma = Gamma +Grayscale = Niveaux de gris +Intensity = Intensité +InverseColors = Couleurs inversées +Natural = Couleurs naturelles +NaturalA = Couleurs naturelles (sans flou) +Off = Aucun +Power = Puissance +PSPColor = Couleurs PSP +Saturation = Saturation +Scanlines = Lignes de balayage +Sharpen = Plus net +SSAA(Gauss) = Anticrénelage supersampling (Gauss) +Tex4xBRZ = 4×BRZ +UpscaleSpline36 = Upscaling Spline36 +VideoSmoothingAA = Anticrénelage des vidéos +Vignette = Vignette + +[PSPCredits] +all the forum mods = tous les modérateurs du forum +build server = serveur de compilation +Buy Gold = Version Gold +check = Essayez aussi Dolphin, le meilleur émulateur de Wii/GameCube : +CheckOutPPSSPP = Jetez un œil à PPSSPP, l'impressionnant émulateur de PSP : https://www.ppsspp.org/ +contributors = Contributeurs : +created = Créé par +Discord = Discord de PPSSPP +info1 = PPSSPP est seulement destiné à des fins éducatives. +info2 = S'il vous plaît, assurez-vous que vous possédez les droits de tous les +info3 = jeux auquels vous jouez en achetant l'UMD ou la version digitale +info4 = téléchargée depuis le PlayStation Store sur votre PSP. +info5 = PSP est une marque déposée par Sony Inc. +iOS builds = versions iOS +license = Logiciel libre sous GPL 2.0+ +list = Listes de compatibilité, Forum et informations sur le développement +PPSSPP Forums = Forum de PPSSPP +Privacy Policy = Politique de\nconfidentialité +Share PPSSPP = Partager PPSSPP +specialthanks = En remerciant tout particulièrement : +specialthanksKeithGalocy = de chez NVIDIA (matériel, conseils) +specialthanksMaxim = pour son incroyable travail sur le décodeur Atrac3+ +testing = tests +this translation by = Traduction française : vnctdj +title = Un émulateur de PSP rapide et portable +tools = Outils libres utilisés : +Twitter @PPSSPP_emu = Twitter de PPSSPP +website = Visitez notre site : +written = Écrit en C++ pour la vitesse et la portabilité + +[RemoteISO] +Browse Games = Parcourir les jeux +Local Server Port = Port local du serveur +Manual Mode Client = Configurer le client manuellement +Remote disc streaming = Streaming de disque distant +Remote Port = Port distant +Remote Server = Serveur distant +Remote Subdirectory = Sous-répertoire distant +RemoteISODesc = Les jeux de votre liste "Récemment" seront partagés. +RemoteISOLoading = Connecté, chargement de la liste des jeux... +RemoteISOScanning = Scan en cours...\nCliquez sur "partager les jeux" sur l'appareil serveur. +RemoteISOScanningTimeout = Scan en cours...\nVérifiez la configuration du pare-feu de l'appareil serveur. +RemoteISOWifi = Important :\nConnectez les deux appareils au même réseau Wi-Fi. +RemoteISOWinFirewall = AVERTISSEMENT : Le pare-feu Windows bloque le partage. +Settings = Paramètres +Share Games (Server) = Partager les jeux (serveur) +Share on PPSSPP startup = Partager au démarrage de PPSSPP +Stop Sharing = Arrêter le partage +Stopping.. = Arrêt en cours... + +[Reporting] +Bad = Mauvais +FeedbackDelayInfo = Transmission des données en tâche de fond... +FeedbackDesc = Comment est l'émulation ? Partagez vos impressions avec nous et la communauté ! +FeedbackDisabled = L'envoi des rapports de compatibilité doit être activé. +FeedbackIncludeCRC = Note : L'envoi d'un CRC du disque consomme de la batterie. +FeedbackIncludeScreen = Inclure une capture d'écran +FeedbackSubmitDone = Les données ont bien été transmises. +FeedbackSubmitFail = Échec de la transmission des données au serveur. Essayez de mettre à jour PPSSPP. +FeedbackThanks = Merci pour votre retour ! +Gameplay = Jouabilité +Graphics = Graphismes +Great = Super +In-game = En jeu +In-game Description = Accès au gameplay, mais trop buggé pour être jouable +Menu/Intro = Menu/Intro +Menu/Intro Description = Pas d'accès au gameplay +Nothing = Rien +Nothing Description = Complètement cassé +OK = OK +Open Browser = Ouvrir le navigateur +Overall = Globalement +Perfect = Parfait +Perfect Description = Émulation parfaite pour le jeu entier, super ! +Plays = Jouable +Plays Description = Pleinement jouable mais bugs possibles +ReportButton = Évaluer l'émulation +Speed = Vitesse +Submit Feedback = Envoyer l'évaluation +SuggestionConfig = Consultez les rapports sur le site pour de meilleurs paramètres. +SuggestionCPUSpeed0 = Désactivez le paramètre de modification de la fréquence CPU. +SuggestionDowngrade = Essayez une version de PPSSPP plus ancienne (veuillez signaler ce bug). +SuggestionsFound = D'autres utilisateurs ont envoyé de meilleurs résultats. Cliquez sur "Voir tous les rapports" pour plus de détails. +SuggestionsNone = Ce jeu ne fonctionne pas non plus pour les autres utilisateurs. +SuggestionsWaiting = Envoi, et consultation des rapports des autres utilisateurs en cours... +SuggestionUpgrade = Veuillez utiliser une version de PPSSPP plus récente. +SuggestionVerifyDisc = Vérifiez que votre ISO est une copie correcte de votre UMD. +Unselected Overall Description = Quel est la qualité d'émulation de ce jeu ? +View Feedback = Voir tous les rapports + +[Savedata] +Date = Date +Filename = Nom de fichier +No screenshot = Pas de capture d'écran +None yet. Things will appear here after you save. = Rien à afficher pour le moment.\nDes choses apparaîtront ici lorsque vous sauvegarderez. +Save Data = Sauvegardes +Save States = États +Savedata Manager = Gestionnaire de sauvegardes +Size = Taille + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = Avertissement : Chainfire3D détecté, cela peut poser des problèmes. +Failed to load state = Échec du chargement de l'état +Failed to save state = Échec de la sauvegarde de l'état +fixed = Vitesse alternative 1 +GLToolsWarning = Avertissement : GLTools détecté, cela peut poser des problèmes. +In menu = Dans les menus +Load savestate failed = Échec du chargement de l'état +Loaded State = État chargé ! +Loaded. Save in game, restart, and load for less bugs. = Chargé.\nSauvegarder dans le jeu, redémarrer,\net charger la sauvegarde pour moins de bugs. +LoadStateDoesntExist = Échec du chargement de l'état :\nl'état n'existe pas ! +LoadStateWrongVersion = Échec du chargement de l'état :\nl'état appartient à une ancienne version de PPSSPP ! +norewind = Pas d'instantané de rembobinage disponible. +Playing = En jeu +PressESC = Appuyer sur "Échap" pour ouvrir le menu Pause. +replaceTextures_false = Les textures ne sont plus remplacées. +replaceTextures_true = Le remplacement des textures est activé. +Save State Failed = Échec de la sauvegarde de l'état ! +Saved State = État sauvegardé ! +saveNewTextures_false = La sauvegarde des textures a été désactivée. +saveNewTextures_true = Les textures seront maintenant sauvegardées\nsur votre espace de stockage. +SpeedCustom2 = Vitesse alternative 2 +standard = Vitesse normale +Untitled PSP game = Jeu PSP sans titre + +[Store] +Already Installed = Déjà installé +Connection Error = Erreur de connexion +Install = Installer +Launch Game = Lancer le jeu +Loading... = Chargement... +MB = Mo +Size = Taille +Uninstall = Désinstaller + +[SysInfo] +%d (%d per core, %d cores) = %d (%d par cœur, %d cœurs) +%d bytes = %d octets +(none detected) = (aucun détecté) +3D API = API 3D +ABI = ABI +API Version = Version de l'API +Audio Information = Informations audio +Board = Carte +Build Config = Config de compilation +Build Configuration = Configuration de compilation +Built by = Compilé par +Core Context = Contexte de cœur +Cores = Coeurs +CPU Extensions = Extensions CPU +CPU Information = Informations CPU +CPU Name = Nom +D3DCompiler Version = Version de D3DCompiler +Debug = Débogage +Debugger Present = Débogueur présent +Device Info = Informations sur l'appareil +Display Information = Informations d'affichage +Driver Version = Version du pilote +EGL Extensions = Extensions EGL +Frames per buffer = Images par mémoire tampon +GPU Information = Informations GPU +High precision float range = Amplitude de float haute précision +High precision int range = Amplitude d'entier haute précision +Lang/Region = Langue/Région +Memory Page Size = Taille de page mémoire +Native Resolution = Définition native +OGL Extensions = Extensions OpenGL +OpenGL ES 2.0 Extensions = Extensions OpenGL ES 2.0 +OpenGL ES 3.0 Extensions = Extensions OpenGL ES 3.0 +OpenGL Extensions = Extensions OpenGL +Optimal frames per buffer = Nombre optimal d'images par mémoire tampon +Optimal sample rate = Taux d'échantillonnage optimal +OS Information = Informations sur l'OS +PPSSPP build = Version de PPSSPP +Refresh rate = Taux de rafraîchissement +Release = Release +RW/RX exclusive = Exclusif RW/RX +Sample rate = Taux d'échantillonnage +Shading Language = Language de shading +Sustained perf mode = Mode performance prolongée +System Information = Informations système +System Name = Nom +System Version = Version du système +Threads = Fils d'exécution +Vendor = Vendeur +Vendor (detected) = Vendeur (détecté) +Version Information = Informations de version +Vulkan Extensions = Extensions Vulkan +Vulkan Features = Fonctionnalités Vulkan + +[System] +(broken) = (cassé) +12HR = 12h +24HR = 24h +Auto = Automatique +Auto Load Savestate = Charger un état automatiquement +AVI Dump started. = Dump AVI démarré +AVI Dump stopped. = Dump AVI stoppé +Cache ISO in RAM = Mettre l'ISO en cache dans la RAM +Change CPU Clock = Fréquence du CPU de la PSP émulé (instable) +Change Memory Stick folder = Changer le dossier de la Memory Stick +Change Memory Stick Size = Changer la taille de la Memory Stick (Go) +Change Nickname = Changer de pseudo +ChangingMemstickPath = Les sauvegardes, états, et autres données ne peuvent pas être enregistrés dans ce dossier.\n\nChanger le dossier de la Memory Stick ? +ChangingMemstickPathInvalid = Ce chemin ne peut pas être utilisé pour enregistrer des fichiers de la Memory Stick. +ChangingMemstickPathNotExists = Ce dossier n'existe pas.\n\nLes sauvegardes, états, et autres données ne peuvent pas y être enregistrés.\n\nCréer ce nouveau dossier de la Memory Stick ? +Cheats = Codes de triche (expérimental, voir forum) +Clear Recent = Effacer "Récemment" +Clear Recent Games List = Effacer la liste "Récemment" +Clear UI background = Retirer le fond d'écran +Confirmation Button = Bouton de confirmation +Date Format = Format de la date +Day Light Saving = Heure d'été +DDMMYYYY = JJMMAAAA +Decrease size = Diminuer la taille +Developer Tools = Outils de développement +Display Extra Info = Afficher plus d'informations +Display Games on a grid = Afficher "Jeux" en icônes +Display Homebrew on a grid = Afficher "Homebrews && Démos" en icônes +Display Recent on a grid = Afficher "Récemment" en icônes +Dynarec (JIT) = Dynarec (JIT) +Emulation = Émulation +Enable Cheats = Activer les codes de triche +Enable Compatibility Server Reports = Activer l'envoi des rapports de compatibilité +Failed to load state. Error in the file system. = Échec du chargement de l'état. Erreur dans le système de fichiers. +Failed to save state. Error in the file system. = Échec de la sauvegarde de l'état. Erreur dans le système de fichiers. +Fast (lag on slow storage) = Rapide (lag sur stockage lent) +Fast Memory = Mémoire rapide (instable) +Force real clock sync (slower, less lag) = Forcer synchronisation temps réel (+ lent, - de décalage) +frames, 0:off = images, 0 = off +Games list settings = Paramètres des listes de jeux +General = Général +Grid icon size = Taille des icônes +Help the PPSSPP team = Aider l'équipe de PPSSPP +Host (bugs, less lag) = Hôte (bugs, moins de lag) +I/O on thread (experimental) = Entrées/Sorties sur fil d'exécution +Ignore bad memory accesses = Ignorer les mauvais accès mémoire +Increase size = Augmenter la taille +Interpreter = Interpréteur +IO timing method = Méthode synchro. E/S +IR Interpreter = Interpréteur IR +Memory Stick Folder = Dossier de la Memory Stick +Memory Stick inserted = Memory Stick insérée +MHz, 0:default = MHz, 0 = par déf. +MMDDYYYY = MMJJAAAA +Newest Save = Le plus récent état +Not a PSP game = Ce n'est pas un jeu PSP. +Off = Désactivé +Oldest Save = Le plus ancien état +PSP Model = Modèle de PSP +PSP Settings = Paramètres de la PSP +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Enregistrer le son +Record Display = Enregistrer l'affichage +Reset Recording on Save/Load State = Redémarrer l'enregistrement lors de la sauvegarde/chargement d'état +Restore Default Settings = Restaurer les paramètres par défaut +Rewind Snapshot Frequency = Fréquence instantanés rembobinage (+ de mémoire) +Save path in installed.txt = Chemin de sauvegarde dans "installed.txt" +Save path in My Documents = Chemin de sauvegarde dans "Mes documents" +Savestate Slot = Emplacement d'état +Savestate slot backups = Emplacement d'état de secours +Screenshots as PNG = Enregistrer les captures d'écran au format .png +Set UI background... = Définir un fond d'écran... +Show ID = Afficher l'identifiant +Show region flag = Afficher le drapeau de région +Simulate UMD delays = Simuler délais UMD +Slot 1 = Emplacement 1 +Slot 2 = Emplacement 2 +Slot 3 = Emplacement 3 +Slot 4 = Emplacement 4 +Slot 5 = Emplacement 5 +Storage full = Espace de stockage plein. +Sustained performance mode = Mode performance prolongée +Time Format = Format de l'heure +UI = Interface utilisateur +UI Sound = Sons de l'interface utilisateur +undo %c = secours %c +Use Lossless Video Codec (FFV1) = Utiliser un codec vidéo sans perte (FFV1) +Use O to confirm = Utiliser O +Use output buffer (with overlay) for recording = Utiliser une mémoire tampon pour l'enregistrement (inclut les messages) +Use system native keyboard = Utiliser le clavier natif du système +Use X to confirm = Utiliser X +VersionCheck = Vérifier s'il existe une nouvelle version de PPSSPP +WARNING: Android battery save mode is on = AVERTISSEMENT : Le mode d'économie de batterie d'Android est activé. +WARNING: Battery save mode is on = AVERTISSEMENT : Le mode d'économie de batterie est activé. +YYYYMMDD = AAAAMMJJ + +[Upgrade] +Details = Détails +Dismiss = Ignorer +Download = Télécharger +New version of PPSSPP available = Nouvelle version de PPSSPP disponible diff --git a/assets/lang/gl_ES.ini b/assets/lang/gl_ES.ini new file mode 100644 index 0000000000..2fa550630a --- /dev/null +++ b/assets/lang/gl_ES.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = Motor de audio (require reiniciar) +AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) +Auto = Automático +Device = Device +DSound (compatible) = DSound (compatible) +Enable Sound = Activar son +Global volume = Global volume +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = WASAPI (rápido) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Analog axis sensitivity +Analog Limiter = Limitador analóxico +Analog Mapper High End = Analog mapper high-end (axis sensitivity) +Analog Mapper Low End = Analog mapper low-end (inverse deadzone) +Analog Mapper Mode = Analog mapper mode +Analog Stick = Stick analóxico +AnalogLimiter Tip = When the analog limiter button is pressed +Auto = Automática +Auto-centering analog stick = Auto-centering analog stick +Auto-hide buttons after seconds = Auto-hide buttons after seconds +Binds = Binds +Button Opacity = Transparencia de botóns +Button style = Estilo de botóns +Calibrate D-Pad = Calibrar +Calibration = Calibración +Classic = Clásico +Combo Key Setting = Combo key setting +Combo Key Setup = Combo key setup +Confine Mouse = Trap mouse within window/display area +Control Mapping = Asignar botóns +Custom layout... = Deseño personalizado... +Customize tilt = Personalizar acelerómetro +D-PAD = D-Pad +Deadzone Radius = Radio de zona inactiva +DInput Analog Settings = DInput analog settings +Disable D-Pad diagonals (4-way touch) = Desactivar diagonais do D-Pad +Glowing borders = Glowing borders +HapticFeedback = Vibración háptica +Ignore gamepads when not focused = Ignore gamepads when not focused +Ignore Windows Key = Ignorar tecla de Windows +Invert Axes = Invertir eixes +Invert Tilt along X axis = Invertir inclinación do eixe X +Invert Tilt along Y axis = Invertir inclinación do eixe Y +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Axustes de teclado +L/R Trigger Buttons = L/R trigger buttons +Landscape = Horizontal +Landscape Auto = Landscape auto +Landscape Reversed = Horizontal invertido +Mouse = Mouse settings +Mouse sensitivity = Mouse sensitivity +Mouse smoothing = Mouse smoothing +MouseControl Tip = You can now map mouse in control mapping screen by pressing the 'M' icon. +None (Disabled) = Desactivado +Off = Off +OnScreen = Controis táctiles en pantalla +Portrait = Vertical +Portrait Reversed = Vertical invertido +PSP Action Buttons = Botóns de acción +Screen Rotation = Rotación de pantalla +seconds, 0 : off = seconds, 0 = off +Sensitivity = Sensibilidade +Show right analog = Show right analog +Show Touch Pause Menu Button = Mostrar botón de menú +Thin borders = Bordes finos +Tilt Base Radius = Tilt base radius +Tilt Input Type = Tipo de control do acelerómetro +Tilt Sensitivity along X axis = Sensibilidade de inclinación do eixe X +Tilt Sensitivity along Y axis = Sensibilidade de inclinación do eixe Y +To Calibrate = Para calibrar, pon o aparello nunha superficie plana e presiona "Calibrar". +Touch Control Visibility = Touch control visibility +Use custom right analog = Use custom right analog +Use Mouse Control = Use mouse control +Visibility = Mostrar... +X = X +X + Y = X + Y +XInput Analog Settings = XInput analog settings +Y = Y + +[CwCheats] +Cheats = Trucos +Edit Cheat File = Editar arquivo de trucos +Enable/Disable All = Activar/desactivar tódolos trucos +Import Cheats = Importar cheat.db +Options = Opcións +Refresh Rate = Frecuencia de actualización + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = &Acerca de PPSSPP... +Auto = &Automático +Backend = Motor &gráfico (require reiniciar) +Bicubic = &Bicúbico +Break = Break +Break on Load = Break on load +Buffered Rendering = &Renderizado por búfer +Buy Gold = Comprar versión &Gold +Control Mapping... = Asignar &botóns... +Debugging = &Depuración +Deposterize = &Deposterizar +Direct3D9 = &Direct3D9 +Direct3D11 = Direct3D &11 +Disassembly = &Desensamblador... +Discord = Discord +Display Layout Editor = Display layout editor... +Display Rotation = Display rotation +Dump Next Frame to Log = &Volcar seguinte cadro a rexistro +Emulation = &Emulación +Enable Chat = Enable chat +Enable Cheats = Activar &trucos (require reiniciar) +Enable Sound = Activar s&on +Exit = &Saír +Extract File... = E&xtraer arquivo... +File = &Arquivo +Frame Skipping = &Saltar cadros +Frame Skipping Type = Frame skipping type +Fullscreen = &Pantalla completa +Game Settings = A&xustes de xogo +GE Debugger... = Dep&urador GE... +GitHub = Git&Hub +Hardware Transform = Transformación por &hardware +Help = A&xuda +Hybrid = &Híbrido +Hybrid + Bicubic = Híb&rido + Bicúbico +Ignore Illegal Reads/Writes = &Ignorar lecturas/escrituras erróneas +Ignore Windows Key = Ignorar tecla de &Windows +Keep PPSSPP On Top = &Manteer PPSSPP en primeiro plano +Landscape = Landscape +Landscape reversed = Landscape reversed +Language... = &Idioma... +Linear = &Lineal +Load = &Cargar... +Load .sym File... = Cargar arquivo .&sym... +Load Map File... = &Cargar arquivo Map... +Load State = &Cargar estado +Load State File... = Cargar a&rquivo de estado... +Log Console = Consola de re&xistros... +Memory View... = Visor de &memoria... +More Settings... = Máis &opcións... +Nearest = &Cercano +Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) +Off = &Non +Open Directory... = &Abrir carpeta... +Open from MS:/PSP/GAME... = A&brir dende ms0:/PSP/GAME... +Open Memory Stick = Abrir &Memory Stick +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = &Pausar +Pause When Not Focused = &Pausar ó cambiar de ventá +Portrait = Portrait +Portrait reversed = Portrait reversed +Postprocessing Shader = &Shader de postprocesado +PPSSPP Forums = &Foro de PPSSPP +Record = &Record +Record Audio = Record &audio +Record Display = Record &display +Rendering Mode = M&odo de renderizado +Rendering Resolution = &Resolución de renderizado +Reset = Re&iniciar +Reset Symbol Table = &Reiniciar tabla de símbolos +Run = &Reanudar +Save .sym File... = Gardar arquivo .&sym... +Save Map File... = &Gardar arquivo Map... +Save State = &Gardar estado +Save State File... = G&ardar arquivo de estado... +Savestate Slot = Ranura de gardar &estados +Screen Scaling Filter = Filtro de escalado de &pantalla +Show Debug Statistics = Mostrar &estadísticas de depuración +Show FPS Counter = &Mostrar contador de FPS +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = P&arar +Switch UMD = Cambiar &UMD +Take Screenshot = Capturar &pantalla +Texture Filtering = &Filtrado de texturas +Texture Scaling = &Escalado de texturas +Use Lossless Video Codec (FFV1) = &Use lossless video codec (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = &Caché de vértices +VSync = Sincronización &vertical +Vulkan = Vulkan +Window Size = &Tamaño de ventá +www.ppsspp.org = &Sitio oficial +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allocator viewer (Vulkan) +Allow remote debugger = Allow remote debugger +Backspace = Borrar +Block address = Bloquear dirección +By Address = Por dirección +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Create/Open textures.ini file for current game +Current = Actual +Dev Tools = Development tools +DevMenu = DevMenu +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Volcar EBOOT.BIN descifrado ó iniciar o xogo +Dump Frame GPU Commands = Volcar comandos GPU do cadro +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Activar rexistro +Enter address = Insertar dirección +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Frame profiler +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = Comparación JIT +JIT debug tools = JIT debug tools +Language = Idioma +Load language ini = Cargar INI de idioma +Log Dropped Frame Statistics = Log dropped frame statistics +Log Level = Nivel de rexistro +Log View = Ver o rexistro +Logging Channels = Canles de rexistro +Next = Seguinte +No block = Non bloquear +Prev = Anterior +Random = Aleatorio +Replace textures = Replace textures +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Seguro que queres volver ós axustes de fábrica?\nOs cambios nos controis non se borrarán.\n\nNon podes desfacer isto.\nReinicia PPSSPP para que os cambios teñan efecto. +RestoreGameDefaultSettings = Seguro que queres reestablecer os axustes do xogo\nós axustes por defecto de PPSSPP? +Resume = Resume +Run CPU Tests = Probas de CPU +Save language ini = Gardar INI de idioma +Save new textures = Save new textures +Shader Viewer = Shader viewer +Show Developer Menu = Mostrar menú de desenrolo +Show on-screen messages = Show on-screen messages +Stats = Stats +System Information = Información do sistema +Texture Replacement = Texture replacement +Toggle Audio Debug = Parar/Reanudar depuración de audio +Toggle Freeze = Parar/Reanudar imaxe +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP res +Active = Active +Back = Atrás +Cancel = Cancelar +Center = Center +ChangingGPUBackends = Cambiar o motor gráfico require reiniciar PPSSPP.\nReiniciar agora? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = Elixe a carpeta de gardado de PPSSPP. +Confirm Overwrite = Desexas sobreescribir os datos? +Confirm Save = Desexas gardar estes datos? +ConfirmLoad = Desexas cargar estes datos gardados? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Borrar +Delete all = Borrar todo +Delete completed = Borrado completado. +DeleteConfirm = Este arquivo de datos borrarase.\nSeguro que queres borralo? +DeleteConfirmAll = Seguro que queres borrar todos\nos datos de gardado de este xogo? +DeleteConfirmGame = Seguro que queres borrar este xogo?\nEsta operación non se pode desfacer. +DeleteConfirmGameConfig = Seguro que queres borrar a configuración deste xogo? +DeleteFailed = Os datos non se puideron borrar. +Deleting = Borrando\nEspera un momento... +Disable All = Disable all +Edit = Edit +Enable All = Enable all +Enter = Intro +Finish = Terminar +Grid = Grid +Inactive = Inactive +InternalError = An internal error has occurred. +Load = Cargar +Load completed = Carga completada. +Loading = Cargando\nAgarda un momento... +LoadingFailed = Os datos nom se puideron cargar. +Move = Posición +Network Connection = Conexión de rede +NEW DATA = NOVOS DATOS +No = Non +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = Aceptar +Old savedata detected = Detectados datos de gardado antigos. +Options = Options +Reset = Reiniciar +Resize = Tamaño +Retry = Reintentar +Save = Gardar +Save completed = Gardado completado. +Saving = Gardando\nAgarda un momento... +SavingFailed = Os datos non se puideron gardar. +Select = Seleccionar +Shift = Alternar +Snap = Snap +Space = Espacio +SSID = SSID +Submit = Enviar +Supported = Supported +There is no data = A tarxeta de memoria está baleira. +Toggle All = Cambiar todo +Toggle List = Toggle list +Unsupported = Unsupported +When you save, it will load on a PSP, but not an older PPSSPP = Cando gardes, a partida cargará nunha PSP, pero non en versións antigas de PPSSPP. +When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Yes = Sí +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = file is compressed (7z).\nPlease decompress first (try 7-Zip or WinRAR). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = Could not save screenshot file. +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll not found. Please install. Or press Yes to try again using Direct3D 9 instead. +D3D11InitializationError = Direct3D 11 initialization error +D3D11Missing = Your operating system version does not include D3D11. Please run Windows Update.\n\nPress Yes to try again using Direct3D 9 instead. +D3D11NotSupported = Your GPU does not appear to support Direct3D 11.\n\nWould you like to try again using Direct3D 9 instead? +Disk full while writing data = O disco encheuse durante a escritura de datos. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = Erro ó cargar o arquivo +Error reading file = Erro o ler o arquivo +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = Non se pudo identificar o arquivo +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Failed initializing graphics. Try upgrading your graphics drivers and DirectX 9 runtime.\n\nWould you like to try switching to OpenGL?\n\nError message: +GenericGraphicsError = Graphics Error +GenericOpenGLError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to DirectX 9?\n\nError message: +GenericVulkanError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to OpenGL?\n\nError message: +InsufficientOpenGLDriver = Soporte insuficiente do driver OpenGL detectado.\n\nA túa tarxeta gráfica indica que non soporta OpenGL 2.0. Queres probar a usar DirectX no seu lugar?\n\nPor agora DirectX é compatible con menos xogos, pero coa túa tarxeta gráfica pode que sexa a única opción dispoñible.\n\nVisita os foros en https://forums.ppsspp.org para máis información. +Just a directory. = Só é unha carpeta. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = Falta o EBOOT.PBP, xogo mal identificado +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = Erro do driver OpenGL +PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = De momento PPSSPP non soporta as funcións de rede para actualizacións de xogos, DLCs ou PSN. +PS1 EBOOTs are not supported by PPSSPP. = PPSSPP non puede executar os EBOOTs de PS1. +PSX game image detected. = O arquivo é unha imaxe MODE2, e PPSSPP non soporta xogos de PSX. +RAR file detected (Require UnRAR) = Arquivo comprimido (RAR).\nNecesita ser descomprimido (usa UnRAR). +RAR file detected (Require WINRAR) = Arquivo comprimido (RAR).\nNecesita ser descomprimido (usa WinRAR). +Running slow: try frameskip, sound is choppy when slow = Running slow: try frameskip, sound is choppy when slow +Running slow: Try turning off Software Rendering = Running slow: try turning off "software rendering" +Save encryption failed. This save won't work on real PSP = Erro ó cifrar os datos gardados. Non funcionarán nunha PSP real. +textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +This is a saved state, not a game. = This is a saved state, not a game. +This is save data, not a game. = This is save data, not a game. +Unable to create cheat file, disk may be full = Non se puido crear o arquivo de trucos, o disco podería estar cheo. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Unable to write savedata, disk may be full. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Warning: Video memory FULL, reducing upscaling and switching to slow caching mode. +Warning: Video memory FULL, switching to slow caching mode = Warning: Video memory FULL, switching to slow caching mode. +ZIP file detected (Require UnRAR) = Arquivo comprimido (ZIP).\nNecesita ser descomprimido (usa UnRAR). +ZIP file detected (Require WINRAR) = Arquivo comprimido (ZIP).\nNecesita ser descomprimido (usa WinRAR). + +[Game] +Asia = Asia +ConfirmDelete = Confirmar +Create Game Config = Crear config. do xogo +Create Shortcut = Crear acceso directo +Delete Game = Borrar xogo +Delete Game Config = Borrar config. do xogo +Delete Save Data = Borrar datos +Europe = Europe +Game = Xogo +Game Settings = Axustes de xogo +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Instalación de datos +Japan = Japan +Korea = Korea +MB = MB +One moment please... = One moment please... +Play = Xogar +Remove From Recent = Borrar de recentes +SaveData = Datos +Setting Background = Setting background +Show In Folder = Mostrar en carpeta +USA = USA +Use UI background = Use UI background + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = unlimited +(supersampling) = (supersampling) +(upscaling) = (upscaling) +1x PSP = PSP ×1 +2x = ×2 +2x PSP = PSP ×2 +3x = ×3 +3x PSP = PSP ×3 +4x = ×4 +4x PSP = PSP ×4 +5x = ×5 +5x PSP = PSP ×5 +6x PSP = PSP ×6 +7x PSP = PSP ×7 +8x = ×8 +8x PSP = PSP ×8 +9x PSP = PSP ×9 +10x PSP = PSP ×10 +16x = ×16 +Aggressive = Agresivo +Alternative Speed = Velocidade alternativa (%, 0 = ilimitada) +Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Anisotropic Filtering = Filtrado anisotrópico +Auto = Automático +Auto (1:1) = Automático (1:1) +Auto (same as Rendering) = Automático (igual á de renderizado) +Auto FrameSkip = Salto de cadros automático +Auto Scaling = Auto scaling +Backend = Motor gráfico +Balanced = Balanceado +Bicubic = Bicúbico +BlockTransfer Tip = Some games require this to be On for correct graphics +BlockTransferRequired = Warning: This game requires "simulate block transfer effects" to be set to On. +Both = Ambos +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Renderizado por búfer +BufferedRenderingRequired = Warning: This game requires "rendering mode" to be set to "buffered". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Tamaño de pantalla (en % da área visual) +Cardboard Screen X Shift = Desprazamento horizontal (en % do espazo en branco) +Cardboard Screen Y Shift = Desprazamento vertical (en % do espazo en branco) +Cardboard VR Settings = Axustes de Google Cardboard VR +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU core +Debugging = Depuración +DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. +Deposterize = Deposterizar +Deposterize Tip = Fixes visual banding glitches in upscaled textures +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Desactivar efectos máis lentos (rápido) +Disabled = Disabled +Display layout editor = Display layout editor +Display Resolution (HW scaler) = Resolución de pantalla (escalado por hardware) +Dump next frame to log = Volcar seguinte cadro ó rexistro +Enable Cardboard VR = Enable Cardboard VR +FPS = FPS +Frame Rate Control = Control de tasa de cadros (FPS) +Frame Skipping = Saltar cadros +Frame Skipping Type = Frame skipping type +FullScreen = Pantalla completa +Hack Settings = Axustes de hacks (causarán erros gráficos) +Hardware Tessellation = Hardware tessellation +Hardware Transform = Transformación por hardware +hardware transform error - falling back to software = Hardware transform error, falling back to software +HardwareTessellation Tip = Uses hardware to make curves +High = Alta +Hybrid = Híbrido +Hybrid + Bicubic = Híbrido + Bicúbico +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Resolución interna +Lazy texture caching = Caché de texturas diferido (rápido) +Linear = Lineal +Low = Baixa +LowCurves = Calidade de curvas bézier +LowCurves Tip = Only used by some games, controls smoothness of curves +Lower resolution for effects (reduces artifacts) = Lower resolution for effects (reduces artifacts) +Manual Scaling = Manual scaling +Medium = Media +Mode = Modo +Must Restart = Debes reiniciar PPSSPP para aplicar este cambio. +Native device resolution = Resolución nativa do dispositivo +Nearest = Pixelado +No buffer = No buffer +Non-Buffered Rendering = Skip buffer effects (non-buffered, faster) +None = Non +Number of Frames = Number of frames +Off = Non +OpenGL = OpenGL +Overlay Information = Información en pantalla +Partial Stretch = Partial stretch +Percent of FPS = Percent of FPS +Performance = Rendemento +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Shader de postprocesado +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = Modo de renderizado +Rendering Resolution = Resolución de renderizado +RenderingMode NonBuffered Tip = Faster, but nothing may draw in some games +Retain changed textures = Retain changed textures (sometimes slower) +RetainChangedTextures Tip = Makes many games slower, but some games a lot faster +Rotation = Rotation +Safe = Seguro +Screen layout = Screen layout +Screen Scaling Filter = Filtro de escalado de pantalla +Show Debug Statistics = Mostrar estadísticas de depuración +Show FPS Counter = Mostrar contador de FPS +Simulate Block Transfer = Simulate block transfer effects +SoftGPU Tip = Currently VERY slow +Software Rendering = Renderizado por software (beta) +Software Skinning = «Skinning» por software +SoftwareSkinning Tip = Combine skinned model draws on the CPU, faster in most games +Speed = Velocidade +Stretching = Stretching +Texture Filter = Filtro de texturas +Texture Filtering = Filtrado de texturas +Texture Scaling = Escalado de texturas +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Turn off "hardware tessellation": unsupported +Unlimited = Unlimited +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = Nivel de escalado +Upscale Type = Tipo de escalado +UpscaleLevel Tip = CPU heavy - some scaling may be delayed to avoid stutter +Use all displays = Use all displays +Vertex Cache = Caché de vértices +VertexCache Tip = Faster, but may cause temporary flicker +VSync = Sincronización vertical +Vulkan = Vulkan +Window Size = Tamaño de ventana +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Borrar arquivo ZIP +Install = Instalar +Install game from ZIP file? = Instalar xogo dende un arquivo ZIP? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = ¡Instalado! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = Autoconfigurar +Autoconfigure for device = Autoconfigurar para dispositivo +Clear All = Borrar todo +Default All = Restaurar +Map a new key for = Pulsa unha tecla para +Map Key = Map key +Map Mouse = Map mouse +Test Analogs = Probar analóx. +You can press ESC to cancel. = You can press Esc to cancel. + +[MainMenu] +Browse = Buscar... +Buy PPSSPP Gold = Buy PPSSPP Gold +Choose folder = Choose folder +Credits = Créditos +PPSSPP Homebrew Store = Tenda de Homebrew de PPSSPP +Exit = Saír +Game Settings = Axustes +Games = Xogos +Give PPSSPP permission to access storage = Give PPSSPP permission to access storage +Homebrew & Demos = Homebrew e demos +How to get games = Como consigo xogos? +How to get homebrew & demos = Como consigo homebrew e demos? +Load = Cargar... +Loading... = Loading... +PinPath = Pin +PPSSPP can't load games or save right now = PPSSPP can't load games or save right now +Recent = Recentes +SavesAreTemporary = PPSSPP is saving in temporary storage +SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently +SavesAreTemporaryIgnore = Ignore warning +UnpinPath = Unpin +www.ppsspp.org = Sitio oficial + +[MainSettings] +Audio = Son +Controls = Controis +Graphics = Gráficos +Networking = Xogo en rede +System = Sistema +Tools = Tools + +[MappableControls] +Alt speed 1 = Alt speed 1 +Alt speed 2 = Alt speed 2 +An.Down = An.Abaixo +An.Left = An.Esquerda +An.Right = An.Dereita +An.Up = An.Arriba +Analog limiter = Limitador analóx. +Analog Stick = Stick analóxico +Audio/Video Recording = Audio/Video recording +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Invertir eixes +Circle = Circle +Cross = Cross +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = DevMenu +Down = D-Pad Abaixo +Dpad = D-Pad +Frame Advance = Frame advance +Hold = Hold +Home = Home +L = L +Left = D-Pad Esquerda +Load State = Cargar estado +Mute toggle = Mute toggle +Next Slot = Seguinte ranura +None = None +Note = Note +OpenChat = Open chat +Pause = Pausa +R = R +RapidFire = Fogo rápido +Remote hold = Remote hold +Rewind = Rebobinar +Right = D-Pad Dereita +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = AnDer.Abaixo +RightAn.Left = AnDer.Esquerda +RightAn.Right = AnDer.Dereita +RightAn.Up = AnDer.Arriba +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Gardar estado +Screen = Screen +Screenshot = Screenshot +Select = Select +SpeedToggle = Alternar veloc. +Square = Square +Start = Start +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = Toggle fullscreen +Toggle mode = Toggle mode +Triangle = Triangle +Unthrottle = Modo turbo +Up = D-Pad Arriba +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Visitar foro de xogo en rede +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Cambiar dirección MAC +Change proAdhocServer Address = Cambiar IP de proAdhocServer (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Activar servidor Adhoc PRO integrado +Enable network chat = Enable network chat +Enable networking = Activar xogo en rede/WLAN (beta) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Rede inicializada +Please change your Port Offset = Please change your port offset +Port offset = Port offset(0 = PSP compatibility) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Send Discord "Rich Presence" information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = Trucos +Continue = Continuar +Create Game Config = Crear config. do xogo +Delete Game Config = Borrar config. do xogo +Exit to menu = Saír ó menú +Game Settings = Axustes do xogo +Load State = Cargar estado +Rewind = Rebobinar +Save State = Gardar estado +Settings = Axustes xerais +Switch UMD = Cambiar UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA + cor +Amount = Amount +Black border = Black border +Bloom = Brillo +Brightness = Brightness +Cartoon = Debuxos animados +ColorCorrection = Color correction +Contrast = Contrast +CRT = Monitor con «scanlines» (CRT) +FXAA = Antialiasing FXAA +Gamma = Gamma +Grayscale = Escala de grises +Intensity = Intensity +InverseColors = Invertir cores +Natural = Cores naturais +NaturalA = Natural Colors (no blur) +Off = Non +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlines (CRT) +Sharpen = Afiado +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 «upscaler» +VideoSmoothingAA = VideoSmoothingAA +Vignette = Viñeta + +[PSPCredits] +all the forum mods = all the forum mods +build server = build server +Buy Gold = Comprar PPSSPP +check = También recomendamoste o emulador de GC/Wii Dolphin: +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = Colaboradores: +created = Creado por: +Discord = Discord +info1 = Só para propósitos educativos +info2 = Asegúrate de ter os dereitos de cualquer xogo +info3 = que uses, xa sexa do UMD orixinal ou dunha copia dixital +info4 = de PSN coa túa PSP orixinal. +info5 = PSP é unha marca rexistrada de Sony Corporation. +iOS builds = iOS builds +license = Software libre baixo licencia GPL 2.0+ +list = foro oficial, fíos de discusión e lista de compatibilidade +PPSSPP Forums = Foro PPSSPP +Privacy Policy = Privacy policy +Share PPSSPP = Compartir... +specialthanks = Agradecementos especiais a: +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = Traducido por: +title = Emulador de PSP rápido e portable +tools = Software libre utilizado: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = PpmeiS, Puniasterus e Swyter. +translators2 = +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Sitio web oficial: +written = Escrito en linguaxe C++ para unha mellor portabilidade e velocidade + +[RemoteISO] +Browse Games = Browse games +Local Server Port = Local server port +Manual Mode Client = Manual mode client +Remote disc streaming = Remote disc streaming +Remote Port = Remote port +Remote Server = Remote server +Remote Subdirectory = Remote subdirectory +RemoteISODesc = Games in your recent list will be shared +RemoteISOLoading = Connected, loading game list... +RemoteISOScanning = Scanning... Click "share games" on your server device +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Note: Connect both devices to the same Wi-Fi network +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Settings +Share Games (Server) = Share games (server) +Share on PPSSPP startup = Share on PPSSPP startup +Stop Sharing = Stop sharing +Stopping.. = Stopping... + +[Reporting] +Bad = Malos +FeedbackDelayInfo = Your data is being submitted in the background. +FeedbackDesc = Como vai o xogo? Que o saiba a comunidade! +FeedbackDisabled = Compatibility server reports must be enabled. +FeedbackIncludeCRC = Note: Battery will be used to send a disc CRC +FeedbackIncludeScreen = Include a screenshot +FeedbackSubmitDone = Your data has been submitted. +FeedbackSubmitFail = Could not submit data to server. Try updating PPSSPP. +FeedbackThanks = Thanks for your feedback! +Gameplay = Xogabilidade +Graphics = Gráficos +Great = Xeniais +In-game = Funciona +In-game Description = Gets into gameplay, but too buggy to complete +Menu/Intro = Menú/Intro +Menu/Intro Description = Can't get into the game itself +Nothing = Nada +Nothing Description = Completely broken +OK = Bos +Open Browser = Abrir navegador +Overall = Xeral +Perfect = Perfecto +Perfect Description = Flawless emulation for the entire game - great! +Plays = Xogable +Plays Description = Fully playable but might be with glitches +ReportButton = Informar de erro +Speed = Velocidade +Submit Feedback = Enviar informe +SuggestionConfig = See reports on website for good settings. +SuggestionCPUSpeed0 = Disable locked CPU speed setting. +SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this bug). +SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. +SuggestionsNone = This game isn't working for other users too. +SuggestionsWaiting = Submitting and checking other users feedback... +SuggestionUpgrade = Upgrade to a newer PPSSPP build. +SuggestionVerifyDisc = Check your ISO is a good copy of your disc. +Unselected Overall Description = How well does this game emulate? +View Feedback = View all feedbacks + +[Savedata] +Date = Date +Filename = Filename +No screenshot = No screenshot +None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Save Data = Save data +Save States = Save states +Savedata Manager = Savedata manager +Size = Size + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = AVISO: Chainfire3D detectado, pode causar problemas. +Failed to load state = Erro ó cargar o estado +Failed to save state = Error ó gardar o estado +fixed = Velocidad: alternativa +GLToolsWarning = AVISO: GLTools detectado, pode causar problemas. +In menu = In menu +Load savestate failed = Erro ó cargar o estado gardado +Loaded State = Estado cargado +Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +LoadStateDoesntExist = Erro ó cargar o estado: non existe o arquivo. +LoadStateWrongVersion = Erro ó cargar o estado: o arquivo é dunha versión anterior de PPSSPP. +norewind = Non hai estados gardados de rebobinado dispoñibles. +Playing = Playing +PressESC = Presiona Esc para abrir o menú de pausa. +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = Erro ó gardar o estado. +Saved State = Estado gardado +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Speed: alternate 2 +standard = Velocidad: estándar +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = Xa instalado +Connection Error = Erro de conexión +Install = Instalar +Launch Game = Launch game +Loading... = Cargando... +MB = MB +Size = Tamaño +Uninstall = Desinstalar + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d cores) +%d bytes = %d bytes +(none detected) = (none detected) +3D API = 3D API +ABI = ABI +API Version = API version +Audio Information = Audio information +Board = Board +Build Config = Build config +Build Configuration = Build Configuration +Built by = Built by +Core Context = Core context +Cores = Cores +CPU Extensions = CPU extensions +CPU Information = CPU information +CPU Name = Name +D3DCompiler Version = D3DCompiler version +Debug = Debug +Debugger Present = Debugger present +Device Info = Device info +Display Information = Display information +Driver Version = Driver version +EGL Extensions = EGL extensions +Frames per buffer = Frames per buffer +GPU Information = GPU information +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Lang/Region +Memory Page Size = Memory page size +Native Resolution = Native resolution +OGL Extensions = OGL extensions +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 extensions +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 extensions +OpenGL Extensions = OpenGL extensions +Optimal frames per buffer = Optimal frames per buffer +Optimal sample rate = Optimal sample rate +OS Information = OS information +PPSSPP build = PPSSPP build +Refresh rate = Refresh rate +Release = Release +RW/RX exclusive = RW/RX exclusive +Sample rate = Sample rate +Shading Language = Shading language +Sustained perf mode = Sustained perf mode +System Information = System information +System Name = Name +System Version = System version +Threads = Threads +Vendor = Vendor +Vendor (detected) = Vendor (detected) +Version Information = Version information +Vulkan Extensions = Vulkan extensions +Vulkan Features = Vulkan features + +[System] +(broken) = (broken) +12HR = 12 hrs +24HR = 24 hrs +Auto = Auto +Auto Load Savestate = Auto load savestate +AVI Dump started. = AVI dump started +AVI Dump stopped. = AVI dump stopped +Cache ISO in RAM = Cargar ISO completa en RAM +Change CPU Clock = Velocidade CPU PSP (unstable) +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Cambiar alcume PSP +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = Trucos (beta, ver foros) +Clear Recent = Clear "Recent" +Clear Recent Games List = Borrar lista de xogos recentes +Clear UI background = Clear UI background +Confirmation Button = Botón de confirmación +Date Format = Formato de data +Day Light Saving = Horario de verán +DDMMYYYY = DD/MM/AAAA +Decrease size = Decrease size +Developer Tools = Ferramentas de desenrolo +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emulación +Enable Cheats = Activar trucos +Enable Compatibility Server Reports = Enviar informes de compatibilidade +Failed to load state. Error in the file system. = Erro ó cargar o estado. Fallo no sistema de arquivos. +Failed to save state. Error in the file system. = Failed to save state. Error in the file system. +Fast (lag on slow storage) = Rápido (lag en almacenamento lento) +Fast Memory = Memoria rápida (inestable) +Force real clock sync (slower, less lag) = Forzar sinc. real de reloxo (lento, menos lag) +frames, 0:off = frames, 0 = off +Games list settings = Games list settings +General = Xeral +Grid icon size = Grid icon size +Help the PPSSPP team = Axuda ó equipo de PPSSPP +Host (bugs, less lag) = Anfitrión (Erros, menos lag) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Interpreter +IO timing method = Método de sincronización de E/S +IR Interpreter = IR interpreter +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = Memory Stick inserted +MHz, 0:default = MHz, 0 = default +MMDDYYYY = MM/DD/AAAA +Newest Save = Newest save +Not a PSP game = Not a PSP game +Off = Off +Oldest Save = Oldest save +PSP Model = Modelo de PSP +PSP Settings = Axustes de PSP +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Record audio +Record Display = Record display +Reset Recording on Save/Load State = Reset recording on Save/Load state +Restore Default Settings = Reestablecer axustes +Rewind Snapshot Frequency = Frecuencia de rebobinado de instantánea (mem hog) +Save path in installed.txt = Carpeta de gardado en installed.txt +Save path in My Documents = Carpeta de gardado en Meus documentos +Savestate Slot = Ranura de estado gardado +Savestate slot backups = Savestate slot backups +Screenshots as PNG = Capturas en PNG +Set UI background... = Set UI background... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Simular retardo UMD +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Storage full +Sustained performance mode = Sustained performance mode +Time Format = Formato de hora +UI = Interfaz de usuario +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) +Use O to confirm = Confirmar co botón O +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = Confirmar co botón X +VersionCheck = Buscar actualizacións de PPSSPP +WARNING: Android battery save mode is on = WARNING: Android battery save mode is On +WARNING: Battery save mode is on = WARNING: Battery save mode is on +YYYYMMDD = AAAA/MM/DD + +[Upgrade] +Details = Details +Dismiss = Cancelar +Download = Descargar +New version of PPSSPP available = Nova versión de PPSSPP dispoñible diff --git a/assets/lang/gr_EL.ini b/assets/lang/gr_EL.ini new file mode 100644 index 0000000000..3983b43c00 --- /dev/null +++ b/assets/lang/gr_EL.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = Backend ήχου (Απ. Επανεκκίνηση) +AudioBufferingForBluetooth = Buffer φιλικό για Bluetooth (αργό) +Auto = Αυτόματο +Device = Συσκευή +DSound (compatible) = DSound (συμβατό) +Enable Sound = Ενεργοποίηση Ήχου +Global volume = Γενική ένταση +Microphone = Microphone +Microphone Device = Microphone device +Mute = Σίγαση +Switch on new audio device = Ενεργοποίηση νέας συσκευής ήχου +Use global volume = Χρήση γενικής έντασης +WASAPI (fast) = WASAPI (γρήγορο) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Ευαισθησία αναλογικού άξονα +Analog Limiter = Περιορισμός αναλογικού +Analog Mapper High End = High-end mapper αναλογικού μοχλού (Ευαισθησία αξόνων) +Analog Mapper Low End = Low-end mapper αναλογικού μοχλού (αντιστροφή ορίων) +Analog Mapper Mode = Λειτουργία mapper αναλογικού +Analog Stick = Αναλογικός μοχλός +AnalogLimiter Tip = Όταν το κουμπί περιορισμού αναλογικού είναι πατημένο +Auto = Αυτόματο +Auto-centering analog stick = Αυτόματος κεντρισμός αναλογικού μοχλού +Auto-hide buttons after seconds = Αυτόματη απόκρυψη κουμπιών (χρονικό όριο) +Binds = Binds +Button Opacity = Διαφάνεια Κουμπιών +Button style = Στυλ Κουμπιών +Calibrate D-Pad = Βαθμονόμηση +Calibration = Βαθμονόμηση ψηφιακού πληκρολογίου +Classic = Κλασικό +Combo Key Setting = Ρύθμιση συνδιασμού κουμπιών +Combo Key Setup = Διάταξη συνδιασμού κουμπιών +Confine Mouse = Εγκλωβισμός ποντικιού μέσα στην περιοχή παραθύρου/οθόνης +Control Mapping = Χαρτογράφηση κουμπιών +Custom layout... = Προσαρμοσμένη διάταξη... +Customize tilt = Προσαρμογή κλίσης... +D-PAD = Ψηφιακό πληκτρολόγιο +Deadzone Radius = Ακτίνα ορίων +DInput Analog Settings = Ρυθμίσεις Αναλογικού DInput +Disable D-Pad diagonals (4-way touch) = Απενεργοποίηση διαγωνίων ψηφιακού πληκρολογίου +Glowing borders = Φωτιζόμενα σύνορα +HapticFeedback = Απτική Ανάδραση (δόνηση) +Ignore gamepads when not focused = Αγνόηση χειριστήριου όταν το παράθυρο δεν είναι σε πρώτο πλάνο +Ignore Windows Key = Αγνόηση πλήκτρου Windows +Invert Axes = Αντιστροφή αξόνων +Invert Tilt along X axis = Αντιστροφή κλίσης οριζόντιου άξονα +Invert Tilt along Y axis = Αντιστροφή κλίσης κάθετου του άξονα +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Ρυθμίσεις χειρισμού πληκτρολογίου +L/R Trigger Buttons = Πλήκτρα σκανδάλης L/R +Landscape = Τοπίο +Landscape Auto = Τοπίο αυτόματο +Landscape Reversed = Τοπίο (αναστροφή) +Mouse = Ρυθμίσεις ποντικιού +Mouse sensitivity = Ευαισθησία ποντικιού +Mouse smoothing = Εξομάλυνση ποντικιού +MouseControl Tip = Τωρα μπορείτε να ρυθμίσετε το ποντίκι στην οθόνη χαρτογράφησης ελέγχου πατώντας το εικονίδιο "M". +None (Disabled) = Κανένα (απενεργοποιημένο) +Off = Off +OnScreen = Χειριστήριο Οθόνης Αφής +Portrait = Πορτραίτο +Portrait Reversed = Πορτραίτο (αναστροφή) +PSP Action Buttons = Πλήκτρα δράσης PSP +Screen Rotation = Περιστροφή οθόνης +seconds, 0 : off = δευτερόλεπτα, 0 = off +Sensitivity = Ευαισθησία +Show right analog = Show right analog +Show Touch Pause Menu Button = Εμφάνιση απτικού κουμπιού μενού παύσης +Thin borders = Λεπτά διαχωριστικά +Tilt Base Radius = Tilt base radius +Tilt Input Type = Τύπο εισόδου κλίσης +Tilt Sensitivity along X axis = Ευαισθησία οριζόντιου άξονα +Tilt Sensitivity along Y axis = Ευαισθησία κάθετου άξονα +To Calibrate = Για τη βαθμονόμηση, αφήστε τη συσκευή σε μια επίπεδη επιφάνεια και πατήστε "Βαθμονόμηση". +Touch Control Visibility = Ορατότητα πλήκτρων αφής +Use custom right analog = Use custom right analog +Use Mouse Control = Χρήση ελέγχου του ποντικιού +Visibility = Ορατότητα +X = X +X + Y = X + Y +XInput Analog Settings = Ρυθμίσεις Αναλογικού XInput +Y = Y + +[CwCheats] +Cheats = Κωδικοί +Edit Cheat File = Επεξεργασία αρχείου κωδικών +Enable/Disable All = Ενεργοπ./Απενεργοπ. Όλων +Import Cheats = Εισαγωγή από cheat.db +Options = Ρυθμίσεις +Refresh Rate = Ρυθμός ανανέωσης + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = &Περί του PPSSPP... +Auto = &Αυτόματο +Backend = Σύστημα Υποστήριξης (επανεκκινεί το PPSSPP) +Bicubic = &Διακυβική +Break = Break +Break on Load = Break on load +Buffered Rendering = Απεικόνιση με Buffer +Buy Gold = Αγορά &Gold +Control Mapping... = Χαρτογράφηση Κουμπιών... +Debugging = Αποσφαλμάτωση +Deposterize = Ε&ξομάλυνση Διαβαθμίσεων +Direct3D9 = &Direct3D9 +Direct3D11 = Direct3D11 +Disassembly = Αποσυναρμολόγηση... +Discord = Discord +Display Layout Editor = Επεξεργασία διάταξης οθόνης... +Display Rotation = Περιστροφή Οθόνης +Dump Next Frame to Log = Αποτύπωση πλαισίου σε καταγραφέα +Emulation = Εξομοίωση +Enable Chat = Enable chat +Enable Cheats = Ενεργοποίηση Κωδικών +Enable Sound = Ενεργοποίηση Ήχου +Exit = Έξοδος +Extract File... = Εξαγωγή αρχείου... +File = &Αρχείο +Frame Skipping = Παράκαμψη Καρέ +Frame Skipping Type = Τύπος Παράκαμψης Καρέ +Fullscreen = Πλήρης Οθόνη +Game Settings = Ρυθμίσεις Παιχνιδιού +GE Debugger... = Αποσφαλματωτής GE... +GitHub = GitHub +Hardware Transform = Με&τασχηματισμός Υλικού +Help = &Βοήθεια +Hybrid = &Υβριδική +Hybrid + Bicubic = Υ&βριδική + Διακυβική +Ignore Illegal Reads/Writes = Αγνόηση Παράνομων Αναγνώσεων/Εγγραφών +Ignore Windows Key = Αγνόηση πλήκτρου Windows +Keep PPSSPP On Top = Κράτημα PPSSPP στο προσκήνιο +Landscape = Οριζόντιο προσανατολισμός +Landscape reversed = Αντεστραμένος οριζόντιος προσανατολισμός +Language... = &Γλώσσα... +Linear = Γραμμικό +Load = &Φόρτωση... +Load .sym File... = Φόρτωση αρχείου .sym ... +Load Map File... = Φόρτωση Αρχείου Χάρτη... +Load State = Γρήγορη Φόρτωση +Load State File... = Φόρτωση Σημείου Αποθήκευσης... +Log Console = Κονσόλα Καταγραφέα +Memory View... = Προβολή Μνήμης... +More Settings... = Περισσότερες Ρυθμίσεις... +Nearest = Κοντινότερο +Non-Buffered Rendering = &Παράκαμψη εφέ buffer (γρηγορότερο) +Off = &Off +Open Directory... = Άνοιγμα Φακέλου... +Open from MS:/PSP/GAME... = Άνοιγμα από MS:/PSP/GAME... +Open Memory Stick = Άνοιγμα Memory Stick +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = &Πάυση +Pause When Not Focused = Παύση σε κατάσταση παρασκηνίου +Portrait = Κατακόρυφο προσανατολισμός +Portrait reversed = Αντεστραμένος κατακόρυφος προσανατολισμός +Postprocessing Shader = Shader Μετεπεξεργασίας +PPSSPP Forums = PPSSPP &Forum +Record = Καταγραφή +Record Audio = Καταγραφή Ήχου +Record Display = Καταγραφή Εικόνας +Rendering Mode = Τρόπος Απεικόνισης +Rendering Resolution = Αναλυση Απεικόνισης +Reset = Επα&νεκκίνηση +Reset Symbol Table = Επαναφορά Πίνακα Συμβόλων +Run = &Εκκίνηση +Save .sym File... = Αποθήκευση Αρχείου .sym ... +Save Map File... = Αποθήκευση Αρχείου Χάρτη... +Save State = Γρήγορη Αποθήκευση +Save State File... = Αποθήκευση Σημείου Αποθήκευσης... +Savestate Slot = Slot Σημείου Αποθήκευσης +Screen Scaling Filter = Φίλτρο κλιμάκωσης οθόνης +Show Debug Statistics = Εμφάνισ&η Στατιστικών Αποσφαλμάτωσης +Show FPS Counter = Εμφάνι&ση μετρητή FPS +Skip Number of Frames = Παράκαμψη αριθμών καρέ +Skip Percent of FPS = Παράκαμψη προσοστού αριθμών καρέ +Stop = &Σταμάτημα +Switch UMD = Αλλαγή UMD +Take Screenshot = Δημιουργία Στιγμιότυπου +Texture Filtering = Φιλτράρισμα Υφών +Texture Scaling = Κλιμάκωση Υφών +Use Lossless Video Codec (FFV1) = Χρήση μη απολεστικού κωδικοποιητή (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = Π&ροσωρινή Μνήμη Κορυφών +VSync = Κά&θετος Συγχρονισμός +Vulkan = Vulkan +Window Size = Μέγεθος Παραθύρου +www.ppsspp.org = Επισκεψη www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Προβολή Allocator (Vulkan) +Allow remote debugger = Επιτροπή απομακρυσμένου εντοπισμού σφαλμάτων +Backspace = Backspace +Block address = Διεύθυνση Block +By Address = Κατά διεύθυνση +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Δημιουργία/Άνοιγμα αρχείου textures.ini για το τρέχον παιχνίδι +Current = Τρέχον +Dev Tools = Εργαλεία ανάπτυξης +DevMenu = DevMenu +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Εξαγωγή αποκρυπτογραφημένου EBOOT.BIN κατά την έναρξη +Dump Frame GPU Commands = Εξαγωγή εντολών frame GPU +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Ενεργοποίηση καταγραφής αποσφαλμάτωσης +Enter address = Διεύθυνση Enter +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Profiler πλαισίου +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = Σύγκριση Jit +JIT debug tools = JIT debug tools +Language = Γλώσσα +Load language ini = Φόρτωση ini γλώσσας +Log Dropped Frame Statistics = Καταγραφή Στατιστικών για Dropped Frames +Log Level = Επίπεδο καταγραφής +Log View = Εμφάνιση καταγραφέα +Logging Channels = Καταγραφή καναλιών +Next = Επόμενο +No block = Κανένα block +Prev = Προηγούμενο +Random = Τυχαίο +Replace textures = Αντικαταστήστε τις υφές +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Είστε σίγουροι ότι θέλετε να επαναφέρετε όλες τις ρυθμίσεις πίσω στις \nπροεπιλογές τους; Οι ρυθμίσεις χαρτογράφισης κουμπιών δεν θα αλλάξουν.\n\nΔεν μπορείτε να αναιρέσετε αυτή την επιλογή.\nΠαρακαλούμε επανεκκινήστε το PPSSPP για να \nτεθούν σε ισχύ οι αλλαγές. +RestoreGameDefaultSettings = Είστε σίγουροι ότι θέλετε να επαναφέρετε τις ρυθμίσεις παιχνιδιού\nστις προεπιλεγμένες του PPSSPP; +Resume = Resume +Run CPU Tests = Εκκίνηση τέστ CPU +Save language ini = Αποθήκευση ini γλώσσας +Save new textures = Αποθήκευση νέων υφών +Shader Viewer = Προβολέας Shader +Show Developer Menu = Εμφάνιση μενού προγραμματιστών +Show on-screen messages = Show on-screen messages +Stats = Στατιστικά +System Information = Πληροφορίες Συστήματος +Texture Replacement = Αντικατάσταση υφών +Toggle Audio Debug = Εναλλαγή debug ήχου +Toggle Freeze = Πάγωμα Εναλαγής +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * ανάλυση PSP +Active = ΕΝΕΡΓΟ +Back = ΠΙΣΩ +Cancel = ΑΚΥΡΟ +Center = ΚΕΝΤΡΟ +ChangingGPUBackends = Η αλλαγή Συστημάτων Υποστήριξης GPU απαιτεί επανεκκίνηση του PPSSPP. Επανεκκίνηση τώρα? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = Επιλογή φακέλου αποθήκευσης PPSSPP +Confirm Overwrite = ΑΝΤΙΚΑΤΑΣΤΑΣΗ ΔΕΔΟΜΕΝΩΝ; +Confirm Save = ΑΠΟΘΗΚΕΥΣΗ ΔΕΔΟΜΕΝΩΝ; +ConfirmLoad = ΦΟΡΤΩΣΗ ΔΕΔΟΜΕΝΩΝ; +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = ΔΙΑΓΡΑΦΗ +Delete all = ΔΙΑΓΡΑΦΗ ΟΛΩΝ +Delete completed = ΔΙΑΓΡΑΦΗ ΟΛΟΚΛΗΡΩΘΗΚΕ +DeleteConfirm = ΤΑ ΔΕΔΟΜΕΝΑ ΘΑ ΔΙΑΦΡΑΦΟΥΝ.\nΕΙΣΤΕ ΣΙΓΟΥΡΟΙ; +DeleteConfirmAll = ΘΕΛΕΤΕ ΝΑ ΔΙΑΦΡΑΨΕΤΕ ΟΛΑ\nΤΑ ΔΕΔΟΜΕΝΑ ΓΙ' ΑΥΤΟ ΤΟ ΠΑΙΧΝΙΔΙ; +DeleteConfirmGame = ΘΕΛΕΤΕ ΝΑ ΔΙΑΓΡΑΨΕΤΕ ΑΥΤΟ ΤΟ ΠΑΙΧΝΙΔΙ ΑΠΟ \nΤΗΝ ΣΥΣΚΕΥΗ ΣΑΣ; ΔΕΝ ΜΠΟΡΕΙΤΕ ΝΑ ΑΝΑΙΡΕΣΕΤΕ ΤΗΝ ΕΠΙΛΟΓΗ ΣΑΣ. +DeleteConfirmGameConfig = Είστε σίγουροι ότι θέλετε να διαγράψετε τις ρυθμίσεις για αυτό το παιχνίδι; +DeleteFailed = ΑΔΥΝΑΜΙΑ ΔΙΑΓΡΑΦΗΣ ΔΕΔΟΜΕΝΩΝ. +Deleting = ΔΙΑΓΡΑΦΗ\nΠΑΡΑΚΑΛΩ ΠΕΡΙΜΕΝΕΤΕ... +Disable All = ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ ΟΛΩΝ +Edit = Edit +Enable All = ΕΝΕΡΓΟΠΟΙΗΣΗ ΟΛΩΝ +Enter = Enter +Finish = ΤΕΛΟΣ +Grid = Grid +Inactive = ΑΝΕΝΕΡΓΟ +InternalError = An internal error has occurred. +Load = ΦΟΡΤΩΣΗ +Load completed = ΦΟΡΤΩΣΗ ΟΛΟΚΛΗΡΩΘΗΚΕ +Loading = ΦΟΡΤΩΣΗ\nΠΑΡΑΚΑΛΩ ΠΕΡΙΜΕΝΕΤΕ... +LoadingFailed = ΑΔΥΝΑΜΙΑ ΦΟΡΤΩΣΗΣ ΔΕΔΟΜΕΝΩΝ. +Move = ΜΕΤΑΚΙΝΗΣΗ +Network Connection = ΣΥΝΔΕΣΗ ΔΙΚΤΥΟΥ +NEW DATA = ΝΕΑ ΔΕΔΟΜΕΝΑ +No = ΟΧΙ +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = OK +Old savedata detected = Εντοπίστηκαν παλαιά αρχεία αποθήκευσης +Options = ΕΠΙΛΟΓΕΣ +Reset = ΕΠΑΝΑΦΟΡΑ +Resize = ΑΛΛΑΓΗ ΜΕΓΕΘΟΥΣ +Retry = ΕΠΑΝΑΛΗΨΗ +Save = ΑΠΟΘΗΚΕΥΣΗ +Save completed = ΑΠΟΘΗΚΕΥΣΗ ΟΛΟΚΛΗΡΩΘΗΚΕ. +Saving = ΑΠΟΘΗΚΕΥΣΗ\nΠΑΡΑΚΑΛΩ ΠΕΡΙΜΕΝΕΤΕ... +SavingFailed = ΑΔΥΝΑΜΙΑ ΑΠΟΘΗΚΕΥΣΗΣ ΔΕΔΟΜΕΝΩΝ. +Select = Select +Shift = Shift +Snap = Snap +Space = ΚΕΝΟ +SSID = SSID +Submit = ΥΠΟΒΟΛΗ +Supported = Supported +There is no data = ΔΕΝ ΥΠΑΡΧΟΥΝ ΔΕΔΟΜΕΝΑ +Toggle All = ΕΝΑΛΛΑΓΗ ΟΛΩΝ +Toggle List = Toggle list +Unsupported = Unsupported +When you save, it will load on a PSP, but not an older PPSSPP = Όταν αποθηκεύετε, θα φορτώσει στο PSP, αλλά όχι σε μια παλαιότερη έκδοση του PPSSPP +When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Yes = ΝΑΙ +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = Το αρχείο είναι συμπισμένο(7z).\nΠαρακαλώ αποσυμπιέστε το πρώτα (δοκιμάστε το 7-Zip ή το WinRAR). +A PSP game couldn't be found on the disc. = Δεν βρέθηκαν παιχνίδια PSP στο δίσκο. +Cannot boot ELF located outside mountRoot. = Δεν μπορεί να φορτωθεί ELF που βρίσκεται εκτός mountRoot. +Could not save screenshot file = Αδυναμία αποθήκευσης αποτύπωσης οθόνης. +D3D9or11 = Direct3D 9? (ή "όχι" για Direct3D 11) +D3D11CompilerMissing = Δεν βρέθηκε το D3DCompiler_47.dll. Παρακαλούμε να το εγκαταστήστε. Ή πατήστε Ναι για να δοκιμάσετε ξανά χρησιμοποιώντας το Direct3D 9. +D3D11InitializationError = Σφάλμα αρχικοποίησης του Direct3D 11 +D3D11Missing = Το λειτουργικό σύστημα δέν υποστηρίζει το D3D11. Παρακαλώ να τρέξετε το Windows Update.\n\nΠατήστε Ναι για να δοκιμάσετε ξανά χρησιμοποιώντας το Direct3D 9. +D3D11NotSupported = Η κάρτα γραφικών δεν υποστηρίζει το Direct3D 11.\n\nΝα χρησιμοποιηθεί το Direct3D 9 αντιθέτως? +Disk full while writing data = Ο δίσκος βρέθηκε γεμάτος κατά την εγγραφή δεδομένων. +ELF file truncated - can't load = Το αρχείο ELF είναι περικομμένο - αδυναμία φόρτωσης +Error loading file = Σφάλμα ανάγνωσης αρχείου +Error reading file = Σφάλμα ανάγνωσης αρχείου. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = Σφάλμα προσδιορισμού αρχείου. +Failed to load executable: = Αδυναμιά φόρτωσης εκτελέσιμου αρχείου: +File corrupt = Κατεστραμμένο αρχείο +Game disc read error - ISO corrupt = Σφάλμα ανάγνωσης δίσκου: κατεστραμμένο ISO. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Σφάλμα αρχικοποίησης γραφικών. Προσπαθήστε να κάνετε αναβάθμιση των drivers και του DirectX 9.\n\nΘα θέλατε να κάνετε αλλαγή απεικόνισης σε OpenGL?\n\nΜήνυμα σφάλματος: +GenericGraphicsError = Σφάλμα γραφικών +GenericOpenGLError = Σφάλμα αρχικοποίησης γραφικών. Προσπαθήστε να κάνετε αναβάθμιση των drivers.\n\nΘα θέλατε να κάνετε αλλαγή απεικόνισης σε DirectX 9?\n\nΜήνυμα σφάλματος: +GenericVulkanError = Σφάλμα αρχικοποίησης γραφικών. Προσπαθήστε να κάνετε αναβάθμιση των drivers.\n\nΘα θέλατε να κάνετε αλλαγή απεικόνισης σε OpenGL?\n\nΜήνυμα σφάλματος: +InsufficientOpenGLDriver = Ανεπαρκής υποστήριξη του οδηγού OpenGL!\n\nΗ κάρτα γραφικών σας αναφέρει σας ότι δεν υποστηρίζει OpenGL 2.0, που απαιτείται για να τρέξει το PPSSPP.\n\nΠαρακαλώ ελέγξτε ότι η κάρτα γραφικών σας είναι συμβατή με OpenGL 2.0. Αν είναι, θα πρέπει να βρείτε και να εγκαταστήσετε το νέο προγράμματα οδήγησης γραφικών από την ιστοσελίδα προμηθευτή σας.\n\nΕπισκεφτείτε τα forums στο https://forums.ppsspp.org για περισσότερες πληροφορίες. +Just a directory. = Είναι μόνο φάκελος. +Missing key = Λείπει κλειδί +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = Κανένα EBOOT.PBP, σφάλμα προσδιορισμού παιχνιδιού. +Not a valid disc image. = Μη έγκυρη εικόνα δίσκου. +OpenGLDriverError = Σφάλμα προγράμματος οδήγησης OpenGL +PPSSPP doesn't support UMD Music. = Το PPSSPP δεν είναι συμβατό με τίτλους UMD Music. +PPSSPP doesn't support UMD Video. = Το PPSSPP δεν είναι συμβατό με τίτλους UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = Το PPSSPP δεν υποστηρίζει προσωρινά την σύνδεση δικτύου για DLC, PSN, ή ενημερώσεις παιχνιδιών. +PS1 EBOOTs are not supported by PPSSPP. = Τα PS1 EBOOTS δεν υποστυρίζονται απ' το PPSSPP. +PSX game image detected. = Το αρχείο είναι αρχείο εικόνας MODE2. Προσπαθείτε να ανοίξετε παιχνίδι για το PSX; +RAR file detected (Require UnRAR) = Το αρχείο είναι συμπισμένο (RAR).\nΠαρακαλώ αποσυμπιέστε το πρώτα (δοκιμάστε το UnRAR). +RAR file detected (Require WINRAR) = Το αρχείο είναι συμπισμένο (RAR).\nΠαρακαλώ αποσυμπιέστε το πρώτα (δοκιμάστε το WinRAR). +Running slow: try frameskip, sound is choppy when slow = Αργή εξομοίωση: δοκιμάστε την παράκαμψη καρέ, ο ήχος είναι ασταθής όταν η εξομοίωση είναι αργή +Running slow: Try turning off Software Rendering = Αργή εξομοίωση: δοκιμάστε να απενεργοποιήσετε την "απόδοση λογισμικού" +Save encryption failed. This save won't work on real PSP = Αποτυχία κρυπτογράφησης του αρχείου αποθήκευσης. Αυτό το αρχείο δέν θα δουλέψει σε ένα πραγματικό PSP +textures.ini filenames may not be cross-platform = Τα όνοματα αρχείων "textures.ini" ενδέχεται να μην είναι cross-platform. +This is a saved state, not a game. = Αυτό είναι ένα σημείου αποθήκευσης, όχι παιχνίδι. +This is save data, not a game. = Αυτό είναι ένα αρχείο αποθήκευσης, όχι παιχνίδι. +Unable to create cheat file, disk may be full = Αδυναμία δημιουργίας αρχείου cheat, Ο δίσκος ενδέχεται να είναι γεμάτος. +Unable to initialize rendering engine. = Αδυναμία προετοιμασίας μηχανισμού απόδοσης. +Unable to write savedata, disk may be full = Αδυναμία εγγραφής savedata, ο δίσκος ενδέχεται να είναι γεμάτος. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Προειδοποίηση: Η μνήμη γραφικών είναι ΠΛΗΡΗΣ, μείωση κλιμάκωσης και μετάβαση σε αργή λειτουργία προσωρινής αποθήκευσης. +Warning: Video memory FULL, switching to slow caching mode = Προειδοποίηση: Η μνήμη γραφικών είναι ΠΛΗΡΗΣ, μετάβαση σε αργή λειτουργία προσωρινής αποθήκευσης. +ZIP file detected (Require UnRAR) = Το αρχείο είναι συμπισμένο (ZIP).\nΠαρακαλώ αποσυμπιέστε το πρώτα (δοκιμάστε το UnRAR). +ZIP file detected (Require WINRAR) = Το αρχείο είναι συμπισμένο (ZIP).\nΠαρακαλώ αποσυμπιέστε το πρώτα (δοκιμάστε το WinRAR). + +[Game] +Asia = Ασία +ConfirmDelete = Διαγραφή +Create Game Config = Δημιουργία ρυθμίσεων παιχνιδιού +Create Shortcut = Δημιουργία Συντόμευσης +Delete Game = Διαγραφή Παιχνιδιού +Delete Game Config = Διαγραφή ρυθμίσεων παιχνιδιού +Delete Save Data = Διαγραφή savedata +Europe = Ευρώπη +Game = Παιχνίδι +Game Settings = Ρυθμίσεις Παιχνιδιού +Homebrew = Homebrew +Hong Kong = Χονγκ Κονγκ +InstallData = Δεδομένα Εγκατάστασης +Japan = Ιαπωνία +Korea = Korea +MB = MB +One moment please... = Μια στιγμή παρακαλώ ... +Play = Εκκίνηση +Remove From Recent = Κατάργηση από τα πρόσφατα +SaveData = Δεδομένα Αποθήκευσης +Setting Background = Ρύθμιση φόντου +Show In Folder = Εμφάνιση σε Φάκελο +USA = ΗΠΑ +Use UI background = Χρήση φόντου UI + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = απεριόριστο +(supersampling) = (supersampling) +(upscaling) = (κλιμάκωση) +1x PSP = 480×272 (1×) +2x = 2× +2x PSP = 960×544 (2×) +3x = 3× +3x PSP = 1440×726 (3×) +4x = 4× +4x PSP = 1920×1088(4×) +5x = 5× +5x PSP = 2400×1360(5×) +6x PSP = 2880×1632 (6×) +7x PSP = 3360×1904 (7×) +8x = 8× +8x PSP = 3840×2176 (8×) +9x PSP = 4320×2448(9×) +10x PSP = 4800×2720(10×) +16x = 16× +Aggressive = Εξαναγκαστική +Alternative Speed = Εναλακτική προβολή ταχύτητας (στα %, 0 = απεριόριστη) +Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Anisotropic Filtering = Ανισοτροπικό Φιλτράρισμα +Auto = Αυτόματο +Auto (1:1) = Αυτόματο (1:1) +Auto (same as Rendering) = Αυτόματο (ίσο με την Ανάλυση Απεικόνισης) +Auto FrameSkip = Αυτόματη Παράκαμψη Καρέ +Auto Scaling = Αυτόματη Κλιμάκωση +Backend = Σύστημα Υποστήριξης +Balanced = Εξισορροπημένη +Bicubic = Διακυβική +BlockTransfer Tip = Ορισμένα παιχνίδια απαιτούν να είναι ενεργοποιημένο για την σωστή επεικόνιση γραφικών. +BlockTransferRequired = Προειδοποίηση: Αυτό το παιχνίδι απαιτεί τη λειτουργία προσομοίωσης εφέ μεταφοράς block να είναι ενεργοποιημένη. +Both = Όλα +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Απεικόνιση με Buffer +BufferedRenderingRequired = Warning: This game requires "rendering mode" to be set to "buffered". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Μέγεθος οθόνης (στα % του παραθύρου) +Cardboard Screen X Shift = μετατόπιση X (στα % του κενού) +Cardboard Screen Y Shift = μετατόπιση Y (στα % του κενού) +Cardboard VR Settings = Ρυθμίσεις Google Cardboard VR +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = Πυρήνες CPU +Debugging = Αποσφαλάτωση +DefaultCPUClockRequired = Προειδοποίηση: Αυτό το παιχνίδι απαιτεί το ρολόι CPU να οριστεί σε προεπιλογή. +Deposterize = Εξομάλυνση Διαβαθμίσεων +Deposterize Tip = Διορθώνει μικρές ατέλειες υφών μετά την κλιμάκωσή τους +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Απενεργοποίηση χρονοβόρων εφέ (άυξηση ταχύτητας) +Disabled = Απενεργοποιημένο +Display layout editor = Επεξεργασία διάταξης οθόνης +Display Resolution (HW scaler) = Ανάλυση οθόνης (Κλιμακοτής hardware) +Dump next frame to log = Αποτύπωση πλαισίου σε καταγραφέα +Enable Cardboard VR = Ενεργοποίηση Cardboard VR +FPS = FPS +Frame Rate Control = Ρυθμίσεις Ρυθμού Καρέ +Frame Skipping = Παράκαμψη Καρέ +Frame Skipping Type = Frame skipping type +FullScreen = Πλήρης Οθόνη +Hack Settings = Ρυθμίσεις Hack +Hardware Tessellation = Tessellation Υλικού +Hardware Transform = Μετασχηματισμός Υλικού +hardware transform error - falling back to software = Σφάλμα Μετασχηματισμού Υλικού, οπισθοχώρηση σε λογισμικό +HardwareTessellation Tip = Χρησιμοποιεί το υλικό για την δημιουργία καμπύλων, χρησιμοποιεί πάντα σταθερή ποιότητα +High = Υψηλή +Hybrid = Υβριδική +Hybrid + Bicubic = Υβριδική + Διακυβική +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Εσωτερική Ανάλυση +Lazy texture caching = Τεμπέλικη προσωρινή μνήμη υφών (ταχύτερο) +Linear = Γραμμικό +Low = Χαμηλή +LowCurves = Ποιότητα καμπυλών spline/bezier +LowCurves Tip = Αυτή η επιλογή θα βελτιώσει/μειώσει σημαντικά την ποιότητα των παρεχόμενων καμπυλών +Lower resolution for effects (reduces artifacts) = Χαμηλότερη ανάλυση για εφέ (λιγότερα προβλήματα) +Manual Scaling = Χειροκίνητη Κλιμάκωση +Medium = Μέτρια +Mode = Τρόπος +Must Restart = Πρέπει να επανεκκινήσετε το PPSSPP για να εφαρμοστούν οι αλλαγές. +Native device resolution = Χρήση ανάλυσης συσκευής +Nearest = Κοντινότερο +No buffer = No buffer +Non-Buffered Rendering = Παράκαμψη εφέ buffer (γρηγορότερο) +None = Καμία +Number of Frames = Number of frames +Off = Ανενεργό +OpenGL = OpenGL +Overlay Information = Πληροφορίες Οθόνης +Partial Stretch = Μερική επέκταση +Percent of FPS = Percent of FPS +Performance = Επίδοσεις +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Shader Μετεπεξεργασίας +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = Τρόπος Απεικόνισης +Rendering Resolution = Ανάλυση Απεικόνισης +RenderingMode NonBuffered Tip = Γρηγορότερο, αλλά σε μερικά αιχνίδια μπορεί να μην εμφανίζει τίποτα +Retain changed textures = Διατηρήστε αλλαγμένων υφών (μερικές φορές αργότερο) +RetainChangedTextures Tip = Κάνει πολλά παιχνίδια πιο αργά, αλλά κάποια άλλα πιο γρήγορα +Rotation = Περιστροφή +Safe = Ασφαλής +Screen layout = Screen layout +Screen Scaling Filter = Φίλτο κλιμάκωσης οθόνης +Show Debug Statistics = Εμφάνιση στατιστικών αποσφαλμάτωσης +Show FPS Counter = Εμφάνιση μετρητή FPS +Simulate Block Transfer = Προσομοίωση εφέ μεταφοράς block +SoftGPU Tip = ΠΟΛΥ αργό +Software Rendering = Απεικόνιση Λογισμικού (πειραματικό) +Software Skinning = Εκδορά Λογισμικού +SoftwareSkinning Tip = Συνδυασμός μοντέλου στην CPU, γρηγορότερο στα περισσότερα παιχνίδια +Speed = Ταχύτητα +Stretching = Επέκταση +Texture Filter = Φίλτρο Υφών +Texture Filtering = Φιλτράρισμα Υφών +Texture Scaling = Κλιμάκωση Υφών +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Απενεργοποιήστε το "Hardware Tessellation": δεν υποστηρίζεται +Unlimited = Απεριόριστο +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = Επίπεδο Κλιμάκωσης +Upscale Type = Τύπος Κλιμάκωσης +UpscaleLevel Tip = Βαρύ για τον επεξεργαστή - κάποια κλιμάκωση μπορεί να καθυστερήσει για να αποφευχθούν κολλήματα +Use all displays = Χρησιμοποιήστε όλες τις οθόνες +Vertex Cache = Προσωρινή Μνήμη Κορυφών +VertexCache Tip = Πιο γρήγορα, αλλά μπορεί να προκαλέσει προσωρινό τρεμόπαιγμα +VSync = Κάθετος Συγχρονισμός +Vulkan = Vulkan +Window Size = Μέγεθος Παραθύρου +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Διαγραφή αρχείου ZIP +Install = Εγκατάσταση +Install game from ZIP file? = Εγκατάσταση παιχνιδιού από το αρχείο ZIP? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = Εγκαταστάθηκε! +Texture pack doesn't support install = Το πακέτο υφής δεν υποστηρίζει την εγκατάσταση +Zip archive corrupt = Το αρχείο ZIP είναι κατεστραμμένο +Zip file does not contain PSP software = Το αρχείο ZIP δεν περιέχει λογισμικό PSP + +[KeyMapping] +Autoconfigure = Αυτόματη ρύθμιση +Autoconfigure for device = Αυτόματη ρύθμιση για τη συσκευή +Clear All = Καθαρισμός +Default All = Επαναφορά +Map a new key for = Πατήστε ένα πλήκτρο για το +Map Key = ΡύΘμιση κουμπιού +Map Mouse = ΡύΘμιση ποντικού +Test Analogs = Δοκιμή Αναλογικού Μοχλού +You can press ESC to cancel. = Μπορείτε να πατήσετε Esc για ακύρωση. + +[MainMenu] +Browse = Αναζήτηση... +Buy PPSSPP Gold = Αγορά PPSSPP Gold +Choose folder = Επιλογή φακέλου +Credits = Συντελεστές +PPSSPP Homebrew Store = PPSSPP Homebrew Store +Exit = Έξοδος +Game Settings = Ρυθμίσεις Παιχνιδιού +Games = Παιχνίδια +Give PPSSPP permission to access storage = Αδειοδότηση PPSSPP για πρόσβαση σε χώρο αποθήκευσης +Homebrew & Demos = Προγράμματα && Demos +How to get games = Πώς να πάρετε τα παιχνίδια +How to get homebrew & demos = Πώς να κατεβάσετε homebrew & demos +Load = Φόρτωση +Loading... = Φόρτωση... +PinPath = Καρφίτσωμα +PPSSPP can't load games or save right now = Το PPSSPP δεν μπορεί να φορτώσει παιχνίδια ή να αποθηκεύσει αυτή τη στιγμή +Recent = Πρόσφατα +SavesAreTemporary = Το PPSSPP αποθηκεύει σε προσωρινή μνήμη +SavesAreTemporaryGuidance = Εξαγάγετε PPSSPP κάπου για να αποθηκεύσετε μόνιμα +SavesAreTemporaryIgnore = Αγνόηση προειδοποίησης +UnpinPath = Ξεκαρφίτσωμα +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Ήχος +Controls = Χειριστήριο +Graphics = Γραφικά +Networking = Δικτύωση +System = Σύστημα +Tools = Εργαλεία + +[MappableControls] +Alt speed 1 = Εναλ. ταχύτητα 1 +Alt speed 2 = Εναλ. ταχύτητα 2 +An.Down = Αναλ. Κάτω +An.Left = Αναλ. Αριστερά +An.Right = Αναλ. Δεξιά +An.Up = Αναλ. Πάνω +Analog limiter = Περιορισμός αναλογικού μοχλού +Analog Stick = Αναλογικός Μοχλός +Audio/Video Recording = Εγγραφή Ήχου/Video +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Ανταλλαγή αξόνων +Circle = Ο +Cross = X +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = Μενού Προγραμματιστών +Down = Κάτω +Dpad = Ψηφιακό pad +Frame Advance = Επόμενο καρέ +Hold = Hold +Home = Home +L = L +Left = Αριστερά +Load State = Γρήγ Επαναφορά +Mute toggle = Mute toggle +Next Slot = Επόμενο Slot +None = None +Note = Note +OpenChat = Open chat +Pause = Πάυση +R = R +RapidFire = Ταχεία βολή +Remote hold = Remote hold +Rewind = Αντιστροφή +Right = Δεξιά +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = ΔεξίΑν.Κάτω +RightAn.Left = ΔεξίΑν.Αριστερά +RightAn.Right = ΔεξίΑν.Δεξιά +RightAn.Up = ΔεξίΑν.Πάνω +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Γρήγ. Αποθήκευση +Screen = Οθόνη +Screenshot = Αποτύπωση οθόνης +Select = Select +SpeedToggle = Κουμπί Ταχύτητας +Square = Τετράγωνο +Start = Start +Texture Dumping = Εξαγωγή υφών +Texture Replacement = Αντικατάσταση υφών +Toggle Fullscreen = Λειτουργεία πλήρους οθόνης +Toggle mode = Toggle mode +Triangle = Τρίγωνο +Unthrottle = Απελευθέρωση +Up = Πάνω +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Επισκευθείτε το Ad Hoc Multiplayer forum +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Αλλαγή φυσικής διεύθυνσης (MAC) +Change proAdhocServer Address = Αλλαγή διεύθυνσης IP proAdhocServer (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Ενεργοποίηση ενσωματωμένου PRO Adhoc Server +Enable network chat = Enable network chat +Enable networking = Ενεργοποίηση Δικτύου/WLAN (πειραματικό) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Μη έγκυρη IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Δίκτυο Εκκινήθηκε +Please change your Port Offset = Please change your port offset +Port offset = Offset πήλης(0 = για συμβατότητα PSP) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Αποστολή "Rich Presence" πληροφοριών σε Discord +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Επικύρωση διεύθυνσης... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = Κωδικοί +Continue = Συνέχεια +Create Game Config = Δημιουργία ρυθμίσεων παιχνιδιού +Delete Game Config = Διαγραφή ρυθμίσεων παιχνιδιού +Exit to menu = Έξοδος από το Μενού +Game Settings = Ρυθμίσεις Παιχνιδιού +Load State = Γρ. Επαν/ρά +Rewind = Επαναφορά προς τα πίσω +Save State = Γρ. Αποθ/ση +Settings = Ρυθμίσεις +Switch UMD = Αλλαγή UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Color +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Καρτούν +ColorCorrection = Color correction +Contrast = Contrast +CRT = Γραμμές σάρωσης CRT +FXAA = Εξομάλυνση κορυφών FXAA +Gamma = Gamma +Grayscale = Ασπρόμαυρο +Intensity = Intensity +InverseColors = Αντιστροφή Χρωμάτων +Natural = Φυσικά Χρώματα +NaturalA = Natural Colors (no blur) +Off = Ανενεργό +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Γραμμές Σάρωσης (CRT) +Sharpen = Όξυνση +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 Upscaler +VideoSmoothingAA = VideoSmoothingAA +Vignette = Vignette + +[PSPCredits] +all the forum mods = όλους τους διαχειριστές του forum +build server = build server +Buy Gold = Αγορά Gold +check = Επίσης δώστε μια ματιά στο Dolphin, ο καλύτερος εξομοιωτής Wii/GC: +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = Συντελεστές: +created = Δημιουργήθηκε από τον +Discord = Discord +info1 = Το PPSSPP προορίζεται για εκπαιδευτικούς σκοπούς και μόνο. +info2 = Παρακαλώ βεβαιωθείτε ότι έχετε τα απαραίτητα δικαιώματα τα παιχνίδια +info3 = παι παίζετε κατέχοντας τα UMD ή αγοράζοντας τις ψηφιακές +info4 = εκδώσεις τους από το PSN store στο πραγματικό σας PSP. +info5 = Το PSP είναι σήμα κατατεθέν της Sony, Inc. +iOS builds = iOS builds +license = Ελεύθερο λογισμικό υπό την νομοθεσία του GPL 2.0+ +list = λίστες συμβατότητας, forum, και πληροφορίες ανάπτυξης +PPSSPP Forums = PPSSPP Forum +Privacy Policy = Πολιτική απορρήτου +Share PPSSPP = Μοιραστήτε το PPSSPP +specialthanks = θερμά ευχασιστώ στους: +specialthanksKeithGalocy = στην NVIDIA (υλικό, συμβουλές) +specialthanksMaxim = για την εκπληκτική δουλειά του στον αποκωδικοποιητή Atrac3+ +testing = testing +this translation by = χορηγός μετάφρασης: +title = Ένας γρήγορος και φορητός εξομοιωτής PSP +tools = Δωρεάν εργαλεία που χρησιμοποιούνται: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = VIRGINKLM +translators2 = acemod13 +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Επισκεφθείτε την ιστοσελίδα: +written = Γραμμένο σε C++ για ταχύτητα και φορητότητα + +[RemoteISO] +Browse Games = Περιήγηση παιχνιδιών +Local Server Port = Τοπική θύρα διακομιστή +Manual Mode Client = Λειτουργία πελάτη Manual +Remote disc streaming = Απομακρυσμένη ροή του δίσκου +Remote Port = Απομακρυσμένη θύρα +Remote Server = Απομακρυσμένος διακομιστής +Remote Subdirectory = Απομακρυσμένος υποκατάλογος +RemoteISODesc = Τα παιχνίδια στην λίστα προσφάτων σας θα διαμοιραστούν +RemoteISOLoading = Συνδέθηκε, φόρτωση λίστας παιχνιδιών... +RemoteISOScanning = Σάρωση ... Κάντε κλικ στην επιλογή "διαμοιρασμός παιχνιδιών" στη συσκευή διακομιστή σας +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Σημείωση: Συνδέστε και τις δύο συσκευές σας στο ίδιο δίκτυο Wi-Fi +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Ρυθμίσεις +Share Games (Server) = Διαμοιρασμός παιχνιδιών (διακομιστής) +Share on PPSSPP startup = Διαμοιρασμός κατά την εκκίνηση PPSSPP +Stop Sharing = Διακοπή διαμοιρασμού +Stopping.. = Διακοπή... + +[Reporting] +Bad = Κακά +FeedbackDelayInfo = Τα δεδομένα σας υποβάλλονται στο παρασκήνιο. +FeedbackDesc = Πώς είναι η εξομοίωση; Πείτε το σε εμάς και την κοινότητα! +FeedbackDisabled = Οι αναφορές διακομιστή συμβατότητας πρέπει να είναι ενεργοποιημένες. +FeedbackIncludeCRC = Σημείωση: Η μπαταρία θα χρησιμοποιηθεί για την αποστολή ενός CRC δίσκου +FeedbackIncludeScreen = Συμπεριλάβετε ένα στιγμιότυπο οθόνης +FeedbackSubmitDone = Τα στοιχεία σας έχουν υποβληθεί. +FeedbackSubmitFail = Δεν ήταν δυνατή η υποβολή δεδομένων στο διακομιστή. Δοκιμάστε να ενημερώσετε το PPSSPP. +FeedbackThanks = Ευχαριστούμε για την ανταπόκριση σας. +Gameplay = Gameplay +Graphics = Γραφικά +Great = Καλά +In-game = In-game +In-game Description = Παίζει, αλλά με προβλήματα καθιστούν αδύνατη ολοκλήρωση του παιχνιδιού +Menu/Intro = Μενού/Εισαγωγή +Menu/Intro Description = Εμφανίζονται κάποια μενού χωρίς την δυνατότητα παιξίματος του παιχνιδιού +Nothing = Τίποτα +Nothing Description = Καμία ανταπόκριση +OK = OK +Open Browser = Ανοιγμα προγραμματος περιήγησης +Overall = Συνολικά +Perfect = Τέλεια +Perfect Description = Άψογη προσομοίωση για ολόκληρο το παιχνίδι +Plays = Πάιζει +Plays Description = Παίζει με μικροπροβλήματα που δεν επηρεάζουν το παιχνίδι +ReportButton = Αναφορά κριτικής +Speed = Ταχύτητα +Submit Feedback = Υποβολή αξιολόγησης +SuggestionConfig = Δείτε τις αναφορές στον ιστότοπο για καλές ρυθμίσεις. +SuggestionCPUSpeed0 = Απενεργοποίηση rύθμισης κλειδωμένης συχνότητας CPU. +SuggestionDowngrade = Υποβάθμιστε σε μια παλαιότερη έκδοση του PPSSPP (κάντε αναφορά αυτού του σφάλματος). +SuggestionsFound = Άλλοι χρήστες έχουν αναφέρει καλύτερα αποτελέσματα. Πατήστε "Προβολή σχολίων" για περισσότερες λεπτομέρειες. +SuggestionsNone = Αυτό το παιχνίδι δεν λειτουργεί και σε άλλους χρήστες. +SuggestionsWaiting = Υποβολή και έλεγχος σχολίων άλλων χρηστών... +SuggestionUpgrade = Αναβαθμίστε σε μια νεότερη έκδοση του PPSSPP. +SuggestionVerifyDisc = Ελέγξτε ότι το αρχείο ISO σας είναι ένα καλό αντίγραφο του δίσκου σας. +Unselected Overall Description = Πόσο καλή είναι η εξομοίωση του παιχνιδιού; +View Feedback = Προβολή σχολίων + +[Savedata] +Date = Ημερομηνία +Filename = Ονομα αρχείου +No screenshot = Χωρίς στιγμιότυπο οθόνης +None yet. Things will appear here after you save. = Τίποτα προς το παρόν. Θα εμφανιστούν στοιχεία αφότου πραγματοποιήσετε αποθήκευση. +Save Data = Δεδομένα αποθήκευσης +Save States = Σημεία Αποθήκευσης +Savedata Manager = Διαχειριστής δεδομένων αποθήκευσης +Size = Μέγεθος + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = ΠΡΟΣΟΧΗ: Η εφαρμογή Chainfire3D εντοπίστηκε, ενδέχεται να προκαλέσει προβλήματα. +Failed to load state = Σφάλμα φόρτωσης σημείου αποθήκευσης +Failed to save state = Σφάλμα αποθήκευσης σημείου αποθήκευσης +fixed = Ταχύτητα: καθορισμένη +GLToolsWarning = ΠΡΟΣΟΧΗ: Η εφαρμογή GLTools εντοπίστηκε, ενδέχεται να προκαλέσει προβλήματα. +In menu = Σε menu +Load savestate failed = Σφάλμα φόρτωσης σημείου αποθήκευσης +Loaded State = Σημείο αποθήκευσης φορτώθηκε +Loaded. Save in game, restart, and load for less bugs. = Φορτώθηκε. Αποθηκεύστε στο παιχνίδι, κάντε επανεκκίνηση και φορτώστε για λιγότερα σφάλματα. +LoadStateDoesntExist = Σφάλμα φόρτωσης σημείου: Το σημείο αποθήκευσης δεν υπάρχει! +LoadStateWrongVersion = Σφάλμα φόρτωσης σημείου: Το σημείο αποθήκευσης είναι για μία παλαιότερη έκδοση του PPSSPP! +norewind = Κανένα σημείο αποθήκευσης rewind διαθέσιμο. +Playing = Παίζει +PressESC = Πατήστε το ESC για να ανοίξετε το μενού παύσης. +replaceTextures_false = Οι υφές δεν αντικαθίστανται πια. +replaceTextures_true = Αντικατάσταση υφών ενεργοποιημένη. +Save State Failed = Σφάλμα αποθήκευσης σημείου! +Saved State = Σημείο αποθήκευσης αποθηκεύτηκε +saveNewTextures_false = Αποθήκευση υφών απενεργοποιημένη. +saveNewTextures_true = Οι υφές θα αποθηκευτούν στο αποθηκευτικό σας χώρο. +SpeedCustom2 = Ταχύτητα: εναλλακτική 2 +standard = Ταχύτητα: κανονική +Untitled PSP game = Παιχνίδι PSP χωρίς τίτλο + +[Store] +Already Installed = Ήδη εγκατεστημένο +Connection Error = Σφάλμα σύνδεσης +Install = Εγκατάσταση +Launch Game = Έναρξη παιχνιδιού +Loading... = Φόρτωση... +MB = MB +Size = Μέγεθος +Uninstall = Απεγκατάσταση + +[SysInfo] +%d (%d per core, %d cores) = %d (%d ανά πυρήνα, %d πυρήνες) +%d bytes = %d bytes +(none detected) = (δεν βρέθηκε) +3D API = 3D API +ABI = ABI +API Version = Έκδοση API +Audio Information = Πληροφορίες ήχου +Board = Board +Build Config = Build config +Build Configuration = Build Configuration +Built by = Built by +Core Context = Core context +Cores = Πυρήνες +CPU Extensions = Επεκτάσεις CPU +CPU Information = Πληροφορίες CPU +CPU Name = Όνομα +D3DCompiler Version = Έκδοση D3DCompiler +Debug = Εντοπισμός σφαλμάτων +Debugger Present = Παρουσία πρόγραμματος εντοπισμού σφαλμάτων +Device Info = Πληροφορίες συσκευής +Display Information = Πληροφορίες οθόνης +Driver Version = Έκδοση Driver +EGL Extensions = Επεκτάσεις EGL +Frames per buffer = Καρέ ανά buffer +GPU Information = Πληροφορίες GPU +High precision float range = High precision float range +High precision int range = Εύρος υψηλής ακρίβειας int +Lang/Region = Γλώσσα/Περιοχή +Memory Page Size = Μέγεθος σελίδας μνήμης +Native Resolution = Εγγενής ανάλυση +OGL Extensions = Επεκτάσεις OGL +OpenGL ES 2.0 Extensions = Επεκτάσεις OpenGL ES 2.0 +OpenGL ES 3.0 Extensions = Επεκτάσεις OpenGL ES 3.0 +OpenGL Extensions = Επεκτάσεις OpenGL +Optimal frames per buffer = Βέλτιστα καρέ ανά buffer +Optimal sample rate = Βέλτιστος ρυθμός δειγματοληψίας +OS Information = Πληροφορίες OS +PPSSPP build = Έκδοση PPSSPP +Refresh rate = Ρυθμός ανανέωσης +Release = Release +RW/RX exclusive = RW/RX αποκλειστικό +Sample rate = Ρυθμός δειγματοληψίας +Shading Language = Γλώσσα σκίασης +Sustained perf mode = Διατηρημένη λειτουργία απόδοσης +System Information = Πληροφορίες συστήματος +System Name = Όνομα +System Version = Έκδοση συστήματος +Threads = Νήματα +Vendor = Προμηθευτής +Vendor (detected) = Προμηθευτής (βρέθηκε) +Version Information = Πληροφορίες έκδοσης +Vulkan Extensions = Επεκτάσεις Vulkan +Vulkan Features = Δυνατότητες Vulkan + +[System] +(broken) = (εσφαλμένο) +12HR = 12ωρο +24HR = 24ωρο +Auto = Auto +Auto Load Savestate = Auto load savestate +AVI Dump started. = Καταγραφή AVI ξεκίνησε. +AVI Dump stopped. = Καταγραφή AVI σταμάτησε. +Cache ISO in RAM = Προσωρινή αποθήκευση ISO σε RAM +Change CPU Clock = Αλλαγή συχνότητας CPU (unstable) +Change Memory Stick folder = Αλλαγή φακέλου Memory Stick +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Αλλαγή Ψευδωνύμου +ChangingMemstickPath = Τα δεδομένα αποθήκευσης παιχνιδιών, καταστάσεων και άλλων δεδομένων δεν θα αντιγραφούν σε αυτόν τον φάκελο.\n\nΑλλαγή του φακέλου Memory Stick; +ChangingMemstickPathInvalid = Αυτή η διαδρομή δεν μπορεί να χρησιμοποιηθεί για αποθήκευση αρχείων Memory Stick. +ChangingMemstickPathNotExists = Αυτός ο φάκελος δεν υπάρχει ακόμα.\n\nΤα δεδομένα αποθήκευσης παιχνιδιών, καταστάσεων και άλλων δεδομένων δεν θα αντιγραφούν σε αυτόν τον φάκελο.\n\nΔημιουργία νέου φακέλου Memory Stick; +Cheats = Κωδικοί(πειραματικό, δείτε στα forums) +Clear Recent = Clear "Recent" +Clear Recent Games List = Καθαρισμός Λίστας Προσφάτων +Clear UI background = Εκκαθάριση φόντου UI +Confirmation Button = Πλήκτρο Επιβεβαίωσης +Date Format = Μορφή Ημερομηνίας +Day Light Saving = Θερινή Ώρα +DDMMYYYY = ΗΗΜΜΧΧΧΧ +Decrease size = Decrease size +Developer Tools = Εργαλεία Προγραμματιστών +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Δυναμικός Αναμεταγλωττιστής (JIT) +Emulation = Εξομοίωση +Enable Cheats = Ενεργοποίηση Κωδικών +Enable Compatibility Server Reports = Ενεργ/ση Αναφορών σε Διακομιστή Συμβατότητας +Failed to load state. Error in the file system. = Σφάλμα φόρτωσης σημείου αποθήκευσης. Σφάλμα συστήματος αρχείων. +Failed to save state. Error in the file system. = Σφάλμα αποθήκευσης σημείου αποθήκευσης. Σφάλμα συστήματος αρχείων. +Fast (lag on slow storage) = Γρήγορος (καθυστερήσεις σε αργά μέσα αποθήκευσης) +Fast Memory = Γρήγορη Μνήμη (ασταθής) +Force real clock sync (slower, less lag) = Εξαναγκασμός συγχρονισμού πραγματικού χρόνου (πιο αργό αλλά λιγότερες καθυστερήσεις) +frames, 0:off = καρέ, 0 = off +Games list settings = Games list settings +General = Γενικά +Grid icon size = Grid icon size +Help the PPSSPP team = Βοηθήστε την ομάδα του PPSSPP +Host (bugs, less lag) = Host (σφάλματα, λιγότερη καθυστέρηση) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Διερμηνέας +IO timing method = Μέθοδος χρονισμού I/O +IR Interpreter = IR Διερμηνέας +Memory Stick Folder = Φόκελος Memory Stick +Memory Stick inserted = Εισήχθη Memory Stick +MHz, 0:default = MHz, 0 = προεπιλογή +MMDDYYYY = ΜΜΗΗΧΧΧΧ +Newest Save = Νεότερο αρχείο αποθήκευσης +Not a PSP game = Δεν είναι παιχνίδι PSP +Off = Off +Oldest Save = Παλαιότερο αρχείο αποθήκευσης +PSP Model = Μοντέλο PSP +PSP Settings = Ρυθμίσεις PSP +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Καταγραφή Ήχου +Record Display = Καταγραφή Εικόνας +Reset Recording on Save/Load State = Επαναφορά της εγγραφής κατή την Αποθήκευση/Φόρτωση σημείου αποθήκευσης +Restore Default Settings = Επαναφορά προεπιλεγμένων ρυθμίσεων του PPSSPP +Rewind Snapshot Frequency = Συχνότητα Αντιστροφής Στιγμιότυπου (mem hog) +Save path in installed.txt = Αποθήκευση διαδρομής στο installed.txt +Save path in My Documents = Αποθήκευση διαδρομής στα Έγγραφα μου +Savestate Slot = Slot Σημείου Αποθήκευσης +Savestate slot backups = Αντίγραφα ασφαλείας slot σημείων αποθήκευσης +Screenshots as PNG = Αποθήκευση Στιγμιοτύπων ως PNG +Set UI background... = Ορισμός φόντου UI... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Προσομόιωση καθυστερήσεων UMD +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Μνήμη πλήρης +Sustained performance mode = Διατηρημένη λειτουργία απόδοσης +Time Format = Μορφή Ώρας +UI = Διεπαφή χρήστη +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Χρήση μη απολεστικού κωδικοποιητή (FFV1) +Use O to confirm = O +Use output buffer (with overlay) for recording = Χρησιμοποιήστε το buffer εξόδου (με επικάλυψη) για εγγραφή +Use system native keyboard = Use system native keyboard +Use X to confirm = X +VersionCheck = Έλεγχος νέων εκδόσεων PPSSPP +WARNING: Android battery save mode is on = ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Η λειτουργία εξοικονόμησης ενέργειας Android είναι ενεργοποιημένη +WARNING: Battery save mode is on = ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Η λειτουργία εξοικονόμησης ενέργειας είναι αναμμένη +YYYYMMDD = ΧΧΧΧΜΜΗΗ + +[Upgrade] +Details = Details +Dismiss = Απόρριψη +Download = Κατέβασμα +New version of PPSSPP available = Νέα διαθέσιμη έκδοση PPSSPP diff --git a/assets/lang/he_IL.ini b/assets/lang/he_IL.ini new file mode 100644 index 0000000000..aa4fe4a6d8 --- /dev/null +++ b/assets/lang/he_IL.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = Audio backend (restart req.) +AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) +Auto = Auto +Device = Device +DSound (compatible) = DSound (compatible) +Enable Sound = אפשר שמע +Global volume = Global volume +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = WASAPI (fast) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Analog axis sensitivity +Analog Limiter = Analog limiter +Analog Mapper High End = Analog mapper high-end (axis sensitivity) +Analog Mapper Low End = Analog mapper low-end (inverse deadzone) +Analog Mapper Mode = Analog mapper mode +Analog Stick = Analog stick +AnalogLimiter Tip = When the analog limiter button is pressed +Auto = Auto +Auto-centering analog stick = Auto-centering analog stick +Auto-hide buttons after seconds = Auto-hide buttons after seconds +Binds = Binds +Button Opacity = אטימות מקשים +Button style = Button style +Calibrate D-Pad = Calibrate +Calibration = Calibration +Classic = Classic +Combo Key Setting = Combo key setting +Combo Key Setup = Combo key setup +Confine Mouse = Trap mouse within window/display area +Control Mapping = מיפוי מקשים +Custom layout... = Edit touch control layout... +Customize tilt = Customize tilt... +D-PAD = D-Pad +Deadzone Radius = Deadzone radius +DInput Analog Settings = DInput analog settings +Disable D-Pad diagonals (4-way touch) = Disable D-Pad diagonals (4-way touch) +Glowing borders = Glowing borders +HapticFeedback = Haptic feedback (vibration) +Ignore gamepads when not focused = Ignore gamepads when not focused +Ignore Windows Key = Disable Windows key +Invert Axes = Invert axes +Invert Tilt along X axis = Invert tilt along X axis +Invert Tilt along Y axis = Invert tilt along Y axis +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Keyboard control settings +L/R Trigger Buttons = L/R trigger buttons +Landscape = Landscape +Landscape Auto = Landscape auto +Landscape Reversed = Landscape reversed +Mouse = Mouse settings +Mouse sensitivity = Mouse sensitivity +Mouse smoothing = Mouse smoothing +MouseControl Tip = You can now map mouse in control mapping screen by pressing the 'M' icon. +None (Disabled) = None (disabled) +Off = Off +OnScreen = מקשי מגע על המסך +Portrait = Portrait +Portrait Reversed = Portrait reversed +PSP Action Buttons = PSP action buttons +Screen Rotation = Screen rotation +seconds, 0 : off = seconds, 0 = off +Sensitivity = Sensitivity +Show right analog = Show right analog +Show Touch Pause Menu Button = Show pause menu button +Thin borders = Thin borders +Tilt Base Radius = Tilt base radius +Tilt Input Type = Tilt input type +Tilt Sensitivity along X axis = Tilt sensitivity along X axis +Tilt Sensitivity along Y axis = Tilt sensitivity along Y axis +To Calibrate = To calibrate, keep device on a flat surface and press "Calibrate". +Touch Control Visibility = Touch control visibility +Use custom right analog = Use custom right analog +Use Mouse Control = Use mouse control +Visibility = Visibility +X = X +X + Y = X + Y +XInput Analog Settings = XInput analog settings +Y = Y + +[CwCheats] +Cheats = Cheats +Edit Cheat File = Edit cheat file +Enable/Disable All = Enable/Disable all Cheats +Import Cheats = Import from cheat.db +Options = Options +Refresh Rate = Refresh rate + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = &About PPSSPP... +Auto = &Auto +Backend = Rendering &Backend (Restarts PPSSPP) +Bicubic = &Bicubic +Break = Break +Break on Load = Break on load +Buffered Rendering = &מאגר מעובד +Buy Gold = Buy &Gold +Control Mapping... = C&ontrol Mapping... +Debugging = ניפ&וי +Deposterize = &Deposterize +Direct3D9 = &Direct3D9 +Direct3D11 = Direct3D &11 +Disassembly = &פירוק... +Discord = Discord +Display Layout Editor = Display layout editor... +Display Rotation = Display rotation +Dump Next Frame to Log = D&ump Next Frame to Log +Emulation = &סימולציה +Enable Chat = Enable chat +Enable Cheats = אפשר &צ'יטים (מאפס את המשחק) +Enable Sound = אפשר ש&מע +Exit = E&xit +Extract File... = E&xtract File... +File = &קובץ +Frame Skipping = &Frame skipping +Frame Skipping Type = Frame skipping type +Fullscreen = מס&ך מלא +Game Settings = &הגדרות משחק +GE Debugger... = GE Debugge&r... +GitHub = Git&Hub +Hardware Transform = &Hardware Transform +Help = &Help +Hybrid = &Hybrid +Hybrid + Bicubic = H&ybrid + Bicubic +Ignore Illegal Reads/Writes = &Ignore Illegal Reads/Writes +Ignore Windows Key = Ignore Windows Key +Keep PPSSPP On Top = &השאר את היישום כחלון עלין תמיד +Landscape = Landscape +Landscape reversed = Landscape reversed +Language... = La&nguage... +Linear = &Linear +Load = &טען... +Load .sym File... = Lo&ad .sym File... +Load Map File... = טען &Map קובץ... +Load State = טען מצב שמור +Load State File... = &טען מצב מקובץ שמור... +Log Console = &התחבר לקונסולה +Memory View... = הצג &זיכרון... +More Settings... = &More Settings... +Nearest = &Nearest +Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) +Off = &Off +Open Directory... = פתח &קובץ... +Open from MS:/PSP/GAME... = פ&תח מ MS:/PSP/GAME... +Open Memory Stick = פתח &זיכרון +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = &השהה +Pause When Not Focused = &Pause When Not Focused +Portrait = Portrait +Portrait reversed = Portrait reversed +Postprocessing Shader = Postprocessin&g Shader +PPSSPP Forums = PPSSPP &Forums +Record = &Record +Record Audio = Record &audio +Record Display = Record &display +Rendering Mode = מצ&ב עיבוד +Rendering Resolution = &עיבוד רזולוציה +Reset = אחרונים +Reset Symbol Table = &Reset Symbol Table +Run = &הרץ +Save .sym File... = Sav&e .sym File... +Save Map File... = &שמור Map קובץ... +Save State = שמור מצב +Save State File... = &שמור מצב בקובץ... +Savestate Slot = Saves&tate Slot +Screen Scaling Filter = Scr&een Scaling Filter +Show Debug Statistics = Show Debu&g Statistics +Show FPS Counter = Show &FPS Counter +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = &עצור +Switch UMD = Switch UMD +Take Screenshot = &צלם מסך +Texture Filtering = Te&xture Filtering +Texture Scaling = &Texture Scaling +Use Lossless Video Codec (FFV1) = &Use lossless video codec (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = &Vertex Cache +VSync = VS&ync +Vulkan = Vulkan +Window Size = &Window Size +www.ppsspp.org = Visit www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allocator viewer (Vulkan) +Allow remote debugger = Allow remote debugger +Backspace = Backspace +Block address = Block address +By Address = By address +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Create/Open textures.ini file for current game +Current = Current +Dev Tools = Development tools +DevMenu = DevMenu +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Dump decrypted EBOOT.BIN on game boot +Dump Frame GPU Commands = Dump frame GPU commands +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = אפשר דיווח באגים +Enter address = Enter address +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Frame profiler +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = Jit compare +JIT debug tools = JIT debug tools +Language = שפה +Load language ini = טען קובץ שפה +Log Dropped Frame Statistics = Log dropped frame statistics +Log Level = Log level +Log View = Log view +Logging Channels = Logging channels +Next = Next +No block = No block +Prev = Previous +Random = Random +Replace textures = Replace textures +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. +RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? +Resume = Resume +Run CPU Tests = הרץ בדיקות מעבד +Save language ini = שמור קובץ שפה +Save new textures = Save new textures +Shader Viewer = Shader viewer +Show Developer Menu = Show developer menu +Show on-screen messages = Show on-screen messages +Stats = Stats +System Information = מידע על המערכת +Texture Replacement = Texture replacement +Toggle Audio Debug = Toggle audio debug +Toggle Freeze = Toggle freeze +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP res +Active = Active +Back = << +Cancel = לטב +Center = Center +ChangingGPUBackends = Changing GPU backends requires PPSSPP to restart. Restart now? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = Choose PPSSPP save folder +Confirm Overwrite = ?ולא םינותנ בתכשל הצור +Confirm Save = ?ולא םינותנ רומשל הצור +ConfirmLoad = ?ולא םינותנ ןועטל הצור +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = קחמ +Delete all = Delete all +Delete completed = .המלשוה הקיחמ +DeleteConfirm = ?ךישמהל םאה .וקחמי ולאה םירומשה םינותנה +DeleteConfirmAll = ?הזה קחשמה רובע הרימשה ינותנ לכ תא קוחמל םאה +DeleteConfirmGame = .וז הלועפ לטבל ןתינ אל ?ךלש רישכמהמ הזה קחשמה תא קוחמל +DeleteConfirmGameConfig = Do you really want to delete the settings for this game? +DeleteFailed = Unable to delete data. +Deleting = ...ןתמה אנא ...קחומ +Disable All = Disable all +Edit = Edit +Enable All = Enable all +Enter = סנכה +Finish = םייס +Grid = Grid +Inactive = Inactive +InternalError = An internal error has occurred. +Load = Load +Load completed = .המלשוה הניעט +Loading = ...ןתמה אנא ...ןעוט +LoadingFailed = Unable to load data. +Move = Move +Network Connection = Network Connection +NEW DATA = םישדח םינותנ +No = אל +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = רדסב +Old savedata detected = Old savedata detected +Options = Options +Reset = Reset +Resize = Resize +Retry = Retry +Save = Save +Save completed = .המלשוה הרימש +Saving = ...ןתמה אנא ...רמוש +SavingFailed = Unable to save data. +Select = רחב +Shift = העבר +Snap = Snap +Space = Space +SSID = SSID +Submit = Submit +Supported = Supported +There is no data = .םינותנ ןיא +Toggle All = Toggle all +Toggle List = Toggle list +Unsupported = Unsupported +When you save, it will load on a PSP, but not an older PPSSPP = When you save, it will load on a PSP, but not an older PPSSPP +When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Yes = ןכ +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = file is compressed (7z).\nPlease decompress first (try 7-Zip or WinRAR). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = Could not save screenshot file. +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll not found. Please install. Or press Yes to try again using Direct3D 9 instead. +D3D11InitializationError = Direct3D 11 initialization error +D3D11Missing = Your operating system version does not include D3D11. Please run Windows Update.\n\nPress Yes to try again using Direct3D 9 instead. +D3D11NotSupported = Your GPU does not appear to support Direct3D 11.\n\nWould you like to try again using Direct3D 9 instead? +Disk full while writing data = Disk full while writing data. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = שגיאה בעת טעינת הקובץ: +Error reading file = קריאת קובץ נכשלה. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = זיהוי קובץ נכשל. +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Failed initializing graphics. Try upgrading your graphics drivers and DirectX 9 runtime.\n\nWould you like to try switching to OpenGL?\n\nError message: +GenericGraphicsError = Graphics Error +GenericOpenGLError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to DirectX 9?\n\nError message: +GenericVulkanError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to OpenGL?\n\nError message: +InsufficientOpenGLDriver = Insufficient OpenGL driver support detected!\n\nYour GPU reports that it does not support OpenGL 2.0. Would you like to try using DirectX instead?\n\nDirectX is currently compatible with less games, but on your GPU it may be the only choice.\n\nVisit the forums at https://forums.ppsspp.org for more information.\n\n +Just a directory. = רק ארכיון. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = אין EBOOT.PBP, שגה בזיהוי המשחק. +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = OpenGL driver error +PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP currently does not support connecting to the Internet for DLC, PSN, or game updates. +PS1 EBOOTs are not supported by PPSSPP. = משחקי פלייסטישן 1 לא נתמכים. +PSX game image detected. = File is a MODE2 image. PPSSPP doesn't support PS1 games. +RAR file detected (Require UnRAR) = file is compressed (RAR).\nPlease decompress first (try UnRAR). +RAR file detected (Require WINRAR) = file is compressed (RAR).\nPlease decompress first (try WinRAR). +Running slow: try frameskip, sound is choppy when slow = Running slow: try frameskip, sound is choppy when slow +Running slow: Try turning off Software Rendering = Running slow: try turning off "software rendering" +Save encryption failed. This save won't work on real PSP = Save encryption failed. This save won't work on real PSP +textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +This is a saved state, not a game. = This is a saved state, not a game. +This is save data, not a game. = This is save data, not a game. +Unable to create cheat file, disk may be full = Unable to create cheat file, disk may be full. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Unable to write savedata, disk may be full. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Warning: Video memory FULL, reducing upscaling and switching to slow caching mode. +Warning: Video memory FULL, switching to slow caching mode = Warning: Video memory FULL, switching to slow caching mode. +ZIP file detected (Require UnRAR) = file is compressed (ZIP).\nPlease decompress first (try UnRAR). +ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompress first (try WinRAR). + +[Game] +Asia = Asia +ConfirmDelete = Delete +Create Game Config = Create game config +Create Shortcut = צור קיצור דרך +Delete Game = Delete game +Delete Game Config = Delete game config +Delete Save Data = Delete savedata +Europe = Europe +Game = משחק +Game Settings = הגדרות משחק +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Data install +Japan = Japan +Korea = Korea +MB = MB +One moment please... = One moment please... +Play = שחק +Remove From Recent = Remove from "Recent" +SaveData = Savedata +Setting Background = Setting background +Show In Folder = Show in folder +USA = USA +Use UI background = Use UI background + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = unlimited +(supersampling) = (supersampling) +(upscaling) = (upscaling) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Aggressive +Alternative Speed = הגבלת מהירות +Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Anisotropic Filtering = Anisotropic filtering +Auto = אוטומטי +Auto (1:1) = Auto (1:1) +Auto (same as Rendering) = Auto (same as rendering resolution) +Auto FrameSkip = Auto frameskip +Auto Scaling = Auto scaling +Backend = Backend +Balanced = Balanced +Bicubic = Bicubic +BlockTransfer Tip = Some games require this to be On for correct graphics +BlockTransferRequired = Warning: This game requires "simulate block transfer effects" to be set to On. +Both = שניהם +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = מאגר מעובד +BufferedRenderingRequired = Warning: This game requires "rendering mode" to be set to "buffered". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Screen size (in % of the viewport) +Cardboard Screen X Shift = X shift (in % of the blank space) +Cardboard Screen Y Shift = Y shift (in % of the blank space) +Cardboard VR Settings = Google Cardboard VR settings +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU core +Debugging = ניפוי +DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. +Deposterize = Deposterize +Deposterize Tip = Fixes visual banding glitches in upscaled textures +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Disable slower effects (speedup) +Disabled = Disabled +Display layout editor = Display layout editor +Display Resolution (HW scaler) = Display resolution (HW scaler) +Dump next frame to log = בחר את הפריים הבא כדי לדווח +Enable Cardboard VR = Enable Cardboard VR +FPS = כמות פריימים לשנייה +Frame Rate Control = שליטה על קצב פריימים +Frame Skipping = דלג על פריימים +Frame Skipping Type = Frame skipping type +FullScreen = מסך מלא +Hack Settings = Hack settings (may cause glitches) +Hardware Tessellation = Hardware tessellation +Hardware Transform = התאמת חומרה +hardware transform error - falling back to software = Hardware transform error, falling back to software +HardwareTessellation Tip = Uses hardware to make curves +High = High +Hybrid = היברידי +Hybrid + Bicubic = היברידי + Bicubic +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Internal resolution +Lazy texture caching = Lazy texture caching (speedup) +Linear = קווי +Low = Low +LowCurves = Spline/Bezier curves quality +LowCurves Tip = Only used by some games, controls smoothness of curves +Lower resolution for effects (reduces artifacts) = Lower resolution for effects (reduces artifacts) +Manual Scaling = Manual scaling +Medium = Medium +Mode = מצב +Must Restart = You must restart PPSSPP for this change to take effect. +Native device resolution = Native device resolution +Nearest = הקרוב ביותר +No buffer = No buffer +Non-Buffered Rendering = Skip buffer effects (non-buffered, faster) +None = אל תציג מונה +Number of Frames = Number of frames +Off = כבוי +OpenGL = OpenGL +Overlay Information = כיסוי מידע +Partial Stretch = Partial stretch +Percent of FPS = Percent of FPS +Performance = Performance +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Postprocessing shader +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = מצב מעובד +Rendering Resolution = Rendering resolution +RenderingMode NonBuffered Tip = Faster, but nothing may draw in some games +Retain changed textures = Retain changed textures (sometimes slower) +RetainChangedTextures Tip = Makes many games slower, but some games a lot faster +Rotation = Rotation +Safe = Safe +Screen layout = Screen layout +Screen Scaling Filter = Screen scaling filter +Show Debug Statistics = הצג סטטיסטיקת באגים +Show FPS Counter = הצג מונה +Simulate Block Transfer = Simulate block transfer effects +SoftGPU Tip = Currently VERY slow +Software Rendering = עיבוד תוכנה (ניסיוני) +Software Skinning = Software skinning +SoftwareSkinning Tip = Combine skinned model draws on the CPU, faster in most games +Speed = מהירות +Stretching = Stretching +Texture Filter = קידוד טקסטורה +Texture Filtering = קידוד טקסטורה +Texture Scaling = מידת טקסטורה +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Turn off "hardware tessellation": unsupported +Unlimited = Unlimited +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = רמה יוקרתית +Upscale Type = סוג יוקרתי +UpscaleLevel Tip = CPU heavy - some scaling may be delayed to avoid stutter +Use all displays = Use all displays +Vertex Cache = Vertex מטמון +VertexCache Tip = Faster, but may cause temporary flicker +VSync = סנכרון אנכי +Vulkan = Vulkan +Window Size = Window size +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Delete ZIP file +Install = Install +Install game from ZIP file? = Install game from ZIP file? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = Installed! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = Auto configure +Autoconfigure for device = Autoconfigure for device +Clear All = נקה הכל +Default All = החזר הכל +Map a new key for = מיפוי מקש נוסף ל +Map Key = Map key +Map Mouse = Map mouse +Test Analogs = Test analogs +You can press ESC to cancel. = You can press Esc to cancel. + +[MainMenu] +Browse = Browse... +Buy PPSSPP Gold = Buy PPSSPP Gold +Choose folder = Choose folder +Credits = זכויות יוצרים +PPSSPP Homebrew Store = PPSSPP Homebrew Store +Exit = צא +Game Settings = הגדרות משחק +Games = משחקים +Give PPSSPP permission to access storage = Give PPSSPP permission to access storage +Homebrew & Demos = משחקי דמו ומשחקי תוצרת בית +How to get games = איך להשיג משחקים +How to get homebrew & demos = איך להשיג משחקי תוצרת בית +Load = טען... +Loading... = Loading... +PinPath = Pin +PPSSPP can't load games or save right now = PPSSPP can't load games or save right now +Recent = אחרונים +SavesAreTemporary = PPSSPP is saving in temporary storage +SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently +SavesAreTemporaryIgnore = Ignore warning +UnpinPath = Unpin +www.ppsspp.org = לאתר + +[MainSettings] +Audio = שמע +Controls = מקשים +Graphics = גראפיקה +Networking = Networking +System = מערכת +Tools = Tools + +[MappableControls] +Alt speed 1 = Alt speed 1 +Alt speed 2 = Alt speed 2 +An.Down = ג'וייסטיק v +An.Left = ג'וייסטיק < +An.Right = ג'וייסטיק > +An.Up = ג'וייסטיק ^ +Analog limiter = Analog limiter +Analog Stick = Analog stick +Audio/Video Recording = Audio/Video recording +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Axis swap +Circle = Circle +Cross = Cross +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = DevMenu +Down = v +Dpad = Dpad +Frame Advance = Frame advance +Hold = Hold +Home = Home +L = L +Left = < +Load State = Load State +Mute toggle = Mute toggle +Next Slot = Next Slot +None = None +Note = Note +OpenChat = Open chat +Pause = עצור +R = R +RapidFire = RapidFire +Remote hold = Remote hold +Rewind = Rewind +Right = > +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = ג'וייס' ימני v +RightAn.Left = ג'וייס' ימני > +RightAn.Right = ג'וייס' ימני < +RightAn.Up = ג'וייס' ימני ^ +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Save State +Screen = Screen +Screenshot = Screenshot +Select = Select +SpeedToggle = שינוי מהירות +Square = Square +Start = Start +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = Toggle fullscreen +Toggle mode = Toggle mode +Triangle = Triangle +Unthrottle = Unthrottle +Up = ^ +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Change MAC address +Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable network chat = Enable network chat +Enable networking = Enable networking/WLAN (beta, may break games) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Network initialized +Please change your Port Offset = Please change your port offset +Port offset = Port offset(0 = PSP compatibility) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Send Discord "Rich Presence" information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = Cheats +Continue = המשך +Create Game Config = Create game config +Delete Game Config = Delete game config +Exit to menu = צא לתפריט הראשי +Game Settings = הגדרות משחק +Load State = טען מצב שמור +Rewind = Rewind +Save State = שמור מצב +Settings = הגדרות +Switch UMD = Switch UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Color +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Cartoon +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT scanlines +FXAA = FXAA Antialiasing +Gamma = Gamma +Grayscale = Grayscale +Intensity = Intensity +InverseColors = Inverse Colors +Natural = Natural Colors +NaturalA = Natural Colors (no blur) +Off = Off +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlines (CRT) +Sharpen = Sharpen +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 Upscaler +VideoSmoothingAA = VideoSmoothingAA +Vignette = Vignette + +[PSPCredits] +all the forum mods = all the forum mods +build server = build server +Buy Gold = Gold קנה גרסאת +check = הטוב ביותר Wii/GC אמולטור ה Dolphin, :ראו את +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = :תורמים +created = נוצר ע"י +Discord = Discord +info1 = מיועד למטרות חינוכיות בלבד PPSSPP. +info2 = אנא ודא שאתה הבעלים של הזכויות לכל המשחקים +info3 = אתה משחק על ידי בעלות על דיסק המדיה האוניברסלי או על ידי רכישה דיגיטלית +info4 = האמיתי שלך. PSP עם ה PSN הורד מחנות ה +info5 = הוא סימן מסחר על ידי סוני בע"מ PSP +iOS builds = iOS builds +license = תוכנה בקוד פתוח תחת GPL 2.0+ +list = רשימות תאימות, פורומים ומידע על פיתוח +PPSSPP Forums = פורומים +Privacy Policy = Privacy policy +Share PPSSPP = Share PPSSPP +specialthanks = :תודה מיוחדת ל +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = ravid1323 :התרגום הזה הוא ע"י +title = מהיר ונייד PSP אימולטור +tools = כלים חינמיים בשימוש היישום: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = +translators2 = +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = :כנסו אל האתר +written = למהירות וניידות C++ נכתב ב + +[RemoteISO] +Browse Games = Browse games +Local Server Port = Local server port +Manual Mode Client = Manual mode client +Remote disc streaming = Remote disc streaming +Remote Port = Remote port +Remote Server = Remote server +Remote Subdirectory = Remote subdirectory +RemoteISODesc = Games in your recent list will be shared +RemoteISOLoading = Connected, loading game list... +RemoteISOScanning = Scanning... Click "share games" on your server device +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Note: Connect both devices to the same Wi-Fi network +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Settings +Share Games (Server) = Share games (server) +Share on PPSSPP startup = Share on PPSSPP startup +Stop Sharing = Stop sharing +Stopping.. = Stopping... + +[Reporting] +Bad = Bad +FeedbackDelayInfo = Your data is being submitted in the background. +FeedbackDesc = How's the emulation? Let us and the community know! +FeedbackDisabled = Compatibility server reports must be enabled. +FeedbackIncludeCRC = Note: Battery will be used to send a disc CRC +FeedbackIncludeScreen = Include a screenshot +FeedbackSubmitDone = Your data has been submitted. +FeedbackSubmitFail = Could not submit data to server. Try updating PPSSPP. +FeedbackThanks = Thanks for your feedback! +Gameplay = Gameplay +Graphics = Graphics +Great = Great +In-game = In-game +In-game Description = Gets into gameplay, but too buggy to complete +Menu/Intro = Menu/Intro +Menu/Intro Description = Can't get into the game itself +Nothing = Nothing +Nothing Description = Completely broken +OK = OK +Open Browser = Open browser +Overall = Overall +Perfect = Perfect +Perfect Description = Flawless emulation for the entire game - great! +Plays = Plays +Plays Description = Fully playable but might be with glitches +ReportButton = Report feedback +Speed = Speed +Submit Feedback = Submit feedback +SuggestionConfig = See reports on website for good settings. +SuggestionCPUSpeed0 = Disable locked CPU speed setting. +SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this bug). +SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. +SuggestionsNone = This game isn't working for other users too. +SuggestionsWaiting = Submitting and checking other users feedback... +SuggestionUpgrade = Upgrade to a newer PPSSPP build. +SuggestionVerifyDisc = Check your ISO is a good copy of your disc. +Unselected Overall Description = How well does this game emulate? +View Feedback = View all feedbacks + +[Savedata] +Date = Date +Filename = Filename +No screenshot = No screenshot +None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Save Data = Save data +Save States = Save states +Savedata Manager = Savedata manager +Size = Size + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = WARNING: Chainfire3D detected, may cause problems. +Failed to load state = Failed to load state +Failed to save state = Failed to save state +fixed = יותר מהיר +GLToolsWarning = WARNING: GLTools detected, may cause problems. +In menu = In menu +Load savestate failed = Load savestate failed +Loaded State = מצב נטען +Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +LoadStateDoesntExist = לא הצליח לטעון את המצב: המצב שמור אינו קיים! +LoadStateWrongVersion = לא הצליח לטעון את המצב: המצב הוא שמירה שמיועדת לגרסה ישנה יותר של PPSSPP! +norewind = No rewind save states available. +Playing = Playing +PressESC = לחץ על ESC כדי לפתוח את התפריט. +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = תקלה בשמירת המצב! +Saved State = מצב נשמר +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Speed: alternate 2 +standard = מהירות סטנדרטית +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = Already installed +Connection Error = Connection error +Install = Install +Launch Game = Launch game +Loading... = Loading... +MB = MB +Size = Size +Uninstall = Uninstall + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d cores) +%d bytes = %d bytes +(none detected) = (none detected) +3D API = 3D API +ABI = ABI +API Version = API version +Audio Information = Audio information +Board = Board +Build Config = Build config +Build Configuration = Build Configuration +Built by = Built by +Core Context = Core context +Cores = Cores +CPU Extensions = CPU extensions +CPU Information = CPU information +CPU Name = Name +D3DCompiler Version = D3DCompiler version +Debug = Debug +Debugger Present = Debugger present +Device Info = Device info +Display Information = Display information +Driver Version = Driver version +EGL Extensions = EGL extensions +Frames per buffer = Frames per buffer +GPU Information = GPU information +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Lang/Region +Memory Page Size = Memory page size +Native Resolution = Native resolution +OGL Extensions = OGL extensions +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 extensions +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 extensions +OpenGL Extensions = OpenGL extensions +Optimal frames per buffer = Optimal frames per buffer +Optimal sample rate = Optimal sample rate +OS Information = OS information +PPSSPP build = PPSSPP build +Refresh rate = Refresh rate +Release = Release +RW/RX exclusive = RW/RX exclusive +Sample rate = Sample rate +Shading Language = Shading language +Sustained perf mode = Sustained perf mode +System Information = System information +System Name = Name +System Version = System version +Threads = Threads +Vendor = Vendor +Vendor (detected) = Vendor (detected) +Version Information = Version information +Vulkan Extensions = Vulkan extensions +Vulkan Features = Vulkan features + +[System] +(broken) = (broken) +12HR = PM/FM +24HR = 24HR +Auto = Auto +Auto Load Savestate = Auto load savestate +AVI Dump started. = AVI dump started +AVI Dump stopped. = AVI dump stopped +Cache ISO in RAM = Cache full ISO in RAM +Change CPU Clock = שנה קצב מעבד (unstable) +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = שנה כינוי +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = צ'יטים (ניסיוני, ראה בפורום) +Clear Recent = Clear "Recent" +Clear Recent Games List = נקה רשימת אחרונים +Clear UI background = Clear UI background +Confirmation Button = העדפת מקשים +Date Format = תבנית תאריך +Day Light Saving = שמירה על אור יום +DDMMYYYY = שנה/חודש/יום +Decrease size = Decrease size +Developer Tools = כלי פיתוח +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = סימולציה +Enable Cheats = אפשר צ'יטים +Enable Compatibility Server Reports = אפשר שרת דיווחי תאימות +Failed to load state. Error in the file system. = Failed to load state. Error in the file system. +Failed to save state. Error in the file system. = Failed to save state. Error in the file system. +Fast (lag on slow storage) = Fast (lag on slow storage) +Fast Memory = עיבוד מהיר של זיכרון (לא יציב) +Force real clock sync (slower, less lag) = Force real clock sync (slower, less lag) +frames, 0:off = frames, 0 = off +Games list settings = Games list settings +General = כללי +Grid icon size = Grid icon size +Help the PPSSPP team = Help the PPSSPP team +Host (bugs, less lag) = Host (bugs, less lag) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Interpreter +IO timing method = I/O timing method +IR Interpreter = IR interpreter +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = Memory Stick inserted +MHz, 0:default = MHz, 0 = default +MMDDYYYY = שנה/יום/חודש +Newest Save = Newest save +Not a PSP game = Not a PSP game +Off = Off +Oldest Save = Oldest save +PSP Model = PSP model +PSP Settings = הגדרות PSP +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Record audio +Record Display = Record display +Reset Recording on Save/Load State = Reset recording on Save/Load state +Restore Default Settings = Restore PPSSPP's settings to default +Rewind Snapshot Frequency = Rewind snapshot frequency (mem hog) +Save path in installed.txt = Save path in installed.txt +Save path in My Documents = Save path in My Documents +Savestate Slot = Savestate slot +Savestate slot backups = Savestate slot backups +Screenshots as PNG = שמור צילום מסך כ PNG +Set UI background... = Set UI background... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Simulate UMD delays +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Storage full +Sustained performance mode = Sustained performance mode +Time Format = תבנית זמן +UI = UI +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) +Use O to confirm = כדי להסכים O השתמש במקש +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = כדי להסכים X השתמש במקש +VersionCheck = Check for new versions of PPSSPP +WARNING: Android battery save mode is on = WARNING: Android battery save mode is On +WARNING: Battery save mode is on = WARNING: Battery save mode is on +YYYYMMDD = יום/חודש/שנה + +[Upgrade] +Details = Details +Dismiss = Dismiss +Download = Download +New version of PPSSPP available = New version of PPSSPP available diff --git a/assets/lang/he_IL_invert.ini b/assets/lang/he_IL_invert.ini new file mode 100644 index 0000000000..86944e1517 --- /dev/null +++ b/assets/lang/he_IL_invert.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = Audio backend (restart req.) +AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) +Auto = Auto +Device = Device +DSound (compatible) = DSound (compatible) +Enable Sound = עמש רשפא +Global volume = Global volume +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = WASAPI (fast) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Analog axis sensitivity +Analog Limiter = Analog limiter +Analog Mapper High End = Analog mapper high-end (axis sensitivity) +Analog Mapper Low End = Analog mapper low-end (inverse deadzone) +Analog Mapper Mode = Analog mapper mode +Analog Stick = Analog stick +AnalogLimiter Tip = When the analog limiter button is pressed +Auto = Auto +Auto-centering analog stick = Auto-centering analog stick +Auto-hide buttons after seconds = Auto-hide buttons after seconds +Binds = Binds +Button Opacity = םישקמ תומיטא +Button style = Button style +Calibrate D-Pad = Calibrate +Calibration = Calibration +Classic = Classic +Combo Key Setting = Combo key setting +Combo Key Setup = Combo key setup +Confine Mouse = Trap mouse within window/display area +Control Mapping = םישקמ יופימ +Custom layout... = Edit touch control layout... +Customize tilt = Customize tilt... +D-PAD = D-Pad +Deadzone Radius = Deadzone radius +DInput Analog Settings = DInput analog settings +Disable D-Pad diagonals (4-way touch) = Disable D-Pad diagonals (4-way touch) +Glowing borders = Glowing borders +HapticFeedback = Haptic feedback (vibration) +Ignore gamepads when not focused = Ignore gamepads when not focused +Ignore Windows Key = Disable Windows key +Invert Axes = Invert axes +Invert Tilt along X axis = Invert tilt along X axis +Invert Tilt along Y axis = Invert tilt along Y axis +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Keyboard control settings +L/R Trigger Buttons = L/R trigger buttons +Landscape = Landscape +Landscape Auto = Landscape auto +Landscape Reversed = Landscape reversed +Mouse = Mouse settings +Mouse sensitivity = Mouse sensitivity +Mouse smoothing = Mouse smoothing +MouseControl Tip = You can now map mouse in control mapping screen by pressing the 'M' icon. +None (Disabled) = None (disabled) +Off = Off +OnScreen = ךסמה לע עגמ ישקמ +Portrait = Portrait +Portrait Reversed = Portrait reversed +PSP Action Buttons = PSP action buttons +Screen Rotation = Screen rotation +seconds, 0 : off = seconds, 0 = off +Sensitivity = Sensitivity +Show right analog = Show right analog +Show Touch Pause Menu Button = Show pause menu button +Thin borders = Thin borders +Tilt Base Radius = Tilt base radius +Tilt Input Type = Tilt input type +Tilt Sensitivity along X axis = Tilt sensitivity along X axis +Tilt Sensitivity along Y axis = Tilt sensitivity along Y axis +To Calibrate = To calibrate, keep device on a flat surface and press "Calibrate". +Touch Control Visibility = Touch control visibility +Use custom right analog = Use custom right analog +Use Mouse Control = Use mouse control +Visibility = Visibility +X = X +X + Y = X + Y +XInput Analog Settings = XInput analog settings +Y = Y + +[CwCheats] +Cheats = Cheats +Edit Cheat File = Edit cheat file +Enable/Disable All = Enable/Disable all Cheats +Import Cheats = Import from cheat.db +Options = Options +Refresh Rate = Refresh rate + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = &About PPSSPP... +Auto = &Auto +Backend = Rendering &Backend (Restarts PPSSPP) +Bicubic = &Bicubic +Break = Break +Break on Load = Break on load +Buffered Rendering = &Buffered Rendering +Buy Gold = Buy &Gold +Control Mapping... = C&ontrol Mapping... +Debugging = Debu&g +Deposterize = &Deposterize +Direct3D9 = &Direct3D9 +Direct3D11 = Direct3D &11 +Disassembly = &Disassembly... +Discord = Discord +Display Layout Editor = Display layout editor... +Display Rotation = Display rotation +Dump Next Frame to Log = D&ump Next Frame to Log +Emulation = &Emulation +Enable Chat = Enable chat +Enable Cheats = Enable &Cheats (Resets Game) +Enable Sound = Enable S&ound +Exit = E&xit +Extract File... = E&xtract File... +File = &File +Frame Skipping = &Frame skipping +Frame Skipping Type = Frame skipping type +Fullscreen = Fu&llscreen +Game Settings = &Game Settings +GE Debugger... = GE Debugge&r... +GitHub = Git&Hub +Hardware Transform = &Hardware Transform +Help = &Help +Hybrid = &Hybrid +Hybrid + Bicubic = H&ybrid + Bicubic +Ignore Illegal Reads/Writes = &Ignore Illegal Reads/Writes +Ignore Windows Key = Ignore Windows Key +Keep PPSSPP On Top = &Keep PPSSPP on Top +Landscape = Landscape +Landscape reversed = Landscape reversed +Language... = La&nguage... +Linear = &Linear +Load = &Load... +Load .sym File... = Lo&ad .sym File... +Load Map File... = Load &Map File... +Load State = Load State +Load State File... = &Load State File... +Log Console = &Log Console +Memory View... = Memory &View... +More Settings... = &More Settings... +Nearest = &Nearest +Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) +Off = &Off +Open Directory... = Open &Directory... +Open from MS:/PSP/GAME... = O&pen from MS:/PSP/GAME... +Open Memory Stick = Open &Memory Stick +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = &Pause +Pause When Not Focused = &Pause When Not Focused +Portrait = Portrait +Portrait reversed = Portrait reversed +Postprocessing Shader = Postprocessin&g Shader +PPSSPP Forums = PPSSPP &Forums +Record = &Record +Record Audio = Record &audio +Record Display = Record &display +Rendering Mode = Rendering M&ode +Rendering Resolution = &Rendering Resolution +Reset = R&eset +Reset Symbol Table = &Reset Symbol Table +Run = &Run +Save .sym File... = Sav&e .sym File... +Save Map File... = &Save Map File... +Save State = Save State +Save State File... = &Save State File... +Savestate Slot = Saves&tate Slot +Screen Scaling Filter = Scr&een Scaling Filter +Show Debug Statistics = Show Debu&g Statistics +Show FPS Counter = Show &FPS Counter +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = &Stop +Switch UMD = Switch UMD +Take Screenshot = &Take Screenshot +Texture Filtering = Te&xture Filtering +Texture Scaling = &Texture Scaling +Use Lossless Video Codec (FFV1) = &Use lossless video codec (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = &Vertex Cache +VSync = VS&ync +Vulkan = Vulkan +Window Size = &Window Size +www.ppsspp.org = Visit www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allocator viewer (Vulkan) +Allow remote debugger = Allow remote debugger +Backspace = Backspace +Block address = Block address +By Address = By address +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Create/Open textures.ini file for current game +Current = Current +Dev Tools = Development tools +DevMenu = DevMenu +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Dump decrypted EBOOT.BIN on game boot +Dump Frame GPU Commands = Dump frame GPU commands +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = םיגאב חוויד רשפא +Enter address = Enter address +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Frame profiler +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = Jit compare +JIT debug tools = JIT debug tools +Language = הפש +Load language ini = הפש ץבוק ןעט +Log Dropped Frame Statistics = Log dropped frame statistics +Log Level = Log level +Log View = Log view +Logging Channels = Logging channels +Next = Next +No block = No block +Prev = Previous +Random = Random +Replace textures = Replace textures +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. +RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? +Resume = Resume +Run CPU Tests = דבעמ תוקידב ץרה +Save language ini = הפש ץבוק רומש +Save new textures = Save new textures +Shader Viewer = Shader viewer +Show Developer Menu = Show developer menu +Show on-screen messages = Show on-screen messages +Stats = Stats +System Information = תכרעמה לע עדימ +Texture Replacement = Texture replacement +Toggle Audio Debug = Toggle audio debug +Toggle Freeze = Toggle freeze +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP res +Active = Active +Back = << +Cancel = לטב +Center = Center +ChangingGPUBackends = Changing GPU backends requires PPSSPP to restart. Restart now? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = Choose PPSSPP save folder +Confirm Overwrite = ?ולא םינותנ בתכשל הצור +Confirm Save = ?ולא םינותנ רומשל הצור +ConfirmLoad = ?ולא םינותנ ןועטל הצור +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = קחמ +Delete all = Delete all +Delete completed = .המלשוה הקיחמ +DeleteConfirm = ?ךישמהל םאה .וקחמי ולאה םירומשה םינותנה +DeleteConfirmAll = ?הזה קחשמה רובע הרימשה ינותנ לכ תא קוחמל םאה +DeleteConfirmGame = .וז הלועפ לטבל ןתינ אל ?ךלש רישכמהמ הזה קחשמה תא קוחמל +DeleteConfirmGameConfig = Do you really want to delete the settings for this game? +DeleteFailed = Unable to delete data. +Deleting = ...ןתמה אנא ...קחומ +Disable All = Disable all +Edit = Edit +Enable All = Enable all +Enter = סנכה +Finish = םייס +Grid = Grid +Inactive = Inactive +InternalError = An internal error has occurred. +Load = Load +Load completed = .המלשוה הניעט +Loading = ...ןתמה אנא ...ןעוט +LoadingFailed = Unable to load data. +Move = Move +Network Connection = Network Connection +NEW DATA = םישדח םינותנ +No = אל +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = רדסב +Old savedata detected = Old savedata detected +Options = Options +Reset = Reset +Resize = Resize +Retry = Retry +Save = Save +Save completed = .המלשוה הרימש +Saving = ...ןתמה אנא ...רמוש +SavingFailed = Unable to save data. +Select = רחב +Shift = העבר +Snap = Snap +Space = Space +SSID = SSID +Submit = Submit +Supported = Supported +There is no data = .םינותנ ןיא +Toggle All = Toggle all +Toggle List = Toggle list +Unsupported = Unsupported +When you save, it will load on a PSP, but not an older PPSSPP = When you save, it will load on a PSP, but not an older PPSSPP +When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Yes = ןכ +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = file is compressed (7z).\nPlease decompress first (try 7-Zip or WinRAR). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = Could not save screenshot file. +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll not found. Please install. Or press Yes to try again using Direct3D 9 instead. +D3D11InitializationError = Direct3D 11 initialization error +D3D11Missing = Your operating system version does not include D3D11. Please run Windows Update.\n\nPress Yes to try again using Direct3D 9 instead. +D3D11NotSupported = Your GPU does not appear to support Direct3D 11.\n\nWould you like to try again using Direct3D 9 instead? +Disk full while writing data = Disk full while writing data. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = :ץבוקה תניעט תעב האיגש +Error reading file = .הלשכנ ץבוק תאירק +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = .לשכנ ץבוק יוהיז +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Failed initializing graphics. Try upgrading your graphics drivers and DirectX 9 runtime.\n\nWould you like to try switching to OpenGL?\n\nError message: +GenericGraphicsError = Graphics Error +GenericOpenGLError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to DirectX 9?\n\nError message: +GenericVulkanError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to OpenGL?\n\nError message: +InsufficientOpenGLDriver = Insufficient OpenGL driver support detected!\n\nYour GPU reports that it does not support OpenGL 2.0. Would you like to try using DirectX instead?\n\nDirectX is currently compatible with less games, but on your GPU it may be the only choice.\n\nVisit the forums at https://forums.ppsspp.org for more information.\n\n +Just a directory. = .ןויכרא קר +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = .קחשמה יוהיזב הגש ,EBOOT.PBP ןיא +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = OpenGL driver error +PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP currently does not support connecting to the Internet for DLC, PSN, or game updates. +PS1 EBOOTs are not supported by PPSSPP. = .םיכמתנ אל 1 ןשיטסיילפ יקחשמ +PSX game image detected. = File is a MODE2 image. PPSSPP doesn't support PS1 games. +RAR file detected (Require UnRAR) = file is compressed (RAR).\nPlease decompress first (try UnRAR). +RAR file detected (Require WINRAR) = file is compressed (RAR).\nPlease decompress first (try WinRAR). +Running slow: try frameskip, sound is choppy when slow = Running slow: try frameskip, sound is choppy when slow +Running slow: Try turning off Software Rendering = Running slow: try turning off "software rendering" +Save encryption failed. This save won't work on real PSP = Save encryption failed. This save won't work on real PSP +textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +This is a saved state, not a game. = This is a saved state, not a game. +This is save data, not a game. = This is save data, not a game. +Unable to create cheat file, disk may be full = Unable to create cheat file, disk may be full. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Unable to write savedata, disk may be full. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Warning: Video memory FULL, reducing upscaling and switching to slow caching mode. +Warning: Video memory FULL, switching to slow caching mode = Warning: Video memory FULL, switching to slow caching mode. +ZIP file detected (Require UnRAR) = file is compressed (ZIP).\nPlease decompress first (try UnRAR). +ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompress first (try WinRAR). + +[Game] +Asia = Asia +ConfirmDelete = Delete +Create Game Config = Create game config +Create Shortcut = Create shortcut +Delete Game = Delete game +Delete Game Config = Delete game config +Delete Save Data = Delete savedata +Europe = Europe +Game = Game +Game Settings = Game settings +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Data install +Japan = Japan +Korea = Korea +MB = MB +One moment please... = One moment please... +Play = Play +Remove From Recent = Remove from "Recent" +SaveData = Savedata +Setting Background = Setting background +Show In Folder = Show in folder +USA = USA +Use UI background = Use UI background + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = unlimited +(supersampling) = (supersampling) +(upscaling) = (upscaling) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Aggressive +Alternative Speed = תוריהמ תלבגה +Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Anisotropic Filtering = Anisotropic filtering +Auto = יטמוטוא +Auto (1:1) = Auto (1:1) +Auto (same as Rendering) = Auto (same as rendering resolution) +Auto FrameSkip = Auto frameskip +Auto Scaling = Auto scaling +Backend = Backend +Balanced = Balanced +Bicubic = Bicubic +BlockTransfer Tip = Some games require this to be On for correct graphics +BlockTransferRequired = Warning: This game requires "simulate block transfer effects" to be set to On. +Both = םהינש +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = דבועמ רגאמ +BufferedRenderingRequired = Warning: This game requires "rendering mode" to be set to "buffered". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Screen size (in % of the viewport) +Cardboard Screen X Shift = X shift (in % of the blank space) +Cardboard Screen Y Shift = Y shift (in % of the blank space) +Cardboard VR Settings = Google Cardboard VR settings +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU core +Debugging = יופינ +DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. +Deposterize = Deposterize +Deposterize Tip = Fixes visual banding glitches in upscaled textures +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Disable slower effects (speedup) +Disabled = Disabled +Display layout editor = Display layout editor +Display Resolution (HW scaler) = Display resolution (HW scaler) +Dump next frame to log = חוודל ידכ אבה םיירפה תא רחב +Enable Cardboard VR = Enable Cardboard VR +FPS = היינשל םימיירפ תומכ +Frame Rate Control = םימיירפ בצק לע הטילש +Frame Skipping = םימיירפ לע גלד +Frame Skipping Type = Frame skipping type +FullScreen = אלמ ךסמ +Hack Settings = Hack settings (may cause glitches) +Hardware Tessellation = Hardware tessellation +Hardware Transform = הרמוח תמאתה +hardware transform error - falling back to software = Hardware transform error, falling back to software +HardwareTessellation Tip = Uses hardware to make curves +High = High +Hybrid = ידירביה +Hybrid + Bicubic = ידירביה + Bicubic +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Internal resolution +Lazy texture caching = Lazy texture caching (speedup) +Linear = יווק +Low = Low +LowCurves = Spline/Bezier curves quality +LowCurves Tip = Only used by some games, controls smoothness of curves +Lower resolution for effects (reduces artifacts) = Lower resolution for effects (reduces artifacts) +Manual Scaling = Manual scaling +Medium = Medium +Mode = בצמ +Must Restart = You must restart PPSSPP for this change to take effect. +Native device resolution = Native device resolution +Nearest = רתויב בורקה +No buffer = No buffer +Non-Buffered Rendering = Skip buffer effects (non-buffered, faster) +None = הנומ גיצת לא +Number of Frames = Number of frames +Off = יובכ +OpenGL = OpenGL +Overlay Information = עדימ יוסיכ +Partial Stretch = Partial stretch +Percent of FPS = Percent of FPS +Performance = Performance +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Postprocessing shader +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = דבועמ בצמ +Rendering Resolution = Rendering resolution +RenderingMode NonBuffered Tip = Faster, but nothing may draw in some games +Retain changed textures = Retain changed textures (sometimes slower) +RetainChangedTextures Tip = Makes many games slower, but some games a lot faster +Rotation = Rotation +Safe = Safe +Screen layout = Screen layout +Screen Scaling Filter = Screen scaling filter +Show Debug Statistics = םיגאב תקיטסיטטס גצה +Show FPS Counter = הנומ גצה +Simulate Block Transfer = Simulate block transfer effects +SoftGPU Tip = Currently VERY slow +Software Rendering = )ינויסינ( הנכות דוביע +Software Skinning = Software skinning +SoftwareSkinning Tip = Combine skinned model draws on the CPU, faster in most games +Speed = תוריהמ +Stretching = Stretching +Texture Filter = הרוטסקט דודיק +Texture Filtering = הרוטסקט דודיק +Texture Scaling = הרוטסקט תדימ +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Turn off "hardware tessellation": unsupported +Unlimited = Unlimited +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = תיתרקוי המר +Upscale Type = יתרקוי גוס +UpscaleLevel Tip = CPU heavy - some scaling may be delayed to avoid stutter +Use all displays = Use all displays +Vertex Cache = Vertex ןומטמ +VertexCache Tip = Faster, but may cause temporary flicker +VSync = יכנא ןורכנס +Vulkan = Vulkan +Window Size = Window size +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Delete ZIP file +Install = Install +Install game from ZIP file? = Install game from ZIP file? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = Installed! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = Auto configure +Autoconfigure for device = Autoconfigure for device +Clear All = לכה הקנ +Default All = לכה רזחה +Map a new key for = ףסונ שקמ יופימ +Map Key = Map key +Map Mouse = Map mouse +Test Analogs = Test analogs +You can press ESC to cancel. = You can press Esc to cancel. + +[MainMenu] +Browse = Browse... +Buy PPSSPP Gold = Buy PPSSPP Gold +Choose folder = Choose folder +Credits = םירצוי תויוכז +PPSSPP Homebrew Store = PPSSPP Homebrew Store +Exit = אצ +Game Settings = קחשמ תורדגה +Games = םיקחשמ +Give PPSSPP permission to access storage = Give PPSSPP permission to access storage +Homebrew & Demos = תיב תרצות יקחשמו ומד יקחשמ +How to get games = םיקחשמ גישהל ךיא +How to get homebrew & demos = תיב תרצות יקחשמ גישהל ךיא +Load = ...ןעט +Loading... = Loading... +PinPath = Pin +PPSSPP can't load games or save right now = PPSSPP can't load games or save right now +Recent = םינורחא +SavesAreTemporary = PPSSPP is saving in temporary storage +SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently +SavesAreTemporaryIgnore = Ignore warning +UnpinPath = Unpin +www.ppsspp.org = רתאל + +[MainSettings] +Audio = עמש +Controls = םישקמ +Graphics = הקיפארג +Networking = Networking +System = תכרעמ +Tools = Tools + +[MappableControls] +Alt speed 1 = Alt speed 1 +Alt speed 2 = Alt speed 2 +An.Down = v קיטסייו'ג +An.Left = > קיטסייו'ג +An.Right = < קיטסייו'ג +An.Up = ^ קיטסייו'ג +Analog limiter = Analog limiter +Analog Stick = Analog stick +Audio/Video Recording = Audio/Video recording +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Axis swap +Circle = Circle +Cross = Cross +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = DevMenu +Down = v +Dpad = Dpad +Frame Advance = Frame advance +Hold = Hold +Home = Home +L = L +Left = < +Load State = Load State +Mute toggle = Mute toggle +Next Slot = Next Slot +None = None +Note = Note +OpenChat = Open chat +Pause = עצור +R = R +RapidFire = RapidFire +Remote hold = Remote hold +Rewind = Rewind +Right = > +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = v ינמי 'סייו'ג +RightAn.Left = < ינמי 'סייו'ג +RightAn.Right = > ינמי 'סייו'ג +RightAn.Up = ^ ינמי 'סייו'ג +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Save State +Screen = Screen +Screenshot = Screenshot +Select = Select +SpeedToggle = תוריהמ יוניש +Square = Square +Start = Start +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = Toggle fullscreen +Toggle mode = Toggle mode +Triangle = Triangle +Unthrottle = Unthrottle +Up = ^ +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Change MAC address +Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable network chat = Enable network chat +Enable networking = Enable networking/WLAN (beta, may break games) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Network initialized +Please change your Port Offset = Please change your port offset +Port offset = Port offset(0 = PSP compatibility) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Send Discord "Rich Presence" information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = Cheats +Continue = ךשמה +Create Game Config = Create game config +Delete Game Config = Delete game config +Exit to menu = ישארה טירפתל אצ +Game Settings = קחשמ תורדגה +Load State = טען מצב שמור +Rewind = Rewind +Save State = בצמ רומש +Settings = תורדגה +Switch UMD = Switch UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Color +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Cartoon +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT scanlines +FXAA = FXAA Antialiasing +Gamma = Gamma +Grayscale = Grayscale +Intensity = Intensity +InverseColors = Inverse Colors +Natural = Natural Colors +NaturalA = Natural Colors (no blur) +Off = Off +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlines (CRT) +Sharpen = Sharpen +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 Upscaler +VideoSmoothingAA = VideoSmoothingAA +Vignette = Vignette + +[PSPCredits] +all the forum mods = all the forum mods +build server = build server +Buy Gold = תאסרג הנק Gold +check = תא ואר: Dolphin, ה רוטלומא Wii/GC רתויב בוטה +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = םימרות: +created = י"ע רצונ +Discord = Discord +info1 = .PPSSPP דבלב תויכוניח תורטמל דעוימ +info2 = םיקחשמה לכל תויוכזה לש םילעבה התאש אדו אנא +info3 = תילטיגיד השיכר ידי לע וא ילסרבינואה הידמה קסיד לע תולעב ידי לע קחשמ התא +info4 = ה תונחמ דרוה PSN ה םע PSP .ךלש יתימאה +info5 = PSP מ"עב ינוס ידי לע רחסמ ןמיס אוה +iOS builds = iOS builds +license = GPL 2.0+ תחת חותפ דוקב הנכות +list = חותיפ לע עדימו םימורופ ,תומיאת תומישר +PPSSPP Forums = םימורופ +Privacy Policy = Privacy policy +Share PPSSPP = Share PPSSPP +specialthanks = ל תדחוימ הדות: +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = י"ע אוה הזה םוגרתה: ravid1323 +title = רוטלומיא PSP דיינו ריהמ +tools = םושייה שומישב םיימניח םילכ: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = +translators2 = +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = רתאה לא וסנכ: +written = ב בתכנ ++C תודיינו תוריהמל + +[RemoteISO] +Browse Games = Browse games +Local Server Port = Local server port +Manual Mode Client = Manual mode client +Remote disc streaming = Remote disc streaming +Remote Port = Remote port +Remote Server = Remote server +Remote Subdirectory = Remote subdirectory +RemoteISODesc = Games in your recent list will be shared +RemoteISOLoading = Connected, loading game list... +RemoteISOScanning = Scanning... Click "share games" on your server device +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Note: Connect both devices to the same Wi-Fi network +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Settings +Share Games (Server) = Share games (server) +Share on PPSSPP startup = Share on PPSSPP startup +Stop Sharing = Stop sharing +Stopping.. = Stopping... + +[Reporting] +Bad = Bad +FeedbackDelayInfo = Your data is being submitted in the background. +FeedbackDesc = How's the emulation? Let us and the community know! +FeedbackDisabled = Compatibility server reports must be enabled. +FeedbackIncludeCRC = Note: Battery will be used to send a disc CRC +FeedbackIncludeScreen = Include a screenshot +FeedbackSubmitDone = Your data has been submitted. +FeedbackSubmitFail = Could not submit data to server. Try updating PPSSPP. +FeedbackThanks = Thanks for your feedback! +Gameplay = Gameplay +Graphics = Graphics +Great = Great +In-game = In-game +In-game Description = Gets into gameplay, but too buggy to complete +Menu/Intro = Menu/Intro +Menu/Intro Description = Can't get into the game itself +Nothing = Nothing +Nothing Description = Completely broken +OK = OK +Open Browser = Open browser +Overall = Overall +Perfect = Perfect +Perfect Description = Flawless emulation for the entire game - great! +Plays = Plays +Plays Description = Fully playable but might be with glitches +ReportButton = Report feedback +Speed = Speed +Submit Feedback = Submit feedback +SuggestionConfig = See reports on website for good settings. +SuggestionCPUSpeed0 = Disable locked CPU speed setting. +SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this bug). +SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. +SuggestionsNone = This game isn't working for other users too. +SuggestionsWaiting = Submitting and checking other users feedback... +SuggestionUpgrade = Upgrade to a newer PPSSPP build. +SuggestionVerifyDisc = Check your ISO is a good copy of your disc. +Unselected Overall Description = How well does this game emulate? +View Feedback = View all feedbacks + +[Savedata] +Date = Date +Filename = Filename +No screenshot = No screenshot +None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Save Data = Save data +Save States = Save states +Savedata Manager = Savedata manager +Size = Size + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = WARNING: Chainfire3D detected, may cause problems. +Failed to load state = Failed to load state +Failed to save state = Failed to save state +fixed = ריהמ רתוי +GLToolsWarning = WARNING: GLTools detected, may cause problems. +In menu = In menu +Load savestate failed = Load savestate failed +Loaded State = ןעטנ בצמ +Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +LoadStateDoesntExist = !םייק וניא רומש בצמה :בצמה תא ןועטל חילצה אל +LoadStateWrongVersion = !PPSSPP לש רתוי הנשי הסרגל תדעוימש הרימש אוה בצמה :בצמה תא ןועטל חילצה אל +norewind = No rewind save states available. +Playing = Playing +PressESC = .טירפתה תא חותפל ידכ ESC לע ץחל +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = !בצמה תרימשב הלקת +Saved State = רמשנ בצמ +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Speed: alternate 2 +standard = תיטרדנטס תוריהמ +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = Already installed +Connection Error = Connection error +Install = Install +Launch Game = Launch game +Loading... = Loading... +MB = MB +Size = Size +Uninstall = Uninstall + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d cores) +%d bytes = %d bytes +(none detected) = (none detected) +3D API = 3D API +ABI = ABI +API Version = API version +Audio Information = Audio information +Board = Board +Build Config = Build config +Build Configuration = Build Configuration +Built by = Built by +Core Context = Core context +Cores = Cores +CPU Extensions = CPU extensions +CPU Information = CPU information +CPU Name = Name +D3DCompiler Version = D3DCompiler version +Debug = Debug +Debugger Present = Debugger present +Device Info = Device info +Display Information = Display information +Driver Version = Driver version +EGL Extensions = EGL extensions +Frames per buffer = Frames per buffer +GPU Information = GPU information +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Lang/Region +Memory Page Size = Memory page size +Native Resolution = Native resolution +OGL Extensions = OGL extensions +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 extensions +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 extensions +OpenGL Extensions = OpenGL extensions +Optimal frames per buffer = Optimal frames per buffer +Optimal sample rate = Optimal sample rate +OS Information = OS information +PPSSPP build = PPSSPP build +Refresh rate = Refresh rate +Release = Release +RW/RX exclusive = RW/RX exclusive +Sample rate = Sample rate +Shading Language = Shading language +Sustained perf mode = Sustained perf mode +System Information = System information +System Name = Name +System Version = System version +Threads = Threads +Vendor = Vendor +Vendor (detected) = Vendor (detected) +Version Information = Version information +Vulkan Extensions = Vulkan extensions +Vulkan Features = Vulkan features + +[System] +(broken) = (broken) +12HR = PM/FM +24HR = 24HR +Auto = Auto +Auto Load Savestate = Auto load savestate +AVI Dump started. = AVI dump started +AVI Dump stopped. = AVI dump stopped +Cache ISO in RAM = Cache full ISO in RAM +Change CPU Clock = דבעמ בצק הנש (unstable) +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = יוניכ הנש +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = )םורופב האר ,ינויסינ( םיטי'צ +Clear Recent = Clear "Recent" +Clear Recent Games List = םינורחא תמישר הקנ +Clear UI background = Clear UI background +Confirmation Button = םישקמ תפדעה +Date Format = ךיראת תינבת +Day Light Saving = םוי רוא לע הרימש +DDMMYYYY = םוי/שדוח/הנש +Decrease size = Decrease size +Developer Tools = חותיפ ילכ +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = היצלומיס +Enable Cheats = םיטי'צ רשפא +Enable Compatibility Server Reports = תומיאת יחוויד תרש רשפא +Failed to load state. Error in the file system. = Failed to load state. Error in the file system. +Failed to save state. Error in the file system. = Failed to save state. Error in the file system. +Fast (lag on slow storage) = Fast (lag on slow storage) +Fast Memory = )ביצי אל( ןורכיז לש ריהמ דוביע +Force real clock sync (slower, less lag) = Force real clock sync (slower, less lag) +frames, 0:off = frames, 0 = off +Games list settings = Games list settings +General = יללכ +Grid icon size = Grid icon size +Help the PPSSPP team = Help the PPSSPP team +Host (bugs, less lag) = Host (bugs, less lag) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Interpreter +IO timing method = I/O timing method +IR Interpreter = IR interpreter +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = Memory Stick inserted +MHz, 0:default = MHz, 0 = default +MMDDYYYY = שדוח/םוי/הנש +Newest Save = Newest save +Not a PSP game = Not a PSP game +Off = Off +Oldest Save = Oldest save +PSP Model = PSP model +PSP Settings = PSP תורדגה +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Record audio +Record Display = Record display +Reset Recording on Save/Load State = Reset recording on Save/Load state +Restore Default Settings = Restore PPSSPP's settings to default +Rewind Snapshot Frequency = Rewind snapshot frequency (mem hog) +Save path in installed.txt = Save path in installed.txt +Save path in My Documents = Save path in My Documents +Savestate Slot = Savestate slot +Savestate slot backups = Savestate slot backups +Screenshots as PNG = PNG כ ךסמ םוליצ רומש +Set UI background... = Set UI background... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Simulate UMD delays +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Storage full +Sustained performance mode = Sustained performance mode +Time Format = ןמז תינבת +UI = UI +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) +Use O to confirm = שקמב שמתשה O םיכסהל ידכ +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = שקמב שמתשה X םיכסהל ידכ +VersionCheck = Check for new versions of PPSSPP +WARNING: Android battery save mode is on = WARNING: Android battery save mode is On +WARNING: Battery save mode is on = WARNING: Battery save mode is on +YYYYMMDD = הנש/שדוח/םוי + +[Upgrade] +Details = Details +Dismiss = Dismiss +Download = Download +New version of PPSSPP available = New version of PPSSPP available diff --git a/assets/lang/hr_HR.ini b/assets/lang/hr_HR.ini new file mode 100644 index 0000000000..e21a56b1af --- /dev/null +++ b/assets/lang/hr_HR.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Naizmjenična brzina zvuka +Audio backend = Poslužitelj zvuka (ponovo pokrenuti) +AudioBufferingForBluetooth = Bluetooth-prijateljski poliranje (sporije) +Auto = Automatski +Device = Uređaj +DSound (compatible) = DSound (kompatibilno) +Enable Sound = Uključi zvuk +Global volume = Opća glasnoća +Microphone = Microphone +Microphone Device = Microphone device +Mute = Priguši +Switch on new audio device = Promijeni trenutni uređaj +Use global volume = Koristi opću glasnoću +WASAPI (fast) = WASAPI (brzo) + +[Controls] +Analog auto-rotation speed = Auto-Rotacija analogne brzine +Analog Axis Sensitivity = Senzitivnost analogne osi +Analog Limiter = Analogni ograničivač +Analog Mapper High End = Postavljanje senzitivnost osi +Analog Mapper Low End = Obrtanje mrtve zone +Analog Mapper Mode = Način analognog postavljanja +Analog Stick = Analogni stick +AnalogLimiter Tip = Kada je analog limiter tipka pritisnuta +Auto = Automatski +Auto-centering analog stick = Auto-centriranje analog stick-a +Auto-hide buttons after seconds = Auto-sakrij tipke nakon sekundi +Binds = Binds +Button Opacity = Prozirnost tipki +Button style = Stil tipki +Calibrate D-Pad = Kalibriraj +Calibration = Kalibracija +Classic = Klasično +Combo Key Setting = Postavke combo tipki +Combo Key Setup = Postavljanje combo tipki +Confine Mouse = Zaključaj miš u window/display području +Control Mapping = Namještanje kontrola +Custom layout... = Izmijeni raspored dodirnih kontrola... +Customize tilt = Izmijeni tilt... +D-PAD = D-Pad +Deadzone Radius = Radijus mrtve zone +DInput Analog Settings = Postavke DInput analoga +Disable D-Pad diagonals (4-way touch) = Isključi D-Pad dijagonale (4-smjerni dodir) +Glowing borders = Svijetleći rubovi +HapticFeedback = Povratna informacija (vibracija) +Ignore gamepads when not focused = Ignoriraj gamepade kada nije fokusirano +Ignore Windows Key = Isključi Windows tipku +Invert Axes = Izmijeni osi +Invert Tilt along X axis = Obrni tilt uz X os +Invert Tilt along Y axis = Obrni tilt uz Y os +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Postavke kontrole tipkovnice +L/R Trigger Buttons = L/R trigger buttons +Landscape = Orijentacija +Landscape Auto = Auto orijentacija +Landscape Reversed = Obrnuta orijentacija +Mouse = Postavke miša +Mouse sensitivity = Senzitivnost miša +Mouse smoothing = Izglađivanje miša +MouseControl Tip = Sada možeš postaviti miš u ekranu postavljanja kontroli pritiskajuci 'M' tipku. +None (Disabled) = Nema (Isključeno) +Off = Isključeno +OnScreen = Dodirne kontrole na ekranu +Portrait = Portret +Portrait Reversed = Obrnuti portret +PSP Action Buttons = PSP akcijske kontrole +Screen Rotation = Rotacija ekrana +seconds, 0 : off = sekunde, 0 = isključeno +Sensitivity = Osjetljivost +Show right analog = Show right analog +Show Touch Pause Menu Button = Prikaži tipku za izbornik pauze +Thin borders = Tanki rubovi +Tilt Base Radius = Tilt base radius +Tilt Input Type = Tip ulaza tilta +Tilt Sensitivity along X axis = Tilt senzitivnost X osi +Tilt Sensitivity along Y axis = Tilt senzitivnost Y osi +To Calibrate = Za kalibraciju, drži uređaj na ravnoj površini i pritisni "Kalibriraj". +Touch Control Visibility = Vidljivost dodirnih kontroli +Use custom right analog = Use custom right analog +Use Mouse Control = Koristi miš za kontrole +Visibility = Vidljivost +X = X +X + Y = X + Y +XInput Analog Settings = XInput postavke analoga +Y = Y + +[CwCheats] +Cheats = Šifre +Edit Cheat File = Izmijeni cheat datoteku +Enable/Disable All = Upali/Izgasi sve Šifre +Import Cheats = Uvezi iz cheat.db +Options = Opcije +Refresh Rate = Brzina osvježavanja + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = &O PPSSPP... +Auto = &Auto +Backend = Poslužitelj &renderanja (restarta PPSSPP) +Bicubic = &Bikubično +Break = Pokvari +Break on Load = Pokvari na učitavanju +Buffered Rendering = &Buffano prikazivanje +Buy Gold = Kupi &Gold +Control Mapping... = P&ostavljanje kontroli... +Debugging = &Debug +Deposterize = &Deposteriziraj +Direct3D9 = Direct3D &9 +Direct3D11 = Direct3D &11 +Disassembly = &Disassembly... +Discord = Discord +Display Layout Editor = Prikaži uređivanje kontroli... +Display Rotation = Rotacija prikaza +Dump Next Frame to Log = O&dloži sljedeći frame na log +Emulation = &Emulacija +Enable Chat = Enable chat +Enable Cheats = Uključi &šifre +Enable Sound = Uključi z&vuk +Exit = I&zlaz +Extract File... = R&aspakiraj datoteku... +File = &Datoteka +Frame Skipping = &Preskakanje frameova +Frame Skipping Type = Tip preskakanja frameova +Fullscreen = Pu&ni ekran +Game Settings = &Postavke igre +GE Debugger... = GE debugge&r... +GitHub = Git&Hub +Hardware Transform = &Hardverska transformacija +Help = &Pomoć +Hybrid = &Hibrid +Hybrid + Bicubic = H&ibrid + bicubic +Ignore Illegal Reads/Writes = &Ignoriraj ilegalna pisanja/čitanja +Ignore Windows Key = Ignoriraj Windows tipku +Keep PPSSPP On Top = &Drži PPSSPP na vrhu +Landscape = Orijentacija +Landscape reversed = Obrnuta orijentacija +Language... = Je&zik... +Linear = &Linearno +Load = &Učitaj... +Load .sym File... = Uč&itaj .sym datoteku... +Load Map File... = Učitaj &Map datoteku... +Load State = U&čitaj state +Load State File... = &Učitaj state datoteku... +Log Console = &Konzola log-a +Memory View... = Pregled &memorije... +More Settings... = &Više postavki... +Nearest = &Najbliže +Non-Buffered Rendering = &Preskoči bufferane efekte (non-buffered, faster) +Off = &Off +Open Directory... = Otvori &direktorij... +Open from MS:/PSP/GAME... = O&tvori iz MS:/PSP/GAME... +Open Memory Stick = Otvori &Memorijsku Karticu +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = &Pauza +Pause When Not Focused = &Pauziraj kad nije fokusirano +Portrait = Portret +Portrait reversed = Obrnuti portret +Postprocessing Shader = Postupa&k sjenčanja +PPSSPP Forums = PPSSPP &forumi +Record = &Snimaj +Record Audio = Snimaj &zvuk +Record Display = Snimaj &zaslon +Rendering Mode = Način p&rikazivanja +Rendering Resolution = &Rezolucija prikazivanja +Reset = R&esetiraj +Reset Symbol Table = Resetiraj s&ymbol tablicu +Run = &Pokreni +Save .sym File... = Spr&emi .sym datoteku... +Save Map File... = &Spremi map datoteku... +Save State = S&premi state +Save State File... = &Spremi state datoteku... +Savestate Slot = Saves&tate slot +Screen Scaling Filter = Scr&een scaling filter +Show Debug Statistics = Prikaži debu&g statistike +Show FPS Counter = Prikaži &FPS broj +Skip Number of Frames = Preskoči broj okvira +Skip Percent of FPS = Preskoči postotak FPS-a +Stop = &Stopiraj +Switch UMD = Promijeni UMD +Take Screenshot = &Slikaj zaslon +Texture Filtering = Fi<riranje teksturi +Texture Scaling = &Skaliranje teksturi +Use Lossless Video Codec (FFV1) = &Koristite lossless video protokol (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = &Vertex cache +VSync = VS&ync +Vulkan = Vulkan +Window Size = &Veličina prozora +www.ppsspp.org = Posjeti www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Pregled alokacije (Vulkan) +Allow remote debugger = Dopusti remote debuganje +Backspace = Vrati +Block address = Blokiraj addresu +By Address = Od adrese +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Kreiraj/Otvori textures.ini datoteku za trenutnu igru +Current = Trenutačno +Dev Tools = Razvojni alati +DevMenu = DevMenu +Disabled JIT functionality = Isključena JIT funkcionalnost +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Dump decrypted EBOOT.BIN on game boot +Dump Frame GPU Commands = Dump frame GPU commands +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Uključi debug logging +Enter address = Upiši adresu +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Frame profiler +GPU Driver Test = Testiranje GPU drivera +GPU Profile = GPU profil +Jit Compare = JIT uspoređivanje +JIT debug tools = JIT debug alati +Language = Jezik +Load language ini = Učitaj language ini +Log Dropped Frame Statistics = Log dropped frame statistics +Log Level = Log level +Log View = Log pregled +Logging Channels = Logging kanali +Next = Sljedeće +No block = Nema bloka +Prev = Prošlo +Random = Nasumično +Replace textures = Zamijeni teksture +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Jesi li siguran da želiš vratiti sve postavke na zadano?\nPostavke kontroli nisu izmijenjene.\n\nNe možeš poništiti ovo.\nPonovo pokrenite PPSSPP za izmijenu postavki. +RestoreGameDefaultSettings = Jesi li siguran da želiš vratiti igrom-specifične postavke \nna PPSSPP zadane postavke? +Resume = Resume +Run CPU Tests = Pokreni CPU testove +Save language ini = Spremi language ini +Save new textures = Spremi nove teksture +Shader Viewer = Pregled sjenčanja +Show Developer Menu = Prikaži developer izbornik +Show on-screen messages = Show on-screen messages +Stats = Stats +System Information = System informacija +Texture Replacement = Zamjena teksturi +Toggle Audio Debug = Uključi audio debuganje +Toggle Freeze = Uključi zamrzavanje +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP res +Active = Aktivno +Back = Nazad +Cancel = Odustani +Center = Center +ChangingGPUBackends = Mijenjanje GPU poslužitelja zahtijeva ponovno pokretanje PPSSPP. Ponovno pokrenuti? +ChangingInflightFrames = Mijenjanje grafičkih komandnih poliranja zahtijeva ponovno pokretanje PPSSPP. Ponovno pokrenuti? +Channel: = Channel: +Choose PPSSPP save folder = Izaberi PPSSPP save mapu +Confirm Overwrite = Želite li pisati preko podataka? +Confirm Save = Želiš li spremiti ovu datu? +ConfirmLoad = Učitaj ovu datu? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Izbriši +Delete all = Izbriši sve +Delete completed = Brisanje dovršeno. +DeleteConfirm = Ova data će biti izbrisana.\nŽeliš li nastaviti? +DeleteConfirmAll = Želis li izbrisati svu\nsvoju save datu za ovu igru? +DeleteConfirmGame = Želiš li izbrisati igru\nsa svog uređaja? Ovo ne možeš poništit. +DeleteConfirmGameConfig = Želiš li izbrisati postavke za ovu igru? +DeleteFailed = Nije moguće izbrisati datu. +Deleting = Brisanje\nPričekajte... +Disable All = Isključi sve +Edit = Edit +Enable All = Uključi sve +Enter = Enter +Finish = Dovrši +Grid = Grid +Inactive = Neaktivno +InternalError = An internal error has occurred. +Load = Učitaj +Load completed = Učitavanje dovršeno. +Loading = Učitavanje\nPričekajte... +LoadingFailed = Nije moguće učitati datu. +Move = Pomakni +Network Connection = Internetska veza +NEW DATA = NOVA DATA +No = Ne +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = OK +Old savedata detected = Uočena stara savedata +Options = Opcije +Reset = Reset +Resize = Resize +Retry = Ponovi +Save = Spremi +Save completed = Spremanje dovršeno. +Saving = Spremanje\nPričekajte... +SavingFailed = Nije moguće spremiti datu. +Select = Select +Shift = Shift +Snap = Snap +Space = Space +SSID = SSID +Submit = Submit +Supported = Podržano +There is no data = Nema date. +Toggle All = Uključi sve +Toggle List = Toggle list +Unsupported = Nepodržano +When you save, it will load on a PSP, but not an older PPSSPP = Kada spremiš,učitat će se na PSP, ali ne na starijem PPSSPP-u +When you save, it will not work on outdated PSP Firmware anymore = Kada spremiš, neće uopće raditi na zastarjelom PSP firmwareu +Yes = Da +Zoom = Zumiraj + +[Error] +7z file detected (Require 7-Zip) = Datoteka je arhivirana (7z).\nMolimo vas, dearhivirajte datoteku prvo (probajte 7-Zip ili WinRAR). +A PSP game couldn't be found on the disc. = PSP igra nije mogla biti pronađena na disku. +Cannot boot ELF located outside mountRoot. = Nije moguće pokrenuti ELF datoteku lociranu izvan mountRoot. +Could not save screenshot file = Nije moguće spremiti datoteku slike zaslona. +D3D9or11 = Direct3D 9? (ili "ne" za Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll ne postoji. Instalirajte. Ili pritisnite DA da koristite D3D9. +D3D11InitializationError = Greška u inicijalizaciji D3D11 +D3D11Missing = Vaš operativni sustav ne sadrži D3D11. Pokrenite Windows Update.\n\nPritisnite Da da koristite D3D9 . +D3D11NotSupported = Vaš GPU izgleda da ne podržava D3D11.\n\nBi li pokušali koristiti Direct3D 9 ? +Disk full while writing data = Disk pun tijekom spremanja podataka. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = Nije moguće učitati datoteku. +Error reading file = Greška tijekom čitanja datoteke. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = Greška u čitanju datoteke. +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Greška u čitanju slike diska: ISO korumpiran. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Neuspjela inicijalizacija grafike. Probajte ažurirati grafičke drivere i DirectX 9 runtime.\n\nBi li pokušali koristiti OpenGL?\n\nError message: +GenericGraphicsError = Grafička greška +GenericOpenGLError = Inicijalizacija grafike nije uspješna. Pokušajte nadograditi vaš grafički driver.\n\nŽelite li pokušati zamijeniti na DirectX 9?\n\nError message: +GenericVulkanError = Inicijalizacija grafike nije uspješna. Pokušajte nadograditi vaš grafički driver.\n\nWould you like to try switching to OpenGL?\n\nError message: +InsufficientOpenGLDriver = Nedovoljna OpenGL driver podrška uočena!\n\nVaš GPU izvještava da ne podržava OpenGL 2.0. Bi li probali koristiti DirectX?\n\nDirectX je trenutačno kompatibilan s malo igara, ali to je jedini izbor za vaš GPU.\n\nPosjeti forume na https://forums.ppsspp.org za više informacija.\n\n +Just a directory. = Samo odredište. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = Nije EBOOT.PBP, neidentificirana igra. +Not a valid disc image. = Nevažeća slika diska. +OpenGLDriverError = OpenGL driver greška +PPSSPP doesn't support UMD Music. = PPSSPP ne podržava UMD Music +PPSSPP doesn't support UMD Video. = PPSSPP ne podržava UMD Video +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP trenutno ne podržava spajanje na Internet za DLC, PSN, ili ažuriranje igara. +PS1 EBOOTs are not supported by PPSSPP. = PPSSPP ne podržava PS1 EBOOTe. +PSX game image detected. = Datoteka je MODE2 slika. PPSSPP ne podržava PS1 igre. +RAR file detected (Require UnRAR) = Datoteka je pakirana (RAR).\nPrvo raspakirajte (probaj UnRAR). +RAR file detected (Require WINRAR) = Datoteka je pakirana (RAR).\nPrvo raspakirajte (probaj WinRAR). +Running slow: try frameskip, sound is choppy when slow = Trenutno sporo: probaj frameskip, zvuk je uzburkan kad je spor +Running slow: Try turning off Software Rendering = Trenutno sporo: probaj isključiti "žbukanje softvera" +Save encryption failed. This save won't work on real PSP = Greška u šifriranju save-a. Ovaj save nece raditi na pravom PSP-u +textures.ini filenames may not be cross-platform = Nazivi "textures.ini" datoteke možda neće biti cross-platform. +This is a saved state, not a game. = Ovo je spremljen state, ne igra. +This is save data, not a game. = Ovo je save data, ne igra. +Unable to create cheat file, disk may be full = Nije moguće kreirati cheat datoteku, disk je možda pun. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Nije moguće kreirati savedatu, disk je možda pun. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Upozorenje: Video memorija PUNA, smanjivanje upscaling i mijenjanje na slow caching mod. +Warning: Video memory FULL, switching to slow caching mode = Warning: Video memorija PUNA, mijenjanje na slow caching mod. +ZIP file detected (Require UnRAR) = Datoteka je pakirana (ZIP).\nPrvo raspakirajte (probaj UnRAR). +ZIP file detected (Require WINRAR) = Datoteka je pakirana (ZIP).\nPrvo raspakirajte (probaj WinRAR). + +[Game] +Asia = Azija +ConfirmDelete = Izbriši +Create Game Config = Kreiraj postavke igre +Create Shortcut = Kreiraj prečac +Delete Game = Izbriši igru +Delete Game Config = Izbriši postavke igre +Delete Save Data = Izbriši savedatu +Europe = Europa +Game = Igra +Game Settings = Postavke igre +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Instalirajte podatke +Japan = Japan +Korea = Korea +MB = MB +One moment please... = Pričekajte trenutak... +Play = Igraj +Remove From Recent = Makni iz "Nedavno" +SaveData = Savedata +Setting Background = Postavljanje pozadine +Show In Folder = Prikaži u mapi +USA = SAD +Use UI background = Koristi UI pozadinu + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = neograničeno +(supersampling) = (supersampling) +(upscaling) = (upscaling) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Agresivno +Alternative Speed = Alternativna brzina (u %, 0 = unlimited) +Alternative Speed 2 = Alternativna brzina 2 (u %, 0 = unlimited) +Anisotropic Filtering = Anizotropno filtriranje +Auto = Auto +Auto (1:1) = Auto (1:1) +Auto (same as Rendering) = Auto (isto kao Prikazna rezolucija) +Auto FrameSkip = Auto preskakanje frame-ova +Auto Scaling = Auto mjerenje +Backend = Backend +Balanced = Balansirano +Bicubic = Bikubično +BlockTransfer Tip = Neke igre zahtijevaju ovo na Uključeno za točne grafike +BlockTransferRequired = Upozorenje: Ova igra zahtijeva "simulirajte blok transfer efekte" da budu postavljeni na Uključeno. +Both = Oboje +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Ublaživanje prikaza +BufferedRenderingRequired = Upozorenje: Ova igra zahtijeva "prikazni način" da bude postavljen na "ublaženo". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Screen size (in % of the viewport) +Cardboard Screen X Shift = X shift (in % of the blank space) +Cardboard Screen Y Shift = Y shift (in % of the blank space) +Cardboard VR Settings = Google Cardboard VR postavke +Cheats = Šifre +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU jezgra +Debugging = Otklanjanje grešaka +DefaultCPUClockRequired = Upozorenje: Ova igra zahtijeva CPU sat da bude postavljen na obično. +Deposterize = Deposteriziranje +Deposterize Tip = Popravlja vizualne banding glitcheve u podignutim teksturama +Device = Uređaj +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Isključite sporije efekte (ubrzava) +Disabled = Isključeno +Display layout editor = Prikaz layout uređivača +Display Resolution (HW scaler) = Prikaz rezolucije (HW mjeritelj) +Dump next frame to log = Odbaci sljedeći frame u log +Enable Cardboard VR = Enable Cardboard VR +FPS = FPS +Frame Rate Control = Framerate kontrole +Frame Skipping = Preskakanje sličica +Frame Skipping Type = Vrsta preskakanja sličica +FullScreen = Puni zaslon +Hack Settings = Opcije hakiranja (može uzrokovati glitcheve) +Hardware Tessellation = Hardware tesselacija +Hardware Transform = Hardver mozaik +hardware transform error - falling back to software = Greška hardver transformiranja, idemo natrag u softver +HardwareTessellation Tip = Koristi hardver za stvaranje grafike +High = Visoko +Hybrid = Hibrid +Hybrid + Bicubic = Hibrid + Bikubični +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Unutarnja rezolucija +Lazy texture caching = Lijeno teksturno predmemoriranje (ubrzanje) +Linear = Linearno +Low = Nisko +LowCurves = Dugačke/Bezijerove kvalitete zavoja +LowCurves Tip = Jedino korišteno od strane nekoliko igara, kontrolira uglađenost grafike +Lower resolution for effects (reduces artifacts) = Snizi rezoluciju za efekte (smanjuje artefakte) +Manual Scaling = Ručno mjerenje +Medium = Srednje +Mode = Način +Must Restart = Morate ponovno pokrenuti PPSSPP da bi se efekat primjenio. +Native device resolution = Urođena rezolucija uređaja +Nearest = Najbliže +No buffer = No buffer +Non-Buffered Rendering = Preskoči efekte ublaživanja (nije ublaženo, faster) +None = Nijedna +Number of Frames = Broj frame-ova +Off = Isključeno +OpenGL = OpenGL +Overlay Information = Prekrivanje informacija +Partial Stretch = Djelomično rastezanje +Percent of FPS = Postotak FPS-a +Performance = Performansa +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Sjenčanje poslije procesa +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Izlgađiva frameove u igrama koje ih jako malo imaju +Rendering Mode = Način prikaza +Rendering Resolution = Rezolucija prikaza +RenderingMode NonBuffered Tip = Brže, ali ništa može uvući neke igre +Retain changed textures = Ostavi promijenjene teksture (ponekad sporije) +RetainChangedTextures Tip = Usporava mnogo igara, ali neke igre dosta ubrzava +Rotation = Rotacija +Safe = Sigurno +Screen layout = Screen layout +Screen Scaling Filter = Mjerenje filtriranje zaslona +Show Debug Statistics = Pokaži statistike otklanjanja grešaka +Show FPS Counter = Pokaži FPS counter +Simulate Block Transfer = Simuliraj blok transfer efekte +SoftGPU Tip = Trenutno VRLO sporo +Software Rendering = Žbukanje softvera (sporo) +Software Skinning = Skiniranje softvera +SoftwareSkinning Tip = Kombiniraj skinirane modele crteža na CPU, brže u većini igara +Speed = Brzina +Stretching = Rastezanje +Texture Filter = Filtar tekstura +Texture Filtering = Filtriranje tekstura +Texture Scaling = Mjerenje tekstura +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Isključi "hardver mozailk": nepodržano +Unlimited = Neograničeno +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = Nadograđivanje razine +Upscale Type = Vrsta nadograđivanja +UpscaleLevel Tip = CPU težak - neke nadogradnje mogu biti usporene da izbjegnu mucanje +Use all displays = Koristi sve prikaze +Vertex Cache = Predmemorija tjemena +VertexCache Tip = Brže, ali može izazvati privremeno treperenje +VSync = VSync +Vulkan = Vulkan +Window Size = Veličina prozora +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Izbriši ZIP datoteku +Install = Instaliraj +Install game from ZIP file? = Instaliraj igru iz ZIP datoteke? +Install textures from ZIP file? = Instaliraj teksture iz ZIP datoteke? +Installed! = Instalirano! +Texture pack doesn't support install = Texture pack ne podržava instaliranje +Zip archive corrupt = Koruptana ZIP arhiva +Zip file does not contain PSP software = ZIP datoteka ne sadrži PSP software + +[KeyMapping] +Autoconfigure = Automatski konfiguriraj +Autoconfigure for device = Automatski konfiguriraj za sve uređaje +Clear All = Obriši sve +Default All = Vrati na zadano +Map a new key for = Postavi novu tipku za +Map Key = Postavi tipku +Map Mouse = Postavi miš +Test Analogs = Testiraj analoge +You can press ESC to cancel. = Možes pritisnuti ESC za odustati. + +[MainMenu] +Browse = Pretraži... +Buy PPSSPP Gold = Kupi PPSSPP Gold +Choose folder = Izaberi mapu +Credits = Zasluge +PPSSPP Homebrew Store = PPSSPP Homebrew Trgovine +Exit = Izlaz +Game Settings = Postavke +Games = Igre +Give PPSSPP permission to access storage = Dopusti PPSSPP dozvolu za pristup datotekama +Homebrew & Demos = Homebrew && Demos +How to get games = Kako mogu nabaviti igre? +How to get homebrew & demos = Kako mogu nabaviti homebrew && demos? +Load = Učitaj... +Loading... = Loading... +PinPath = Prikvači mapu +PPSSPP can't load games or save right now = PPSSPP trenutačno ne može učitati igre ili spremati datu +Recent = Nedavno +SavesAreTemporary = PPSSPP sprema u privremenom prostoru +SavesAreTemporaryGuidance = Extractaj PPSSPP negdje za trajno spremanje +SavesAreTemporaryIgnore = Ignoriraj upozorenje +UnpinPath = Otkvači mapu +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Zvuk +Controls = Kontrole +Graphics = Grafike +Networking = Internet +System = Sistem +Tools = Alati + +[MappableControls] +Alt speed 1 = Alt brzina 1 +Alt speed 2 = Alt brzina 2 +An.Down = Gljivica Dolje +An.Left = Gljivica Lijevo +An.Right = Gljivica Desno +An.Up = Gljivica Gore +Analog limiter = Ograničenje gljivice +Analog Stick = Gljivica +Audio/Video Recording = Snimanje Zvuka/Videa +Auto Analog Rotation (CCW) = Auto analogna rotacija (CCW) +Auto Analog Rotation (CW) = Auto analogna rotacija (CW) +AxisSwap = Izmijena Osi +Circle = Circle +Cross = Cross +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = DevMenu +Down = Dpad Dolje +Dpad = Dpad +Frame Advance = Ubrzavanje Frameova +Hold = Hold +Home = Početna +L = L +Left = Dpad Lijevo +Load State = Učitaj state +Mute toggle = Tipka za prigušivanje +Next Slot = Sljedeći slot +None = None +Note = Note +OpenChat = Otvori chat +Pause = Pauza +R = R +RapidFire = Rapid-fire +Remote hold = Remote hold +Rewind = Rewind +Right = Dpad Desno +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = RightAn.Down +RightAn.Left = RightAn.Left +RightAn.Right = RightAn.Right +RightAn.Up = RightAn.Up +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Spremi state +Screen = Screen +Screenshot = Slikaj zaslon +Select = Select +SpeedToggle = Tipka za ubrzavanje +Square = Square +Start = Start +Texture Dumping = Odlaganje tekstura +Texture Replacement = Mijenjanje tesktura +Toggle Fullscreen = Uključi puni zaslon +Toggle mode = Toggle mode +Triangle = Triangle +Unthrottle = Unthrottle +Up = Dpad Gore +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Posjeti Ad Hoc Multiplayer forum +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Promijeni MAC addresu +Change proAdhocServer Address = Promijeni PRO ad hoc server IP addresu (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Uključi ugrađen PRO ad hoc server +Enable network chat = Enable network chat +Enable networking = Uključi networking/WLAN (beta, može pokvariti igru) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Nevažeći IP ili domaćin +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Veza Uspostavljena +Please change your Port Offset = Please change your port offset +Port offset = Port offset (0 = PSP kompatibilnost) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Šalji Discord "Rich Presence" informaciju +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Provjeravanje adrese... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = Trenutno si u "Offline",idi u lobby ili online hall + +[Pause] +Cheats = Šifre +Continue = Nastavi +Create Game Config = Kreiraj postavke za ovu igru +Delete Game Config = Izbriši postavke za ovu igru +Exit to menu = Izađi na početnu +Game Settings = Postavke igre +Load State = Učitaj state +Rewind = Premotaj +Save State = Spremi state +Settings = Postavke +Switch UMD = Promijeni UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Color +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Cartoon +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT scanlines +FXAA = FXAA Antialiasing +Gamma = Gamma +Grayscale = Grayscale +Intensity = Intensity +InverseColors = Izmijeni boje +Natural = Prirodne boje +NaturalA = Prirodne boje (bez zamućivanja) +Off = Isključeno +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlines (CRT) +Sharpen = Naoštriti +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 nadograđivač +VideoSmoothingAA = Video ublaživanja AA +Vignette = Vignette + +[PSPCredits] +all the forum mods = svi forum modovi +build server = build server +Buy Gold = Kupi Gold +check = Također provjeri Dolphin, najbolji Wii/GC emu around: +CheckOutPPSSPP = Baci oko na PPSSPP, odličan PSP emulator: https://www.ppsspp.org/ +contributors = Kontributori: +created = Napravio +Discord = Discord +info1 = PPSSPP je namijenjen za edukativne svrhe. +info2 = Budi siguran da posjeduješ prava na igre +info3 = igraš tako da posjeduješ UMD ili imaš kupljenu igru +info4 = instaliraš sa PSN trgovine. +info5 = PSP je trademarka Sony, Inc. +iOS builds = iOS buildovi +license = Besplatan softver pokrenut licencom GPL 2.0+ +list = liste kompatibilnosti, forumi, i razvojne informacije +PPSSPP Forums = PPSSPP Forumi +Privacy Policy = Pravila o privatnosti +Share PPSSPP = Dijeli PPSSPP +specialthanks = Posebne zahvale: +specialthanksKeithGalocy = kod NVIDIA (hardware, savjeti) +specialthanksMaxim = za njegov odličan Atrac3+ koding posao +testing = testiranje +this translation by = ovaj prijevod napravili su: +title = Brz i prijenosan PSP emulator +tools = Korišteni alati: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = MrYadro, mgaver, VIRGINKLM, raven02 +translators2 = sum2012, vnctdj, unknownbrackets, ufdada +translators3 = The Dax, wuspring, hrydgard, adrian17 +translators4 = HiImBrala, Carlson +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Pogledaj stranicu: +written = Napisan u C++ za brzinu i za pokretnost + +[RemoteISO] +Browse Games = Pretraži igre +Local Server Port = Local server port +Manual Mode Client = Ručno konfiguriraj klijent +Remote disc streaming = Daljinsko dijeljenje diska +Remote Port = porta Daljinskog +Remote Server = Daljinski server +Remote Subdirectory = Daljinski subdirectory +RemoteISODesc = Igre koje si nedavno igrao bit će dijeljene +RemoteISOLoading = Spojeno, učitavanje liste igara... +RemoteISOScanning = Skeniranje... Klikni "dijeli igre" na uređaju za dijeljenje +RemoteISOScanningTimeout = Skeniranje... provjeri postavke na Vatrozidu +RemoteISOWifi = Note: Spoji oba uređaja na istu Wi-Fi mrežu +RemoteISOWinFirewall = WARNING: Windows Vatrozid blokira dijeljenje +Settings = Postavke +Share Games (Server) = Dijeli igre (server) +Share on PPSSPP startup = Dijeli kada se PPSSPP upali +Stop Sharing = Zaustavi dijeljenje +Stopping.. = Zaustavljanje... + +[Reporting] +Bad = Loše +FeedbackDelayInfo = Tvoji podaci se šalju u pozadini. +FeedbackDesc = Kakva je emulacija? Dajte nama i drugima do znanja! +FeedbackDisabled = Prijavljivanje kompatibilnosti servera mora biti uključeno. +FeedbackIncludeCRC = Napomena: Baterija će biti korištena za slanje CRC diska +FeedbackIncludeScreen = Stavi i sliku zaslona +FeedbackSubmitDone = Tvoji podaci su poslani +FeedbackSubmitFail = Nije moguće poslati podatke. Pokušajte nadograditi PPSSPP. +FeedbackThanks = Hvala vam na vašim povratnim informacijama! +Gameplay = Igra +Graphics = Grafike +Great = Odlične +In-game = U igri +In-game Description = Uđe u igru, ali previše bugova da bi se dovršilo +Menu/Intro = Početna/Intro +Menu/Intro Description = Ne mogu ući u igru +Nothing = Ništa +Nothing Description = Kompletan opis +OK = OK +Open Browser = Otvori stranicu za prijavljivanje +Overall = Sve u svemu +Perfect = Savršeno +Perfect Description = Emulacija bez grešaka za cijelu igru - odlično! +Plays = Playovi +Plays Description = Potpuno moguće za igrati, ali možda sa glitchevima +ReportButton = Prijavi povratne informacije +Speed = Brzina +Submit Feedback = Pošalji povratne informacije +SuggestionConfig = Vidi prijave na web stranici za dobre opcije. +SuggestionCPUSpeed0 = Isključi zaključane CPU brzinske opcije. +SuggestionDowngrade = Unazadi na stariju PPSSPP verziju (molimo vas prijavite ovaj bug). +SuggestionsFound = Drugi korisnici su prijavili bolje rezultate. Pritisnite "Pogledajte povratne informacije" za više detalja. +SuggestionsNone = Ova igra također ne radi za druge. +SuggestionsWaiting = Slanje i provjeravanje drugih korisničkih povratnih informacija... +SuggestionUpgrade = Nadogradite na noviji PPSSPP build. +SuggestionVerifyDisc = Provjerite vaš ISO za dobru kopiju vašeg diska. +Unselected Overall Description = Koliko se dobro ova igra emulira? +View Feedback = Provjeri sve povratne informacije + +[Savedata] +Date = Datum +Filename = Ime datoteke +No screenshot = Nema snimke zaslona +None yet. Things will appear here after you save. = Još ništa. Stvari će se ovdje pojaviti nakon što nešto spremiš. +Save Data = Save data +Save States = Save states +Savedata Manager = Izbornik savedate +Size = Veličina + +[Screen] +Cardboard VR OFF = Cardboard VR isključen +Chainfire3DWarning = UPOZORENJE: Chainfire3D uočen, može stvarati probleme. +Failed to load state = Nije moguće učitati save +Failed to save state = Nije moguće spremiti state +fixed = Speed: alternate +GLToolsWarning = UPOZORENJE: GLTools uočen, može stvarati probleme. +In menu = In menu +Load savestate failed = Učitavanje savestate-a nije moguće +Loaded State = State učitan +Loaded. Save in game, restart, and load for less bugs. = Učitano. Spremi u igri, ponovo pokreni, i učitaj za manje bugova. +LoadStateDoesntExist = Nije moguće učitati state: Savestate ne postoji! +LoadStateWrongVersion = Nije moguće učitati state: Savestate je za stariju verziju PPSSPP-a! +norewind = Rewind save state-ovi nisu dostupni. +Playing = Playing +PressESC = Pritisni ESC za otvaranje izbornika. +replaceTextures_false = Teksture se više ne primjenjuju. +replaceTextures_true = Mijenjanje tekstura je upaljeno. +Save State Failed = Nije moguće spremiti state! +Saved State = State spremljen +saveNewTextures_false = Spremanje tekstura je isključeno. +saveNewTextures_true = Teksture ce sada biti spremljene u datotekama. +SpeedCustom2 = Speed: alternate 2 +standard = Speed: standard +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = Već instalirano +Connection Error = Pogreška u spajanju +Install = Instaliraj +Launch Game = Pokreni igru +Loading... = Učitavanje... +MB = MB +Size = Veličina +Uninstall = Deinstaliraj + +[SysInfo] +%d (%d per core, %d cores) = %d (%d po jezgri, %d jezgre) +%d bytes = %d bajtova +(none detected) = (nijedna uočena) +3D API = 3D API +ABI = ABI +API Version = API verzija +Audio Information = Audio informacija +Board = Ploča +Build Config = Konfig građe +Build Configuration = Konfiguracija građe +Built by = Građeno od +Core Context = Kontekst jezgre +Cores = Jezgre +CPU Extensions = CPU nastavci +CPU Information = CPU informacije +CPU Name = Ime +D3DCompiler Version = D3DCompiler verzija +Debug = Otklanjanje grešaka +Debugger Present = Otklanjivač grešaka prisutan +Device Info = Informacije o uređaju +Display Information = Informacije o prikazu +Driver Version = Verzija drivera +EGL Extensions = EGL nastavci +Frames per buffer = Frame-ova po ublaživanju +GPU Information = Informacije o GPU +High precision float range = High precision float range +High precision int range = Visoka preciznost int dohvata +Lang/Region = Lang/Regija +Memory Page Size = Veličina memorijske stranice +Native Resolution = Urođena rezolucija +OGL Extensions = OGL nastavci +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 nastavci +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 nastavci +OpenGL Extensions = OpenGL nastavci +Optimal frames per buffer = Optimalni frame-ovi po ublaživanju +Optimal sample rate = Optimalni omjer samplova +OS Information = Informacije OS-a +PPSSPP build = PPSSPP build +Refresh rate = Brzina osvježavanja +Release = Pusti +RW/RX exclusive = RW/RX ekskluzivno +Sample rate = Brzina sample-ova +Shading Language = Jezik sjenčanja +Sustained perf mode = Održiv perf način +System Information = Informacije sustava +System Name = Ime sustava +System Version = Verzija sustava +Threads = Konci +Vendor = Prodavač +Vendor (detected) = Prodavač (uočen) +Version Information = Informacija verzije +Vulkan Extensions = Vulkan nastavci +Vulkan Features = Vulkan svojstva + +[System] +(broken) = (broken) +12HR = 12HR +24HR = 24HR +Auto = Auto +Auto Load Savestate = Auto učitaj savestate +AVI Dump started. = AVI dump započelo +AVI Dump stopped. = AVI dump zaustavljeno +Cache ISO in RAM = Predmemorija puna ISO-a u RAM-u +Change CPU Clock = Promijeni emulaciju PSP-ovog CPU sata (nestabilno) +Change Memory Stick folder = Promijeni mapu Memorijskoga sticka +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Promijeni nadimak +ChangingMemstickPath = Spremljene igre, save state-ovi, i drugi podatci neće biti kopirani na ovu mapu.\n\nPromijeni mapu Memorijskoga sticka? +ChangingMemstickPathInvalid = Taj put nije mogao biti korišten za spremanje datoteka Memorijskog sticka. +ChangingMemstickPathNotExists = Ta mapa još ne postoji.\n\nSpremljene igre, save state-ovi, i drugi podatci neće biti kopirani na ovu mapu.\n\nPromijeni mapu Memorijskoga sticka? +Cheats = Varanje (eksperimentalno, vidite forume) +Clear Recent = Clear "Recent" +Clear Recent Games List = Očisti listu igara u Nedavno +Clear UI background = Očisti UI pozadinu +Confirmation Button = Dugme za potvrđivanje. +Date Format = Format datuma +Day Light Saving = Ljetno računanje vremena +DDMMYYYY = DDMMYYYY +Decrease size = Decrease size +Developer Tools = Alati za napredne programere +Display Extra Info = Display extra info +Display Games on a grid = Prikaži "Igre" on a grid +Display Homebrew on a grid = Prikaži "Homebrew&Demos" on a grid +Display Recent on a grid = Prikaži "Nedavno" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emulacija +Enable Cheats = Uključi cheatove +Enable Compatibility Server Reports = Omogući prijave kompatibilnosti servera +Failed to load state. Error in the file system. = Neuspješno učitavanje state-a. Greška u datoteci sustava. +Failed to save state. Error in the file system. = Neuspješno spremanje state-a. Greška u datoteci sustava. +Fast (lag on slow storage) = Brzo (štekanje na malom prostoru) +Fast Memory = Brza memorija (nestabilno) +Force real clock sync (slower, less lag) = Prisili pravo-satno sinkroniziranje (sporije, manje šteka) +frames, 0:off = frame-ova, 0 = isključeno +Games list settings = Games list settings +General = Generalno +Grid icon size = Veličina ikona na mreži +Help the PPSSPP team = Pomozite PPSSPP timu +Host (bugs, less lag) = Domaći (bugovi, manje šteka) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Tumač +IO timing method = I/O metoda timing-a +IR Interpreter = IR tumač +Memory Stick Folder = Memory Stick mapa +Memory Stick inserted = Memory Stick unesen +MHz, 0:default = MHz, 0 = zadano +MMDDYYYY = MMDDYYYY +Newest Save = Najnoviji save +Not a PSP game = Nije PSP igra +Off = Isključeno +Oldest Save = Najstariji save +PSP Model = PSP model +PSP Settings = PSP opcije +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Snimi audio +Record Display = Snimi prikaz +Reset Recording on Save/Load State = Ponovo postavi snimak na Save/Load state +Restore Default Settings = Vrati PPSSPP opcije na zadano +Rewind Snapshot Frequency = Vrati snapshot frekvenciju (mem hog) +Save path in installed.txt = Spremi put u installed.txt +Save path in My Documents = Spremi put u My Documents +Savestate Slot = Savestate mjesto +Savestate slot backups = Savestate mjesto backup-ovi +Screenshots as PNG = Spremi snimak zaslona u PNG formatu +Set UI background... = Postavi UI pozadinu... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Simuliraj UMD kašnjenja +Slot 1 = Mjesto 1 +Slot 2 = Mjesto 2 +Slot 3 = Mjesto 3 +Slot 4 = Mjesto 4 +Slot 5 = Mjesto 5 +Storage full = Prostor pun +Sustained performance mode = Način održive performanse +Time Format = Format vremena +UI = Felhasználói felület +UI Sound = Felhasználói felület hangja +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Koristi neizgubiv Video Codec (FFV1) +Use O to confirm = Koristi 0 kao gumb za potvrđivanje +Use output buffer (with overlay) for recording = Koristi output ublaživač (sa overlay-om) za snimanje +Use system native keyboard = Use system native keyboard +Use X to confirm = Koristi X kao gumb za potvrđivanje +VersionCheck = Provjerite za nove verzije PPSSPP-a +WARNING: Android battery save mode is on = UPOZORENJE: Način uštede baterije u Androidu je uključen +WARNING: Battery save mode is on = UPOZORENJE: Način uštede baterije je uključen +YYYYMMDD = YYYYMMDD + +[Upgrade] +Details = Details +Dismiss = Zanemari +Download = Instaliraj +New version of PPSSPP available = Nova verzija PPSSPP-a je dostupna diff --git a/assets/lang/hu_HU.ini b/assets/lang/hu_HU.ini new file mode 100644 index 0000000000..7fe19fd7a5 --- /dev/null +++ b/assets/lang/hu_HU.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternatív sebesség hangereje +Audio backend = Audió backend (újraindítás szükséges) +AudioBufferingForBluetooth = Bluetooth-barát buffer (lassabb) +Auto = Auto +Device = Eszköz +DSound (compatible) = DSound (kompatibilis) +Enable Sound = Hang engedélyezése +Global volume = Globális hangerő +Microphone = Microphone +Microphone Device = Microphone device +Mute = Némítás +Switch on new audio device = Új eszköz észlelésekor átváltás rá +Use global volume = Globális hangerő használata +WASAPI (fast) = WASAPI (gyors) + +[Controls] +Analog auto-rotation speed = Automata analóg forgató sebessége +Analog Axis Sensitivity = Analóg tengely érzékenysége +Analog Limiter = Analóg korlátozó +Analog Mapper High End = Analóg leképezés felső-vég (tengely érzékenység) +Analog Mapper Low End = Analóg leképezés alsó-vég (fordított holtzóna) +Analog Mapper Mode = Analóg leképezés módja +Analog Stick = Analóg kar +AnalogLimiter Tip = Miközben az Analóg Korlátozó gombot nyomva tartod +Auto = Auto +Auto-centering analog stick = Analóg kar visszaállítása középre +Auto-hide buttons after seconds = Gombok elrejtése X másodperc után +Binds = Gombok +Button Opacity = Gombok átlátszósága +Button style = Gombok stílusa +Calibrate D-Pad = D-Pad kalibrálása +Calibration = Kalibrálás +Classic = Klasszikus +Combo Key Setting = Gomb-kombó beállítás +Combo Key Setup = Gomb-kombók definiálása +Confine Mouse = Egérkurzor rögzítése az ablakhoz +Control Mapping = Gombok beállítása +Custom layout... = Elrendezés testreszabása… +Customize tilt = Döntés testreszabása… +D-PAD = D-Pad +Deadzone Radius = Holtzóna sugara +DInput Analog Settings = DInput analóg beállítások +Disable D-Pad diagonals (4-way touch) = D-Pad átlóinak letiltása (4-irányú érintés) +Glowing borders = Világító szélek +HapticFeedback = Haptikus visszajelzés (rezgés) +Ignore gamepads when not focused = Gamepad figyelmen kívül hagyása, ha nincs fókuszban +Ignore Windows Key = Windows billentyű kikapcsolása +Invert Axes = Tengelyek megfordítása +Invert Tilt along X axis = X tengely menti döntés megfordítása +Invert Tilt along Y axis = Y tengely menti döntés megfordítása +Keep this button pressed when right analog is pressed = Tartsd lenyomva ezt a gombot amikor a jobb analóg kart nyomod +Keyboard = Billentyűzet beállítások +L/R Trigger Buttons = L/R ravasz gombok +Landscape = Fekvő +Landscape Auto = Automatikus fekvő +Landscape Reversed = Fordított fekvő +Mouse = Egér beállítások +Mouse sensitivity = Egér érzékenység +Mouse smoothing = Egér simítás +MouseControl Tip = Az 'M' ikonra kattintva egérgombokat is társíthatsz a különböző gombokhoz. +None (Disabled) = Nincs (letiltva) +Off = Ki +OnScreen = Érintőképernyős irányítás +Portrait = Álló +Portrait Reversed = Fordított álló +PSP Action Buttons = PSP akció gombok +Screen Rotation = Képernyő elforgatása +seconds, 0 : off = másodperc, 0 = ki +Sensitivity = Érzékenység +Show right analog = Jobb oldali analóg kar megjelenítése +Show Touch Pause Menu Button = Szünet gomb megjelenítése +Thin borders = Vékony szélek +Tilt Base Radius = Döntés alapsugara +Tilt Input Type = Döntési bevitel típusa +Tilt Sensitivity along X axis = X tengely menti döntés érzékenysége +Tilt Sensitivity along Y axis = X tengely menti döntés érzékenysége +To Calibrate = A kalibrációhoz hagyd az eszközt egy sima felületen, és nyomd meg a "Kalibrálás"-t. +Touch Control Visibility = Érintőképernyős irányítás láthatósága +Use custom right analog = Személyre szabott jobb analog kar +Use Mouse Control = Egér bevitel használata +Visibility = Láthatóság +X = X +X + Y = X + Y +XInput Analog Settings = XInput analóg beállítások +Y = Y + +[CwCheats] +Cheats = Csalások +Edit Cheat File = Csalás fájl szerkesztése +Enable/Disable All = Összes csalás engedélyezése/tiltása +Import Cheats = Importálás cheat.db-ből +Options = Beállítások +Refresh Rate = Frissítési gyakoriság + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = PPSSPP &névjegye… +Auto = &Auto +Backend = Renderelési &backend (újraindítás szükséges) +Bicubic = &Bicubic +Break = Megállítás +Break on Load = Megállítás betöltéskor +Buffered Rendering = &Bufferelt renderelés +Buy Gold = &Gold vásárlása +Control Mapping... = &Gombok beállítása… +Debugging = &Hibakeresés +Deposterize = &Keményítés megszüntetése +Direct3D9 = Direct3D &9 +Direct3D11 = Direct3D 1&1 +Disassembly = &Disassembly… +Discord = &Discord +Display Layout Editor = Elrendezés szerkesztő… +Display Rotation = Megjelenítés forgatása +Dump Next Frame to Log = Kö&vetkező képkocka kiírása naplófájlba +Emulation = &Emuláció +Enable Chat = Chat engedélyezése +Enable Cheats = &Csalások engedélyezése +Enable Sound = &Hang engedélyezése +Exit = &Kilépés +Extract File... = Fájl ki&csomagolása… +File = &Fájl +Frame Skipping = &Képkocka kihagyás +Frame Skipping Type = Képkocka kihagyás típusa +Fullscreen = Tel&jes képernyő +Game Settings = &Játékbeállítások +GE Debugger... = GE Hibake&reső… +GitHub = Git&Hub +Hardware Transform = Hardveres &transzform +Help = &Segítség +Hybrid = &Hibrid +Hybrid + Bicubic = H&ibrid + Bicubic +Ignore Illegal Reads/Writes = &Illegális olvasások/írások figyelmen kívül hagyása +Ignore Windows Key = Windows billentyű figyelmen kívül hagyása +Keep PPSSPP On Top = PPSSPP &mindig legfelül +Landscape = Fekvő +Landscape reversed = Fordított fekvő +Language... = &Nyelv… +Linear = &Lineáris +Load = &Megnyitás… +Load .sym File... = .sym fájl megnyitás&a… +Load Map File... = &Map fájl megnyitása… +Load State = Állapotmentés &betöltése +Load State File... = &Állapotmentés fájl megnyitása… +Log Console = &Napló ablak +Memory View... = Memória &nézet… +More Settings... = &Egyéb beállítások… +Nearest = Leg&közelebbi +Non-Buffered Rendering = Bufferelt effektek kihagyá&sa (nem bufferelt, gyorsabb) +Off = &Ki +Open Directory... = Ma&ppa megnyitása… +Open from MS:/PSP/GAME... = Megnyitás MS:/PSP/&GAME-ből… +Open Memory Stick = Memory &Stick megnyitása +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = &Szünet +Pause When Not Focused = &Szüneteltetés, ha nincs fókuszban +Portrait = Álló +Portrait reversed = Fordított álló +Postprocessing Shader = Utóeffektező shader +PPSSPP Forums = PPSSPP &fórum +Record = &Felvétel +Record Audio = &Hang felvétele +Record Display = Megjelenítés &felvétele +Rendering Mode = Renderelési m&ód +Rendering Resolution = &Renderelés felbontása +Reset = &Újraindítás +Reset Symbol Table = Szimbólum tábla &újratöltése +Run = &Futtatás +Save .sym File... = .sym fájl mentés&e… +Save Map File... = Map fájl &mentése… +Save State = Állapotmenté&s készítése +Save State File... = &Állapotmentés fájl készítése… +Savestate Slot = Állapotmentés s&orszáma +Screen Scaling Filter = Kép&ernyő skálázási szűrő +Show Debug Statistics = Hiba&keresési statisztikák mutatása +Show FPS Counter = &FPS számláló mutatása +Skip Number of Frames = Képkockák kihagyása darabszámra +Skip Percent of FPS = Képkockák kihagyása FPS százalékában +Stop = &Leállítás +Switch UMD = UMD váltása +Take Screenshot = &Képernyőkép mentése +Texture Filtering = Te&xtúra szűrés +Texture Scaling = &Textúra nagyítás +Use Lossless Video Codec (FFV1) = &Veszteségmentes videó codec használata (FFV1) +Use output buffer for video = Kimeneti &buffer alkalmazása rögzítéskor +Vertex Cache = &Vertex gyorsítótár +VSync = VS&ync +Vulkan = &Vulkan +Window Size = &Ablak méret +www.ppsspp.org = Látogasd meg a www.&ppsspp.org-ot +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allokátor nézet (Vulkan) +Allow remote debugger = Távoli hibakereső engedélyezése +Backspace = Backspace +Block address = Blokk cím +By Address = Cím alapján +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = textures.ini fájl készítése/megnyitása a jelenlegi játékhoz +Current = Jelenlegi +Dev Tools = Fejlesztői eszközök +DevMenu = DevMenu +Disabled JIT functionality = Kikapcsolt JIT funkcionalitások +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Visszafejtett EBOOT.BIN írása játék indításakor +Dump Frame GPU Commands = Képkocka GPU parancsok írása +Enable Logging = Naplózás engedélyezése +Enable driver bug workarounds = Enable driver bug workarounds +Enter address = Cím megadása +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Képkocka profilozó +GPU Driver Test = GPU driver teszt +GPU Profile = GPU profil +Jit Compare = JIT összehasonlítás +JIT debug tools = JIT hibakereső eszközök +Language = Nyelv +Load language ini = Nyelvi .ini betöltése +Log Dropped Frame Statistics = Eldobott képkockák statisztikáinak naplózása +Log Level = Naplózási szint +Log View = Nápló megtekintése +Logging Channels = Naplózási csatornák +Next = Következő +No block = Nincs blokk +Prev = Előző +Random = Véletlenszerű +Replace textures = Textúrák kicserélése +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Biztos vagy benne, hogy mindent az alapértelmezettre állítasz?\nA gombbeállítások nem változnak.\n\n\nNem vonható vissza.\nIndítsd újra a PPSSPP-t a beállítások érvényesítéséhez. +RestoreGameDefaultSettings = Biztos vagy benne, hogy minden játék-specifikus beállítást\nvisszaállítáasz a PPSSPP alapértelmezettre? +Resume = Resume +Run CPU Tests = CPU tesztek futtatása +Save language ini = Nyelvi .ini mentése +Save new textures = Új textúrák mentése +Shader Viewer = Shader megjelenítő +Show Developer Menu = Fejlesztői menü megjelenítése +Show on-screen messages = Show on-screen messages +Stats = Statisztikák +System Information = Rendszer információ +Texture Replacement = Textúra csere +Toggle Audio Debug = Audió hibakereső ki/bekapcsolása +Toggle Freeze = Fagyasztás ki/bekapcsolása +Touchscreen Test = Érintőképernyő teszt +VFPU = VFPU + +[Dialog] +* PSP res = * PSP felbontás +Active = Aktív +Back = Vissza +Cancel = Mégse +Center = Középre +ChangingGPUBackends = GPU backend megváltoztatásához újra kell indítani az alkalmazást. Újraindítod most? +ChangingInflightFrames = Grafikai parancs-bufferelés megváltoztatásához újra kell indítani az alkalmazást. Újraindítod most? +Channel: = Channel: +Choose PPSSPP save folder = PPSSPP mentési mappa kiválasztása +Confirm Overwrite = Biztosan felülírod? +Confirm Save = Elmented? +ConfirmLoad = Betöltöd ezt a mentést? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Töröl +Delete all = Mindet töröl +Delete completed = Törölve. +DeleteConfirm = Ez a mentés törlődni fog.\nBiztosan akarod folytatni? +DeleteConfirmAll = Biztosan törölni akarod az összes\nmentésedet ehhez a játékhoz? +DeleteConfirmGame = Biztosan törölni akarod ezt a játékot?\nNem lehet visszavonni. +DeleteConfirmGameConfig = Biztosan törölni akarod a játék beállításait? +DeleteFailed = Törlés sikertelen. +Deleting = Törlés\nKérlek várj... +Disable All = Mind kikapcsolása +Edit = Edit +Enable All = Mind bekapcsolása +Enter = Belép +Finish = Kész +Grid = Rács +Inactive = Inaktív +InternalError = An internal error has occurred. +Load = Betöltés +Load completed = Betöltve. +Loading = Betöltés\nKérlek várj... +LoadingFailed = Betöltés sikertelen. +Move = Mozgat +Network Connection = Hálózati kapcsolat +NEW DATA = ÚJ MENTÉS +No = Nem +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = OK +Old savedata detected = Régi mentés észlelve +Options = Opciók +Reset = Visszaállít +Resize = Átméretez +Retry = Újra +Save = Mentés +Save completed = Mentve. +Saving = Mentés\nKérlek várj... +SavingFailed = Mentés sikertelen. +Select = Kiválaszt +Shift = Shift +Snap = Igazít +Space = Szóköz +SSID = SSID +Submit = Elküld +Supported = Támogatott +There is no data = Nincs adat. +Toggle All = Összes átkapcsolása +Toggle List = Toggle list +Unsupported = Nem támogatott +When you save, it will load on a PSP, but not an older PPSSPP = Ha mentesz, PSP-n vissza tudod majd tölteni, de egy régebbi PPSSPP-n nem +When you save, it will not work on outdated PSP Firmware anymore = Ha mentesz, már nem fog működni elavult PSP alapszoftveren +Yes = Igen +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = A fájl tömörített (7z).\nElőbb csomagold ki (használj 7-Zip-et vagy WinRAR-t)! +A PSP game couldn't be found on the disc. = Nem található PSP játék a lemezen. +Cannot boot ELF located outside mountRoot. = Nem indítható mountRoot-on kívül található ELF. +Could not save screenshot file = Képernyőkép mentése sikertelen. +D3D9or11 = Direct3D 9? (Nyomj "Nem"-et Direct3D 11 használatához) +D3D11CompilerMissing = D3DCompiler_47.dll nem található. Kérlek telepítsd! Megpróbálod Direct3D 9-cel? +D3D11InitializationError = Direct3D 11 inicializációs hiba. +D3D11Missing = Az operációs rendszered nem tartalmazza a D3D11-et. Kérlek frissítsd a Windows-t!\n\nMegpróbálod Direct3D 9-cel? +D3D11NotSupported = Úgy tűnik, hogy a videókártyád nem támogatja a Direct3D 11-et.\n\nSzeretnél helyette Direct3D 9-et használni? +Disk full while writing data = Írás közben megtelt a lemez. +ELF file truncated - can't load = AZ ELF fájl csonkolva van - nem lehet betölteni +Error loading file = Játék betöltése sikertelen. +Error reading file = Fájl olvasási hiba. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = Fájl azonosítási hiba. +Failed to load executable: = A futtatható állomány betöltése sikertelen: +File corrupt = A fájl sérült +Game disc read error - ISO corrupt = Játék lemez olvasási hiba: sérült ISO. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Grafika inicializálása sikertelen. Próbáld frissíteni a videókártya drivereket és a DirectX-et.\n\nMegpróbálsz átváltani OpenGL-re?\n\nHibaüzenet: +GenericGraphicsError = Grafika Hiba +GenericOpenGLError = Grafika inicializálása sikertelen. Próbáld frissíteni a videókártya drivereket.\n\Megpróbálsz átváltani DirectX 9-re?\n\nHibaüzenet: +GenericVulkanError = Grafika inicializálása sikertelen. Próbáld frissíteni a videókártya drivereket.\n\nMegpróbálsz átváltani OpenGL-re?\n\nHibaüzenet: +InsufficientOpenGLDriver = Hiányos OpenGL driver támogatás észlelve!\n\nA GPU-d azt jelzi, hogy nem támogatja az OpenGL 2.0-át.\n\nKérlek ellenőrizd, hogy a GPU-d kompatibilis-e az OpenGL 2.0-ával. Ha igen, keresd meg, és telepísd fel a legfrissebb driver-t a GPU gyártójának honlapjáról!\n\nMegpróbálsz átváltani DirectX-re?\n\nA DirectX jelenleg kevesebb játékkal kompatibilis, de ez lehet az egyetlen lehetőség a te videókártyádon.\n\nLátogasd meg a fórumot https://forums.ppsspp.org több információért! +Just a directory. = Ez egy mappa. +Missing key = Hiányzó kulcs +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = Nincs EBOOT.PBP, félreazonosított játék. +Not a valid disc image. = Ez nem egy érvényes lemezkép. +OpenGLDriverError = OpenGL driver hiba +PPSSPP doesn't support UMD Music. = A PPSSPP nem támogatja az UMD Music zenét. +PPSSPP doesn't support UMD Video. = A PPSSPP nem támogatja az UMD Video-t. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = A PPSSPP jelenleg nem támogatja az internethez való csatlakozást DLC-khez, PSN-hez és játékfrissítésekhez. +PS1 EBOOTs are not supported by PPSSPP. = PS1 EBOOT-okat nem támogat a PPSSPP. +PSX game image detected. = A fájl egy MODE2 képfájl. A PPSSPP nem támogat PS1 játékokat. +RAR file detected (Require UnRAR) = A fájl tömörített (RAR).\nElőbb csomagold ki (próbáld UnRAR-ral). +RAR file detected (Require WINRAR) = A fájl tömörített (RAR).\nElőbb csomagold ki (próbáld WinRAR-ral). +Running slow: try frameskip, sound is choppy when slow = Lassú futás észlelve: próbálj képkocka kihagyást beállítani (hang akadozik lassuláskor) +Running slow: Try turning off Software Rendering = Lassú futás észlelve: próbáld kikapcoslni a "Szoftveres Renderelés"-t! +Save encryption failed. This save won't work on real PSP = Mentés titkosítás sikertelen. A mentés nem fog működni egy valódi PSP-n. +textures.ini filenames may not be cross-platform = A "textures.ini" fájlnevek nem lehetnek cross-platform. +This is a saved state, not a game. = Ez egy állapotmentés, nem egy játék. +This is save data, not a game. = Ez egy mentés, nem egy játék. +Unable to create cheat file, disk may be full = Csalás fájl létrehozása sikertelen, talán megtelt a lemez. +Unable to initialize rendering engine. = Renderelő motor inicializálása sikertelen. +Unable to write savedata, disk may be full = Mentés létrehozása sikertelen, talán megtelt a lemez. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Figyelem: Videómemória MEGTELT. Átváltás alacsonyabb skálázásra és lassú gyorsítótárazásra. +Warning: Video memory FULL, switching to slow caching mode = Figyelem: Videómemória MEGTELT. Átváltás lassú gyorsítótárazásra. +ZIP file detected (Require UnRAR) = A fájl tömörített (ZIP).\nElőbb csomagold ki (próbáld UnRAR-ral). +ZIP file detected (Require WINRAR) = A fájl tömörített (ZIP).\nElőbb csomagold ki (próbáld WinRAR-ral). + +[Game] +Asia = Ázsia +ConfirmDelete = Törlés +Create Game Config = Új játékbeállítás +Create Shortcut = Parancsikon létrehozása +Delete Game = Játék törlése +Delete Game Config = Játékbeállítások törlése +Delete Save Data = Mentések törlése +Europe = Európa +Game = Játék +Game Settings = Játékbeállítások +Homebrew = Homebrew +Hong Kong = Hongkong +InstallData = Adatok telepítése +Japan = Japán +Korea = Korea +MB = MB +One moment please... = Egy pillanat türelmet... +Play = Indítás +Remove From Recent = Törlés a listából +SaveData = Mentések +Setting Background = Háttér beállítás +Show In Folder = Mutatás mappában +USA = USA +Use UI background = Alapértelmezett háttér használata + +[Graphics] +% of the void = %-a az üres térnek +% of viewport = %-a a mintaablaknak +%, 0:unlimited = %, 0 = korlátlan +(supersampling) = (supersampling) +(upscaling) = (felskálázás) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Agresszív +Alternative Speed = Alternatív sebesség +Alternative Speed 2 = Alternatív sebesség 2 (%-ban, 0 = korlátlan) +Anisotropic Filtering = Anizotropikus szűrés +Auto = Auto +Auto (1:1) = Auto (1:1) +Auto (same as Rendering) = Auto (renderelési felbontással megegyező) +Auto FrameSkip = Automatikus képkocka kihagyás +Auto Scaling = Automatikus skálázás +Backend = Backend +Balanced = Kiegyensúlyozott +Bicubic = Bicubic +BlockTransfer Tip = Néhány játék számára ezt be kell kapcsolni ahhoz, hogy helyesen rajzolódjon ki. +BlockTransferRequired = Figyelem: Ehhez a játékhoz be kell kapcsolni a "Blokk transzfer effektek szimulálása" opciót! +Both = Mindkettő +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Bufferelt renderelés +BufferedRenderingRequired = Figyelem: Ehhez a játékhoz a "Renderelési mód" beállítást "Bufferelt"-re kell állítani! +Camera = Kamera +Camera Device = Kamera eszköz +Cardboard Screen Size = Képernyőméret (látómező %-ában kifejezve) +Cardboard Screen X Shift = X irányú eltolás (üres terület %-ában kifejezve) +Cardboard Screen Y Shift = Y irányú eltolás (üres terület %-ában kifejezve) +Cardboard VR Settings = Google Cardboard VR beállítások +Cheats = Csalások +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU mag +Debugging = Hibakeresés +DefaultCPUClockRequired = Figyelem: Ehhez a játékhoz az alapértelmezett CPU órajel beállítás szükséges! +Deposterize = Keményítés megszüntetése +Deposterize Tip = Skálázásból eredő kisebb textúra hibák megszüntetése. +Device = Eszköz +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Lassú effektek letiltása (gyorsítás) +Disabled = Letiltva +Display layout editor = Elrendezés szerkesztő +Display Resolution (HW scaler) = Megjelenítési felbontás (HW skálázó) +Dump next frame to log = Következő képkocka kiírása naplófájlba +Enable Cardboard VR = Cardboard VR engedélyezése +FPS = FPS +Frame Rate Control = Képkocka sebesség szabályozása +Frame Skipping = Képkocka kihagyás +Frame Skipping Type = Képkocka kihagyás típusa +FullScreen = Teljes képernyő +Hack Settings = Hack beállítások (ezek HIBÁKAT OKOZHATNAK) +Hardware Tessellation = Hardveres tesszeláció +Hardware Transform = Hardveres transzform +hardware transform error - falling back to software = Hardveres transzform hiba, próbálkozás szoftverrel. +HardwareTessellation Tip = Görbék hardveres kirajzolása. Mindig egy fix minőséget használ. +High = Magas +Hybrid = Hibrid +Hybrid + Bicubic = Hibrid + Bicubic +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Belső felbontás +Lazy texture caching = Lusta textúra gyorsítótárazás (gyorsítás) +Linear = Lineáris +Low = Alacsony +LowCurves = Spline/Bezier görbék minősége +LowCurves Tip = Csak néhány játék használja, a görbék simaságát szabályozza +Lower resolution for effects (reduces artifacts) = Effektek alacsonyabb felbontásssal (gyengíti a látványt) +Manual Scaling = Kézi skálázás +Medium = Közepes +Mode = Renderelési üzemmód +Must Restart = A beállítások érvénybeléptetéséhez újra kell indítani a PPSSPP-t. +Native device resolution = Natív készülék felbontás +Nearest = Legközelebbi +No buffer = No buffer +Non-Buffered Rendering = Buffer effektek kihagyása (nem bufferelt, gyorsabb) +None = Nincs +Number of Frames = Képkockák száma +Off = Ki +OpenGL = OpenGL +Overlay Information = Overlay információk +Partial Stretch = Részleges nyújtás +Percent of FPS = FPS százalékában +Performance = Teljesítmény +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Utóeffektező shader +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Képkockák duplázása 60 Hz rendereléshez +RenderDuplicateFrames Tip = Simábbá teheti az alacsonyabb képkocka számon futó játékok kirajzolását +Rendering Mode = Renderelés módja +Rendering Resolution = Renderelés felbontása +RenderingMode NonBuffered Tip = Gyorsabb, de egyes játékokban nem rajzol ki semmit. +Retain changed textures = Változtatott textúrák megtartása (olykor lassabb) +RetainChangedTextures Tip = Egyes játékokat gyorsít, de sok játékot lassít. +Rotation = Forgatás +Safe = Biztonságos +Screen layout = Screen layout +Screen Scaling Filter = Képernyő skálázási szűrő +Show Debug Statistics = Hibakeresési statisztikák mutatása +Show FPS Counter = FPS számláló mutatása +Simulate Block Transfer = Blokk transzfer effektek szimulálása +SoftGPU Tip = Jelenleg NAGYON lassú +Software Rendering = Szoftveres renderelés (lassú) +Software Skinning = Szoftveres "skinning" +SoftwareSkinning Tip = "Skinning" művelet elvégzése a processzoron. Sok játék esetében gyorsabb. +Speed = Sebesség +Stretching = Nyújtás +Texture Filter = Textúra szűrés +Texture Filtering = Textúra szűrés +Texture Scaling = Textúra nagyítás +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Kapcsold ki a "Hardveres tesszelációt": nem támogatott! +Unlimited = Korlátlan +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = Nagyítási szint +Upscale Type = Nagyítás típusa +UpscaleLevel Tip = CPU intenzív - akadozások elkerülése végett olykor késleltetve nagyít. +Use all displays = Minden megjelenítő használata +Vertex Cache = Vertex gyorsítótár +VertexCache Tip = Gyorsabb, de néha villódzást okoz +VSync = VSync +Vulkan = Vulkan +Window Size = Ablak méret +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = ZIP fájl törlése +Install = Telepítés +Install game from ZIP file? = Játék telepítése ZIP fájlból? +Install textures from ZIP file? = Textúrák telepítése ZIP fájlból? +Installed! = Telepítve! +Texture pack doesn't support install = A textúra csomag nem támogatja a telepítést +Zip archive corrupt = A ZIP archívum sérült +Zip file does not contain PSP software = A ZIP fájl nem tartalmaz PSP szoftvert + +[KeyMapping] +Autoconfigure = Automatikus beállítás +Autoconfigure for device = Eszköz auto-beállítása +Clear All = Összes törlése +Default All = Összeset alapért. +Map a new key for = Új gomb beállítása ehhez: +Map Key = Billentyű társítása +Map Mouse = Egér társítása +Test Analogs = Analóg teszt +You can press ESC to cancel. = Megszakításhoz használj ESC-et. + +[MainMenu] +Browse = Tallózás… +Buy PPSSPP Gold = Gold vásárlása +Choose folder = Mappa választása +Credits = Névjegy +PPSSPP Homebrew Store = PPSSPP Homebrew Store +Exit = Kilépés +Game Settings = Beállítások +Games = Játékok +Give PPSSPP permission to access storage = Engedélyezd a PPSSPP számára a hozzáférést a háttértárhoz! +Homebrew & Demos = Homebrew && Demók +How to get games = Hogyan szerezzünk be játékokat? +How to get homebrew & demos = Hogyan szerezzünk homebrew-kat és demókat? +Load = Betöltés… +Loading... = Töltés... +PinPath = Rögzít +PPSSPP can't load games or save right now = A PPSSPP most nem képes játékot betölteni vagy menteni. +Recent = Legutóbbiak +SavesAreTemporary = A PPSSPP ideiglenes tárba ment +SavesAreTemporaryGuidance = A tartós mentéshez csomagold ki valahova a PPSSPP-t +SavesAreTemporaryIgnore = Figyelmen kívül hagyás +UnpinPath = Felold +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Hang +Controls = Irányítás +Graphics = Grafika +Networking = Hálózat +System = Rendszer +Tools = Eszközök + +[MappableControls] +Alt speed 1 = Alt. seb. 1 +Alt speed 2 = Alt. seb. 2 +An.Down = Analóg Le +An.Left = Analóg Balra +An.Right = Analóg Jobbra +An.Up = Analóg Fel +Analog limiter = Analóg korlátozó +Analog Stick = Analóg kar +Audio/Video Recording = Audió/Videó felvétel +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Tengely csere +Circle = Kör +Cross = Kereszt +D-pad down = D-pad Le +D-pad left = D-pad Balra +D-pad right = D-pad Jobbra +D-pad up = D-pad Fel +DevMenu = DevMenu +Down = D-Pad Le +Dpad = D-Pad +Frame Advance = Köv. képkocka +Hold = Zár +Home = Kezdőkép +L = L +Left = D-Pad Balra +Load State = Áll.mentés bet. +Mute toggle = Némítás +Next Slot = Következő sorsz. +None = None +Note = Megj. +OpenChat = Open chat +Pause = Szünet +R = R +RapidFire = Gyorstüzelés +Remote hold = Távoli zár +Rewind = Visszatekerés +Right = D-Pad Jobbra +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = Jobb An. Le +RightAn.Left = Jobb An. Balra +RightAn.Right = Jobb An. Jobbra +RightAn.Up = Jobb An. Fel +Rotate Analog (CCW) = An. forg. (óram. ell.) +Rotate Analog (CW) = An. forg. (óram. jár.) +Save State = Áll.mentés kész. +Screen = Képernyő +Screenshot = Képernyőkép +Select = Select +SpeedToggle = Seb. változtatása +Square = Négyzet +Start = Start +Texture Dumping = Textúra kiírás +Texture Replacement = Textúra csere +Toggle Fullscreen = Teljes képernyő +Toggle mode = Üzemmód váltása +Triangle = Háromszög +Unthrottle = Gyorsítás +Up = D-Pad Fel +Vol + = Hangerő + +Vol - = Hangerő - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Ad Hoc többjátékos fórum +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Alul középen +Bottom Left = Alul bal old. +Bottom Right = Alul jobb old. +Center Left = Középen bal old. +Center Right = Középen jobb old. +Change Mac Address = MAC cím megváltoztatása +Change proAdhocServer Address = ProAdhoc szerver címe (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat gomb helye +Chat Here = Írj ide... +Chat Screen Position = Chat képernyő poziciója +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Beépített ProAdhoc szerver engedélyezése +Enable network chat = Hálózati chat engedélyezése +Enable networking = Hálózat/WLAN engedélyezése (béta, néhány játékot elronthat) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Gyors üzenetek engedélyezése +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Érvénytelen IP vagy kiszolgáló név +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Hálózat inicializálva +Please change your Port Offset = Please change your port offset +Port offset = Port eltolás/offset (0 = PSP kompatibilitás) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Gyors üzenet 1 +Quick Chat 2 = Gyors üzenet 2 +Quick Chat 3 = Gyors üzenet 3 +Quick Chat 4 = Gyors üzenet 4 +Quick Chat 5 = Gyors üzenet 5 +QuickChat = Quick chat +Send = Küldés +Send Discord Presence information = Discord "Rich Presence" információ küldése +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Felül középen +Top Left = Felül bal old. +Top Right = Felül jobb old. +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Cím ellenőrzése... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = Offline üzemmódban vagy, menj a lobbiba vagy az online terembe + +[Pause] +Cheats = Csalások +Continue = Folytatás +Create Game Config = Játékbeállítás létrehozása +Delete Game Config = Játékbeállítás törlése +Exit to menu = Kilépés a főmenübe +Game Settings = Játékbeállítások +Load State = Állás betöltése +Rewind = Visszatekerés +Save State = Állapotmentés készítése +Settings = Beállítások +Switch UMD = UMD váltása + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Color +Amount = Mennyiség +Black border = Fekete keret +Bloom = Bloom +Brightness = Brightness +Cartoon = Rajzfilm +ColorCorrection = Színkorrekció +Contrast = Kontraszt +CRT = CRT +FXAA = FXAA élsimítás +Gamma = Gamma +Grayscale = Szürkeárnyalatos +Intensity = Erősség +InverseColors = Színek megfordítása +Natural = Természetes színek +NaturalA = Természetes színek (elmosódás nélkül) +Off = Ki +Power = Power +PSPColor = PSP color +Saturation = Telítettség (szaturáció) +Scanlines = Csíkozás +Sharpen = Élesítés +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 felskálázó +VideoSmoothingAA = VideoSmoothingAA +Vignette = Vignetta + +[PSPCredits] +all the forum mods = a fórum összes moderátorának +build server = build szerver +Buy Gold = Gold vásárlása +check = Nézd meg a Dolphin-t is, a legjobb Wii/GC emulátort: +CheckOutPPSSPP = Nézd meg a PPSSPP-t, a lenyűgöző PSP emulatort: https://www.ppsspp.org/ +contributors = Közreműködtek: +created = Készítette +Discord = Discord +info1 = A PPSSPP kizárólag oktatási célokra készült. +info2 = Kérlek győzödj meg arról, hogy van jogod a játékokhoz +info3 = azáltal, hogy megvan UMD-n vagy megvetted digitálisan +info4 = a PSN boltból a valódi PSP-den. +info5 = A PSP a Sony védjegye. +iOS builds = iOS build-ek +license = Ingyenes szoftver GPL 2.0+ alatt +list = kompatibilitási listák, fórumok és fejlesztési infók +PPSSPP Forums = PPSSPP fórumok +Privacy Policy = Adatvédelmi irányelvek +Share PPSSPP = PPSSPP megosztása +specialthanks = Különleges köszönet: +specialthanksKeithGalocy = az NVIDIA-nál (hardver, tanács) +specialthanksMaxim = (lenyűgöző Atrac3+ dekóder) +testing = tesztelés +this translation by = Fordította: +title = Egy gyors és hordozható PSP emulátor +tools = Használt ingyenes eszközök: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = Nezarn +translators2 = mrolcsi +translators3 = NABN00B +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Nézd meg a honlapot: +written = C++ban írva a sebességért és portolhatóságért + +[RemoteISO] +Browse Games = Játékok tallózása +Local Server Port = Lokális szerver port +Manual Mode Client = Kliens kézi konfigurálása +Remote disc streaming = Távoli lemez streamelése +Remote Port = Távoli port +Remote Server = Távoli szerver +Remote Subdirectory = Távoli elérési út +RemoteISODesc = A "Legutóbbi játékok" listában szereplő játékok lesznek megosztva. +RemoteISOLoading = Csatlakozva, játék lista betöltése... +RemoteISOScanning = Keresés... Kattints a "Játékok megosztása" gombra a szerver eszközön. +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Megjegyzés: Mindkét eszköznek ugyanarra a WiFi hálózatra kell csatlakoznia. +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Beállítások +Share Games (Server) = Játékok megosztása (szerver) +Share on PPSSPP startup = Játékok megosztása a PPSSPP indulásakor +Stop Sharing = Megosztás leállítása +Stopping.. = Leállítás alatt... + +[Reporting] +Bad = Rossz +FeedbackDelayInfo = A jelentésed feltöltésre kerül a háttérben. +FeedbackDesc = Hogy tetszik az alkalmazás? Áruld el véleményed nekünk és a közösségnek! +FeedbackDisabled = A kompatibilitási jelentéseket engedélyezni kell. +FeedbackIncludeCRC = Megjegyzés: megnöveli az akkumulátorhasználatot. +FeedbackIncludeScreen = Képernyőkép csatolása +FeedbackSubmitDone = A jelentésed feltöltésre került. +FeedbackSubmitFail = Nem sikerült feltölteni a jelentést. Próbáld frissíteni a PPSSPP-t. +FeedbackThanks = Köszönjük a visszajelzésed! +Gameplay = Játékmenet +Graphics = Grafika +Great = Remek +In-game = Játékon belül +In-game Description = Sikerül eljutni a játékmenetig, de túl hibás ahhoz, hogy végigvihető legyen. +Menu/Intro = Főmenü/Intro +Menu/Intro Description = Nem sikerül eljutni a játékmenetig. +Nothing = Semmi +Nothing Description = Teljesen rossz +OK = OK +Open Browser = Böngésző megnyitása +Overall = Összegezve +Perfect = Tökéletes +Perfect Description = A teljes játék emulálása hibátlan - remek! +Plays = Játszható +Plays Description = Végig játszható, de előfordulnak kisebb hibák. +ReportButton = Vélemény jelentése +Speed = Sebesség +Submit Feedback = Vélemény elküldése +SuggestionConfig = Nézd meg a jelentéseket a honlapon a megfelelő beállításokhoz. +SuggestionCPUSpeed0 = Kapcsold ki a CPU sebesség-korlát beállítást. +SuggestionDowngrade = Állj vissza egy korábbi PPSSPP verzióra (kérlek jelentsd a hibát)! +SuggestionsFound = Más felhasználók jobb eredményeket jelentettek. Bökj az "Eredmény Megtekintése" gombra további részletekért. +SuggestionsNone = Ez a játék más felhasználóknak sem működik. +SuggestionsWaiting = Elküldés és mások véleményének keresése... +SuggestionUpgrade = Frissíts a PPSSPP újabb verziójára! +SuggestionVerifyDisc = Ellenőrizd, hogy az ISO megfelelő másolata-e a lemezednek! +Unselected Overall Description = Mennyire jó a játék emulációja? +View Feedback = Az összes visszajelzés megtekintése + +[Savedata] +Date = Dátum +Filename = Fájlnév +No screenshot = Nincs kép +None yet. Things will appear here after you save. = Itt jelennek majd meg a mentések. Még nincs semmi. +Save Data = Mentés +Save States = Állapotmentések +Savedata Manager = Mentések kezelése +Size = Méret + +[Screen] +Cardboard VR OFF = Cardboard VR ki +Chainfire3DWarning = FIGYELMEZTETÉS: Chainfire3D észlelve, problémákat okozhat +Failed to load state = Állapotmentés betöltése sikertelen +Failed to save state = Állápotmentés készítése sikertelen +fixed = Sebesség: alternatív +GLToolsWarning = FIGYELMNEZTETÉS: GLTools észlelve, problémákat okozhat. +In menu = Menüben +Load savestate failed = Állapotmentés betöltése sikertelen +Loaded State = Állapotmentés betöltve +Loaded. Save in game, restart, and load for less bugs. = Betöltve. Ments a játékban, indítsd újra, és töltsd be a mentést kevesebb hibáért. +LoadStateDoesntExist = Hiba az állapotmentés betöltése közben: Az állapotmentés nem létezik! +LoadStateWrongVersion = Hiba az állapotmentés betöltése közben: Az állapotmentés egy régebbi PPSSPP verzióhoz való! +norewind = Nem érhető el visszatekerési állapotmentés. +Playing = Lejátszás +PressESC = Nyomd meg az ESC-et a menühöz. +replaceTextures_false = A textúrák nincsenek többé kicserélve. +replaceTextures_true = A textúra csere be van kapcsolva. +Save State Failed = Hiba az állás mentése közben! +Saved State = Állapotmentés elkészítve +saveNewTextures_false = Textúra mentés letiltva. +saveNewTextures_true = A textúrák mostantól el lesznek mentve a tárhelyeden. +SpeedCustom2 = Sebesség: alternatív 2 +standard = Sebesség: alapértelmezett +Untitled PSP game = Névtelen PSP játék + +[Store] +Already Installed = Már telepítve +Connection Error = Kapcsolódási hiba +Install = Telepítés +Launch Game = Játék indítása +Loading... = Töltés... +MB = MB +Size = Méret +Uninstall = Eltávolítás + +[SysInfo] +%d (%d per core, %d cores) = %d (%d magonként, %d db mag) +%d bytes = %d bájt +(none detected) = (nem észlelve) +3D API = 3D API +ABI = ABI +API Version = API verzió +Audio Information = Audió információ +Board = Alaplap +Build Config = Build konfig +Build Configuration = Build konfiguráció +Built by = Buildelte: +Core Context = Core context +Cores = Magok +CPU Extensions = CPU kiterjesztések +CPU Information = CPU információ +CPU Name = Név +D3DCompiler Version = D3DCompiler verzió +Debug = Hibakeresés +Debugger Present = Debugger jelen +Device Info = Eszközinfó +Display Information = Megjelenítő információ +Driver Version = Driver verzió +EGL Extensions = EGL kiterjesztések +Frames per buffer = Bufferenkénti képkockák +GPU Information = GPU információ +High precision float range = High precision float range +High precision int range = Nagy pontosságú int tartomány +Lang/Region = Nyelv/Régió +Memory Page Size = Memória lapozóméret +Native Resolution = Natív felbontás +OGL Extensions = OGL kiterjesztések +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 kiterjesztések +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 kiterjesztések +OpenGL Extensions = OpenGL kiterjezstések +Optimal frames per buffer = Bufferenkénti optimális képkockák +Optimal sample rate = Optimális mintavételezés +OS Information = Op.rendszer információ +PPSSPP build = PPSSPP build +Refresh rate = Frissítési gyakoriság +Release = Release +RW/RX exclusive = RW/RX exkluzív +Sample rate = Mintavételezési ráta +Shading Language = Shading nyelv +Sustained perf mode = Fentartott teljesítmény mód +System Information = Rendszerinformáció +System Name = Név +System Version = Rendszer verzió +Threads = Szálak +Vendor = Gyártó +Vendor (detected) = Gyártó (észlelt) +Version Information = Verzió információ +Vulkan Extensions = Vulkan kiterjesztések +Vulkan Features = Vulkan funkciók + +[System] +(broken) = (nem működik) +12HR = 12ó +24HR = 24ó +Auto = Auto +Auto Load Savestate = Állapotmentés automatikus betöltése +AVI Dump started. = AVI írás indítva +AVI Dump stopped. = AVI írás leállítva +Cache ISO in RAM = Teljes ISO fájl RAM-ban tartása +Change CPU Clock = Emulált CPU órajel változtatása (instabil) +Change Memory Stick folder = Memory Stick mappa megváltoztatása +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Becenév megváltoztatása +ChangingMemstickPath = A mentések, állapotmentések és egyéb adatok nem kerülnek másolásra ebbe a mappába.\n\nMegváltoztatod a Memory Stick mappáját? +ChangingMemstickPathInvalid = Ez az elérési útvonal nem használható Memory Stick fájlok mentésére. +ChangingMemstickPathNotExists = Ez a mappa még nem létezik.\n\nA mentések, állapotmentések és egyéb adatok nem kerülnek másolásra ebbe a mappába.\n\nLétrehozod az új Memory Stick mappát? +Cheats = Csalások (kísérleti, lásd fórumon) +Clear Recent = Legutóbb használtak listájának törlése +Clear Recent Games List = Legutóbbi játékok listájának törlése +Clear UI background = Kezelőfelület hátterének visszaállítása +Confirmation Button = Megerősítő gomb +Date Format = Dátum formátuma +Day Light Saving = Nyári időszámítás +DDMMYYYY = NNHHÉÉÉÉ +Decrease size = Méret csökkentése +Developer Tools = Fejlesztői eszközök +Display Extra Info = Extra információ megjelenítése +Display Games on a grid = Játékok rácsnézetben +Display Homebrew on a grid = Homebrew és Demók rácsnézetben +Display Recent on a grid = Legutóbbiak rácsnézetben +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emuláció +Enable Cheats = Csalások engedélyezése +Enable Compatibility Server Reports = Szerver kompatibilitási jelentések engedélyezése +Failed to load state. Error in the file system. = Állapotmentés betöltése sikertelen. Hiba a fájlrendszerben. +Failed to save state. Error in the file system. = Állapotmentés készítése sikertelen. Hiba a fájlrendszerben. +Fast (lag on slow storage) = Gyors (lassú tárolón akadozik) +Fast Memory = Gyors memória elérés (instabil) +Force real clock sync (slower, less lag) = Valós idejű óra szinkron kényszerítése (lassabb, kevesebb lag) +frames, 0:off = képkocka, 0 = ki +Games list settings = Játéklista beállításai +General = Általános +Grid icon size = Ikonok mérete rácsnézetben +Help the PPSSPP team = Segítsd a PPSSPP csapatát +Host (bugs, less lag) = Host (hibák, kevesebb lag) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Méret növelése +Interpreter = Interpreter +IO timing method = I/O időzítési metódus +IR Interpreter = IR interpreter +Memory Stick Folder = Memory Stick mappa +Memory Stick inserted = Memory Stick behelyezve +MHz, 0:default = MHz, 0 = alapértelmezett +MMDDYYYY = HHNNÉÉÉÉ +Newest Save = Legújabb mentés +Not a PSP game = Nem egy PSP játék +Off = Ki +Oldest Save = Legrégebbi mentés +PSP Model = PSP modell +PSP Settings = PSP beállítások +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Audió felvétele +Record Display = Videó felvétele +Reset Recording on Save/Load State = Felvétel leállítása állapotmentés készítésekor vagy betöltésekor +Restore Default Settings = PPSSPP beállításainak alapértelmezettre állítása +Rewind Snapshot Frequency = Visszatekerési állapotmentések gyakorisága (sok memória kell) +Save path in installed.txt = Mentés helye installed.txt-ben +Save path in My Documents = Mentés helye a Dokumentumok mappában +Savestate Slot = Állapotmentés sorszáma +Savestate slot backups = Állapotmentések sorszámonkénti biztonsági másolata +Screenshots as PNG = Képek mentése PNG formátumban +Set UI background... = Kezelőfelület hátterének beállítása… +Show ID = Azonosító megjelenítése +Show region flag = Régió ikon megjelenítése +Simulate UMD delays = UMD késleltetések szimulálása +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Tárhely megtelt +Sustained performance mode = Fentartott teljesítmény mód +Time Format = Idő formátuma +UI = Felhasználói felület +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Veszteségmentes videó codec használata (FFV1) +Use O to confirm = O gomb használata a megerősítéshez +Use output buffer (with overlay) for recording = Kimeneti buffer alkalmazása (fedőréteggel) rögzítéskor +Use system native keyboard = Use system native keyboard +Use X to confirm = X gomb használata a megerősítéshez +VersionCheck = PPSSPP frissítés keresése +WARNING: Android battery save mode is on = FIGYELEM: Android energiatakarékos üzemmód bekapcsolva! +WARNING: Battery save mode is on = FIGYELEM: Energiatakarékós üzemmód bekapcsolva! +YYYYMMDD = ÉÉÉÉHHNN + +[Upgrade] +Details = Details +Dismiss = Kihagyás +Download = Letöltés +New version of PPSSPP available = Elérhető a PPSSPP egy újabb verziója diff --git a/assets/lang/id_ID.ini b/assets/lang/id_ID.ini new file mode 100644 index 0000000000..0341af38e9 --- /dev/null +++ b/assets/lang/id_ID.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = Audio backend (butuh start ulang) +AudioBufferingForBluetooth = Bluetooth-friendly buffer (lambat) +Auto = Otomatis +Device = Device +DSound (compatible) = DSound (cocok) +Enable Sound = Aktifkan suara +Global volume = Volume global +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = WASAPI (cepat) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Analog axis sensitivity +Analog Limiter = Pembatas analog +Analog Mapper High End = Pemetaan analog high-end (sensitivitas sumbu) +Analog Mapper Low End = Pemetaan analog low-end (inverse deadzone) +Analog Mapper Mode = Mode pemetaan analog +Analog Stick = Kemudi analog +AnalogLimiter Tip = When the analog limiter button is pressed +Auto = Otomatis +Auto-centering analog stick = Penengahan otomatis kemudi analog +Auto-hide buttons after seconds = Sembunyi-tombol setelah beberapa detik +Binds = Binds +Button Opacity = Kegelapan tombol +Button style = Gaya tombol +Calibrate D-Pad = Kalibrasi +Calibration = Kalibrasi +Classic = Klasik +Combo Key Setting = Pengaturan tombol kombinasi +Combo Key Setup = Konfigurasi tombol kombinasi +Confine Mouse = Kurung tetikus di dalam area layar +Control Mapping = Pemetaan kontrol +Custom layout... = Sunting tata letak kontrol sentuh... +Customize tilt = Sesuaikan kemiringan... +D-PAD = D-Pad +Deadzone Radius = Radius mati +DInput Analog Settings = Pengaturan DInput analog +Disable D-Pad diagonals (4-way touch) = Matikan D-Pad diagonal (sentuhan 4 arah) +Glowing borders = Glowing borders +HapticFeedback = Umpan balik (getar) +Ignore gamepads when not focused = Abaikan kemudi ketika tidak fokus +Ignore Windows Key = Abaikan tombol Windows +Invert Axes = Balikkan sumbu +Invert Tilt along X axis = Balikkan kemiringan sepanjang sumbu X +Invert Tilt along Y axis = Balikkan kemiringan sepanjang sumbu Y +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Pengaturan kendali papan ketik +L/R Trigger Buttons = Tombol pelatuk L/R +Landscape = Lanskap +Landscape Auto = Landscape auto +Landscape Reversed = Lanskap terbalik +Mouse = Pengaturan Mouse +Mouse sensitivity = Sentivitas Mouse +Mouse smoothing = Kelembutan Mouse +MouseControl Tip = You can now map mouse in control mapping screen by pressing the 'M' icon. +None (Disabled) = Tidak ada (dinonaktifkan) +Off = Matikan +OnScreen = Kontrol sentuh di layar +Portrait = Tegak +Portrait Reversed = Tegak terbalik +PSP Action Buttons = Tombol aksi PSP +Screen Rotation = Rotasi layar +seconds, 0 : off = detik, 0 = mati +Sensitivity = Sensitivitas +Show right analog = Show right analog +Show Touch Pause Menu Button = Tampilkan tombol menu jeda +Thin borders = Garis batas tipis +Tilt Base Radius = Tilt base radius +Tilt Input Type = Jenis masukan kemiringan +Tilt Sensitivity along X axis = Sensitivitas kemiringan sepanjang sumbu X +Tilt Sensitivity along Y axis = Sensitivitas kemiringan sepanjang sumbu Y +To Calibrate = Untuk mengkalibrasi, taruh perangkat di permukaan datar dan tekan "Kalibrasi". +Touch Control Visibility = Visibilitas kendali sentuh +Use custom right analog = Use custom right analog +Use Mouse Control = Gunakan kontrol mouse +Visibility = Visibilitas +X = X +X + Y = X + Y +XInput Analog Settings = Pengaturan analog XInput +Y = Y + +[CwCheats] +Cheats = Curang +Edit Cheat File = Sunting berkas curang +Enable/Disable All = Hidupkan/matikan semua kecurangan +Import Cheats = Impor dari cheat.db +Options = Pilihan +Refresh Rate = Perbarui Penyegaran + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = Tent&ang PPSSPP... +Auto = Otomatis +Backend = Rendering &Backend (Start ulang PPSSPP) +Bicubic = &Bicubic +Break = Break +Break on Load = Break on load +Buffered Rendering = Pelukisan Tersangga +Buy Gold = Beli versi &Gold +Control Mapping... = Pemetaan K&ontrol... +Debugging = Debug +Deposterize = &Deposterize +Direct3D9 = &Direct3D9 +Direct3D11 = Direct3D &11 +Disassembly = &Disassembly... +Discord = Discord +Display Layout Editor = Penyunting tata letak tampilan... +Display Rotation = Rotasi tampilan +Dump Next Frame to Log = D&ump Next Frame to Log +Emulation = &Emulasi +Enable Chat = Enable chat +Enable Cheats = Hidupkan Penge&coh +Enable Sound = Hidupkan Suara +Exit = Keluar +Extract File... = Ekstrak Berkas... +File = Berkas +Frame Skipping = &Lewati Frame +Frame Skipping Type = Frame skipping type +Fullscreen = &Layar Penuh +Game Settings = Pengaturan Permainan +GE Debugger... = Awakutu GE... +GitHub = Git&Hub +Hardware Transform = Transformasi Perangkat Keras +Help = Bantuan +Hybrid = &Hibrida +Hybrid + Bicubic = Hibrida + Bikubik +Ignore Illegal Reads/Writes = Aba&ikan Pembacaan/Penulisan Ilegal +Ignore Windows Key = Abaikan Tombol Windows +Keep PPSSPP On Top = Tahan PPSSPP di Atas +Landscape = Lanskap +Landscape reversed = Lanskap terbalik +Language... = Bahasa... +Linear = &Linier +Load = Muat... +Load .sym File... = Mu&at Berkas .sym... +Load Map File... = Muat Berkas &Map... +Load State = L&oad State +Load State File... = &Load State File... +Log Console = Konso&l Pencatat +Memory View... = Tampilan Memori... +More Settings... = Pengaturan Lainnya... +Nearest = Terdekat +Non-Buffered Rendering = Lewati efek penyangga (tak-tersangga, lebih cepat) +Off = Mati +Open Directory... = Buka &Direktori... +Open from MS:/PSP/GAME... = Buka dari MS:/PSP/GAME... +Open Memory Stick = Buka &Memory Stick +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = Jeda +Pause When Not Focused = Jeda Ketika Tidak Fokus +Portrait = Tegak +Portrait reversed = Tegak terbalik +Postprocessing Shader = Postprocessin&g Shader +PPSSPP Forums = &Forum PPSSPP +Record = Rekam +Record Audio = Rekam Suara +Record Display = Rekam Tampilan +Rendering Mode = M&ode Pelukisan +Rendering Resolution = &Resolusi Pelukisan +Reset = Tata Ulang +Reset Symbol Table = Tata Ulang Tabel Simbol +Run = Jalankan +Save .sym File... = Simpan B&erkas .sym... +Save Map File... = &Simpan Berkas Peta... +Save State = Simp&an Posisi +Save State File... = &Simpan Berkas Posisi... +Savestate Slot = Saves&tate Slot +Screen Scaling Filter = Saringan P&enskala Layar +Show Debug Statistics = Tampilkan Statistik Debug +Show FPS Counter = Tampilkan Penghitung &FPS +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = Hentikan +Switch UMD = Ganti UMD +Take Screenshot = Ambil &Tangkapan Layar +Texture Filtering = Penyaringan Tekstur +Texture Scaling = Penskala &Tekstur +Use Lossless Video Codec (FFV1) = Gunakan Lossless Video Codec (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = Tembolok &Vertex +VSync = VS&ync +Vulkan = Vulkan +Window Size = Ukuran Jendela +www.ppsspp.org = Kunjungi www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allocator viewer (Vulkan) +Allow remote debugger = Allow remote debugger +Backspace = Spasi mundur +Block address = Alamat blok +By Address = Berdasarkan alamat +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Create/Open textures.ini file for current game +Current = Saat ini +Dev Tools = Development tools +DevMenu = DevMenu +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Dump decrypted EBOOT.BIN on game boot +Dump Frame GPU Commands = Dump frame GPU commands +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Hidupkan pencatat awakutu +Enter address = Masukkan alamat +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Frame profiler +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = Bandingkan Jit +JIT debug tools = JIT debug tools +Language = Bahasa +Load language ini = Muat *.ini bahasa +Log Dropped Frame Statistics = Log dropped frame statistics +Log Level = Tingkatan pencatat +Log View = Tampilan pencatat +Logging Channels = Kanal pencatatan +Next = Sesudah +No block = Tidak ada blok +Prev = Sebelum +Random = Acak +Replace textures = Replace textures +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Apakah Anda yakin ingin mengembalikan semua pengaturan ke awal?\nPengaturan pemetaan kendali tidak berubah.\n\nAksi ini bersifat permanen.\nSilakan start ulang PPSSPP agar perubahan ini bisa diterapkan. +RestoreGameDefaultSettings = Apakah Anda yakin ingin mengembalikan pengaturan permainan\nkembali ke pengaturan awal PPSSPP? +Resume = Resume +Run CPU Tests = Jalankan pengujian CPU +Save language ini = Simpan *.ini bahasa +Save new textures = Save new textures +Shader Viewer = Penampil shader +Show Developer Menu = Tampilkan menu pengembang +Show on-screen messages = Show on-screen messages +Stats = Statistik +System Information = Informasi sistem +Texture Replacement = Texture replacement +Toggle Audio Debug = Alihkan awakutu audio +Toggle Freeze = Alihkan pembekuan +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP res +Active = Active +Back = Kembali +Cancel = Batal +Center = Tengah +ChangingGPUBackends = Pergantian GPU backend memerlukan start ulang PPSSPP. Start ulang sekarang? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = Pilih folder simpanan PPSSPP +Confirm Overwrite = Apakah Anda ingin menimpa data? +Confirm Save = Apakah Anda ingin menyimpan data ini? +ConfirmLoad = Muat data ini? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Hapus +Delete all = Hapus semua +Delete completed = Selesai menghapus. +DeleteConfirm = Simpanan ini akan dihapus.\nAnda yakin ingin melanjutkan? +DeleteConfirmAll = Apakah Anda ingin menghapus semua\ndata simpanan untuk permainan ini? +DeleteConfirmGame = Apakah Anda benar-benar ingin menghapus\npermainan ini dari pesawat? Aksi ini bersifat permanen. +DeleteConfirmGameConfig = Apakah Anda benar-benar ingin menghapus pengaturan untuk permainan ini? +DeleteFailed = Tidak dapat menghapus data. +Deleting = Menghapus\nMohon tunggu... +Disable All = Disable all +Edit = Edit +Enable All = Enable all +Enter = Enter +Finish = Selesai +Grid = Grid +Inactive = Inactive +InternalError = An internal error has occurred. +Load = Muat +Load completed = Selesai memuat. +Loading = Memuat\nMohon Tunggu... +LoadingFailed = Tidak dapat memuat data. +Move = Pindah +Network Connection = Koneksi Jaringan +NEW DATA = DATA BARU +No = Tidak +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = Oke +Old savedata detected = Old savedata detected +Options = Pilihan +Reset = Tata Ulang +Resize = Resize +Retry = Coba lagi +Save = Simpan +Save completed = Selesai menyimpan. +Saving = Menyimpan\nMohon tunggu... +SavingFailed = Tidak dapat menyimpan data. +Select = Select +Shift = Shift +Snap = Snap +Space = Space +SSID = SSID +Submit = Ajukan +Supported = Supported +There is no data = Tidak ada data. +Toggle All = Alihkan semua +Toggle List = Toggle list +Unsupported = Unsupported +When you save, it will load on a PSP, but not an older PPSSPP = Setelah Anda menyimpan, ini akan dapat dimuat di PSP, namun tidak di PPSSPP lawas +When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Yes = Ya +Zoom = Perbesaran + +[Error] +7z file detected (Require 7-Zip) = berkas terkompresi (7z).\nMohon ekstrak dahulu (coba 7-Zip atau WinRAR). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = Tidak dapat menyimpan berkas tangkapan layar. +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll not found. Please install. Or press Yes to try again using Direct3D 9 instead. +D3D11InitializationError = Direct3D 11 initialization error +D3D11Missing = Your operating system version does not include D3D11. Please run Windows Update.\n\nPress Yes to try again using Direct3D 9 instead. +D3D11NotSupported = Your GPU does not appear to support Direct3D 11.\n\nWould you like to try again using Direct3D 9 instead? +Disk full while writing data = Penyimpanan penuh ketika menyimpan data. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = Tidak dapat memuat permainan. +Error reading file = Kesalahan saat membaca berkas. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = gagal mengidentifikasi berkas. +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Gagal menginisiasi grafis. Coba tingkatkan penggerak grafis dan DirectX 9 runtime Anda.\n\nApakah Anda ingin mencoba beralih ke OpenGL?\n\nPesan galat: +GenericGraphicsError = Kesalahan pada Grafik +GenericOpenGLError = Gagal menginisiasi grafis. Coba tingkatkan penggerak grafis Anda.\n\nApakah Anda ingin mencoba beralih ke DirectX 9?\n\nPesan galat: +GenericVulkanError = Gagal menginisiasi grafis. Coba tingkatkan penggerak grafis Anda.\n\nApakah Anda ingin mencoba beralih ke OpenGL?\n\nPesan galat: +InsufficientOpenGLDriver = Penggerak OpenGL tidak mendukung!\n\nGPU Anda melaporkan bahwa tia tidak mendukung OpenGL 2.0. Apakah Anda ingin mencoba menggunakan DirectX saja?\n\nDirectX saat ini hanya cocok untuk beberapa permainan, namun hal ini menjadi satu-satunya pilihan bagi GPU Anda.\n\nKunjungi forum di https://forums.ppsspp.org untuk informasi lebih lanjut.\n\n +Just a directory. = hanya sebuah direktori. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = no EBOOT.PBP, misidentified game. +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = Kesalahan pada penggerak OpenGL +PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP saat ini tidak mendukung koneksi Internet untuk DLC, PSN, atau pembaruan permainan. +PS1 EBOOTs are not supported by PPSSPP. = PS1 EBOOT tidak didukung oleh PPSSPP. +PSX game image detected. = Berkas tersebut adalah gambar MODE2. PPSSPP tidak mendukung permainan PS1. +RAR file detected (Require UnRAR) = berkas terkompresi (RAR).\nMohon ekstrak dahulu (coba UnRAR). +RAR file detected (Require WINRAR) = berkas terkompresi (RAR).\nMohon ekstrak dahulu (coba WinRAR). +Running slow: try frameskip, sound is choppy when slow = Berjalan lambat: coba frameskip, suara tidak lancar saat lamban +Running slow: Try turning off Software Rendering = Berjalan lambat: coba matikan "software rendering" +Save encryption failed. This save won't work on real PSP = Enkripsi simpanan gagal. Simpanan ini tidak akan bekerja pada PSP asli. +textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +This is a saved state, not a game. = This is a saved state, not a game. +This is save data, not a game. = This is save data, not a game. +Unable to create cheat file, disk may be full = Tidak dapat membuat berkas curang, penyimpanan mungkin penuh. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Tidak dapat menulis simpanan, penyimpanan mungkin penuh. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Perhatian: Memori video PENUH, mengurangi penskalaan-atas dan berganti ke mode penembolokan lambat. +Warning: Video memory FULL, switching to slow caching mode = Perhatian: Memori video PENUH, berganti ke mode penembolokan lambat. +ZIP file detected (Require UnRAR) = berkas terkompresi (ZIP).\nSilakan ekstrak dahulu (coba UnRAR). +ZIP file detected (Require WINRAR) = berkas terkompresi (ZIP).\nSilakan ekstrak dahulu (coba WinRAR). + +[Game] +Asia = Asia +ConfirmDelete = Hapus +Create Game Config = Buat konfig. permainan +Create Shortcut = Buat jalan pintas +Delete Game = Hapus permainan +Delete Game Config = Hapus konfig. permainan +Delete Save Data = Hapus simpanan +Europe = Eropa +Game = Permainan +Game Settings = Pengaturan permainan +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Data install +Japan = Jepang +Korea = Korea +MB = MB +One moment please... = One moment please... +Play = Mainkan +Remove From Recent = Hapus dari "Terbaru" +SaveData = Simpanan +Setting Background = Setting background +Show In Folder = Tampilkan di folder +USA = USA +Use UI background = Use UI background + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = tak terbatas +(supersampling) = (supersampling) +(upscaling) = (skala-atas) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Agresif +Alternative Speed = Kec. alternatif (dalam %, 0 = tak terbatas) +Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Anisotropic Filtering = Penyaringan anisotropik +Auto = Otomatis +Auto (1:1) = Otomatis (1:1) +Auto (same as Rendering) = Otomatis (sama dengan resolusi pelukis) +Auto FrameSkip = Lewati Frame secara otomatis +Auto Scaling = Penskala otomatis +Backend = Backend +Balanced = Seimbang +Bicubic = Bikubik +BlockTransfer Tip = Beberapa game memerlukan opsi ini untuk menghindari kesalahan grafis. +BlockTransferRequired = Peringatan: Game ini membutuhkan "Simulasikan efek transfer blok" dalam keadaan menyala. +Both = Keduanya +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Pelukisan tersangga +BufferedRenderingRequired = Peringatan: Game ini membutuhkan "mode pelukisan" yang ditetapkan "buffered". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Ukuran layar (dalam % dari area layar) +Cardboard Screen X Shift = X shift (dalam % dari ruang kosong) +Cardboard Screen Y Shift = Y shift (dalam % dari ruang kosong) +Cardboard VR Settings = Pengaturan Google Cardboard VR +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU core +Debugging = Awakutu +DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. +Deposterize = Deposterize +Deposterize Tip = Fixes visual banding glitches in upscaled textures +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Matikan efek lambat (mempercepat) +Disabled = Disabled +Display layout editor = Penyunting tata letak tampilan +Display Resolution (HW scaler) = Resolusi tampilan (penskala HW) +Dump next frame to log = Dump next frame to log +Enable Cardboard VR = Enable Cardboard VR +FPS = FPS +Frame Rate Control = Kontrol framerate +Frame Skipping = Lewati Frame +Frame Skipping Type = Frame skipping type +FullScreen = Layar penuh +Hack Settings = Retas pengaturan (menyebabkan kecacatan) +Hardware Tessellation = Hardware Tessellation +Hardware Transform = Transformasi perangkat keras +hardware transform error - falling back to software = Kesalahan perangkat keras, kembali ke perangkat lunak +HardwareTessellation Tip = Menggunakan perangkat keras untuk menggambar kurva, selalu menggunakan kualitas yang tetap +High = Tinggi +Hybrid = Hibrida +Hybrid + Bicubic = Hibrida + Bikubik +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Resolusi internal +Lazy texture caching = Perlambatan penembolokan tekstur (mempercepat) +Linear = Linier +Low = Rendah +LowCurves = Kualitas kurva spline/bezier +LowCurves Tip = Hanya digunakan oleh beberapa permainan, mengontrol kualitas kurva Bezier dan splines +Lower resolution for effects (reduces artifacts) = Resolusi efek lebih rendah (mengurangi artefak) +Manual Scaling = Penskala manual +Medium = Menengah +Mode = Mode +Must Restart = Anda harus menstart ulang PPSSPP agar perubahan ini berfungsi. +Native device resolution = Resolusi asli pesawat +Nearest = Terdekat +No buffer = No buffer +Non-Buffered Rendering = Lewati efek penyangga (tak tersangga, lebih cepat) +None = Tidak ada +Number of Frames = Number of frames +Off = Mati +OpenGL = OpenGL +Overlay Information = Tampilan Informasi +Partial Stretch = Partial stretch +Percent of FPS = Percent of FPS +Performance = Kinerja +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Postprocessing shader +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = Mode pelukisan +Rendering Resolution = Resolusi pelukisan +RenderingMode NonBuffered Tip = Lebih cepat, namun mungkin tidak ada gambar di beberapa permainan +Retain changed textures = Tahan tekstur yang berubah (adakalanya lambat) +RetainChangedTextures Tip = Membuat beberapa permainan lambat, namun beberapa lainnya sangat cepat +Rotation = Rotasi +Safe = Aman +Screen layout = Screen layout +Screen Scaling Filter = Saringan penskala layar +Show Debug Statistics = Tampilkan statistik awakutu +Show FPS Counter = Tampilkan penghitung FPS +Simulate Block Transfer = Simulasikan efek transfer blok +SoftGPU Tip = Saat ini SANGAT lambat +Software Rendering = Pelukisan perangkat lunak (eksperimen) +Software Skinning = Pengkulitan perangkat lunak +SoftwareSkinning Tip = Menggabungkan model berkulit pada CPU, lebih cepat di kebanyakan permainan +Speed = Kecepatan +Stretching = Peregangan +Texture Filter = Penyaring tekstur +Texture Filtering = Penyaringan tekstur +Texture Scaling = Penskala tekstur +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Matikan "hardware tessellation": Tidak didukung +Unlimited = Tak terbatas +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = Tingkat skala-atas +Upscale Type = Jenis skala-atas +UpscaleLevel Tip = Berat di CPU - beberapa pengskala mungkin tertunda untuk menghindari kegagapan +Use all displays = Use all displays +Vertex Cache = Tembolok vertex +VertexCache Tip = Lebih cepat, namun dapat menyebabkan kedipan sementara +VSync = VSync +Vulkan = Vulkan +Window Size = Ukuran jendela +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Hapus berkas ZIP +Install = Pasang +Install game from ZIP file? = Pasang permainan dari berkas ZIP? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = Terpasang! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = Konfigurasi otomatis +Autoconfigure for device = Konfigurasi otomatis untuk perangkat +Clear All = Bersihkan semua +Default All = Kembalikan ke awal +Map a new key for = Tombol kunci baru ditetapkan ke +Map Key = Tetapkan kunci/tombol +Map Mouse = Tetapkan mouse +Test Analogs = Uji analog +You can press ESC to cancel. = kamu dapat membatalkan dengan menekan ESC. + +[MainMenu] +Browse = Telusuri... +Buy PPSSPP Gold = Buy PPSSPP Gold +Choose folder = Choose folder +Credits = Kredit/Kontributor +PPSSPP Homebrew Store = PPSSPP Homebrew Store +Exit = Keluar +Game Settings = Pengaturan +Games = Permainan +Give PPSSPP permission to access storage = Berikan PPSSPP izin untuk mengakses penyimpanan +Homebrew & Demos = Homebrew && Demos +How to get games = Bagaimana caranya mendapatkan permainan? +How to get homebrew & demos = Bagaimana caranya mendapatkan homebrew && demos? +Load = Muat... +Loading... = Loading... +PinPath = Sematkan +PPSSPP can't load games or save right now = PPSSPP tidak dapat memuat dan menyimpan permainan saat ini +Recent = Terbaru +SavesAreTemporary = PPSSPP is saving in temporary storage +SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently +SavesAreTemporaryIgnore = Ignore warning +UnpinPath = Lepaskan +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Suara +Controls = Kontrol +Graphics = Grafik +Networking = Jaringan +System = Sistem +Tools = Alat + +[MappableControls] +Alt speed 1 = Alt speed 1 +Alt speed 2 = Alt speed 2 +An.Down = Analog Bawah +An.Left = Analog Kiri +An.Right = Analog Kanan +An.Up = Analog Atas +Analog limiter = Pembatas analog +Analog Stick = Kendali analog +Audio/Video Recording = Audio/Video recording +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Tukar sumbu +Circle = Circle +Cross = Cross +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = DevMenu +Down = Dpad Bawah +Dpad = Dpad +Frame Advance = Frame advance +Hold = Hold +Home = Home +L = L +Left = Dpad Kiri +Load State = Muat Posisi +Mute toggle = Mute toggle +Next Slot = Slot berikutnya +None = None +Note = Note +OpenChat = Open chat +Pause = Jeda +R = R +RapidFire = Rapid-fire +Remote hold = Remote hold +Rewind = Rewind +Right = Dpad Kanan +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = RightAn.Bawah +RightAn.Left = RightAn.Kiri +RightAn.Right = RightAn.Kanan +RightAn.Up = RightAn.Atas +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Simpan Posisi +Screen = Screen +Screenshot = Screenshot +Select = Select +SpeedToggle = Speed toggle +Square = Square +Start = Start +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = Toggle fullscreen +Toggle mode = Toggle mode +Triangle = Triangle +Unthrottle = Unthrottle +Up = Dpad Atas +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Kunjungi forum Ad Hoc Multiplayer +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Ganti alamat MAC +Change proAdhocServer Address = Ganti alamat IP pelayan PRO ad hoc (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Hidupkan pelayan PRO ad hoc bawaan +Enable network chat = Enable network chat +Enable networking = Hidupkan jaringan/WLAN (beta, mungkin merusak permainan) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Jaringan terinisiasi +Please change your Port Offset = Please change your port offset +Port offset = Port offset (0 = kecocokan dengan PSP) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Send Discord "Rich Presence" information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = Pengecoh +Continue = Lanjutkan +Create Game Config = Buat konfig. permainan +Delete Game Config = Hapus konfig. permainan +Exit to menu = Keluar ke menu +Game Settings = Pengaturan permainan +Load State = Muat posisi +Rewind = Rewind +Save State = Simpan posisi +Settings = Pengaturan +Switch UMD = Ganti UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Color +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Kartun +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT scanlines +FXAA = FXAA Antialiasing +Gamma = Gamma +Grayscale = Abu-abu +Intensity = Intensity +InverseColors = Warna Terbalik +Natural = Warna Natural +NaturalA = Natural Colors (no blur) +Off = Mati +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlines (CRT) +Sharpen = Pertajam +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 Upscaler +VideoSmoothingAA = VideoSmoothingAA +Vignette = Vignette + +[PSPCredits] +all the forum mods = all the forum mods +build server = build server +Buy Gold = Beli versi Gold +check = Lihat pula Dolphin, emulator Wii/GC terbaik: +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = Kontributor: +created = Dibuat oleh +Discord = Discord +info1 = PPSSPP dimaksudkan untuk tujuan pendidikan saja. +info2 = Mohon pastikan bahwa Anda punya hak terhadap permainan +info3 = yang Anda mainkan dengan memiliki UMD atau membeli versi +info4 = unduhan digital dari toko PSN di PSP asli Anda. +info5 = PSP adalah merek dagang milik Sony, Inc. +iOS builds = iOS builds +license = Perangkat lunak bebas di bawah GPL 2.0+ +list = daftar kecocokan, forum, dan informasi pengembangan +PPSSPP Forums = Forum PPSSPP +Privacy Policy = Privacy policy +Share PPSSPP = Bagikan PPSSPP +specialthanks = Ucapan terima kasih kepada: +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = Diterjemahkan oleh: +title = Sebuah emulator PSP yang cepat dan portabel +tools = Alat-alat bebas yang digunakan: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = mupralsh +translators2 = ubunteroz +translators3 = niznet +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Kunjungi situs: +written = Ditulis dalam bahasa C++ demi kecepatan dan portabilitas + +[RemoteISO] +Browse Games = Jelajahi game +Local Server Port = Port pelayan lokal +Manual Mode Client = Manual mode client +Remote disc streaming = Remote disc streaming +Remote Port = Remote port +Remote Server = Remote server +Remote Subdirectory = Remote subdirectory +RemoteISODesc = Permainan dalam daftar terkini akan dibagikan +RemoteISOLoading = Terhubung, memuat daftar permainan... +RemoteISOScanning = Scanning... Click "share games" on your server device +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Catatan: Hubungkan kedua perangkat ke dalam jaringan WiFi yang sama +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Pengaturan +Share Games (Server) = Bagikan permainan (pelayan) +Share on PPSSPP startup = Bagikan saat memulai PPSSPP +Stop Sharing = Hentikan pembagian +Stopping.. = Menghentikan... + +[Reporting] +Bad = Buruk +FeedbackDelayInfo = Data Anda akan dikirim di latar belakang. +FeedbackDesc = Bagaimana emulasinya? Beritahu kami dan komunitas! +FeedbackDisabled = Laporan kompatibilitas harus diaktifkan. +FeedbackIncludeCRC = Catatan: Baterai akan digunakan untuk mengirim CRC pada disk. +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 +Graphics = Grafik +Great = Bagus +In-game = Dalam permainan +In-game Description = Masuk dalam permainan, tapi terlalu berkutu untuk diselesaikan +Menu/Intro = Menu/Intro +Menu/Intro Description = Tidak dapat masuk dalam permainan +Nothing = Tidak ada +Nothing Description = Rusak sama sekali +OK = Oke +Open Browser = Buka peramban +Overall = Keseluruhan +Perfect = Sempurna +Perfect Description = Emulasi sempurna untuk seluruh permainan - hebat! +Plays = Bermain +Plays Description = Sepenuhnya dapat dimainkan, tapi mungkin ada kesalahan. +ReportButton = Laporkan umpan balik +Speed = Kecepatan +Submit Feedback = Ajukan umpan balik +SuggestionConfig = See reports on website for good settings. +SuggestionCPUSpeed0 = Disable locked CPU speed setting. +SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this bug). +SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. +SuggestionsNone = This game isn't working for other users too. +SuggestionsWaiting = Submitting and checking other users feedback... +SuggestionUpgrade = Upgrade to a newer PPSSPP build. +SuggestionVerifyDisc = Check your ISO is a good copy of your disc. +Unselected Overall Description = Seberapa baik permainannya berjalan? +View Feedback = Lihat semua umpan balik + +[Savedata] +Date = Date +Filename = Filename +No screenshot = Tangkapan layar kosong +None yet. Things will appear here after you save. = Belum ada. Sesuatu akan muncul di sini setelah Anda menyimpan. +Save Data = Simpan data +Save States = Simpanan posisi +Savedata Manager = Pengatur data simpanan +Size = Size + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = PERINGATAN: Chainfire3D terdeteksi, mungkin akan menyebabkan masalah. +Failed to load state = Gagal memuat posisi permainan +Failed to save state = Gagal menyimpan posisi permainan +fixed = Kecepatan: alternatif +GLToolsWarning = PERINGATAN: GLTools terdeteksi, mungkin akan menyebabkan masalah. +In menu = In menu +Load savestate failed = Gagal memuat simpanan posisi permainan +Loaded State = Posisi/keadaan termuat +Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +LoadStateDoesntExist = Gagal memuat posisi permainan: Simpanan tidak ada! +LoadStateWrongVersion = Gagal memuat posisi permainan: Simpanan ini untuk versi lawas dari PPSSPP! +norewind = Tidak ada penyimpanan posisi permainan lawas yang tersedia. +Playing = Playing +PressESC = Tekan ESC untuk membuka menu jeda. +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = Gagal menyimpan posisi permainan! +Saved State = Posisi permainan tersimpan +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Speed: alternate 2 +standard = Kecepatan: standar +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = Sudah terpasang +Connection Error = Kesalahan pada koneksi +Install = Pasang +Launch Game = Jalankan permainan +Loading... = Memuat... +MB = MB +Size = Ukuran +Uninstall = Mencopot pemasangan + +[SysInfo] +%d (%d per core, %d cores) = %d (%d perinti, %d inti) +%d bytes = %d bytes +(none detected) = (tidak ada yang terdeteksi) +3D API = 3D API +ABI = ABI +API Version = Versi API +Audio Information = Informasi audio +Board = Board +Build Config = Konfig. pembuatan +Build Configuration = Konfigurasi Pembuatan +Built by = Dibuat oleh +Core Context = Core context +Cores = Inti +CPU Extensions = Ekstensi CPU +CPU Information = Informasi CPU +CPU Name = Nama +D3DCompiler Version = D3DCompiler version +Debug = Awakutu +Debugger Present = Pengawakutu tersedia +Device Info = Info perangkat +Display Information = Display information +Driver Version = Versi penggerak +EGL Extensions = Ekstensi EGL +Frames per buffer = Frames per buffer +GPU Information = Informasi GPU +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Bahasa/Regional +Memory Page Size = Memory page size +Native Resolution = Native resolution +OGL Extensions = Ekstensi OGL +OpenGL ES 2.0 Extensions = Ekstensi OpenGL ES 2.0 +OpenGL ES 3.0 Extensions = Ekstensi OpenGL ES 3.0 +OpenGL Extensions = Ekstensi OpenGL +Optimal frames per buffer = Optimal frames per buffer +Optimal sample rate = Optimal sample rate +OS Information = Informasi OS +PPSSPP build = Bentukan PPSSPP +Refresh rate = Refresh rate +Release = Rilis +RW/RX exclusive = RW/RX exclusive +Sample rate = Sample rate +Shading Language = Shading language +Sustained perf mode = Sustained perf mode +System Information = Informasi sistem +System Name = Nama +System Version = System version +Threads = Threads +Vendor = Penyedia +Vendor (detected) = Penyedia (terdeteksi) +Version Information = Informasi versi +Vulkan Extensions = Ekstensi Vulkan +Vulkan Features = Fitur-fitur Vulkan + +[System] +(broken) = (rusak) +12HR = 12 jam +24HR = 24 jam +Auto = Otomatis +Auto Load Savestate = Auto load savestate +AVI Dump started. = AVI dump dimulai. +AVI Dump stopped. = AVI dump berhenti. +Cache ISO in RAM = Tembolokkan ISO dalam RAM +Change CPU Clock = Change emulated PSP's CPU clock (tidak stabil) +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Ganti panggilan +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = Kecurangan (eksperimen, lihat forum) +Clear Recent = Clear "Recent" +Clear Recent Games List = Bersihkan daftar main terakhir +Clear UI background = Hapus latar UI +Confirmation Button = Tombol konfirmasi +Date Format = Format tanggal +Day Light Saving = DST +DDMMYYYY = HHBBTTTT +Decrease size = Decrease size +Developer Tools = Alat pengembang +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emulasi +Enable Cheats = Hidupkan kecurangan +Enable Compatibility Server Reports = Hidupkan pelaporan ke pelayan kecocokan +Failed to load state. Error in the file system. = Gagal memuat posisi/keadaan. Kesalahan pada sistem berkas. +Failed to save state. Error in the file system. = Gagal menyimpan posisi/keadaan. Kesalahan pada sistem berkas. +Fast (lag on slow storage) = Cepat (telat di penyimpanan yang lambat) +Fast Memory = Memori cepat (tidak stabil) +Force real clock sync (slower, less lag) = Force real clock sync (lambat, namun lebih tepat) +frames, 0:off = frames, 0 = mati +Games list settings = Games list settings +General = Umum +Grid icon size = Grid icon size +Help the PPSSPP team = Bantu tim PPSSPP +Host (bugs, less lag) = Inang (berkutu tapi lebih cepat) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Penginterpretasi +IO timing method = Metode pewaktu I/O +IR Interpreter = Penginterpretasi IR +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = Memory Stick dimasukkan +MHz, 0:default = MHz, 0 = awal +MMDDYYYY = BBHHTTTT +Newest Save = Newest save +Not a PSP game = Bukan permainan PSP +Off = Mati +Oldest Save = Oldest save +PSP Model = Model PSP +PSP Settings = Pengaturan PSP +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Rekam Suara +Record Display = Rekam Tampilan +Reset Recording on Save/Load State = Reset recording on Save/Load state +Restore Default Settings = Kembalikan pengaturan PPSSPP ke awal +Rewind Snapshot Frequency = Rewind snapshot frequency (mem hog) +Save path in installed.txt = Simpan path dalam installed.txt +Save path in My Documents = Simpan path dalam My Documents +Savestate Slot = Slot simpanan posisi +Savestate slot backups = Savestate slot backups +Screenshots as PNG = Simpan tangkapan layar dalam format PNG +Set UI background... = Tetapkan UI background... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Simulasikan jeda UMD +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Penyimpanan penuh +Sustained performance mode = Sustained performance mode +Time Format = Format waktu +UI = Antarmuka pengguna +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Gunakan Lossless Video Codec (FFV1) +Use O to confirm = Gunakan O sebagai tombol konfirmasi +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = Gunakan X sebagai tombol konfirmasi +VersionCheck = Cek versi baru PPSSPP +WARNING: Android battery save mode is on = PERINGATAN: Modus hemat daya Android aktif +WARNING: Battery save mode is on = PERINGATAN: Modus hemat daya aktif +YYYYMMDD = TTTT/BB/HH + +[Upgrade] +Details = Details +Dismiss = Tolak +Download = Unduh +New version of PPSSPP available = Versi baru PPSSPP tersedia diff --git a/assets/lang/it_IT.ini b/assets/lang/it_IT.ini new file mode 100644 index 0000000000..c51025a6ea --- /dev/null +++ b/assets/lang/it_IT.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Volume velocizzato alternativo +Audio backend = Renderer Audio (necessita il riavvio) +AudioBufferingForBluetooth = Buffer per Bluetooth (lento) +Auto = Automatico +Device = Dispositivo +DSound (compatible) = DirectSound (compatibile) +Enable Sound = Attiva il Sonoro +Global volume = Volume Globale +Microphone = Microfono +Microphone Device = Periferica Microfono +Mute = Muto +Switch on new audio device = Passa la nuovo dispositivo audio +Use global volume = Usa volume globale +WASAPI (fast) = WASAPI (veloce) + +[Controls] +Analog auto-rotation speed = Velocità rotazione automat. analogico +Analog Axis Sensitivity = Sensibilità Asse Analogico +Analog Limiter = Limitatore Analogico +Analog Mapper High End = Mappatura Analogico avanzata (sensibilità degli assi) +Analog Mapper Low End = Mappatura Analogico semplice (inversione zona morta) +Analog Mapper Mode = Modalità Mappatura Analogico +Analog Stick = Stick Analogico +AnalogLimiter Tip = Quando viene premuto il tasto del limitatore analogico +Auto = Automatico +Auto-centering analog stick = Auto-centramento dello stick analogico +Auto-hide buttons after seconds = Nascondi autom. i pulsanti dopo 2 secondi +Binds = Assegnazioni +Button Opacity = Opacità Tasti +Button style = Stile dei Tasti +Calibrate D-Pad = Calibra il D-Pad +Calibration = Calibratura +Classic = Classico +Combo Key Setting = Impostazioni tasti Combo +Combo Key Setup = Settaggi tasti Combo +Confine Mouse = Confina il mouse all'interno dell'area della finestra +Control Mapping = Mappatura dei Controlli +Custom layout... = Personalizza disposizione dei Controlli... +Customize tilt = Personalizza Inclinazione... +D-PAD = Croce direzionale +Deadzone Radius = Raggio della zona morta +DInput Analog Settings = Impostazioni DInput analogico +Disable D-Pad diagonals (4-way touch) = Disattiva Diagonali del D-Pad (Tocco a 4-Vie) +Glowing borders = Bordi luminosi +HapticFeedback = Risposta Tattile (vibrazione) +Ignore gamepads when not focused = Ignora i gamepad se non attivi +Ignore Windows Key = Ignora il tasto "Windows" +Invert Axes = Inverti gli Assi +Invert Tilt along X axis = Inverti Inclinazione sull'asse X +Invert Tilt along Y axis = Inverti Inclinazione sull'asse Y +Keep this button pressed when right analog is pressed = Tieni premuto questo pulsante quando l'analogico destro viene premuto +Keyboard = Impostazioni Controlli Tastiera +L/R Trigger Buttons = Pulsanti grilletto L/R +Landscape = Panoramico +Landscape Auto = Panoramico automatico +Landscape Reversed = Panoramico invertito +Mouse = Impostazioni Mouse +Mouse sensitivity = Sensibilità Mouse +Mouse smoothing = Fluidità Mouse +MouseControl Tip = Ora puoi mappare il mouse nella schermata di mappatura controlli premendo l'icona 'M'. +None (Disabled) = Nessuno (disattivo) +Off = Disattiva +OnScreen = Controlli Touchscreen +Portrait = Ritratto +Portrait Reversed = Ritratto invertito +PSP Action Buttons = Pulsanti Azione PSP (△◯☓☐) +Screen Rotation = Rotazione Schermo +seconds, 0 : off = secondi, 0 = disattiva +Sensitivity = Sensibilità +Show right analog = Mostra analogico destro +Show Touch Pause Menu Button = Mostra Tasto di Pausa +Thin borders = Bordi fini +Tilt Base Radius = Modifica zona morta con inclinazione analogica +Tilt Input Type = Tipo di Input Inclinazione +Tilt Sensitivity along X axis = Inverti Sensibilità sull'asse X +Tilt Sensitivity along Y axis = Inverti Sensibilità sull'asse Y +To Calibrate = Per calibrare, mantenere il dispositivo su una superficie piatta e premere "Calibra". +Touch Control Visibility = Visibilità controlli Touch +Use custom right analog = Usa analogico destro personalizzato +Use Mouse Control = Usa il controllo con il mouse +Visibility = Visibilità +X = X +X + Y = X + Y +XInput Analog Settings = Impostazioni XInput analogico +Y = Y + +[CwCheats] +Cheats = Trucchi +Edit Cheat File = Modifica file Trucchi +Enable/Disable All = Attiva/Disattiva Trucchi +Import Cheats = Importa da cheat.db +Options = Opzioni +Refresh Rate = Frequenza di Aggiornamento + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = Informazioni su PPSSPP... +Auto = Automatico +Backend = Rendering di fondo (riavvia il PPSSPP) +Bicubic = Bicubico +Break = Interruzione +Break on Load = Fermati al caricamento +Buffered Rendering = Rendering con buffer +Buy Gold = Acquista la Versione &Gold +Control Mapping... = Impostazioni dei Controlli... +Debugging = Debug +Deposterize = De-posterizza +Direct3D9 = &Direct3D9 +Direct3D11 = Direct3D &11 +Disassembly = &Disassemblatore... +Discord = Discord +Display Layout Editor = Editor visualizzazione layout... +Display Rotation = Rotazione display +Dump Next Frame to Log = Salva Log Frame Successivo +Emulation = Emulazione +Enable Chat = Attiva la chat +Enable Cheats = Attiva i trucchi +Enable Sound = Attiva il sonoro +Exit = Esci +Extract File... = Estrazione File... +File = &File +Frame Skipping = &Salto frame +Frame Skipping Type = Tipo di Salto frame +Fullscreen = Allarga a Tutto Schermo +Game Settings = Impostazioni di Gioco +GE Debugger... = Debugger GE... +GitHub = Git&Hub +Hardware Transform = Trasformazione &Hardware +Help = Aiuto +Hybrid = Ibrido +Hybrid + Bicubic = Ibrido + Bicubico +Ignore Illegal Reads/Writes = &Ignora Letture/Scritture Irregolari +Ignore Windows Key = Ignora il tasto "Windows" +Keep PPSSPP On Top = Mantieni PPSSPP Sempre in Primo Piano +Landscape = Panoramico +Landscape reversed = Panoramico invertito +Language... = Lingua... +Linear = Lineare +Load = Carica File... +Load .sym File... = Carica File .sym... +Load Map File... = Carica File Map... +Load State = Carica Stato +Load State File... = Carica File di Stato... +Log Console = &Log Console +Memory View... = Visualizzazione Memoria... +More Settings... = Altre Impostazioni... +Nearest = Pixel perfect +Non-Buffered Rendering = Salta effetti di buffer (niente buffer, più velocità) +Off = Disattiva +Open Directory... = Apri Cartella... +Open from MS:/PSP/GAME... = Apri da MS:/PSP/GAME... +Open Memory Stick = Apri Memory Stick +Open New Instance = Apri nuova istanza +OpenGL = OpenGL +Pause = Pausa +Pause When Not Focused = Pausa quando non attivo +Portrait = Ritratto +Portrait reversed = Ritratto invertito +Postprocessing Shader = Shader di post-elaborazione +PPSSPP Forums = Forums PPSSPP +Record = Registra +Record Audio = Registra Audio +Record Display = Registra Display +Rendering Mode = Modalità di Rendering +Rendering Resolution = Rendering della Risoluzione +Reset = Reset +Reset Symbol Table = Reimposta la Tabella dei Simboli +Run = &Avvia +Save .sym File... = Salva File .sym... +Save Map File... = Salva File Map... +Save State = Salva Stato +Save State File... = Salva File di Stato... +Savestate Slot = Slot del salvataggio di stato +Screen Scaling Filter = Filtro Scalatura Schermo +Show Debug Statistics = Mostra Statistiche di Debug +Show FPS Counter = Mostra FPS +Skip Number of Frames = Salta numero di frames +Skip Percent of FPS = Salta percentuale di FPS +Stop = &Interrompi +Switch UMD = Cambia UMD +Take Screenshot = Acquisizione Screenshot +Texture Filtering = Filtro Texture +Texture Scaling = Scalatura Texture +Use Lossless Video Codec (FFV1) = Usa Codec Video senza perdite (FFV1) +Use output buffer for video = Usa il buffer per il video +Vertex Cache = Cache dei Vertici +VSync = Sincronizzazione Verticale +Vulkan = Vulkan +Window Size = Dimensioni Finestra +www.ppsspp.org = Visita www.ppsspp.org +xBRZ = xBRZ + +[Developer] +Allocator Viewer = Visualizzazione allocatore (Vulkan) +Allow remote debugger = Permetti il debugger remoto +Backspace = Backspace +Block address = Blocca indirizzo +By Address = Per indirizzo +Copy savestates to memstick root = Copia gli stati salvati nella root della Memory Stick +Create/Open textures.ini file for current game = Crea/Apri il file textures.ini per il gioco corrente +Current = Corrente +Dev Tools = Tools di sviluppo +DevMenu = DevMenu +Disabled JIT functionality = JIT Funzionalità JIT disattivata +Draw Frametimes Graph = Disegna grafica dei frametimes +Dump Decrypted Eboot = Crea EBOOT.BIN decriptato all'avvio del gioco +Dump Frame GPU Commands = Comandi Dump frame GPU +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Attiva Log del Debug +Enter address = Inserire indirizzo +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Profilo Frame +GPU Driver Test = Test dei driver GPU +GPU Profile = Profilo GPU +Jit Compare = Confronto Jit +JIT debug tools = Strumenti di debug JIT +Language = Lingua +Load language ini = Carica *.ini della lingua +Log Dropped Frame Statistics = Statistiche dei Frame persi +Log Level = Livello del Log +Log View = Visualizza Log +Logging Channels = Registra Canali +Next = Avanti +No block = Nessun blocco +Prev = Indietro +Random = Casuale +Replace textures = Sostituisci textures +Reset limited logging = Reset del logging limitato +RestoreDefaultSettings = Sei sicuro di voler ripristinare le impostazioni?\nImpostazioni dei Controlli non sono cambiate.\n\n\nQuesta azione non si può annullare.\nRiavviare PPSSPP per caricare i cambiamenti. +RestoreGameDefaultSettings = Sei sicuro di voler ripristinare le impostazioni specifiche per il gioco\nai valori predefiniti? +Resume = Ripristina +Run CPU Tests = Fai Test CPU +Save language ini = Salva *.ini della lingua +Save new textures = Salva nuove texture +Shader Viewer = Visualizzatore shader +Show Developer Menu = Mostra Menu Sviluppatore +Show on-screen messages = Show on-screen messages +Stats = Statistiche +System Information = Informazioni Sistema +Texture Replacement = Sostituzione Texture +Toggle Audio Debug = Attiva/Disattiva debug audio +Toggle Freeze = Attiva/Disattiva congelamento +Touchscreen Test = Test del touchscreen +VFPU = VFPU + +[Dialog] +* PSP res = * definizione PSP +Active = Attiva +Back = Indietro +Cancel = Annulla +Center = Centra +ChangingGPUBackends = Per cambiare il renderer GPU sarà necessario riavviare PPSSPP. Riavviare adesso? +ChangingInflightFrames = La modifica del buffering dei comandi grafici richiede il riavvio di PPSSPP. Riavviare adesso? +Channel: = Canale: +Choose PPSSPP save folder = Scegli la cartella di salvataggio PPSSPP +Confirm Overwrite = Vuoi sovrascrivere i dati? +Confirm Save = Vuoi salvare questi dati? +ConfirmLoad = Caricare questi dati? +ConnectingAP = Connessione in corso dal punto di accesso.\nAttendere, prego... +ConnectingPleaseWait = Connessione in corso.\nAttendere, prego... +ConnectionName = Nome connessione +Corrupted Data = Dati corrotti +Delete = Elimina +Delete all = Elimina tutto +Delete completed = Eliminazione completata. +DeleteConfirm = Questo salvataggio sarà eliminato.\nSi è sicuri di voler continuare? +DeleteConfirmAll = Vuoi veramente eliminare tutti\ni salvataggi di questo gioco? +DeleteConfirmGame = Vuoi veramente eliminare questo gioco\ndal tuo dispositivo? Questa azione non si può annullare. +DeleteConfirmGameConfig = Vuoi veramente cancellare le impostazioni per questo gioco? +DeleteFailed = Impossibile cancellare i dati. +Deleting = Cancellazione in corso.\nAttendere, prego... +Disable All = Disattiva tutto +Edit = Modifica +Enable All = Attiva tutto +Enter = Invio +Finish = Fine +Grid = Griglia +Inactive = Inattiva +InternalError = È avvenuto un errore interno. +Load = Carica +Load completed = Caricamento completato. +Loading = Caricamento in corso.\nAttendere, prego... +LoadingFailed = Impossibile caricare i dati. +Move = Sposta +Network Connection = Connessione di Rete +NEW DATA = NUOVI DATI +No = No +ObtainingIP = Cerco di ottenere l'indirizzo IP.\nAttendere, prego... +OK = OK +Old savedata detected = Rilevati vecchi dati salvati +Options = Opzioni +Reset = Reset +Resize = Ridimensiona +Retry = Riprova +Save = Salva +Save completed = Salvataggio Completato. +Saving = Salvataggio in corso.\nAttendere, prego... +SavingFailed = Impossibile salvare i dati. +Select = Seleziona +Shift = Maiuscolo +Snap = Allinea +Space = Spazio +SSID = SSID +Submit = Invia +Supported = Supportato +There is no data = Non ci sono dati. +Toggle All = Attiva Tutto +Toggle List = Mostra lista +Unsupported = Non supportato +When you save, it will load on a PSP, but not an older PPSSPP = Salvando, sarà possibile effettuare il caricamento su una PSP, ma non su un vecchio PPSSPP. +When you save, it will not work on outdated PSP Firmware anymore = Salvando, non sarà più possibile effettuare il caricamento su un vecchio firmware PSP. +Yes = Sì +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = il file è compresso (7z).\nPrego, prima decomprimerlo (prova con 7-Zip o WinRAR). +A PSP game couldn't be found on the disc. = Non è stato trovato nessun gioco PSP su disco. +Cannot boot ELF located outside mountRoot. = Impossibile avviare il file ELF fuori dal mountRoot. +Could not save screenshot file = Impossibile salvare il file screenshot. +D3D9or11 = Direct3D 9? (oppure "no" per Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll non trovato. Si prega di installarlo. Oppure premi Sì per cercare di usare le Direct3D 9. +D3D11InitializationError = Errore inizializzazione Direct3D 11 +D3D11Missing = Il sistema non usa le D3D11. Prego, attiva Windows Update.\n\nOppure premi Sì per cercare di usare le Direct3D 9. +D3D11NotSupported = La GPU non supporta le Direct3D 11.\n\nVuoi usare le Direct3D 9, invece? +Disk full while writing data = Disco pieno durante la scrittura dei dati. +ELF file truncated - can't load = File ELF troncato - caricamento impossibile +Error loading file = Errore nel caricamento del file: +Error reading file = Errore nella Lettura del File. +Failed initializing CPU/Memory = Errore di inizializzazione della CPU o della memoria +Failed to identify file = Identificazione del File non riuscita. +Failed to load executable: = Caricamento dell'eseguibile fallito: +File corrupt = File corrotto +Game disc read error - ISO corrupt = Errore di lettura disco del gioco: ISO corrotta. +GenericAllStartupError = PPSSPP non è stato in grado di avviare tutti i backend grafici. Si consiglia di provare ad aggiornare i driver della scheda grafica. +GenericBackendSwitchCrash = PPSSPP ha crashato all'avvio.\n\nCiò è solitamente dovuto a un problema con i driver grafici. Prova ad aggiornare i driver della scheda grafica.\n\nI backend grafici sono stati cambiati: +GenericDirect3D9Error = Errore d'inizializzazione della grafica. Prova ad aggiornare i driver della scheda video e le runtime DirectX 9.\n\nVuoi provare ad usare le OpenGL?\n\nMessaggio di errore: +GenericGraphicsError = Errore grafico +GenericOpenGLError = Errore d'inizializzazione della grafica. Prova ad aggiornare i driver della scheda video.\n\nVuoi provare ad usare le DirectX 9?\n\nMessaggio di errore: +GenericVulkanError = Errore d'inizializzazione della grafica. Prova ad aggiornare i driver della scheda video.\n\nVuoi provare ad usare le OpenGL?\n\nMessaggio di errore: +InsufficientOpenGLDriver = Supporto del Driver OpenGL insufficiente!\n\nIl GPU dichiara di non supportare OpenGL 2.0, questo è necessario per il funzionamento di PPSSPP.\n\nControllare compatibilità del GPU per OpenGL 2.0. Se è compatibile, è necessario installare i driver più recenti dal sito del produttore del GPU.\n\nVisita il forum a http://forums.ppsspp.org per altre informazioni. +Just a directory. = Solo una cartella. +Missing key = Tasto assente +MsgErrorCode = Codice errore: +MsgErrorSavedataDataBroken = Dati del salvataggio corrotti. +MsgErrorSavedataMSFull = Memory Stick piena. Controllare lo spazio a disposizione. +MsgErrorSavedataNoData = Attenzione: dati del salvataggio non trovati. +MsgErrorSavedataNoMS = Memory Stick non inserita. +No EBOOT.PBP, misidentified game = No EBOOT.PBP, gioco identificato erroneamente. +Not a valid disc image. = Immagine disco non valida. +OpenGLDriverError = Errore Driver OpenGL +PPSSPP doesn't support UMD Music. = PPSSPP non supporta Musica UMD. +PPSSPP doesn't support UMD Video. = PPSSPP non supporta Video UMD. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP per giocare ai giochi PSP, non ai giochi PlayStation 1 o 2. +PPSSPPDoesNotSupportInternet = PPSSPP attualmente non supporta connessioni Internet per DLC, PSN o aggiornamenti. +PS1 EBOOTs are not supported by PPSSPP. = PS1 EBOOT non supportati da PPSSPP. +PSX game image detected. = Il file è un'immagine MODE2. PPSSPP non supporta giochi per PS1. +RAR file detected (Require UnRAR) = Il file è compresso (RAR).\nPrima si deve decomprimere (prova UnRAR). +RAR file detected (Require WINRAR) = Il file è compresso (RAR).\nPrima si deve decomprimere (prova WinRAR). +Running slow: try frameskip, sound is choppy when slow = Emulazione lenta: provare ad attivare il salto frame, l'audio potrebbe non essere ottimale +Running slow: Try turning off Software Rendering = Emulazione lenta: prova a disattivare "rendering software" +Save encryption failed. This save won't work on real PSP = Criptazione salvataggio fallita. Questo salvataggio non funzionerà su una PSP reale +textures.ini filenames may not be cross-platform = I nomi dei file "textures.ini" potrebbero non essere multi-piattaforma. +This is a saved state, not a game. = Questo è un salvataggio di stato, non un gioco. +This is save data, not a game. = Questi sono dei dati salvati, non un gioco. +Unable to create cheat file, disk may be full = Impossibile creare il file cheat, il disco potrebbe essere pieno. +Unable to initialize rendering engine. = Impossibile inizializzare il renderer. +Unable to write savedata, disk may be full = Impossibile sovrascrivere i dati del salvataggio, il disco potrebbe essere pieno. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Attenzione: Memoria Video PIENA, ridurre l'upscaling e passare in modalità caching lenta. +Warning: Video memory FULL, switching to slow caching mode = Attenzione: Memoria Video PIENA, passare in modalità caching lenta. +ZIP file detected (Require UnRAR) = Il file è compresso (ZIP).\nPrima si deve decomprimere (prova UnRAR). +ZIP file detected (Require WINRAR) = Il file è compresso (ZIP).\nPrima si deve decomprimere (prova WinRAR). + +[Game] +Asia = Asia +ConfirmDelete = Elimina +Create Game Config = Crea game config +Create Shortcut = Crea Scorciatoia +Delete Game = Elimina Gioco +Delete Game Config = Elimina game config +Delete Save Data = Elimina dati salvataggio +Europe = Europa +Game = Gioco +Game Settings = Impostazioni Gioco +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Installa i dati +Japan = Giappone +Korea = Corea +MB = MB +One moment please... = Un momento, prego... +Play = Gioca +Remove From Recent = Rimuovi dai Recenti +SaveData = Dati salvataggio +Setting Background = Imposta sfondo +Show In Folder = Mostra nella Cartella +USA = USA +Use UI background = Usa UI di sfondo + +[Graphics] +% of the void = % di spazio vuoto +% of viewport = % di area di visualizzazione +%, 0:unlimited = %, 0 = senza limiti +(supersampling) = (supercampionamento) +(upscaling) = (upscaling) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Aggressivo +Alternative Speed = Velocità Alternativa (in %, 0 = illimitata) +Alternative Speed 2 = Velocità Alternativa 2 (in %, 0 = illimitata) +Anisotropic Filtering = Filtro Anisotropico +Auto = Automatico +Auto (1:1) = Automatico (1:1) +Auto (same as Rendering) = Automatico (stessa risoluzione del rendering) +Auto FrameSkip = Salto frame automatico +Auto Scaling = Scaling automatico +Backend = Renderer +Balanced = Bilanciato +Bicubic = Bicubico +BlockTransfer Tip = Alcuni giochi richiedono che quest'opzione sia attiva per correggere la grafica +BlockTransferRequired = Attenzione: Questo gioco richiede l'attivazione di 'Simula gli effetti del blocco trasferimento'. +Both = Entrambi +Buffer graphics commands (faster, input lag) = Comandi grafici bufferizzati (più rapido, più lag dei comandi) +Buffered Rendering = Rendering in buffer +BufferedRenderingRequired = Attenzione: Questo gioco richiede di impostare "modalità di rendering" su "buffered". +Camera = Telecamera +Camera Device = Dispositivo di telecamera +Cardboard Screen Size = Dimens. schermo (in % di area di visualizzazione) +Cardboard Screen X Shift = Spostamento orizzontale (in % di spazio vuoto) +Cardboard Screen Y Shift = Spostamento verticale (in % di spazio vuoto) +Cardboard VR Settings = Impostazioni Google Cardboard VR +Cheats = Trucchi +Clear Speedhack = Svuota i framebuffer al primo utilizzo (hack per velocizzare) +ClearSpeedhack Tip = A volte più veloce (soprattutto sui dispositivi mobile), può causare dei glitch +CPU Core = Core CPU +Debugging = Debugging +DefaultCPUClockRequired = Attenzione: Per questo gioco il clock della CPU deve avere i valori predefiniti. +Deposterize = De-posterizza +Deposterize Tip = Sistema i possibili problemi visivi nelle texture upscalate +Device = Dispositivo +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Disattiva gli effetti più lenti (veloce) +Disabled = Disabilitato +Display layout editor = Editor Display +Display Resolution (HW scaler) = Risoluzione Display (scaler HW) +Dump next frame to log = Crea Log del Frame Successivo +Enable Cardboard VR = Attiva Cardboard VR +FPS = FPS +Frame Rate Control = Controllo Framerate +Frame Skipping = Salto frame +Frame Skipping Type = Tipo di Salto frame +FullScreen = Schermo Intero +Hack Settings = Impostazioni Hack (causerà dei problemi, sicuramente) +Hardware Tessellation = Tassellazione Hardware +Hardware Transform = Trasformazione Hardware +hardware transform error - falling back to software = Errore Trasformazione Hardware, ritorno indietro al renderer software +HardwareTessellation Tip = Usa l'hardware per creare le curve, usa sempre una qualità prefissata +High = Alta +Hybrid = Ibrido +Hybrid + Bicubic = Ibrido + Bicubico +Ignore camera notch when centering = Ignora il notch della foto camera durante il centramento +Internal Resolution = Risoluzione Interna +Lazy texture caching = Caching lenta delle texture (velocizza) +Linear = Lineare +Low = Bassa +LowCurves = Riduci qualità splines e curve di bezier (maggior velocità) +LowCurves Tip = Usato solo in alcuni giochi, controlla la fluidità delle curve +Lower resolution for effects (reduces artifacts) = Bassa risoluzione degli effetti (riduce gli artefatti) +Manual Scaling = Scaling manuale +Medium = Media +Mode = Modalità +Must Restart = Sarà necessario riavviare PPSSPP per attivare le modifiche. +Native device resolution = Risoluzione nativa della periferica +Nearest = Pixel perfect +No buffer = Niente buffer +Non-Buffered Rendering = Salta effetti di buffer (niente buffer, più velocità) +None = Nessuno +Number of Frames = Numero di Frames +Off = Disattiva +OpenGL = OpenGL +Overlay Information = Copri Informazioni +Partial Stretch = Estensione Parziale +Percent of FPS = Percentuale di FPS +Performance = Prestazioni +Postprocessing effect = Effetti di post-elaborazione +Postprocessing Shader = Shader di post-elaborazione +Recreate Activity = Ricrea l'animazione +Render duplicate frames to 60hz = Duplica i frame da renderizzare a 60 Hz +RenderDuplicateFrames Tip = Può migliorare la fluidità nei giochi che funzionano a frame rate inferiori +Rendering Mode = Modalità di Rendering +Rendering Resolution = Rendering della Risoluzione +RenderingMode NonBuffered Tip = Veloce, ma potrebbe generare dei glitch in alcuni giochi +Retain changed textures = Conserva le textures modificate (a volte è lento) +RetainChangedTextures Tip = Rallenta molti giochi, ma alcuni saranno velocizzati +Rotation = Rotazione +Safe = Sicuro +Screen layout = Disposizione dello schermo +Screen Scaling Filter = Filtro Scalatura Schermo +Show Debug Statistics = Mostra Statistiche Debug +Show FPS Counter = Mostra FPS +Simulate Block Transfer = Simula gli effetti del blocco trasferimento +SoftGPU Tip = Per adesso è MOOOOLTO lento +Software Rendering = Rendering tramite Software (sperimentale) +Software Skinning = Software Skinning +SoftwareSkinning Tip = Combina la visualizzazione di modelli disegnati dalla CPU, più veloce nella maggior parte dei giochi +Speed = Velocità +Stretching = Adatta al Display +Texture Filter = Filtro delle texture +Texture Filtering = Filtraggio delle texture +Texture Scaling = Scalatura delle texture +Texture Shader = Shader delle texture +Turn off Hardware Tessellation - unsupported = Disattivazione di "tessellazione hardware": non supportata +Unlimited = Illimitato +Up to 1 = Max 1 +Up to 2 = Max 2 +Upscale Level = Livello Ottimizzazione +Upscale Type = Tipo Ottimizzazione +UpscaleLevel Tip = Pesante per le CPU - alcune scalature posso essere ritardate per evitare scatti +Use all displays = Usa tutti i display +Vertex Cache = Cache dei Vertici +VertexCache Tip = Più veloce, ma potrebbe causare dei flicker temporanei +VSync = Sincronizzazione Verticale +Vulkan = Vulkan +Window Size = Dimensioni Finestra +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Elimina file ZIP +Install = Installa +Install game from ZIP file? = Installare il gioco dal file ZIP? +Install textures from ZIP file? = Installare le texture dal file ZIP? +Installed! = Installato! +Texture pack doesn't support install = Il texture pack non supporta l'installazione +Zip archive corrupt = Archivio ZIP corrotto +Zip file does not contain PSP software = Il file ZIP non contiene software PSP + +[KeyMapping] +Autoconfigure = Configurazione automatica +Autoconfigure for device = Configurazione Automatica per il Dispositivo +Clear All = Pulisci Tutto +Default All = Ripristina Tutto +Map a new key for = Seleziona Tasto di Controllo per: +Map Key = Mappatura tasto +Map Mouse = Mappatura mouse +Test Analogs = Test analogico +You can press ESC to cancel. = Puoi premere Esc per annullare. + +[MainMenu] +Browse = Sfoglia... +Buy PPSSPP Gold = Acquista PPSSPP Gold +Choose folder = Scegli cartella +Credits = Riconoscimenti +PPSSPP Homebrew Store = Store PPSSPP Homebrew +Exit = Esci +Game Settings = Impostazioni +Games = Giochi +Give PPSSPP permission to access storage = Da' a PPSSPP il permesso di accedere alla memoria di massa +Homebrew & Demos = Homebrew && Demo +How to get games = Come ottenere giochi? +How to get homebrew & demos = Come ottenere homebrew o demo? +Load = Carica... +Loading... = Caricamento in corso... +PinPath = Pin +PPSSPP can't load games or save right now = PPSSPP non può caricare i giochi o salvarli, in questo momento +Recent = Recenti +SavesAreTemporary = PPSSPP sta salvando in una cartella temporanea +SavesAreTemporaryGuidance = Estrae PPSSPP da qualche parte per salvarlo permanentemente +SavesAreTemporaryIgnore = Ignora l'avviso +UnpinPath = Stacca +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Audio +Controls = Controlli +Graphics = Grafica +Networking = Rete +System = Sistema +Tools = Strumenti + +[MappableControls] +Alt speed 1 = Velocità altern. 1 +Alt speed 2 = Velocità altern. 2 +An.Down = Analogico Giù +An.Left = Analogico SX +An.Right = Analogico DX +An.Up = Analogico Su +Analog limiter = Limitatore Analogico +Analog Stick = Stick Analogico +Audio/Video Recording = Registrazione Audio/Video +Auto Analog Rotation (CCW) = Rotazione analog. automatica (anti-orario) +Auto Analog Rotation (CW) = Rotazione analog. automatica (orario) +AxisSwap = Scambia Assi +Circle = Cerchio +Cross = Croce +D-pad down = D-pad giù +D-pad left = D-pad sinistra +D-pad right = D-pad destra +D-pad up = D-pad su +DevMenu = DevMenu +Down = D-Pad Giù +Dpad = Dpad +Frame Advance = Avanzam. frame +Hold = Hold +Home = Home +L = L +Left = D-Pad Sinistro +Load State = Carica Stato +Mute toggle = Muto +Next Slot = Slot successivo +None = Niente +Note = Nota +OpenChat = Apri la chat +Pause = Pausa +R = R +RapidFire = Fuoco rapido +Remote hold = Blocco da remoto +Rewind = Riavvolgi +Right = D-Pad Destro +Right Analog Stick (tap to customize) = Analogico destro (tocca per personalizzare) +RightAn.Down = Analogico destro - Giù +RightAn.Left = Analogico destro - Sinistra +RightAn.Right = Analogico destro - Destra +RightAn.Up = Analogico destro - Su +Rotate Analog (CCW) = Rotazione analogico (anti-orario) +Rotate Analog (CW) = Rotazione analogico (orario) +Save State = Salva Stato +Screen = Schermata +Screenshot = Screenshot +Select = Select +SpeedToggle = Velocità +Square = Quadrato +Start = Start +Texture Dumping = Dumping delle texture +Texture Replacement = Sostituzione delle texture +Toggle Fullscreen = Passa a Schermo Intero +Toggle mode = Modalità Scambio +Triangle = Triangolo +Unthrottle = Non velocizzare +Up = D-Pad Su +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Visita il forum Ad Hoc Multigiocatore +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = In basso al centro +Bottom Left = In basso a sinistra +Bottom Right = In basso a destra +Center Left = Al centro a sinistra +Center Right = Al centro a destra +Change Mac Address = Cambia indirizzo MAC +Change proAdhocServer Address = Cambia indirizzo server IP PRO ad hoc (localhost = multiple istanze) +Chat = Chat +Chat Button Position = Posizione del pulsante chat +Chat Here = Scrivi qui +Chat Screen Position = Posizione della chat +Disconnected from AdhocServer = Disconnesso dal server ad hoc +DNS Error Resolving = Errore risoluzione DNS +Enable built-in PRO Adhoc Server = Attiva server integrato PRO ad hoc +Enable network chat = Attiva chat di rete +Enable networking = Attiva la rete/WLAN (sperimentale) +Enable UPnP = Attiva UPnP (serviranno pochi secondi per rilevarlo) +EnableQuickChat = Attiva chat rapida +Enter a new PSP nickname = Inserisci nuovo nick +Enter Quick Chat 1 = Inserire chat rapida 1 +Enter Quick Chat 2 = Inserire chat rapida 2 +Enter Quick Chat 3 = Inserire chat rapida 3 +Enter Quick Chat 4 = Inserire chat rapida 4 +Enter Quick Chat 5 = Inserire chat rapida 5 +Error = Errore +Failed to Bind Localhost IP = Impossibile correlare l'IP localhost +Failed to Bind Port = Impossibile correlare la porta +Failed to connect to Adhoc Server = Impossibile connettersi al sever ad hoc +Forced First Connect = Prima connessione forzata (connessione più rapida) +Invalid IP or hostname = Indirizzo IP o nome del dominio non valido +Minimum Timeout = Minimum timeout (override in ms, 0 = predefinito) +Misc = Varie (predefinito = compatibilità PSP) +Network Initialized = Rete inizializzata +Please change your Port Offset = Prego, cambiare l'offset della porta +Port offset = Offset Porta (0 = compatibilità PSP) +proAdhocServer Address: = Indirizzo server ad hoc: +Quick Chat 1 = Chat rapida 1 +Quick Chat 2 = Chat rapida 2 +Quick Chat 3 = Chat rapida 3 +Quick Chat 4 = Chat rapida 4 +Quick Chat 5 = Chat rapida 5 +QuickChat = Chat rapida +Send = Invia +Send Discord Presence information = Invia informazioni Discord "Rich Presence" +TCP No Delay = Nessun ritardo TCP (TCP più veloce) +Top Center = In alto al centro +Top Left = In alto a sinistra +Top Right = In alto a destra +Unable to find UPnP device = Impossibile trovare il dispositivo UPnP +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) +Validating address... = Convalida indirizzo... +WLAN Channel = Canale WLAN +You're in Offline Mode, go to lobby or online hall = Sei in modalità offline, vai alla lobby online. + +[Pause] +Cheats = Trucchi +Continue = Continua +Create Game Config = Crea game config +Delete Game Config = Elimina game config +Exit to menu = Vai al Menu +Game Settings = Impostazioni Gioco +Load State = Carica Stato +Rewind = Riavvolgimento +Save State = Salva Stato +Settings = Impostazioni +Switch UMD = Cambia UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (parametri duplicati, verrà usata la precedente regolazione) +4xHqGLSL = 4xHQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = Colore AA +Amount = Quantità +Black border = Bordo nero +Bloom = Sfocatura luminosa +Brightness = Luminosità +Cartoon = Disegno +ColorCorrection = Correzione dei colori +Contrast = Contrasto +CRT = Linee di scansione CRT +FXAA = Antialiasing FXAA +Gamma = Gamma +Grayscale = Scala di grigi +Intensity = Intensità +InverseColors = Colori invertiti +Natural = Colori naturali +NaturalA = Colori naturali (nessuna sfocatura) +Off = Nessuno +Power = Potenza +PSPColor = PSP color +Saturation = Saturazione +Scanlines = Linee di scansione (CRT) +Sharpen = Maggior nitidezza +SSAA(Gauss) = Supercampionamento AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Upscaling Spline36 +VideoSmoothingAA = AA nitido del video +Vignette = Miniatura + +[PSPCredits] +all the forum mods = tutte le mod del forum +build server = crea server +Buy Gold = Versione Gold +check = Prova anche il Dolphin, il miglior emulatore per Wii/GC: +CheckOutPPSSPP = Da' un'occhiata a PPSSPP, il magnifico emulatore PSP: http://www.ppsspp.org/ +contributors = Collaboratori: +created = Realizzato da +Discord = Discord +info1 = PPSSPP è realizzato esclusivamente a scopo didattico. +info2 = Assicurarsi di avere i diritti di utilizzo dei propri giochi +info3 = possedendo una copia UMD autentica o acquistando una copia +info4 = digitale dal negozio di PlayStation Network sulla propria PSP. +info5 = PSP è un marchio di Sony, Inc. +iOS builds = versione iOS +license = Software Libero GPL 2.0+ +list = liste di compatibilità, forum e informazioni sullo sviluppo +PPSSPP Forums = Forum PPSSPP +Privacy Policy = Privacy +Share PPSSPP = Condividi PPSSPP +specialthanks = Ringraziamenti Speciali: +specialthanksKeithGalocy = at NVIDIA (hardware, consigli) +specialthanksMaxim = per il suo incredibile lavoro sul decoder Atrac3+ +testing = test +this translation by = Traduzione a cura di: Vecna +title = Un emulatore veloce e portatile per PSP +tools = Strumenti Liberi utilizzati: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = MrYadro, mgaver, VIRGINKLM, raven02 +translators2 = sum2012, vnctdj, unknownbrackets, ufdada +translators3 = The Dax, wuspring, hrydgard, adrian17 +translators4 = papel +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter +website = Visita il sito web: +written = Scritto in C++ per velocità e portabilità + +[RemoteISO] +Browse Games = Cerca i giochi +Local Server Port = Porta locale del server +Manual Mode Client = Client in modalità manuale +Remote disc streaming = Streaming del disco remoto +Remote Port = Porta in remoto +Remote Server = Server in remoto +Remote Subdirectory = Sotto-directory in remoto +RemoteISODesc = I giochi nella lista lista recente verranno condivisi +RemoteISOLoading = Connesso, caricamento lista giochi... +RemoteISOScanning = Scansione in corso... Fare clic su "Giochi condivisi" sul server +RemoteISOScanningTimeout = Scansione in corso... Verificare la configurazione del firewall. +RemoteISOWifi = Nota: Connettere ambo i dispositivi alla stessa rete Wi-Fi +RemoteISOWinFirewall = ATTENZIONE: Il firewall di Windows sta bloccando la condivisione. +Settings = Impostazioni +Share Games (Server) = Giochi condivisi (server) +Share on PPSSPP startup = Condividi all'avvio di PPSSPP +Stop Sharing = Interrompi condivisione +Stopping.. = Interruzione in corso... + +[Reporting] +Bad = Pessima +FeedbackDelayInfo = I dati verranno trasmessi in background. +FeedbackDesc = Com'è l'emulazione? Fallo sapere alla comunità! +FeedbackDisabled = L'invio del rapporto di compatibilità dev'essere attivato. +FeedbackIncludeCRC = Nota: L'invio del CRC di un disco consuma la batteria. +FeedbackIncludeScreen = Includi uno screenshot +FeedbackSubmitDone = I tuoi dati sono stati inviati. +FeedbackSubmitFail = Impossibile inviare i dati al server. Prova ad aggiornare PPSSPP. +FeedbackThanks = Grazie per il tuo feedback! +Gameplay = Gameplay +Graphics = Grafica +Great = Magnifica +In-game = In-game +In-game Description = Accedi al gameplay, ma, per adesso è troppo buggato +Menu/Intro = Menu/Intro +Menu/Intro Description = Impossibile accedere al gameplay +Nothing = Niente +Nothing Description = Completamente non funzionante +OK = OK +Open Browser = Apri browser +Overall = Globalmente +Perfect = Perfetta +Perfect Description = Emulazione perfetta per tutto il gioco - magnifico! +Plays = Giocabile +Plays Description = Completamente giocabile ma sono presenti dei glitch +ReportButton = Rapporto feedback +Speed = Velocità +Submit Feedback = Invia feedback +SuggestionConfig = Guarda i rapporti sul sito web per le impostazioni migliori. +SuggestionCPUSpeed0 = Disabilita l'impostazione di blocco della velocità della CPU. +SuggestionDowngrade = Cerca una versione più vecchia del PPSSPP (segnalateci questo bug). +SuggestionsFound = Altri utenti hanno riportato dei risultati migliori. Clicca su "Mostra i Feedback" per altri dettagli. +SuggestionsNone = Questo gioco non funziona neanche sui dispositivi degli altri utenti. +SuggestionsWaiting = Invia e consulta i feedback degli altri utenti... +SuggestionUpgrade = Aggiorna alla nuova build del PPSSPP. +SuggestionVerifyDisc = Verifica se l'ISO in tuo possesso è una copia funzionante del tuo disco. +Unselected Overall Description = Quanto è stata precisa l'emulazione del gioco? +View Feedback = Mostra i Feedback + +[Savedata] +Date = Data +Filename = Nome del file +No screenshot = Nessuno screenshot +None yet. Things will appear here after you save. = Ancora niente. Si inizierà a vedere qualcosa dopo il salvataggio. +Save Data = Salvataggi +Save States = Salvataggio stati +Savedata Manager = Gestione dei Salvataggi +Size = Dimensioni + +[Screen] +Cardboard VR OFF = Cardboard VR spenta +Chainfire3DWarning = AVVISO: rilevato Chainfire3D, potrebbe causare problemi +Failed to load state = Impossibile caricare il salvataggio di stato +Failed to save state = Impossibile salvare il salvataggio di stato +fixed = Velocità: alternata +GLToolsWarning = AVVISO: rilevato GLTools, potrebbe causare problemi +In menu = Nei menu +Load savestate failed = Caricamento salvataggio di stato fallito +Loaded State = Stato Caricato +Loaded. Save in game, restart, and load for less bugs. = Caricato. Salvataggio in gioco, riavvio, e caricamento per meno bug. +LoadStateDoesntExist = Caricamento stato fallito: lo stato non esiste! +LoadStateWrongVersion = Caricamento stato fallito: lo stato è di una versione precedente di PPSSPP! +norewind = Nessun riavvolgimento di savestates disponibile. +Playing = Sta giocando +PressESC = Premere ESC per aprire il Menu Pausa +replaceTextures_false = Le texture non verranno più sostituite. +replaceTextures_true = La sostituzione delle texture è stata attivata. +Save State Failed = Salvataggio stato fallito! +Saved State = Stato Salvato +saveNewTextures_false = Il salvataggio delle texture è stato disattivato. +saveNewTextures_true = Le texture verranno salvate su disco. +SpeedCustom2 = Velocità: alternativa 2 +standard = Velocità: standard +Untitled PSP game = Gioco PSP senza titolo + +[Store] +Already Installed = Già installato +Connection Error = Errore di connessione +Install = Installare +Launch Game = Avvia il gioco +Loading... = Caricamento... +MB = MB +Size = Dimensioni +Uninstall = Disinstalla + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d core) +%d bytes = %d bytes +(none detected) = (niente rilevato) +3D API = API 3D +ABI = ABI +API Version = Versione dell'API +Audio Information = Informazioni audio +Board = Scheda +Build Config = Config della build +Build Configuration = Configurazione della build +Built by = Compilato da +Core Context = Contesto del core +Cores = Core +CPU Extensions = Estensioni della CPU +CPU Information = Informazioni sulla CPU +CPU Name = Nome +D3DCompiler Version = Versione D3DCompiler +Debug = Debug +Debugger Present = Debugger presente +Device Info = Informazioni dispositivo +Display Information = Informazioni display +Driver Version = Versione dei Driver +EGL Extensions = Estensioni EGL +Frames per buffer = Frames per buffer +GPU Information = Informazioni GPU +High precision float range = Ampiezza di float ad alta precisione +High precision int range = Ampiezza interi ad alta precisione +Lang/Region = Lingua/Regione +Memory Page Size = Ampiezza pagina di memoria +Native Resolution = Risoluzione nativa +OGL Extensions = Estensioni OGL +OpenGL ES 2.0 Extensions = Estensioni OpenGL ES 2.0 +OpenGL ES 3.0 Extensions = Estensioni OpenGL ES 3.0 +OpenGL Extensions = Estensioni OpenGL +Optimal frames per buffer = Frames per buffer ottimali +Optimal sample rate = Frequenza di campionamento ottimale +OS Information = Informazioni OS +PPSSPP build = Versione PPSSPP +Refresh rate = Frequenza d'aggiornamento +Release = Rilascio +RW/RX exclusive = Esclusiva RW/RX +Sample rate = Frequenza di campionamento +Shading Language = Linguaggio shading +Sustained perf mode = Modalità prestazioni prolungate +System Information = Informazioni Sistema +System Name = Nome +System Version = Versione del sistema +Threads = Processi +Vendor = Venditore +Vendor (detected) = Venditore (rilevato) +Version Information = Informazioni Versione +Vulkan Extensions = Estensioni Vulkan +Vulkan Features = Funzionalità Vulkan + +[System] +(broken) = (rotto) +12HR = 12 ore +24HR = 24 ore +Auto = Automatico +Auto Load Savestate = Carica automaticam. uno stato +AVI Dump started. = Dump AVI avviato +AVI Dump stopped. = Dump AVI interrotto +Cache ISO in RAM = Metti l'ISO in cache nella RAM (avvio lento) +Change CPU Clock = Cambia la frequenza della CPU (instabile) +Change Memory Stick folder = Cambia cartella della Memory Stick +Change Memory Stick Size = Cambia dimensioni (GB) Memory Stick +Change Nickname = Cambia Nick +ChangingMemstickPath = I salvataggi, gli stati e altri dati non verranno copiati in questa cartella.\n\nCambiare la cartella del Memory Stick? +ChangingMemstickPathInvalid = Quel percorso non può essere usato per salvare i file Memory Stick. +ChangingMemstickPathNotExists = Quella cartella non esiste.\n\nI salvataggi, gli stati e altri dati non verranno copiati nella cartella.\n\nCambiare la cartella del Memory Stick? +Cheats = Trucchi (sperimentale, consultare il forum) +Clear Recent = Svuota "Recenti" +Clear Recent Games List = Svuota Lista Giochi Recenti +Clear UI background = Svuota fondo UI +Confirmation Button = Tasto di Conferma +Date Format = Formato Data +Day Light Saving = Ora Legale +DDMMYYYY = GGMMAAAA +Decrease size = Riduci dimensioni +Developer Tools = Strumenti Sviluppatore +Display Extra Info = Mostra altre informazioni +Display Games on a grid = Mostra "Giochi" a icona +Display Homebrew on a grid = Mostra "Homebrew && Demo" a icona +Display Recent on a grid = Mostra "Recenti" a icona +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emulazione +Enable Cheats = Attiva i Trucchi +Enable Compatibility Server Reports = Attiva l'Invio dei Rapporti di Compatibilità +Failed to load state. Error in the file system. = Impossibile caricare il salvataggio di stato. Errore nel file system. +Failed to save state. Error in the file system. = Impossibile effettuare il salvataggio di stato. Errore nel file system. +Fast (lag on slow storage) = Veloce (lag nei dischi lenti) +Fast Memory = Memoria Rapida (instabile) +Force real clock sync (slower, less lag) = Forza sincronizzazione con frequenza reale (lento, meno lag) +frames, 0:off = frames, 0 = off +Games list settings = Impostazioni Lista giochi +General = Generali +Grid icon size = Dimensioni delle icone +Help the PPSSPP team = Aiuta il gruppo del PPSSPP +Host (bugs, less lag) = Host (buggato, poca lag) +I/O on thread (experimental) = I/O su thread (sperimentale) +Ignore bad memory accesses = Ignora i cattivi accessi alla memoria +Increase size = Aumenta dimensioni +Interpreter = Interprete +IO timing method = Metodo di temporizzazione I/O +IR Interpreter = Interprete IR +Memory Stick Folder = Cartella Memory Stick +Memory Stick inserted = Memory Stick inserita +MHz, 0:default = MHz, 0 = predefinito +MMDDYYYY = MMGGAAAA +Newest Save = Salvataggio più recente +Not a PSP game = Nessun gioco PSP +Off = Off +Oldest Save = Salvataggio più vecchio +PSP Model = Modello PSP +PSP Settings = Impostazioni PSP +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Registra Audio +Record Display = Registra Display +Reset Recording on Save/Load State = Reset della registrazione al Salvataggio/Caricamento stato +Restore Default Settings = Ripristina Impostazioni di PPSSPP +Rewind Snapshot Frequency = Frequenza riavvolgimento snapshot (+ memoria) +Save path in installed.txt = Salva il percorso in "installed.txt" +Save path in My Documents = Salva il percorso in "Documenti" +Savestate Slot = Slot di salvataggio stato +Savestate slot backups = Backup dello slot di salvataggio stato +Screenshots as PNG = Salva screenshot in formato PNG +Set UI background... = Imposta sfondo UI... +Show ID = Mostra ID +Show region flag = Mostra flag regione +Simulate UMD delays = Simula ritardo UMD +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Spazio su disco pieno +Sustained performance mode = Modalità prestazioni prolungate +Time Format = Formato Data/Ora +UI = Interfaccia utente +UI Sound = Suoni dell'Interfaccia +undo %c = salva %c +Use Lossless Video Codec (FFV1) = Usa Codec Video senza perdite (FFV1) +Use O to confirm = Usa ◯ come tasto di conferma +Use output buffer (with overlay) for recording = Usa la memoria di buffer per la registrazione (compresi i messaggi) +Use system native keyboard = Usa tastiera nativa di sistema +Use X to confirm = Usa ☓ come tasto di conferma +VersionCheck = Controlla se ci sono aggiornamenti per PPSSPP +WARNING: Android battery save mode is on = ATTENZIONE: La modalità Risparmio Energetico di Android è attivata +WARNING: Battery save mode is on = ATTENZIONE: La modalità Risparmio Energetico è attivata +YYYYMMDD = AAAAMMGG + +[Upgrade] +Details = Dettagli +Dismiss = Ignora +Download = Scarica +New version of PPSSPP available = È disponibile una nuova versione di PPSSPP diff --git a/assets/lang/ja_JP.ini b/assets/lang/ja_JP.ini new file mode 100644 index 0000000000..05429e8765 --- /dev/null +++ b/assets/lang/ja_JP.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = カスタム速度時のボリューム +Audio backend = オーディオのバックエンド (再起動が必要) +AudioBufferingForBluetooth = Bluetoothに適したバッファ (低速) +Auto = 自動 +Device = デバイス +DSound (compatible) = DSound (互換性重視) +Enable Sound = オーディオを有効にする +Global volume = グローバルボリューム +Microphone = Microphone +Microphone Device = Microphone device +Mute = ミュート +Switch on new audio device = 新しいオーディオデバイスをオンにする +Use global volume = グローバルボリュームを使う +WASAPI (fast) = WASAPI (高速) + +[Controls] +Analog auto-rotation speed = アナログの自動回転速度 +Analog Axis Sensitivity = アナログパッドの感度 +Analog Limiter = アナログパッドのリミッタ +Analog Mapper High End = アナログマッパーの最大値 (軸の感度) +Analog Mapper Low End = アナログマッパーの最小値 (逆デッドゾーン) +Analog Mapper Mode = アナログマッパーモード +Analog Stick = アナログパッド +AnalogLimiter Tip = アナログリミッタボタンが押されたとき +Auto = 自動 +Auto-centering analog stick = アナログパッドを自動でセンタリングする +Auto-hide buttons after seconds = 指定した秒数後に自動でボタンを隠す +Binds = Binds +Button Opacity = ボタンの透明度 +Button style = ボタンのスタイル +Calibrate D-Pad = 方向キーをキャリブレートする +Calibration = キャリブレーション +Classic = クラシック +Combo Key Setting = コンボキーの設定 +Combo Key Setup = コンボキーを設定する +Confine Mouse = ウィンドウ/表示領域内でマウスをトラップする +Control Mapping = キーを設定する +Custom layout... = カスタムレイアウト... +Customize tilt = 傾きをカスタマイズする +D-PAD = 方向キー +Deadzone Radius = デッドゾーンの半径 +DInput Analog Settings = DInputのアナログパッド設定 +Disable D-Pad diagonals (4-way touch) = 方向キーの斜め入力を無効にする (4方向タッチ) +Glowing borders = 点灯する枠線 +HapticFeedback = 触感フィードバック (振動) +Ignore gamepads when not focused = 非フォーカス時はゲームパッドを無効にする +Ignore Windows Key = Windowsキーを無視する +Invert Axes = 軸を反転させる +Invert Tilt along X axis = X軸の傾きを反転させる +Invert Tilt along Y axis = Y軸の傾きを反転させる +Keep this button pressed when right analog is pressed = 右アナログが押されたときにこのボタンを押し続ける +Keyboard = キーボード +L/R Trigger Buttons = L/R トリガーボタン +Landscape = 横 +Landscape Auto = 横 (自動) +Landscape Reversed = 横 (反転) +Mouse = マウスの設定 +Mouse sensitivity = マウスの感度 +Mouse smoothing = マウスのスムージング +MouseControl Tip = キーの設定画面で「M」のアイコンを押すとマウスボタンを設定できます。 +None (Disabled) = なし (無効) +Off = オフ +OnScreen = 画面にタッチ用のコントローラを表示する +Portrait = 縦 +Portrait Reversed = 縦 (反転) +PSP Action Buttons = PSPアクションボタン +Screen Rotation = 画面の向き +seconds, 0 : off = 秒数, 0 = オフ +Sensitivity = 感度 +Show right analog = 右アナログを表示する +Show Touch Pause Menu Button = 一時停止ボタンを表示する +Thin borders = 薄い枠線 +Tilt Base Radius = 傾きのベース半径 +Tilt Input Type = 傾き入力のタイプ +Tilt Sensitivity along X axis = X軸の傾きの感度 +Tilt Sensitivity along Y axis = Y軸の傾きの感度 +To Calibrate = デバイスを水平に置いて「キャリブレート」を押してください +Touch Control Visibility = タッチコントロールの表示 +Use custom right analog = カスタム右アナログを使用する +Use Mouse Control = マウスで操作する +Visibility = 表示 +X = X +X + Y = X + Y +XInput Analog Settings = XInputのアナログパッド設定 +Y = Y + +[CwCheats] +Cheats = チート +Edit Cheat File = チートファイルを編集する +Enable/Disable All = 全て有効/無効にする +Import Cheats = cheat.dbからインポートする +Options = オプション +Refresh Rate = リフレッシュレート + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = PPSSPPについて(&A)... +Auto = 自動(&A) +Backend = バックエンド(&B) +Bicubic = Bicubic(&B) +Break = ブレーク +Break on Load = ロード時にブレーク +Buffered Rendering = バッファレンダリング(&B) +Buy Gold = Gold版を購入(&G) +Control Mapping... = キーを設定する(&O)... +Debugging = デバッグ(&D) +Deposterize = ポスタライズを解除する(&D) +Direct3D9 = Direct3D &9 +Direct3D11 = Direct3D &11 +Disassembly = 逆アセンブル(&D)... +Discord = Discord +Display Layout Editor = 画面のレイアウトを編集する... +Display Rotation = 画面の向き +Dump Next Frame to Log = 次のフレームをログにダンプする(&U) +Emulation = エミュレーション(&E) +Enable Chat = チャットを有効にする +Enable Cheats = チートを有効にする(&C) +Enable Sound = オーディオを有効にする(&O) +Exit = 終了(&X) +Extract File... = ファイルを展開する(&X)... +File = ファイル(&F) +Frame Skipping = フレームスキップ(&F) +Frame Skipping Type = フレームスキップのタイプ +Fullscreen = フルスクリーン(&L) +Game Settings = ゲームの設定(&G) +GE Debugger... = GEデバッガ(&R)... +GitHub = Git&Hub +Hardware Transform = ハードウェアトランスフォーム(&H) +Help = ヘルプ(&H) +Hybrid = Hybrid(&H) +Hybrid + Bicubic = Hybrid + Bicubic(&Y) +Ignore Illegal Reads/Writes = 不正な読み書きを無視する(&I) +Ignore Windows Key = Windowsキーを無視する +Keep PPSSPP On Top = PPSSPPを常に前面に表示する(&K) +Landscape = 横 +Landscape reversed = 横 (反転) +Language... = 言語(&N)... +Linear = &Linear +Load = ロード(&L)... +Load .sym File... = .symファイルをロードする(&A)... +Load Map File... = &Mapファイルをロードする... +Load State = ステートをロードする(&O) +Load State File... = ステートファイルをロードする(&L)... +Log Console = ログコンソール(&L) +Memory View... = メモリビュー(&V)... +More Settings... = 詳細設定(&M)... +Nearest = &Nearest +Non-Buffered Rendering = ノンバッファレンダリング (高速化)(&S) +Off = オフ(&O) +Open Directory... = ディレクトリを開く(&D)... +Open from MS:/PSP/GAME... = MS:/&PSP/GAMEを開く... +Open Memory Stick = メモリースティックを開く(&M) +Open New Instance = 新しいインスタンスを開く +OpenGL = &OpenGL +Pause = 一時停止(&P) +Pause When Not Focused = 非フォーカス時は一時停止する(&P) +Portrait = 縦 +Portrait reversed = 縦 (反転) +Postprocessing Shader = 後処理シェーダ(&G) +PPSSPP Forums = PPSSPPフォーラム(&F) +Record = 記録(&R) +Record Audio = オーディオを記録する(&A) +Record Display = 画面を記録する(&D) +Rendering Mode = レンダリングモード(&O) +Rendering Resolution = レンダリング解像度(&R) +Reset = リセット(&E) +Reset Symbol Table = シンボルテーブルをリセットする(&Y) +Run = 実行(&R) +Save .sym File... = .symファイルをセーブする(&E)... +Save Map File... = Mapファイルをセーブする(&S)... +Save State = ステートをセーブする(&A) +Save State File... = ステートファイルをセーブする(&S)... +Savestate Slot = セーブステートのスロット(&T) +Screen Scaling Filter = 画像スケーリングのフィルタ(&E) +Show Debug Statistics = デバッグ情報を表示する(&G) +Show FPS Counter = FPSを表示する(&F) +Skip Number of Frames = スキップするフレーム数 +Skip Percent of FPS = スキップするFPS中のパーセント +Stop = 停止(&S) +Switch UMD = UMDを交換する +Take Screenshot = スクリーンショットを撮る(&T) +Texture Filtering = テクスチャフィルタリング(&X) +Texture Scaling = テクスチャスケーリング(&T) +Use Lossless Video Codec (FFV1) = ロスレスビデオコーデックを使う (FFV1)(&U) +Use output buffer for video = ビデオに出力バッファを使う +Vertex Cache = 頂点キャッシュ(&V) +VSync = VSync(&Y) +Vulkan = Vulkan +Window Size = ウィンドウサイズ(&W) +www.ppsspp.org = www.&ppsspp.org に行く +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = アロケータビューア (Vulkan) +Allow remote debugger = リモートデバッガを許可する +Backspace = Backspace +Block address = アドレスをブロックする +By Address = アドレスで +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = 現在のゲームの textures.ini ファイルを作成する/開く +Current = 現在 +Dev Tools = 開発用ツール +DevMenu = 開発者用メニュー +Disabled JIT functionality = 無効されたJIT機能 +Draw Frametimes Graph = フレームタイムグラフを描く +Dump Decrypted Eboot = 復号したEBOOT.BINを起動時にダンプする +Dump Frame GPU Commands = フレームGPUコマンドをダンプする +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = デバッグログを有効にする +Enter address = アドレスを入力する +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = フレームプロファイラ +GPU Driver Test = GPUドライバをテスト +GPU Profile = GPUプロファイル +Jit Compare = Jit compare +JIT debug tools = JITデバッグツール +Language = 言語 +Load language ini = 言語のiniファイルをロードする +Log Dropped Frame Statistics = ドロップしたフレームの統計を記録する +Log Level = ログレベル +Log View = ログビュー +Logging Channels = ログチャネル +Next = 次へ +No block = ブロックなし +Prev = 前へ +Random = ランダム +Replace textures = テクスチャを置き換える +Reset limited logging = Reset limited logging +RestoreDefaultSettings = 全ての設定 (キーの設定は除く) をデフォルトに戻しますか?\nやり直すことはできません。\n変更を反映させるにはPPSSPPを再起動してください。 +RestoreGameDefaultSettings = ゲームの設定をPPSSPPのデフォルトに\n戻しますか? +Resume = Resume +Run CPU Tests = CPUテストを実行する +Save language ini = 言語のiniファイルをセーブする +Save new textures = 新しいテクスチャを保存する +Shader Viewer = シェーダビューワ +Show Developer Menu = 開発者向けメニューを表示する +Show on-screen messages = Show on-screen messages +Stats = 状況 +System Information = システム情報 +Texture Replacement = テクスチャの置き換え +Toggle Audio Debug = オーディオのデバッグを切り替える +Toggle Freeze = フリーズを切り替える +Touchscreen Test = タッチスクリーンのテスト +VFPU = VFPU + +[Dialog] +* PSP res = * PSP 解像度 +Active = アクティブ +Back = 戻る +Cancel = キャンセル +Center = センタリング +ChangingGPUBackends = GPUバックエンドの変更にはPPSSPPの再起動が必要です。今すぐ再起動しますか? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = PPSSPPのセーブ用フォルダを選択する +Confirm Overwrite = データを上書きしますか? +Confirm Save = データをセーブしますか? +ConfirmLoad = データをロードしますか? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = 削除 +Delete all = 全て削除 +Delete completed = 削除が完了しました。 +DeleteConfirm = データを削除します。\n本当に続けますか? +DeleteConfirmAll = 本当にこのゲームのセーブデータを削除しますか? +DeleteConfirmGame = 本当にこのゲームを削除しますか?\nデータを元に戻すことはできません。 +DeleteConfirmGameConfig = 本当にこのゲームの設定を削除しますか? +DeleteFailed = データを削除できませんでした。 +Deleting = 削除中です。\nしばらくお待ちください... +Disable All = 全て無効にする +Edit = Edit +Enable All = 全て有効にする +Enter = 決定 +Finish = 終了 +Grid = Grid +Inactive = 非アクティブ +InternalError = An internal error has occurred. +Load = ロード... +Load completed = ロードが完了しました。 +Loading = ロード中です。\nしばらくお待ちください... +LoadingFailed = データをロードできませんでした。 +Move = 移動 +Network Connection = ネットワーク接続 +NEW DATA = 新しいデータ +No = いいえ +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = OK +Old savedata detected = 古いセーブデータを検出しました +Options = オプション +Reset = リセット +Resize = リサイズ +Retry = リトライ +Save = セーブ +Save completed = セーブが完了しました。 +Saving = セーブ中です。\nしばらくお待ちください... +SavingFailed = データをセーブできませんでした。 +Select = Select +Shift = Shift +Snap = Snap +Space = スペース +SSID = SSID +Submit = 決定 +Supported = サポートしています +There is no data = データがありません。 +Toggle All = 全て反転する +Toggle List = Toggle list +Unsupported = サポートしていません +When you save, it will load on a PSP, but not an older PPSSPP = 保存すると、PSPではロードできますが古いPPSSPPではロードできません +When you save, it will not work on outdated PSP Firmware anymore = 保存すると、古いPSPファームウェアでは動作しなくなります +Yes = はい +Zoom = 拡大 + +[Error] +7z file detected (Require 7-Zip) = ファイルが圧縮されています (7z)。\nまず解凍してください (7-ZipかWinRARを使う)。 +A PSP game couldn't be found on the disc. = PSPのゲームがディスクにありません。 +Cannot boot ELF located outside mountRoot. = mountRootの外部にあるELFを起動できません。 +Could not save screenshot file = スクリーンショットファイルを保存できません。 +D3D9or11 = Direct3D 9? (「いいえ」でDirect3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll が見つかりません。インストールするか「はい」を押してDirect3D 9を使ってください。 +D3D11InitializationError = Direct3D 11の初期化エラー +D3D11Missing = お使いのOSにはD3D11がありません。Windows Updateを実行してください。\n\n「はい」を押すと代わりにDirect3D 9を試します。 +D3D11NotSupported = お使いのGPUはDirect3D 11をサポートしていないようです。\n\n代わりにDirect3D 9を使ってやり直しますか? +Disk full while writing data = データの書き込み中にディスクが一杯になりました。 +ELF file truncated - can't load = ELFファイルが不完全です - ロードできません +Error loading file = ゲームをロードできません。 +Error reading file = ファイルを読み込めません。 +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = ファイルを識別できません。 +Failed to load executable: = 実行ファイルを読み込めません: +File corrupt = ファイルが壊れています +Game disc read error - ISO corrupt = ゲームディスクを読み込めません: ISOが壊れています +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = グラフィックスの初期化に失敗しました。グラフィックドライバとDirectX 9ランタイムを更新してみてください。\n\nOpenGLに切り替えますか?\n\nエラーメッセージ: +GenericGraphicsError = グラフィックスエラー +GenericOpenGLError = グラフィックスの初期化に失敗しました。グラフィックドライバを更新してみてください。\n\nDirectX 9に切り替えますか?\n\nエラーメッセージ: +GenericVulkanError = グラフィックスの初期化に失敗しました。グラフィックドライバを更新してみてください。\n\nOpenGLに切り替えますか?\n\nエラーメッセージ: +InsufficientOpenGLDriver = OpenGLドライバのサポート不足が検出されました。\n\nお使いのGPUはPPSSPPの動作に必要なOpenGL 2.0をサポートしていません。\n\nお使いのGPUがOpenGL 2.0と互換性があるか確認してください。 互換性がある場合、GPUの開発元のウェブサイトから新しいグラフィックスドライバをインストールしてください。\n\n詳細についてはhttps://forums.ppsspp.orgのフォーラムを確認してください。 +Just a directory. = ディレクトリです。 +Missing key = キーがありません +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = EBOOT.PBPがないのでゲームを識別できません。 +Not a valid disc image. = 有効なディスクイメージではありません。 +OpenGLDriverError = OpenGLドライバエラー +PPSSPP doesn't support UMD Music. = PPSSPPはUMD Musicをサポートしていません +PPSSPP doesn't support UMD Video. = PPSSPPはUMD Videoをサポートしていません +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPPは現在、DLC、PSN、ゲーム更新のためのインターネット接続をサポートしていません。 +PS1 EBOOTs are not supported by PPSSPP. = PPSSPPはPS1のEBOOTをサポートしていません。 +PSX game image detected. = MODE2のイメージファイルです。PPSSPPはPS1のゲームをサポートしていません。 +RAR file detected (Require UnRAR) = ファイルが圧縮されています (RAR)。\nまず解凍してください (UnRARを使う)。 +RAR file detected (Require WINRAR) = ファイルが圧縮されています (RAR)。\nまず解凍してください (WinRARを使う)。 +Running slow: try frameskip, sound is choppy when slow = 低速です: フレームスキップを試してください。低速だと音が途切れます +Running slow: Try turning off Software Rendering = 低速です: 「ソフトウェアレンダリング」を無効にしてみてください +Save encryption failed. This save won't work on real PSP = 暗号化セーブに失敗しました。このセーブはPSP実機では使えません +textures.ini filenames may not be cross-platform = textures.ini のファイル名がクロスプラットフォーム向けではないかもしれません +This is a saved state, not a game. = これはセーブステートです。ゲームではありません。 +This is save data, not a game. = これはセーブデータです。ゲームではありません。 +Unable to create cheat file, disk may be full = チートファイルを作成できません。ディスクが一杯のようです。 +Unable to initialize rendering engine. = レンダリングエンジンを初期化できません。 +Unable to write savedata, disk may be full = セーブデータを書き込めません。ディスクが一杯のようです。 +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = 警告: ビデオメモリが一杯なので、アップスケールを落として低速キャッシュモードに切り替えます。 +Warning: Video memory FULL, switching to slow caching mode = 警告: ビデオメモリが一杯なので、低速キャッシュモードに切り替えます。 +ZIP file detected (Require UnRAR) = ファイルが圧縮されています (ZIP)。\nまず解凍してください (UnRARを使う)。 +ZIP file detected (Require WINRAR) = ファイルが圧縮されています (ZIP)。\nまず解凍してください (WinRARを使う)。 + +[Game] +Asia = アジア +ConfirmDelete = 削除 +Create Game Config = ゲームの設定を作成する +Create Shortcut = ショートカットを作成する +Delete Game = ゲームを削除する +Delete Game Config = ゲームの設定を削除する +Delete Save Data = セーブデータを削除する +Europe = ヨーロッパ +Game = ゲーム +Game Settings = ゲームの設定 +Homebrew = 自作 +Hong Kong = 香港 +InstallData = データのインストール +Japan = 日本 +Korea = 韓国 +MB = MB +One moment please... = しばらくお待ちください... +Play = プレイ +Remove From Recent = 履歴から削除する +SaveData = セーブデータ +Setting Background = 背景を設定 +Show In Folder = フォルダに表示する +USA = USA +Use UI background = UIの背景を使う + +[Graphics] +% of the void = ボイドの% +% of viewport = ビューポートの% +%, 0:unlimited = %, 0 = 無制限 +(supersampling) = (スーパーサンプリング) +(upscaling) = (アップスケーリング) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = 最大限 +Alternative Speed = カスタム速度1 (%で指定、0 = 無制限) +Alternative Speed 2 = カスタム速度2 (%で指定、0 = 無制限) +Anisotropic Filtering = 異方性フィルタリング +Auto = 自動 +Auto (1:1) = 自動 (1:1) +Auto (same as Rendering) = 自動 (レンダリング解像度と同じ) +Auto FrameSkip = オートフレームスキップ +Auto Scaling = 自動的に拡大 +Backend = バックエンド +Balanced = バランス +Bicubic = Bicubic +BlockTransfer Tip = オンにしないと正しく表示できないゲームがいくつかあります +BlockTransferRequired = 警告: このゲームは「ブロック転送の効果をシミュレートする」をオンにする必要があります。 +Both = 両方 +Buffer graphics commands (faster, input lag) = グラフィックスコマンドをバッファする (高速, 入力ラグあり) +Buffered Rendering = バッファレンダリング +BufferedRenderingRequired = 警告: このゲームは「レンダリングモード」を「バッファ」にする必要があります。 +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = 画面のサイズ (in % of the viewport) +Cardboard Screen X Shift = X shift (in % of the blank space) +Cardboard Screen Y Shift = Y shift (in % of the blank space) +Cardboard VR Settings = Google Cardboard VRの設定 +Cheats = チート +Clear Speedhack = 初回使用時にフレームバッファをクリアする (高速化) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPUコア +Debugging = デバッグ +DefaultCPUClockRequired = 警告: このゲームではCPUクロックをデフォルトに設定する必要があります。 +Deposterize = ポスタライズを解除する +Deposterize Tip = アップスケールされたテクスチャのバンディングを修正する +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = 重いエフェクトを無効にする (高速化) +Disabled = 無効 +Display layout editor = 画面のレイアウトを編集する +Display Resolution (HW scaler) = 画面解像度 (HWスケーラー) +Dump next frame to log = 次のフレームをログにダンプする +Enable Cardboard VR = Cardboard VRを有効にする +FPS = FPS +Frame Rate Control = フレームレートのコントロール +Frame Skipping = フレームスキップ +Frame Skipping Type = フレームスキップのタイプ +FullScreen = フルスクリーン +Hack Settings = ハックの設定 (不具合あり) +Hardware Tessellation = ハードウェアテッセレーション +Hardware Transform = ハードウェアトランスフォーム +hardware transform error - falling back to software = ハードウェアトランスフォームでエラー。ソフトウェアに戻します +HardwareTessellation Tip = ハードウェアを使用して曲線を作成し、品質を常に一定にする +High = 高 +Hybrid = Hybrid +Hybrid + Bicubic = Hybrid + Bicubic +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = 内部解像度 +Lazy texture caching = テクスチャキャッシュを遅延させる (高速化) +Linear = Linear +Low = 低 +LowCurves = スプライン/ベジェ曲線の品質 +LowCurves Tip = いくつかのゲームでのみ用いられ、曲線の滑らかさをコントロールする +Lower resolution for effects (reduces artifacts) = エフェクトを低解像度にする (生成物を減らす) +Manual Scaling = 手動で拡大 +Medium = 中 +Mode = モード +Must Restart = この変更を適用するにはPPSSPPを再起動してください +Native device resolution = 機器のネイティブ解像度 +Nearest = Nearest +No buffer = バッファなし +Non-Buffered Rendering = ノンバッファレンダリング (高速化) +None = なし +Number of Frames = フレーム数 +Off = オフ +OpenGL = OpenGL +Overlay Information = オーバーレイ表示 +Partial Stretch = 部分的に拡大 +Percent of FPS = FPS中のパーセント +Performance = パフォーマンス +Postprocessing effect = 後処理エフェクト +Postprocessing Shader = 後処理シェーダ +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = フレームを複製して60Hzでレンダリングする +RenderDuplicateFrames Tip = フレームレートが低いゲームでフレームレートをよりスムーズにできます +Rendering Mode = レンダリングモード +Rendering Resolution = レンダリング解像度 +RenderingMode NonBuffered Tip = 高速ですが何も表示されなくなるゲームがあるかもしれません +Retain changed textures = 変更したテクスチャを保持する (低速化する場合がある) +RetainChangedTextures Tip = 多くのゲームが低速化しますが、かなり速くなるゲームもあります +Rotation = 向き +Safe = セーフ +Screen layout = 画面のレイアウト +Screen Scaling Filter = 画像スケーリングのフィルタ +Show Debug Statistics = デバッグ情報を表示する +Show FPS Counter = FPSを表示する +Simulate Block Transfer = ブロック転送の効果をシミュレートする +SoftGPU Tip = 現状では非常に遅い +Software Rendering = ソフトウェアレンダリング (実験的) +Software Skinning = ソフトウェアスキニング +SoftwareSkinning Tip = スキンモデルの描画をCPUでまとめて行う。ほとんどのゲームが高速化します +Speed = 速度 +Stretching = 拡大 +Texture Filter = テクスチャフィルタ +Texture Filtering = テクスチャフィルタリング +Texture Scaling = テクスチャスケーリング +Texture Shader = テクスチャシェーダ +Turn off Hardware Tessellation - unsupported = 「ハードウェアテッセレーション」をオフにしてください。サポートされていません +Unlimited = 無制限 +Up to 1 = 最大1 +Up to 2 = 最大2 +Upscale Level = アップスケールのレベル +Upscale Type = アップスケールのタイプ +UpscaleLevel Tip = CPUに重い負荷 - カクつきを避けるためタイプによっては遅延するスケーリングがあるかもしれません +Use all displays = 全てのディスプレイを使う +Vertex Cache = 頂点キャッシュ +VertexCache Tip = 高速ですがフリッカーが生じるかもしれません +VSync = VSync +Vulkan = Vulkan +Window Size = ウィンドウサイズ +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = ZIPファイルを削除 +Install = インストールする +Install game from ZIP file? = ZIPファイルからゲームをインストールしますか? +Install textures from ZIP file? = ZIPファイルからテクスチャをインストールしますか? +Installed! = インストールしました +Texture pack doesn't support install = テクスチャパックがインストールをサポートしていません +Zip archive corrupt = ZIPアーカイブが破損しています +Zip file does not contain PSP software = ZIPファイルにPSPソフトウェアが含まれていません + +[KeyMapping] +Autoconfigure = 自動設定 +Autoconfigure for device = デバイスの自動設定 +Clear All = 全てクリアする +Default All = デフォルトに戻す +Map a new key for = 新しいキーを入力 +Map Key = Map key +Map Mouse = Map mouse +Test Analogs = パッドをテスト +You can press ESC to cancel. = Escを押すとキャンセルできます。 + +[MainMenu] +Browse = 参照... +Buy PPSSPP Gold = PPSSPP Goldを購入 +Choose folder = フォルダを選択する +Credits = クレジット +PPSSPP Homebrew Store = PPSSPP自作ソフトストア +Exit = 終了 +Game Settings = ゲームの設定 +Games = ゲーム +Give PPSSPP permission to access storage = PPSSPPにストレージへのアクセス権限を与えてください +Homebrew & Demos = 自作ソフトとデモ +How to get games = ゲームを入手する +How to get homebrew & demos = 自作ソフトとデモを入手する +Load = ロード... +Loading... = ロードしています... +PinPath = ピンで留める +PPSSPP can't load games or save right now = PPSSPPがゲームをロード/セーブできません +Recent = 履歴 +SavesAreTemporary = PPSSPPは一時ストレージに保存しています +SavesAreTemporaryGuidance = PPSSPPをどこかに展開して永続的に保存する +SavesAreTemporaryIgnore = 警告を無視する +UnpinPath = ピンを外す +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = オーディオ +Controls = コントロール +Graphics = グラフィックス +Networking = ネットワーク +System = システム +Tools = ツール + +[MappableControls] +Alt speed 1 = カスタム速度1 +Alt speed 2 = カスタム速度2 +An.Down = パッド 下 +An.Left = パッド 左 +An.Right = パッド 右 +An.Up = パッド 上 +Analog limiter = パッドのリミッタ +Analog Stick = アナログパッド +Audio/Video Recording = オーディオ/ビデオを記録 +Auto Analog Rotation (CCW) = 自動アナログ回転 (CCW) +Auto Analog Rotation (CW) = 自動アナログ回転 (CW) +AxisSwap = 軸の入れ替え +Circle = Circle +Cross = Cross +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = 開発者用メニュー +Down = 方向キー 下 +Dpad = 方向キー +Frame Advance = コマ送り +Hold = ホールド +Home = Home +L = L +Left = 方向キー 左 +Load State = ステートをロード +Mute toggle = ミュートを切り替える +Next Slot = 次のスロット +None = None +Note = 音符 +OpenChat = チャットを開く +Pause = 一時停止 +R = R +RapidFire = 連射 +Remote hold = リモートホールド +Rewind = 巻き戻す +Right = 方向キー 右 +Right Analog Stick (tap to customize) = 右アナログスティック (タップしてカスタマイズ) +RightAn.Down = 右パッド 下 +RightAn.Left = 右パッド 左 +RightAn.Right = 右パッド 右 +RightAn.Up = 右パッド 上 +Rotate Analog (CCW) = アナログ回転 (CCW) +Rotate Analog (CW) = アナログ回転 (CW) +Save State = ステートをセーブ +Screen = スクリーン +Screenshot = スクリーンショット +Select = Select +SpeedToggle = 速度の切り替え +Square = Square +Start = Start +Texture Dumping = テクスチャのダンプ +Texture Replacement = テクスチャの置換 +Toggle Fullscreen = フルスクリーンの切り替え +Toggle mode = モードの切り替え +Triangle = Triangle +Unthrottle = 速度制限を解除 +Up = 方向キー 上 +Vol + = 音量を上げる +Vol - = 音量を下げる +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = アドホックマルチプレイのフォーラムに行く +AdHoc Server = アドホックサーバ +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = 下中央 +Bottom Left = 左下 +Bottom Right = 右下 +Center Left = 左中央 +Center Right = 右中央 +Change Mac Address = MACアドレスを変更する +Change proAdhocServer Address = PROアドホックサーバのIPアドレスを変更する (localhost = multiple instances) +Chat = チャット +Chat Button Position = チャットボタンの位置 +Chat Here = ここにチャットを入力する +Chat Screen Position = チャット画面の位置 +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = 内蔵PROアドホックサーバを有効にする +Enable network chat = ネットワークチャットを有効にする +Enable networking = ネットワーク/WLANを有効にする (ベータ版) +Enable UPnP = UPnPを有効にする (検出に数秒かかる) +EnableQuickChat = クイックチャットを有効にする +Enter a new PSP nickname = PSPの新しいニックネームを入力する +Enter Quick Chat 1 = クイックチャット1を入力する +Enter Quick Chat 2 = クイックチャット2を入力する +Enter Quick Chat 3 = クイックチャット3を入力する +Enter Quick Chat 4 = クイックチャット4を入力する +Enter Quick Chat 5 = クイックチャット5を入力する +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = 無効なIPまたはホスト名 +Minimum Timeout = 最小タイムアウト (低遅延をオーバーライド、単位ms) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = ネットワークを初期化 +Please change your Port Offset = Please change your port offset +Port offset = ポートオフセット (0 = PSP互換) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = クイックチャット1 +Quick Chat 2 = クイックチャット2 +Quick Chat 3 = クイックチャット3 +Quick Chat 4 = クイックチャット4 +Quick Chat 5 = クイックチャット5 +QuickChat = クイックチャット +Send = 送信する +Send Discord Presence information = Discordのプレゼンス情報を送信する +TCP No Delay = 遅延のないTCP (高速なTCP) +Top Center = 上中央 +Top Left = 左上 +Top Right = 右上 +Unable to find UPnP device = Unable to find UPnP device +UPnP (port-forwarding) = UPnP(ポートフォワーディング) +UPnP need to be reinitialized = UPnP need to be reinitialized +UPnP use original port = UPnPでオリジナルのポートを使用する (有効 = PSP互換) +Validating address... = アドレスを検証しています... +WLAN Channel = WLANチャネル +You're in Offline Mode, go to lobby or online hall = オフラインモードです。ロビーかホールに移動してください + +[Pause] +Cheats = チート +Continue = 再開する +Create Game Config = ゲームの設定を作成する +Delete Game Config = ゲームの設定を削除する +Exit to menu = メニューに戻る +Game Settings = ゲームの設定 +Load State = ステートをロードする +Rewind = 巻き戻す +Save State = ステートをセーブする +Settings = 設定 +Switch UMD = UMDを交換する + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Color +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Cartoon +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT scanlines +FXAA = FXAA Antialiasing +Gamma = Gamma +Grayscale = Grayscale +Intensity = Intensity +InverseColors = Inverse Colors +Natural = Natural Colors +NaturalA = Natural Colors (no blur) +Off = オフ +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlines (CRT) +Sharpen = Sharpen +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 Upscaler +VideoSmoothingAA = Video Smoothing AA +Vignette = Vignette + +[PSPCredits] +all the forum mods = フォーラムのモデレータの皆さん +build server = ビルドサーバ +Buy Gold = Gold版を購入 +check = Dolphinもチェックしてください。最高のWii/GCエミュレータです: +CheckOutPPSSPP = PPSSPPをチェックしてください。素晴らしいPSPエミュレータです: https://www.ppsspp.org/ +contributors = 貢献者: +created = 作者: +Discord = Discord +info1 = PPSSPPは教育目的のみを意図しています。 +info2 = UMDを所有するかPSP実機のPSNストアからダウンロード購入して、 +info3 = プレイするゲームに対してあなたが権利を保有していることを +info4 = 確認してください。 +info5 = "PSP" はSony Interactive Entertainment Inc.の登録商標です。 +iOS builds = iOSビルド +license = GPL 2.0+ライセンスのフリーソフトウェア +list = 互換性リスト, フォーラム, 開発情報などがあります +PPSSPP Forums = PPSSPPフォーラム +Privacy Policy = プライバシーポリシー +Share PPSSPP = PPSSPPをシェアする +specialthanks = スペシャルサンクス: +specialthanksKeithGalocy = at NVIDIA (ハードウェア, アドバイス) +specialthanksMaxim = (素晴らしいAtrac3+デコーダ) +testing = 動作テスト +this translation by = 翻訳者: +title = 高速で移植性のあるPSPエミュレータ +tools = 使用したフリーツール: +# PPSSPPの翻訳者や翻訳への貢献者をここに追加してください。 +# 翻訳者のクレジットは6行までです。 +# 余った行は空白のままにしてください。1行に4人記載するのがベストのようです。 +translators1 = unknown, gary, nassau-tk +translators2 = +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = ウェブサイトはこちら: +written = 速度と移植性を保つためにC++で書かれています + +[RemoteISO] +Browse Games = ゲームをブラウズする +Local Server Port = ローカルサーバのポート +Manual Mode Client = マニュアルモードクライアント +Remote disc streaming = リモートディスクストリーミング +Remote Port = リモートポート +Remote Server = リモートサーバ +Remote Subdirectory = リモートサブディレクトリ +RemoteISODesc = 最近のリストにあるゲームがシェアされます +RemoteISOLoading = 接続しました。ゲームリストをロードします... +RemoteISOScanning = スキャンしています... サーバデバイスの「ゲームをシェアする」をクリックしてください +RemoteISOScanningTimeout = スキャンしています... デスクトップのファイアウォール設定を確認してください +RemoteISOWifi = 注意: 両方のデバイスを同じWi-Fiネットワークに接続してください +RemoteISOWinFirewall = 警告: Windowsファイアウォールが共有をブロックしています +Settings = 設定 +Share Games (Server) = ゲームをシェアする (サーバ) +Share on PPSSPP startup = PPSSPPの起動時にシェアする +Stop Sharing = シェアを停止する +Stopping.. = 停止しています... + +[Reporting] +Bad = Bad +FeedbackDelayInfo = あなたのデータはバックグラウンドで送信されます。 +FeedbackDesc = エミュレーションの評価をコミュニティに報告する +FeedbackDisabled = 「互換性をコミュニティに報告する」を有効にしてください。 +FeedbackIncludeCRC = 注意: ディスクのCRCを送信するのでバッテリを消費します +FeedbackIncludeScreen = スクリーンショットを含める +FeedbackSubmitDone = あなたのデータを送信しました。 +FeedbackSubmitFail = サーバにデータを送信できませんでした。PPSSPPをアップデートしてみてください。 +FeedbackThanks = フィードバックをご送信いただいてありがとうございます! +Gameplay = ゲームプレイ +Graphics = グラフィックス +Great = Great +In-game = In-game +In-game Description = ゲームプレイには入れるがバグが多すぎて完全には程遠い +Menu/Intro = Menu/Intro +Menu/Intro Description = ゲームプレイに入れない +Nothing = Nothing +Nothing Description = 全く動かない +OK = OK +Open Browser = ブラウザを開く +Overall = 総合評価 +Perfect = Perfect +Perfect Description = ゲーム全体に渡って完全なエミュレーション - 素晴らしい! +Plays = Plays +Plays Description = 完全に遊べるがグリッチが生じる +ReportButton = 報告する +Speed = 速度 +Submit Feedback = フィードバックを送信する +SuggestionConfig = 適切な設定についてウェブサイトのレポートを参照してください。 +SuggestionCPUSpeed0 = CPU速度のロックを無効にしてください。 +SuggestionDowngrade = 古いPPSSPPにダウングレードしてください (このバグは報告してください)。 +SuggestionsFound = 他のユーザがより良い結果をレポートしています。詳細については「全てのフィードバックを見る」をタップしてください。 +SuggestionsNone = このゲームは他のユーザの環境でも動いていません。 +SuggestionsWaiting = 送信して他のユーザのフィードバックを確認しています... +SuggestionUpgrade = 新しいPPSSPPに更新してください。 +SuggestionVerifyDisc = お使いのISOがディスクから適切にコピーされているか確認してください。 +Unselected Overall Description = このゲームのエミュレーション精度はどうですか? +View Feedback = 全てのフィードバックを見る + +[Savedata] +Date = 日付 +Filename = ファイル名 +No screenshot = スクリーンショットなし +None yet. Things will appear here after you save. = まだありません。セーブ後に項目が表示されます。 +Save Data = セーブデータ +Save States = セーブステート +Savedata Manager = セーブデータを管理する +Size = サイズ + +[Screen] +Cardboard VR OFF = Cardboard VRオフ +Chainfire3DWarning = 警告: Chainfire3Dを検出しました。問題が起きるかもしれません。 +Failed to load state = ステートのロードに失敗しました +Failed to save state = ステートのセーブに失敗しました +fixed = 速度: カスタム速度1 +GLToolsWarning = 警告: GLToolsを検出しました。問題が起きるかもしれません。 +In menu = In menu +Load savestate failed = セーブステートのロードに失敗しました +Loaded State = ステートをロードしました +Loaded. Save in game, restart, and load for less bugs. = ロードしました。バグの発生を減らすためにゲーム中でセーブを行い、再起動してロードしてください。 +LoadStateDoesntExist = ステートのロードに失敗しました: セーブステートがありません。 +LoadStateWrongVersion = ステートのロードに失敗しました: 古いバージョンのセーブステートです。 +norewind = 巻き戻すセーブステートがありません。 +Playing = プレイ中 +PressESC = ESCを押すと一時停止メニューを開きます。 +replaceTextures_false = テクスチャが置き換えられなくなりました。 +replaceTextures_true = テクスチャの置き換えが有効になりました。 +Save State Failed = ステートのセーブに失敗しました。 +Saved State = ステートをセーブしました +saveNewTextures_false = テクスチャの保存が無効になりました。 +saveNewTextures_true = テクスチャがストレージに保存されます。 +SpeedCustom2 = 速度: カスタム速度2 +standard = 速度: 標準 +Untitled PSP game = 無題のPSPゲーム + +[Store] +Already Installed = インストール済み +Connection Error = 接続エラー +Install = インストールする +Launch Game = ゲームを起動する +Loading... = ロードしています... +MB = MB +Size = サイズ +Uninstall = アンインストールする + +[SysInfo] +%d (%d per core, %d cores) = %d (1コアあたり %d, コア数 %d) +%d bytes = %d bytes +(none detected) = (未検出) +3D API = 3D API +ABI = ABI +API Version = APIバージョン +Audio Information = オーディオ情報 +Board = Board +Build Config = ビルド設定 +Build Configuration = ビルド設定 +Built by = ビルド作成者 +Core Context = コアコンテキスト +Cores = コア数 +CPU Extensions = CPU拡張 +CPU Information = CPU情報 +CPU Name = CPU名 +D3DCompiler Version = D3DCompilerバージョン +Debug = デバッグ +Debugger Present = デバッガーあり +Device Info = デバイス情報 +Display Information = ディスプレイ情報 +Driver Version = ドライバのバージョン +EGL Extensions = EGL拡張 +Frames per buffer = バッファあたりのフレーム数 +GPU Information = GPU情報 +High precision float range = High precision float range +High precision int range = 高精度整数の範囲 +Lang/Region = 言語/地域 +Memory Page Size = メモリページサイズ +Native Resolution = ネイティブ解像度 +OGL Extensions = OGL拡張 +OpenGL ES 2.0 Extensions = OpenGL ES 2.0拡張 +OpenGL ES 3.0 Extensions = OpenGL ES 3.0拡張 +OpenGL Extensions = OpenGL拡張 +Optimal frames per buffer = バッファあたりの最適フレーム +Optimal sample rate = 最適サンプルレート +OS Information = OS情報 +PPSSPP build = PPSSPPビルド +Refresh rate = リフレッシュレート +Release = リリース +RW/RX exclusive = RW/RX専用 +Sample rate = サンプルレート +Shading Language = シェーディング言語 +Sustained perf mode = 性能維持モード +System Information = システム情報 +System Name = システム名 +System Version = システムバージョン +Threads = スレッド数 +Vendor = ベンダ +Vendor (detected) = ベンダ (検出されたもの) +Version Information = バージョン情報 +Vulkan Extensions = Vulkan拡張 +Vulkan Features = Vulkanの機能 + +[System] +(broken) = (壊れています) +12HR = 12時間 +24HR = 24時間 +Auto = 自動 +Auto Load Savestate = 自動的にセーブステートをロードする +AVI Dump started. = AVIダンプを開始しました +AVI Dump stopped. = AVIダンプを停止しました +Cache ISO in RAM = ISO全体をキャッシュする +Change CPU Clock = CPUクロックを変更する (不安定) +Change Memory Stick folder = メモリースティックフォルダを変更する +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = ニックネームを変更する +ChangingMemstickPath = ゲームのセーブ, セーブステート, その他のデータはこのフォルダにコピーされません。\n\nメモリースティックフォルダを変更しますか? +ChangingMemstickPathInvalid = そのパスを使用してメモリースティックファイルを保存することができませんでした。 +ChangingMemstickPathNotExists = そのフォルダはまだ存在しません。\n\nゲームのセーブ, セーブステート, その他のデータはこのフォルダにコピーされません。\n\n新しいメモリースティックフォルダを作成しますか? +Cheats = チート +Clear Recent = 履歴をクリアする +Clear Recent Games List = ゲームリストの履歴をクリアする +Clear UI background = UIの背景をクリアする +Confirmation Button = 決定ボタン +Date Format = 日付の形式 +Day Light Saving = サマータイム +DDMMYYYY = 日/月/年 +Decrease size = サイズを縮小する +Developer Tools = 開発者向けツール +Display Extra Info = 拡張情報の表示 +Display Games on a grid = "ゲーム" をグリッド表示にする +Display Homebrew on a grid = "自作ソフトとデモ" をグリッド表示にする +Display Recent on a grid = "履歴" をグリッド表示にする +Dynarec (JIT) = Dynarec (JIT) +Emulation = エミュレーション +Enable Cheats = チートを有効にする +Enable Compatibility Server Reports = 互換性をコミュニティに報告する +Failed to load state. Error in the file system. = ステートのロードに失敗しました。フィルシステムにエラーがあります。 +Failed to save state. Error in the file system. = ステートのセーブに失敗しました。フィルシステムにエラーがあります。 +Fast (lag on slow storage) = 高速 (遅いストレージだとラグあり) +Fast Memory = 高速メモリ (不安定) +Force real clock sync (slower, less lag) = リアルクロックへの同期を強制する (低速化, ラグ減少) +frames, 0:off = フレーム, 0 = オフ +Games list settings = ゲームリストの設定 +General = 全般 +Grid icon size = グリッド表示時のアイコンサイズ +Help the PPSSPP team = PPSSPPチームを支援する +Host (bugs, less lag) = ホスト (バグあり, ラグは少ない) +I/O on thread (experimental) = 入出力をスレッド化 (実験的) +Ignore bad memory accesses = 不正なメモリアクセスを無視する +Increase size = サイズを拡大する +Interpreter = インタプリタ +IO timing method = 入出力のタイミング +IR Interpreter = IRインタプリタ +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = メモリースティックを挿入する +MHz, 0:default = MHz, 0 = デフォルト +MMDDYYYY = 月/日/年 +Newest Save = 最も新しいセーブ +Not a PSP game = PSPのゲームではありません +Off = オフ +Oldest Save = 最も古いセーブ +PSP Model = PSPのモデル +PSP Settings = PSPの設定 +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = オーディオを記録する +Record Display = 画面を記録する +Reset Recording on Save/Load State = ステートをセーブ/ロードしたら記録をリセットする +Restore Default Settings = 設定をデフォルトに戻す +Rewind Snapshot Frequency = スナップショットの巻き戻し頻度 (メモリを消費) +Save path in installed.txt = パスを installed.txt に保存する +Save path in My Documents = パスを My Documents に保存する +Savestate Slot = セーブステートのスロット +Savestate slot backups = セーブステートのスロットをバックアップする +Screenshots as PNG = スクリーンショットをPNG形式で保存する +Set UI background... = UIの背景を設定する... +Show ID = IDを表示する +Show region flag = 地域の旗を表示する +Simulate UMD delays = UMDの遅延をシミュレートする +Slot 1 = スロット1 +Slot 2 = スロット2 +Slot 3 = スロット3 +Slot 4 = スロット4 +Slot 5 = スロット5 +Storage full = ストレージが一杯です +Sustained performance mode = パフォーマンス維持モード +Time Format = 時刻の形式 +UI = ユーザーインターフェース +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = ロスレスビデオコーデックを使う (FFV1) +Use O to confirm = Oボタンで決定する +Use output buffer (with overlay) for recording = 記録時に出力バッファを使用する (オーバーレイ付き) +Use system native keyboard = システムネイティブキーボードを使用する +Use X to confirm = Xボタンで決定する +VersionCheck = 新バージョンのPPSSPPをチェックする +WARNING: Android battery save mode is on = 警告: アンドロイドのバッテリーセーブモードがオンになっています +WARNING: Battery save mode is on = 警告: バッテリーセーブモードがオンになっています +YYYYMMDD = 年/月/日 + +[Upgrade] +Details = Details +Dismiss = 無視 +Download = ダウンロード +New version of PPSSPP available = 新しいバージョンのPPSSPPを利用できます diff --git a/assets/lang/jv_ID.ini b/assets/lang/jv_ID.ini new file mode 100644 index 0000000000..23e3fc59ba --- /dev/null +++ b/assets/lang/jv_ID.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = Suoro backend (Wiwiti maneh, req) +AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) +Auto = Otomatis +Device = Device +DSound (compatible) = DSound (kompatibel) +Enable Sound = Ngatifke Suoro +Global volume = Tingkat Volume +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = WASAPI (cepet) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Analog axis sensitivity +Analog Limiter = Analog limiter +Analog Mapper High End = Mapper Analog dhuwur-mburi (sensitivitas sumbu) +Analog Mapper Low End = Mapper Analog sedheng pungkasan (kuwalik deadzone) +Analog Mapper Mode = Analog mapper mode +Analog Stick = Analog stick +AnalogLimiter Tip = When the analog limiter button is pressed +Auto = Otomatis +Auto-centering analog stick = Otomatis Analog stick nang tengah +Auto-hide buttons after seconds = Otomatis tombol ilang +Binds = Binds +Button Opacity = Ketebelan warna tombol +Button style = Gaya tombol +Calibrate D-Pad = Kalibrasi D-Pad +Calibration = Kalibrasi +Classic = Klasik +Combo Key Setting = Persiyapan Setelan Kombo +Combo Key Setup = Persiyapan Tombol Kombo +Confine Mouse = Trap mouse within window/display area +Control Mapping = Pemetaan Kontrol +Custom layout... = Edit Sentuh Kontrol layout... +Customize tilt = Ngatur ngiringake ... +D-PAD = D-Pad +Deadzone Radius = Radius deadzone +DInput Analog Settings = Setelan analog DInput +Disable D-Pad diagonals (4-way touch) = Mateni D-Pad diagonals (4-cara tutul) +Glowing borders = Glowing borders +HapticFeedback = Saran tutul (getar) +Ignore gamepads when not focused = Nglirwakake gamepads nalika ora fokus +Ignore Windows Key = Nglirwakake tombol Windows +Invert Axes = Balekna Sumbu +Invert Tilt along X axis = Balèkna ngiringake bebarengan X sumbu +Invert Tilt along Y axis = Balèkna ngiringake bebarengan Y sumbu +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Setelan kontrol papan ketik +L/R Trigger Buttons = Tombol pemicu L/R +Landscape = Lanskap +Landscape Auto = Landscape auto +Landscape Reversed = Lanskap kebalik +Mouse = Mouse settings +Mouse sensitivity = Mouse sensitivity +Mouse smoothing = Mouse smoothing +MouseControl Tip = You can now map mouse in control mapping screen by pressing the 'M' icon. +None (Disabled) = Ora ana (Ora Aktif) +Off = Mati +OnScreen = Tombol Layar-sentuh +Portrait = Portret +Portrait Reversed = Potret kebalik +PSP Action Buttons = PSP Aksi tombol +Screen Rotation = Rotasi layar +seconds, 0 : off = seconds, 0 = off +Sensitivity = Sensitiv +Show right analog = Show right analog +Show Touch Pause Menu Button = Deleng tombol menu ngaso +Thin borders = Watesan lancip +Tilt Base Radius = Tilt base radius +Tilt Input Type = Ngiringake Tipe input +Tilt Sensitivity along X axis = Ngiringake sensitivitas bebarengan X sumbu +Tilt Sensitivity along Y axis = Ngiringake sensitivitas bebarengan Y sumbu +To Calibrate = Kanggo kalibrasi, sijine piranti ing warata lan pencet "Kalibrasi". +Touch Control Visibility = Visibilitas kontrol sentuh +Use custom right analog = Use custom right analog +Use Mouse Control = Use mouse control +Visibility = Visibilitas +X = X +X + Y = X + Y +XInput Analog Settings = Setelan analog XInput +Y = Y + +[CwCheats] +Cheats = Mbeling +Edit Cheat File = Sunting berkas mbeling +Enable/Disable All = Ngatifke/Pateni Kabeh mbeling +Import Cheats = Njokot soko cheat.db +Options = Pilian +Refresh Rate = Restar rate + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = &Tentang PPSSPP... +Auto = &Otomatis +Backend = Rendering &Backend (Restarts PPSSPP) +Bicubic = &Bicubic +Break = Break +Break on Load = Break on load +Buffered Rendering = &Yakuwi Rendering +Buy Gold = Tuku &Gold +Control Mapping... = Pemetaan Kontrol ... +Debugging = Debu&g +Deposterize = &Deposterize +Direct3D9 = &Direct3D9 +Direct3D11 = Direct3D &11 +Disassembly = &Disassembly... +Discord = Discord +Display Layout Editor = Display layout editor... +Display Rotation = Display rotation +Dump Next Frame to Log = Mbucal Frame Sabanjure kanggo Mlebu +Emulation = &Emulasi +Enable Chat = Enable chat +Enable Cheats = Ngatifke &Cheats (Ngreset Dolanan) +Enable Sound = Ngatifke Suoro +Exit = Metu +Extract File... = E&xtract File... +File = &File +Frame Skipping = &Pigura Skipping +Frame Skipping Type = Frame skipping type +Fullscreen = La&yar wutuh +Game Settings = &Setelan Dolanan +GE Debugger... = GE Debugge&r... +GitHub = Git&Hub +Hardware Transform = &Ndandani Hardware +Help = &Pithulungan +Hybrid = &Hybrid +Hybrid + Bicubic = H&ybrid + Bicubic +Ignore Illegal Reads/Writes = &Nglirwakake Ilegal Maos/nyerat +Ignore Windows Key = Nglirwakake Windows Key +Keep PPSSPP On Top = &PPSSPP tansah ing nduwur +Landscape = Landscape +Landscape reversed = Landscape reversed +Language... = Basa... +Linear = &Linear +Load = &Mbukak... +Load .sym File... = Mbukak .sym File... +Load Map File... = Mbukak file map... +Load State = Mbukak keadaan +Load State File... = &Mbukak file state ... +Log Console = &Konsol Log +Memory View... = Tampilan &Memory... +More Settings... = Setelan sing luwih ... +Nearest = &Nearest +Non-Buffered Rendering = Skip efek buffer (ora yakuwi,luwih cepet) +Off = &Mati +Open Directory... = Mbukak &Direktori... +Open from MS:/PSP/GAME... = Mbukak soko MS:/PSP/GAME... +Open Memory Stick = Mbukak &Memory Stick +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = &Ngaso +Pause When Not Focused = &Ngaso Nalika Ora Fokus +Portrait = Portrait +Portrait reversed = Portrait reversed +Postprocessing Shader = Ngatifke Shader +PPSSPP Forums = &Forum PPSSPP +Record = &Record +Record Audio = Record &audio +Record Display = Record &display +Rendering Mode = M&ode Rendering +Rendering Resolution = &Resolusi +Reset = Ngreset +Reset Symbol Table = &Ngreset Tabel Simbol +Run = &Mbukak +Save .sym File... = Nyimpen File .sym ... +Save Map File... = &Nyimpan File Map... +Save State = Simpen State +Save State File... = &Simpen file state... +Savestate Slot = Kalbu Slot +Screen Scaling Filter = Layar njongko Filter +Show Debug Statistics = Tampilno Statistik Debu&g +Show FPS Counter = Tampilno Penghitung &FPS +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = &Mandek +Switch UMD = Ngalih UMD +Take Screenshot = &Njupuk Takapan-layar +Texture Filtering = Tektur Nyaring +Texture Scaling = Tektur njongko +Use Lossless Video Codec (FFV1) = &Use lossless video codec (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = &Penyimpenan Vertex +VSync = VS&ync +Vulkan = Vulkan +Window Size = &Ukuran Window +www.ppsspp.org = Kunjungi www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allocator viewer (Vulkan) +Allow remote debugger = Allow remote debugger +Backspace = Backspace +Block address = Alamat pemblokiran +By Address = Dening Alamat +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Create/Open textures.ini file for current game +Current = Saiki +Dev Tools = Development tools +DevMenu = DevMenu +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Mbucal EBOOT.BIN decrypted ing boot dolanan +Dump Frame GPU Commands = Mbucal printah pigura GPU +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Ngatifke ngangkut barang +Enter address = Ketik alamat +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Pigura Profiler +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = Jit mbandhingake +JIT debug tools = JIT debug tools +Language = Basa +Load language ini = Mbukak file basa +Log Dropped Frame Statistics = Log dropped frame statistics +Log Level = Tingkat Log +Log View = Tampilan Log +Logging Channels = Saluran ngangkut barang +Next = Sabanjure +No block = Ora pemblokiran +Prev = Sadurunge +Random = Acak +Replace textures = Replace textures +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Apa panjenengan yakin arep mulihake kabeh setelan bali menyang sing awal?Setelan pemetaan Control ora diganti.Avatar sing Rika unggahna ora bisa batalaken iki.monggo miwiti PPSSPP kanggo owah-owahan kanggo ditrapake. +RestoreGameDefaultSettings = Apa panjenengan yakin arep mulihake setelan-game tartamtu back kanggo awal PPSSPP? +Resume = Resume +Run CPU Tests = Mbukak Tes CPU +Save language ini = Simpen berkas basa +Save new textures = Save new textures +Shader Viewer = Tampilan shader +Show Developer Menu = Tampilno menu pengembang +Show on-screen messages = Show on-screen messages +Stats = Stats +System Information = Informasi Sistem +Texture Replacement = Texture replacement +Toggle Audio Debug = Pilian Debug Suoro +Toggle Freeze = Pilian Beku +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP res +Active = Active +Back = Bali +Cancel = Mbatalake +Center = Center +ChangingGPUBackends = Ganti backends GPU mbutuhake PPSSPP kanggo miwiti maneh. Wiwiti maneh saiki? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = Peleh folder penyimpenan PPSSPP +Confirm Overwrite = Njenengan arep Panganggoan data iki? +Confirm Save = Njenengan arep nyimpen data iki? +ConfirmLoad = Mbukak data iki? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Mbusek +Delete all = Mbusek Kabeh +Delete completed = Mbusek rampung. +DeleteConfirm = Data iki arep di busek.\nTetep lanjutkake? +DeleteConfirmAll = Njenengan yakin arep mbusek\nkabeh data penyimpenan dolanan iki? +DeleteConfirmGame = Yakin arep mbusek dolanan iki\nsaka perangkat njenengan? Tindakan iki ora bisa di batalkake. +DeleteConfirmGameConfig = Yakin arep mbusek setelan kanggo dolanan iki? +DeleteFailed = ora dapat mbusek data. +Deleting = Mbusek\nMohon nteni... +Disable All = Disable all +Edit = Edit +Enable All = Enable all +Enter = Ketik +Finish = Rampung +Grid = Grid +Inactive = Inactive +InternalError = An internal error has occurred. +Load = Mbukak +Load completed = Mbukak rampung. +Loading = Mbukak\nMohon nteni... +LoadingFailed = Ora biso mbukak data. +Move = Pindahno +Network Connection = Koneksi Jaringan +NEW DATA = DATA ANYAR +No = Ora +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = He.eh +Old savedata detected = Simpenan lawas terdeteksi +Options = Opsi +Reset = Ngreset +Resize = Ubah Ukuran +Retry = Jajal Maning +Save = Simpen +Save completed = Nyimpen rampung. +Saving = Nyimpen\nMohon nteni... +SavingFailed = Ora biso Nyimpen data. +Select = Peleh +Shift = Shift +Snap = Snap +Space = Spasi +SSID = SSID +Submit = Kerem +Supported = Supported +There is no data = Ora ana data. +Toggle All = Peleh kabeh +Toggle List = Toggle list +Unsupported = Unsupported +When you save, it will load on a PSP, but not an older PPSSPP = Nalika nyimpen, iku bakal mbukak ing PSP,nanging ora PPSSPP lawas +When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Yes = He.eh +Zoom = Gede + +[Error] +7z file detected (Require 7-Zip) = berkas iki terkompres (7z).\nMohon bongkar dahulu (try 7-Zip or WinRAR). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = Ora dapat nyimpen tangkapan layar. +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll not found. Please install. Or press Yes to try again using Direct3D 9 instead. +D3D11InitializationError = Direct3D 11 initialization error +D3D11Missing = Your operating system version does not include D3D11. Please run Windows Update.\n\nPress Yes to try again using Direct3D 9 instead. +D3D11NotSupported = Your GPU does not appear to support Direct3D 11.\n\nWould you like to try again using Direct3D 9 instead? +Disk full while writing data = Disk lengkap nalika nulis data. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = Galat nalika mbukak berkas: +Error reading file = Galat nalika maca berkas. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = Gagal kanggo ngenali berkas +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Failed initializing graphics. Try upgrading your graphics drivers and DirectX 9 runtime.\n\nWould you like to try switching to OpenGL?\n\nError message: +GenericGraphicsError = Graphics Error +GenericOpenGLError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to DirectX 9?\n\nError message: +GenericVulkanError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to OpenGL?\n\nError message: +InsufficientOpenGLDriver = Boten cecek support driver kapan dideteksi \n\ Nyour GPU laporan sing ora ndhukung kapan 2.0. Punapa panjenengan kersa nyoba nggunakake DirectX tinimbang?\n\nDirectX saiki kompatibel karo game kurang,nanging ing GPU iku uga mung pilihan.\n\ nVisit forum ing https://forums.ppsspp.org luwih Alexa.\n\n +Just a directory. = Mung sebuah folder. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = Udu EBOOT.PBP, Dolanan ora dikenal. +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = Galat pada OpenGL driver +PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = Saat iki, PPSSPP ora mendukung koneksi internet kanggo DLC, PSN, utawi pembaruan dolanan. +PS1 EBOOTs are not supported by PPSSPP. = EBOOT PS1 ora bisa dijalankan ing PPSSPP. +PSX game image detected. = Berkas merupakan MODE2 image. PPSSPP ora mendokong dolanan PS1. +RAR file detected (Require UnRAR) = berkas iki terkompres (RAR).\nMohon bongkar dahulu (try UnRAR). +RAR file detected (Require WINRAR) = berkas iki terkompres (RAR).\nMohon bongkar dahulu (try WinRAR). +Running slow: try frameskip, sound is choppy when slow = Running slow: try frameskip, sound is choppy when slow +Running slow: Try turning off Software Rendering = Running slow: try turning off "software rendering" +Save encryption failed. This save won't work on real PSP = Simpenan terenkripsi gagal. Simpenan iki ora dapat berfungsi ing PSP asli. +textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +This is a saved state, not a game. = This is a saved state, not a game. +This is save data, not a game. = This is save data, not a game. +Unable to create cheat file, disk may be full = ora dapat ngawe berkas cheat, penyimpenan lengkap. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Ora dapat nulis simpenan, penyimpenan penuh. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Peringatan: memori Video LENGKAP,ngurangi upscaling lan ngoper menyang mode alon caching. +Warning: Video memory FULL, switching to slow caching mode = Peringatan: Memori Video LENGKAP, ngoper menyang mode alon caching . +ZIP file detected (Require UnRAR) = berkas iki terkompres (ZIP).\nMohon bongkar dahulu (coba UnRAR). +ZIP file detected (Require WINRAR) = berkas iki terkompres (ZIP).\nMohon bongkar dahulu (coba WinRAR). + +[Game] +Asia = Asia +ConfirmDelete = Mbusek +Create Game Config = Nggawe Setelan Dolanan +Create Shortcut = Nggawe Trobosan +Delete Game = Mbusek Dolanan +Delete Game Config = Mbusek Setelan Dolanan +Delete Save Data = Mbusek Simpenan +Europe = Europe +Game = Dolanan +Game Settings = Setelan Dolanan +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Nginstal data +Japan = Japan +Korea = Korea +MB = MB +One moment please... = One moment please... +Play = Muter +Remove From Recent = Mbusek soko "Terakher" +SaveData = Simpen Data +Setting Background = Setting background +Show In Folder = Tampilno Nang Folder +USA = USA +Use UI background = Use UI background + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = unlimited +(supersampling) = (supersampling) +(upscaling) = (upscaling) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Agresif +Alternative Speed = Kacepetan Alternatif +Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Anisotropic Filtering = Penyaring Anisotropis +Auto = Otomatis +Auto (1:1) = Otomatis (1:1) +Auto (same as Rendering) = Otomatis (padha Rendering) +Auto FrameSkip = Frameskip Otomatis +Auto Scaling = Njongko Otomatis +Backend = Backend +Balanced = Imbang +Bicubic = Bicubic +BlockTransfer Tip = Some games require this to be On for correct graphics +BlockTransferRequired = Warning: This game requires "simulate block transfer effects" to be set to On. +Both = Kelorone +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Yakuwi Rendering +BufferedRenderingRequired = Warning: This game requires "rendering mode" to be set to "buffered". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Ukuran layar (ing % saka tampilan) +Cardboard Screen X Shift = X shift (in % of the blank space) +Cardboard Screen Y Shift = Y shift (in % of the blank space) +Cardboard VR Settings = Setelan Karton +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU core +Debugging = Pilian debug +DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. +Deposterize = Deposterisasikan +Deposterize Tip = Fixes visual banding glitches in upscaled textures +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Mateni efek alon (luwih cepet) +Disabled = Disabled +Display layout editor = Tata letak Tampilan editor +Display Resolution (HW scaler) = Resolusi tampilan (HW scaler) +Dump next frame to log = Mbucal pigura jejere log +Enable Cardboard VR = Enable Cardboard VR +FPS = FPS +Frame Rate Control = Kontrol Frame-rate +Frame Skipping = Frame-skip +Frame Skipping Type = Frame skipping type +FullScreen = Layar Penuh +Hack Settings = Retas setelsn (nyebabake glitches) +Hardware Tessellation = Hardware tessellation +Hardware Transform = Ndandani Hardware +hardware transform error - falling back to software = Kesalahan Hardware - Mudhun bali software +HardwareTessellation Tip = Uses hardware to make curves +High = Dhuwur +Hybrid = Hybrid +Hybrid + Bicubic = Hybrid + Bicubic +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Resolusi internal +Lazy texture caching = Caching tektur puguh (Luwih cepet) +Linear = Linear +Low = Kurang +LowCurves = Kualitas kurva Spline/Bezier +LowCurves Tip = Only used by some games, controls smoothness of curves +Lower resolution for effects (reduces artifacts) = Resolusi ngisor kanggo efek (nyuda artefak) +Manual Scaling = Manual njongko +Medium = Sedang +Mode = Mode +Must Restart = Wiwiti maneh PPSSPP kanggo aplikasi setelan. +Native device resolution = Resolusi piranti asal +Nearest = Cedhak +No buffer = No buffer +Non-Buffered Rendering = Skip efek buffer (non-yakuwi,luwih cepet) +None = Ora ana +Number of Frames = Number of frames +Off = Pateni +OpenGL = OpenGL +Overlay Information = Informasi numpuki +Partial Stretch = Partial stretch +Percent of FPS = Percent of FPS +Performance = Kinerja +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Postprocessing shader +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = Mode Rendering +Rendering Resolution = Rendering résolusi +RenderingMode NonBuffered Tip = Faster, but nothing may draw in some games +Retain changed textures = Makaryakke diganti tekstur (kadhangkala luwih alon) +RetainChangedTextures Tip = Makes many games slower, but some games a lot faster +Rotation = Rotasi +Safe = Aman +Screen layout = Screen layout +Screen Scaling Filter = Layar njongko Filter +Show Debug Statistics = Tampilno statistik debug +Show FPS Counter = Tampilno penghitung FPS +Simulate Block Transfer = Simulasi efek transfer pemblokiran +SoftGPU Tip = Currently VERY slow +Software Rendering = Software rendering (jajalan) +Software Skinning = Software skinning +SoftwareSkinning Tip = Combine skinned model draws on the CPU, faster in most games +Speed = Kacepetan +Stretching = Stretching +Texture Filter = Penyaring Tekstur +Texture Filtering = Penyaring Tekstur +Texture Scaling = Skala Tekstur +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Turn off "hardware tessellation": unsupported +Unlimited = Ora Ana Watesan +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = Tingkatan Penaikan-skala +Upscale Type = Jenis Penaikan-skala +UpscaleLevel Tip = CPU heavy - some scaling may be delayed to avoid stutter +Use all displays = Use all displays +Vertex Cache = Penyimpenan Vertex +VertexCache Tip = Faster, but may cause temporary flicker +VSync = VSync +Vulkan = Vulkan +Window Size = Ukuran window +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Mbusek berkas ZIP +Install = Nginstal +Install game from ZIP file? = Nginstal dolanan saka berkas ZIP? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = Keinstal! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = Konfigurasi otomatis +Autoconfigure for device = Konfigurasi otomatis kanggo piranti +Clear All = Ilangi kabeh +Default All = Gawan kabeh +Map a new key for = Petakan tombol anyar +Map Key = Map key +Map Mouse = Map mouse +Test Analogs = Tes Analog +You can press ESC to cancel. = You can press Esc to cancel. + +[MainMenu] +Browse = Nelusuri... +Buy PPSSPP Gold = Buy PPSSPP Gold +Choose folder = Choose folder +Credits = Penghargaan +PPSSPP Homebrew Store = PPSSPP Homebrew toko +Exit = Metu +Game Settings = Setelan Dolanan +Games = Dolanan +Give PPSSPP permission to access storage = Menehi PPSSPP ijin kanggo ngakses panyimpenan +Homebrew & Demos = Homebrew && Demo +How to get games = Dapatno dolanan +How to get homebrew & demos = Cara mendapatkan Homebrew && demo +Load = Mbukak... +Loading... = Loading... +PinPath = Pin +PPSSPP can't load games or save right now = PPSSPP can't load games or save right now +Recent = Terakher +SavesAreTemporary = PPSSPP is saving in temporary storage +SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently +SavesAreTemporaryIgnore = Ignore warning +UnpinPath = Unpin +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Suoro +Controls = Kontrol +Graphics = Tampilan +Networking = Jaringan +System = Sistem +Tools = Alat + +[MappableControls] +Alt speed 1 = Alt speed 1 +Alt speed 2 = Alt speed 2 +An.Down = An.Ngisor +An.Left = An.Kiri +An.Right = An.Kanan +An.Up = An.Nduwur +Analog limiter = Analog limiter +Analog Stick = Analog stick +Audio/Video Recording = Audio/Video recording +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Axis swap +Circle = Circle +Cross = Cross +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = DevMenu +Down = Ngisor +Dpad = Dpad +Frame Advance = Frame advance +Hold = Hold +Home = Home +L = L +Left = Kiri +Load State = Mbukak Keadaan +Mute toggle = Mute toggle +Next Slot = Next Slot +None = None +Note = Note +OpenChat = Open chat +Pause = Ngaso +R = R +RapidFire = RapidFire +Remote hold = Remote hold +Rewind = Rewind +Right = Kanan +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = AnKanan.Ngisor +RightAn.Left = AnKanan.Kiri +RightAn.Right = AnKanan.Kanan +RightAn.Up = AnKanan.Nduwur +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Simpen State +Screen = Screen +Screenshot = Screenshot +Select = Select +SpeedToggle = Pilian Kacepetan +Square = Square +Start = Start +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = Toggle fullscreen +Toggle mode = Toggle mode +Triangle = Triangle +Unthrottle = Unthrottle +Up = Nduwur +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Kunjungi forum Ad Hoc Multiplayer +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Ubah alamat MAC +Change proAdhocServer Address = Ubah alamat pelayan IP PRO ad hoc (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Ngatifke pelayan PRO ad hoc bawaan +Enable network chat = Enable network chat +Enable networking = Ngatifke jaringan/WLAN (beta, mungkin ngrusak dolanan) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Jaringan diinisiasi +Please change your Port Offset = Please change your port offset +Port offset = Port offset(0 = PSP compatibility) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Send Discord "Rich Presence" information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = Mbeling +Continue = Terusno +Create Game Config = Nggawe Setelan Dolanan +Delete Game Config = Mbusek Setelan Dolanan +Exit to menu = Metu ing Menu +Game Settings = Setelan Dolanan +Load State = Mbukak Keadaan +Rewind = Rewind +Save State = Simpen Keadaan +Settings = Setelan +Switch UMD = Ngalih UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Color +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Kartun +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT scanlines +FXAA = FXAA Antialiasing +Gamma = Gamma +Grayscale = Keabu-abuan +Intensity = Intensity +InverseColors = Warna kebalik +Natural = Warna Natural +NaturalA = Natural Colors (no blur) +Off = Ora Aktif +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlines (CRT) +Sharpen = Sharpen +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 Upscaler +VideoSmoothingAA = VideoSmoothingAA +Vignette = Vignette + +[PSPCredits] +all the forum mods = all the forum mods +build server = build server +Buy Gold = Tuku versi Emas (Gold) +check = Ndeleng pula Dolphin, emulator Wii/GC terapik saat iki: +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = Kontributor: +created = Digawe oleh +Discord = Discord +info1 = PPSSPP iki project gol pendidikan. +info2 = Priksa manawa sampeyan sah duwe dolanan +info3 = Sampeyan muter duwe UMD utawa tuku digital +info4 = ing toko PSN ing PSP asli. +info5 = PSP iku merek dagang soko Sony, Inc. +iOS builds = iOS builds +license = Perangkat lunak gratis berlisensi GPL 2.0+ +list = Daftar Kompatibilitas, forum, karo informasi perkembangan +PPSSPP Forums = Forum PPSSPP +Privacy Policy = Privacy policy +Share PPSSPP = Sebar PPSSPP +specialthanks = Ucapan matur nuwun kepada: +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = Diterjemahkan ke Basa Jawa oleh: Endarko +title = Emulator PSP sing cepet lan Portable +tools = Peralatan gratis sing digunakan: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = +translators2 = +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Ngunjungi situs web kita: +written = Ditulis dalam C++ Kanggo kacepetan lan portabilitas + +[RemoteISO] +Browse Games = Browse games +Local Server Port = Local server port +Manual Mode Client = Manual mode client +Remote disc streaming = Remote disc streaming +Remote Port = Remote port +Remote Server = Remote server +Remote Subdirectory = Remote subdirectory +RemoteISODesc = Games in your recent list will be shared +RemoteISOLoading = Connected, loading game list... +RemoteISOScanning = Scanning... Click "share games" on your server device +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Note: Connect both devices to the same Wi-Fi network +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Settings +Share Games (Server) = Share games (server) +Share on PPSSPP startup = Share on PPSSPP startup +Stop Sharing = Stop sharing +Stopping.. = Stopping... + +[Reporting] +Bad = Buruk +FeedbackDelayInfo = Your data is being submitted in the background. +FeedbackDesc = Bagaimana emulasinya? Beritahu komunitas! +FeedbackDisabled = Compatibility server reports must be enabled. +FeedbackIncludeCRC = Note: Battery will be used to send a disc CRC +FeedbackIncludeScreen = Include a screenshot +FeedbackSubmitDone = Your data has been submitted. +FeedbackSubmitFail = Could not submit data to server. Try updating PPSSPP. +FeedbackThanks = Thanks for your feedback! +Gameplay = Gameplay +Graphics = Tampilan +Great = Sangat Apik +In-game = In-game +In-game Description = Gets into gameplay, but too buggy to complete +Menu/Intro = Menu/Intro +Menu/Intro Description = Can't get into the game itself +Nothing = Ora Ana +Nothing Description = Completely broken +OK = Oke +Open Browser = Mbukak peramban web +Overall = Secara keseluruhan +Perfect = Sempurna +Perfect Description = Flawless emulation for the entire game - great! +Plays = Dapat dimainkan +Plays Description = Fully playable but might be with glitches +ReportButton = Laporkan umpan balik +Speed = Kacepetan +Submit Feedback = Kerem umpan balik +SuggestionConfig = See reports on website for good settings. +SuggestionCPUSpeed0 = Disable locked CPU speed setting. +SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this bug). +SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. +SuggestionsNone = This game isn't working for other users too. +SuggestionsWaiting = Submitting and checking other users feedback... +SuggestionUpgrade = Upgrade to a newer PPSSPP build. +SuggestionVerifyDisc = Check your ISO is a good copy of your disc. +Unselected Overall Description = How well does this game emulate? +View Feedback = View all feedbacks + +[Savedata] +Date = Date +Filename = Filename +No screenshot = Ora ana tangkapan layar +None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Save Data = Simpen data +Save States = Simpen states +Savedata Manager = SimpenData Manager +Size = Size + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = PERINGATAN: Chainfire3D terdeteksi, mungkin menyebabkan masalah. +Failed to load state = Failed to load state +Failed to save state = Failed to save state +fixed = Kecepatan: ora-tetep +GLToolsWarning = PERINGATAN: GLTools terdeteksi, mungkin menyebabkan masalah. +In menu = In menu +Load savestate failed = Load savestate failed +Loaded State = Penyimpenan-cepet dimuat +Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +LoadStateDoesntExist = Gagal memuat: File simpen-cepet ora kasedhiya! +LoadStateWrongVersion = Gagal memuat: File simpen-cepet iki kanggi versi lawas PPSSPP! +norewind = No rewind save states available. +Playing = Playing +PressESC = Tekan ESC kanggo ing Menu. +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = Gagal memuat-cepet! +Saved State = Penyimpenan-cepet berhasil +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Speed: alternate 2 +standard = Kacepetan: standar +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = Mpun terpasang +Connection Error = Galat koneksi +Install = Nginstal +Launch Game = Bukak Dolanan +Loading... = Nteni... +MB = MB +Size = Ukuran +Uninstall = Copot + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d cores) +%d bytes = %d bytes +(none detected) = (none detected) +3D API = 3D API +ABI = ABI +API Version = API version +Audio Information = Audio information +Board = Board +Build Config = Build config +Build Configuration = Build Configuration +Built by = Built by +Core Context = Core context +Cores = Cores +CPU Extensions = CPU extensions +CPU Information = CPU information +CPU Name = Name +D3DCompiler Version = D3DCompiler version +Debug = Debug +Debugger Present = Debugger present +Device Info = Device info +Display Information = Display information +Driver Version = Driver version +EGL Extensions = EGL extensions +Frames per buffer = Frames per buffer +GPU Information = GPU information +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Lang/Region +Memory Page Size = Memory page size +Native Resolution = Native resolution +OGL Extensions = OGL extensions +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 extensions +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 extensions +OpenGL Extensions = OpenGL extensions +Optimal frames per buffer = Optimal frames per buffer +Optimal sample rate = Optimal sample rate +OS Information = OS information +PPSSPP build = PPSSPP build +Refresh rate = Refresh rate +Release = Release +RW/RX exclusive = RW/RX exclusive +Sample rate = Sample rate +Shading Language = Shading language +Sustained perf mode = Sustained perf mode +System Information = System information +System Name = Name +System Version = System version +Threads = Threads +Vendor = Vendor +Vendor (detected) = Vendor (detected) +Version Information = Version information +Vulkan Extensions = Vulkan extensions +Vulkan Features = Vulkan features + +[System] +(broken) = (broken) +12HR = 12-Jam +24HR = 24-Jam +Auto = Otomatis +Auto Load Savestate = Auto load savestate +AVI Dump started. = AVI dump started +AVI Dump stopped. = AVI dump stopped +Cache ISO in RAM = Cache lengkap ISO ing RAM +Change CPU Clock = Ganti CPU Clock (unstable) +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Ganti Jeneng +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = Cheat (jajalan, deleng forum) +Clear Recent = Clear "Recent" +Clear Recent Games List = Ilangi daftar terakher dimainkan +Clear UI background = Clear UI background +Confirmation Button = Tombol konfirmasi +Date Format = Format tanggal +Day Light Saving = Batu Awet +DDMMYYYY = HHBBTTTT +Decrease size = Decrease size +Developer Tools = Pengembang Pribadi +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emulasi +Enable Cheats = Ngatifke Cheat +Enable Compatibility Server Reports = Ngatifke laporan kompatibilitas ing Server +Failed to load state. Error in the file system. = Gagal kanggo mbukak negara. Kesalahan ing sistem file. +Failed to save state. Error in the file system. = Failed to save state. Error in the file system. +Fast (lag on slow storage) = Cepet (lag on slow storage) +Fast Memory = Memory cepet (ora stabil) +Force real clock sync (slower, less lag) = Pasukan jam nyata sink (alon, kurang lag) +frames, 0:off = frames, 0 = off +Games list settings = Games list settings +General = Umum +Grid icon size = Grid icon size +Help the PPSSPP team = Bantu tim PPSSPP +Host (bugs, less lag) = Host (bugs, less lag) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Interpreter +IO timing method = IO wektu method +IR Interpreter = IR interpreter +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = Memory Stick inserted +MHz, 0:default = MHz, 0 = Gawan +MMDDYYYY = BBHHTTTT +Newest Save = Newest save +Not a PSP game = Ora ana dolanan PSP +Off = Mati +Oldest Save = Oldest save +PSP Model = PSP model +PSP Settings = Setelan PSP +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Record audio +Record Display = Record display +Reset Recording on Save/Load State = Reset recording on Save/Load state +Restore Default Settings = Mulihake setelan PPSSPP kanggo gawan +Rewind Snapshot Frequency = Frekuensi gambar asli seko mundur (mem hog) +Save path in installed.txt = Nyimpen path ing installed.txt +Save path in My Documents = Nyimpen path ing Dokumen kulo +Savestate Slot = Savestate slot +Savestate slot backups = Savestate slot backups +Screenshots as PNG = Gambar minangka PNG +Set UI background... = Set UI background... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Simulasi UMD telat +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Penyimpenan lengkap +Sustained performance mode = Sustained performance mode +Time Format = Format wektu +UI = Antarmuka Panganggo +UI Sound = Swara Antarmuka Panganggo +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) +Use O to confirm = Gunakake O kanggo konfirmasi +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = Gunakake X kanggo konfirmasi +VersionCheck = Cek versi anyar PPSSPP +WARNING: Android battery save mode is on = WARNING: Android battery save mode is On +WARNING: Battery save mode is on = WARNING: Battery save mode is on +YYYYMMDD = TTTTBBHH + +[Upgrade] +Details = Details +Dismiss = Ngilangi +Download = Unduh +New version of PPSSPP available = Versi anyar PPSSPP mpun ono monggo di comot diff --git a/assets/lang/ko_KR.ini b/assets/lang/ko_KR.ini new file mode 100644 index 0000000000..98d8da8214 --- /dev/null +++ b/assets/lang/ko_KR.ini @@ -0,0 +1,1074 @@ +[Audio] +Alternate speed volume = 대체 속도 볼륨 +Audio backend = 오디오 처리자 (재시작 필요) +AudioBufferingForBluetooth = 블루투스 친화적 버퍼링 (느림) +Auto = 자동 +Device = 장치 +DSound (compatible) = DSound (호환됨) +Enable Sound = 사운드 활성화 +Global volume = 전역 볼륨 +Microphone = Microphone +Microphone Device = Microphone device +Mute = 음소거 +Switch on new audio device = 새로운 오디오 장치로 전환 +Use global volume = 전역 볼륨 사용 +WASAPI (fast) = WASAPI (빠름) + +[Controls] +Analog auto-rotation speed = 아날로그 자동 회전 속도 +Analog Axis Sensitivity = 아날로그 축 민감도 +Analog Limiter = 아날로그 제한 +Analog Mapper High End = 아날로그 매퍼 high-end (축 감도) +Analog Mapper Low End = 아날로그 매퍼 low-end (데드존 반전) +Analog Mapper Mode = 아날로그 매퍼 모드 +Analog Stick = 아날로그 스틱 +AnalogLimiter Tip = 아날로그 제한 버튼이 눌러졌을 때 아날로그를 제한합니다. +Auto = 자동 +Auto-centering analog stick = 아날로그 스틱 자동으로 중앙 고정 +Auto-hide buttons after seconds = 버튼 자동 숨김 +Binds = Binds +Button Opacity = 버튼 투명도 +Button style = 버튼 스타일 +Calibrate D-Pad = 십자 패드 보정 +Calibration = 보정 +Classic = 클래식 +Combo Key Setting = 콤보 키 설정 +Combo Key Setup = 콤보 키 설정하기 +Confine Mouse = 창/화면 안에 커서를 가두기 +Control Mapping = 컨트롤 맵핑 +Custom layout... = 터치 컨트롤 레이아웃 편집... +Customize tilt = 기울기 사용자화... +D-PAD = 십자 패드 +Deadzone Radius = 데드존 범위 +DInput Analog Settings = DInput 아날로그 설정 (다이렉트 인풋) +Disable D-Pad diagonals (4-way touch) = 십자 패드 대각선 비활성 (4방향 터치) +Glowing borders = 빛나는 테두리 +HapticFeedback = 햅틱 피드백 (진동) +Ignore gamepads when not focused = 창이 활성화 되지 않았을 때 게임패드 무시 +Ignore Windows Key = 윈도우 키 무시 +Invert Axes = 축 반전 +Invert Tilt along X axis = X축 기울기 반전 +Invert Tilt along Y axis = Y축 기울기 반전 +Keep this button pressed when right analog is pressed = 오른쪽 아날로그가 눌렸을 때 이 버튼을 눌리게끔 유지 +Keyboard = 키보드 조작 설정 +L/R Trigger Buttons = L/R 트리거 버튼 +Landscape = 가로 +Landscape Auto = 가로 자동 +Landscape Reversed = 가로 반전 +Mouse = 마우스 설정 +Mouse sensitivity = 마우스 민감도 +Mouse smoothing = 마우스 가속도(Smoothing) +MouseControl Tip = 'M' 아이콘을 눌러 조작 매핑 화면에 들어가 마우스를 매핑할 수 있습니다. +None (Disabled) = 없음 (비활성) +Off = 끄기 +OnScreen = 화면 터치 컨트롤 +Portrait = 세로 +Portrait Reversed = 세로 반전 +PSP Action Buttons = PSP 액션 버튼 +Screen Rotation = 화면 회전 +seconds, 0 : off = 초 단위, 0 : 끄기 +Sensitivity = 민감도 +Show right analog = 오른쪽 아날로그 보기 +Show Touch Pause Menu Button = 일시 정지 메뉴 버튼 표시 +Thin borders = 얇은 테두리 +Tilt Base Radius = Tilt base radius +Tilt Input Type = 기울기 입력 방식 +Tilt Sensitivity along X axis = X축 기울기 민감도 +Tilt Sensitivity along Y axis = Y축 기울기 민감도 +To Calibrate = 보정하려면, 기기를 평평한 곳에 놓고 "보정"을 눌러주십시오. +Touch Control Visibility = 터치 컨트롤 표시 +Use custom right analog = 사용자 정의 오른쪽 아날로그 사용 +Use Mouse Control = 마우스 사용하기 +Visibility = 표시 +X = X +X + Y = X + Y +XInput Analog Settings = XInput 아날로그 설정 (Xbox 계열 컨트롤러) +Y = Y + +[CwCheats] +Cheats = 치트 +Edit Cheat File = 치트 파일 편집 +Enable/Disable All = 모든 치트 활성화/비활성화 +Import Cheats = 치트 가져오기 (cheat.db에서) +Options = 옵션 +Refresh Rate = 재생률 + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +Font = NanumGothic +About PPSSPP... = PPSSPP 정보(&A)... +Auto = 자동(&A) +Backend = 렌더링 처리자(&B) (PPSSPP 재시작) +Bicubic = 쌍입방(&B) +Break = 중단 +Break on Load = 불러올 때 중단 +Buffered Rendering = 버퍼링된 렌더링(&B) +Buy Gold = 골드 버전 구매(&G) +Control Mapping... = 컨트롤 맵핑(&O)... +Debugging = 디버그(&D) +Deposterize = 색조 융합(&D) +Direct3D9 = Direct3D 9(&D) +Direct3D11 = Direct3D &11 +Disassembly = 역어셈블리(&D)... +Discord = Discord +Display Layout Editor = 화면 레이아웃 편집기... +Display Rotation = 화면 회전 +Dump Next Frame to Log = 로그에 다음 프레임 덤프(&U) +Emulation = 에뮬레이션(&E) +Enable Chat = 대화 활성화 +Enable Cheats = 치트 활성화(&C) +Enable Sound = 사운드 활성화(&O) +Exit = 종료(&X) +Extract File... = 파일 추출(&X)... +File = 파일(&F) +Frame Skipping = 프레임 생략(&F) +Frame Skipping Type = 프레임 생략 유형 +Fullscreen = 전체 화면(&L) +Game Settings = 게임 설정(&G) +GE Debugger... = GE 디버거(&R)... +GitHub = Git&Hub +Hardware Transform = 하드웨어 변환(&H) +Help = 도움말(&H) +Hybrid = 혼합(&H) +Hybrid + Bicubic = 혼합 + 쌍입방(&Y) +Ignore Illegal Reads/Writes = 잘못된 읽기/쓰기 무시(&I) +Ignore Windows Key = 윈도우 키 무시 +Keep PPSSPP On Top = PPSSPP 항상 위에 표시(&K) +Landscape = 가로 +Landscape reversed = 가로 반전 +Language... = 언어(&N)... +Linear = 선형 필터링(&L) +Load = 불러오기(&L)... +Load .sym File... = sym 파일 불러오기(&A)... +Load Map File... = 맵 파일 불러오기(&M)... +Load State = 상태 불러오기(&O) +Load State File... = 상태 파일 불러오기(&L)... +Log Console = 콘솔 로그(&L) +Memory View... = 메모리 뷰(&V)... +More Settings... = 기타 설정(&M)... +Nearest = 근접 필터링(&N) +Non-Buffered Rendering = 버퍼 없는 렌더링(&S) +Off = 끄기(&O) +Open Directory... = 디렉터리 열기(&D)... +Open from MS:/PSP/GAME... = MS:/PSP/GAME에서 열기(&P)... +Open Memory Stick = 메모리 스틱 열기(&M) +Open New Instance = Open new instance +OpenGL = OpenGL(&O) +Pause = 일시 정지(&P) +Pause When Not Focused = 포커싱되지 않았을 때 일시 정지(&P) +Portrait = 세로 +Portrait reversed = 세로 반전 +Postprocessing Shader = 후처리 셰이더(&G) +PPSSPP Forums = PPSSPP 포럼(&F) +Record = 기록(&R) +Record Audio = 소리 녹음(&A) +Record Display = 영상 녹화(&D) +Rendering Mode = 렌더링 방식(&O) +Rendering Resolution = 렌더링 해상도(&R) +Reset = 리셋(&E) +Reset Symbol Table = 심볼 테이블 리셋(&Y) +Run = 실행(&R) +Save .sym File... = sym 파일 저장하기(&E)... +Save Map File... = 맵 파일 저장하기(&S)... +Save State = 상태 저장하기(&A) +Save State File... = 상태 파일 저장하기(&S)... +Savestate Slot = 상태 저장 슬롯(&T) +Screen Scaling Filter = 화면 크기 조절 필터(&E) +Show Debug Statistics = 디버그 통계 표시(&G) +Show FPS Counter = FPS 카운터 표시(&F) +Skip Number of Frames = 프레임 수 생략 +Skip Percent of FPS = FPS 비율 생략 +Stop = 정지(&S) +Switch UMD = UMD 교체 +Take Screenshot = 스크린샷 찍기(&T) +Texture Filtering = 텍스처 필터링(&X) +Texture Scaling = 텍스처 크기 조절(&T) +Use Lossless Video Codec (FFV1) = 무손실 비디오 코덱 사용 (FFV1)(&U) +Use output buffer for video = 비디오에 출력 버퍼 사용 +Vertex Cache = 버텍스 캐시(&V) +VSync = 수직 동기(&Y) +Vulkan = 벌칸(Vulkan) +Window Size = 창 크기(&W) +www.ppsspp.org = www.ppsspp.org 방문(&P) +xBRZ = xBRZ(&X) + +[Developer] +Allocator Viewer = 할당기(Allocator) 뷰어 (Vulkan) +Allow remote debugger = 원격 디버거 허용 +Backspace = 백스페이스 +Block address = 주소를 차단 +By Address = 주소로 +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = 현재 게임의 textures.ini 파일 생성 및 열기 +Current = 현재 +Dev Tools = 개발자 도구 +DevMenu = 개발 메뉴 +Disabled JIT functionality = 비활성화 된 JIT 기능 +Draw Frametimes Graph = 프레임 레이트 그래프 그리기 +Dump Decrypted Eboot = 게임 부팅 시 복호화된 EBOOT.BIN 덤프 (암호화 되어 있는 경우) +Dump Frame GPU Commands = 프레임 GPU 명령어를 덤프 +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = 디버그 로깅 활성화 +Enter address = 주소 입력 +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = 프레임 프로파일러 +GPU Driver Test = GPU 드라이버 테스트 +GPU Profile = GPU 프로파일 +Jit Compare = JIT 비교 +JIT debug tools = JIT 디버그 툴 +Language = 언어 +Load language ini = 언어 ini 불러오기 +Log Dropped Frame Statistics = 프레임 저하 통계 기록하기 +Log Level = 로그 깊이 +Log View = 로그 보기 +Logging Channels = 로깅 채널 +Next = 다음 +No block = 블록 없음 +Prev = 이전 +Random = 랜덤 +Replace textures = 텍스처 덮어쓰기 +Reset limited logging = Reset limited logging +RestoreDefaultSettings = 모든 설정을 다시 기본으로 복원 하시겠습니까?\n컨트롤 맵핑 설정은 변경되지 않습니다.\n\n\n이 작업은 되돌릴 수 없습니다.\n변경 사항을 적용하기 위해 PPSSPP를 재시작해 주십시오. +RestoreGameDefaultSettings = 게임 지정 설정을 다시\nPPSSPP 기본 설정으로 복원하시겠습니까? +Resume = Resume +Run CPU Tests = CPU 테스트 실행 +Save language ini = 언어 ini 저장하기 +Save new textures = 새로운 텍스처 저장 +Shader Viewer = 셰이더 뷰어 +Show Developer Menu = 개발자 메뉴 표시 +Show on-screen messages = Show on-screen messages +Stats = 상태 +System Information = 시스템 정보 +Texture Replacement = 텍스처 교체하기 +Toggle Audio Debug = 오디오 디버그 토글 +Toggle Freeze = 토글 프리징 +Touchscreen Test = 터치 스크린 테스트 +VFPU = VFPU + +[Dialog] +* PSP res = * PSP 리소스 +Active = 활성화 +Back = 뒤로 +Cancel = 취소 +Center = 중앙 +ChangingGPUBackends = GPU 처리자를 변경하기 위해서는 PPSSPP를 재시작해야 합니다. 재시작할까요? +ChangingInflightFrames = 그래픽 커멘드 버퍼링을 변경하기 위해서는 PPSSPP를 재시작해야 합니다. 재시작할까요? +Channel: = Channel: +Choose PPSSPP save folder = PPSSPP 저장 폴더 선택 +Confirm Overwrite = 데이터를 덮어쓰시겠습니까? +Confirm Save = 이 데이터를 저장하시겠습니까? +ConfirmLoad = 이 데이터를 불러오시겠습니까? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = 삭제 +Delete all = 전체 삭제 +Delete completed = 삭제를 완료했습니다. +DeleteConfirm = 이 데이터는 삭제됩니다.\n계속하시겠습니까? +DeleteConfirmAll = 이 게임에 대한 모든 저장 데이터를\n삭제하시겠습니까? +DeleteConfirmGame = 이 게임을 정말로 당신의 장치에서\n삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다. +DeleteConfirmGameConfig = 이 게임의 설정을 정말로 삭제하시겠습니까? +DeleteFailed = 삭제할 수 없습니다. +Deleting = 삭제 중입니다.\n잠시 기다려 주세요... +Disable All = 모두 비활성화 +Edit = Edit +Enable All = 모두 활성화 +Enter = 결정 +Finish = 완료 +Grid = 격자 +Inactive = 비활성화 +InternalError = An internal error has occurred. +Load = 불러오기 +Load completed = 불러오기를 완료했습니다. +Loading = 불러오는 중입니다.\n잠시 기다려 주세요... +LoadingFailed = 불러올 수 없습니다. +Move = 이동 +Network Connection = 네트워크 연결 +NEW DATA = 새로운 데이터 +No = 아니오 +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = 확인 +Old savedata detected = 구 버전 저장 데이터 감지됨 +Options = 옵션 +Reset = 리셋 +Resize = 크기 조정 +Retry = 다시 시도 +Save = 저장하기 +Save completed = 저장을 완료했습니다. +Saving = 저장 중입니다.\n잠시 기다려 주세요... +SavingFailed = 저장할 수 없습니다. +Select = 선택 +Shift = 전환 +Snap = Snap +Space = 스페이스 +SSID = SSID +Submit = 전송 +Supported = 지원 +There is no data = 데이터가 없습니다. +Toggle All = 전체 선택 +Toggle List = Toggle list +Unsupported = 지원되지 않음 +When you save, it will load on a PSP, but not an older PPSSPP = 저장할 경우 PSP에서는 불러올 수 있지만 구 버전의 PPSSPP에서는 불러올 수 없습니다. +When you save, it will not work on outdated PSP Firmware anymore = 저장할 경우 더 이상 구 버전의 PSP 펌웨어에서는 작동하지 않을 것입니다. +Yes = 네 +Zoom = 확대 + +[Error] +7z file detected (Require 7-Zip) = 파일이 7z 형식으로 압축되어 있습니다.\n먼저 압축을 해제해 주십시오. (7-Zip 또는 WinRAR) +A PSP game couldn't be found on the disc. = 디스크에서 PSP 게임을 찾을 수 없습니다. +Cannot boot ELF located outside mountRoot. = 삽입된 Root 이외의 경로에 위치한 ELF는 부팅할 수 없습니다. +Could not save screenshot file = 스크린샷 파일을 저장할 수 없습니다. +D3D9or11 = Direct3D 9를 사용할까요? ("아니오"를 선택할 경우 Direct3D 11를 사용합니다.) +D3D11CompilerMissing = D3DCompiler_47.dll 을 찾을 수 없었습니다. 설치한 후 재시도하거나 대신 예 버튼을 눌러 Direct3D 9 를 사용할 수 있습니다. +D3D11InitializationError = Direct3D 11 초기화 오류 +D3D11Missing = 현재 사용중인 OS가 D3D11을 포함하지 않고 있습니다. 업데이트를 진행해 보십시오.\n\n예를 눌러 Direct3D 9를 대신 사용합니다. +D3D11NotSupported = 현재 사용중인 GPU가 Direct3D 11을 지원하지 않습니다.\n\n예를 눌러 Direct3D 9를 대신 사용할 수 있습니다. +Disk full while writing data = 데이터를 쓰는 도중 디스크가 가득 찼습니다. +ELF file truncated - can't load = ELF 파일이 불완전합니다 - 불러올 수 없습니다. +Error loading file = 파일 불러오는 중 오류 : +Error reading file = 파일을 읽는 동안 오류가 발생했습니다. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = 파일을 식별하는데 실패했습니다. +Failed to load executable: = 실행 파일을 불러오는데 실패했습니다: +File corrupt = 파일이 손상되었습니다. +Game disc read error - ISO corrupt = 게임 디스크 읽기 오류: ISO 파일이 손상되었습니다. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Direct 3D 9 그래픽 초기화에 실패했습니다. 그래픽 드라이버와 DirectX 9 런타임을 업데이트해 보십시오.\n\nOpenGL으로 전환해 보시겠습니까?\n\오류 메시지: +GenericGraphicsError = 그래픽 오류 +GenericOpenGLError = OpenGL 그래픽 초기화에 실패했습니다. 그래픽 드라이버를 업데이트해 보십시오.\n\nDirectX 9로 전환해 보시겠습니까?\n\n오류 메시지: +GenericVulkanError = Vulkan 그래픽 초기화에 실패했습니다. 그래픽 드라이버를 업데이트해 보십시오.\n\nOpenGL으로 전환해 보시겠습니까?\n\n오류 메시지: +InsufficientOpenGLDriver = OpenGL 드라이버 지원 부족 감지!\n\n현재 PPSSPP를 실행하는데 필요한 OpenGL 2.0을 지원하지 않는 것 같습니다.\n\n당신의 GPU가 OpenGL 2.0과 호환되는지 확인해 주십시오. 호환되는 경우, 당신의 GPU 공급업체의 웹사이트에서 새로운 그래픽 드라이버를 찾아서 설치해야 합니다.\n\n자세한 내용은 https://forums.ppsspp.org 포럼을 방문하십시오. +Just a directory. = 디렉토리 입니다. +Missing key = 키가 누락되었습니다. +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = EBOOT.PBP가 없으면, 게임을 식별할 수 없습니다. +Not a valid disc image. = 유효한 디스크 이미지가 아닙니다. +OpenGLDriverError = OpenGL 드라이버 오류 +PPSSPP doesn't support UMD Music. = PPSSPP는 UMD 음악을 지원하지 않습니다. +PPSSPP doesn't support UMD Video. = PPSSPP는 UMD 비디오를 지원하지 않습니다. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP는 현재 DLC, PSN, 게임 업데이트에 대한 인터넷 연결을 지원하지 않습니다. +PS1 EBOOTs are not supported by PPSSPP. = PS1 EBOOTs는 PPSSPP에서 지원되지 않습니다. +PSX game image detected. = MODE2 이미지 파일입니다. PPSSPP는 PS1 게임을 지원하지 않습니다. +RAR file detected (Require UnRAR) = 파일이 RAR 형식으로 압축되어 있습니다.\n먼저 압축을 해제해 주십시오. (UnRAR로 시도) +RAR file detected (Require WINRAR) = 파일이 RAR 형식으로 압축되어 있습니다.\n먼저 압축을 해제해 주십시오. (WinRAR로 시도) +Running slow: try frameskip, sound is choppy when slow = 느리게 작동 중입니다: 게임 소리가 제대로 재생되지 않을 경우 프레임 스킵을 시도해 보십시오. +Running slow: Try turning off Software Rendering = 느리게 작동 중입니다: 소프트웨어 렌더링 모드를 해제해 보십시오. +Save encryption failed. This save won't work on real PSP = 저장 파일 암호화에 실패했습니다. 이 저장 파일은 실제 PSP상에서 동작하지 않을 것입니다. +textures.ini filenames may not be cross-platform = 다른 운영체제의 "textures.ini" 파일을 사용할 수 없습니다. +This is a saved state, not a game. = 게임이 아닌 상태 저장 파일입니다. 게임 파일을 선택해 주십시오. +This is save data, not a game. = 게임이 아닌 저장 파일입니다. 게임 파일을 선택해 주십시오. +Unable to create cheat file, disk may be full = 치트 파일을 생성할 수 없습니다. 디스크 용량이 꽉 찼을 수도 있습니다. +Unable to initialize rendering engine. = 렌더링 엔진을 초기화할 수 없습니다. +Unable to write savedata, disk may be full = 저장 파일을 작성할 수 없습니다. 디스크 용량이 꽉 찼을 수도 있습니다. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = 경고: 비디오 메모리가 꽉 찼습니다. 업스케일링을 줄이고 느린 캐시 모드로 전환합니다. +Warning: Video memory FULL, switching to slow caching mode = 경고: 비디오 메모리가 꽉 찼습니다. 느린 캐시 모드로 전환합니다. +ZIP file detected (Require UnRAR) = 파일이 ZIP 형식으로 압축되어 있습니다.\n먼저 압축을 해제해 주십시오. (UnRAR로 시도) +ZIP file detected (Require WINRAR) = 파일이 ZIP 형식으로 압축되어 있습니다.\n먼저 압축을 해제해 주십시오. (WinRAR로 시도) + +[Game] +Asia = 아시아 +ConfirmDelete = 삭제 +Create Game Config = 게임 설정파일 만들기 +Create Shortcut = 바로가기 만들기 +Delete Game = 게임 삭제 +Delete Game Config = 게임 설정파일 삭제 +Delete Save Data = 저장 데이터 삭제 +Europe = 유럽 +Game = 게임 +Game Settings = 게임 설정 +Homebrew = 홈브류 +Hong Kong = 홍콩 +InstallData = 데이터 설치 +Japan = 일본 +Korea = 대한민국 +MB = MB +One moment please... = 잠시만 기다려 주세요... +Play = 재생 +Remove From Recent = 최근 기록 제거 +SaveData = 저장 데이터 +Setting Background = 배경화면 설정 +Show In Folder = 폴더에 표시 +USA = 북미 +Use UI background = UI 배경화면 사용 + +[Graphics] +% of the void = 무효 영역의 백분율 +% of viewport = 뷰포트의 백분율 +%, 0:unlimited = %, 0 = 무제한 +(supersampling) = (슈퍼 샘플링) +(upscaling) = (업스케일링) +1x PSP = PSP 1배 +2x = 2배 +2x PSP = PSP 2배 +3x = 3배 +3x PSP = PSP 3배 +4x = 4배 +4x PSP = PSP 4배 +5x = 5배 +5x PSP = PSP 5배 +6x PSP = PSP 6배 +7x PSP = PSP 7배 +8x = 8배 +8x PSP = PSP 8배 +9x PSP = PSP 9배 +10x PSP = PSP 10배 +16x = 16배 +Aggressive = 급격한 +Alternative Speed = 대체 속도 +Alternative Speed 2 = 대체 속도 2 (단위 퍼센트, 0 = 무제한) +Anisotropic Filtering = 비등방성 필터링 +Auto = 자동 +Auto (1:1) = 자동 (1:1) +Auto (same as Rendering) = 자동 (렌더링 해상도와 같음) +Auto FrameSkip = 자동 프레임 생략 +Auto Scaling = 자동 스케일링 +Backend = 처리자 +Balanced = 평형 +Bicubic = 쌍입방 +BlockTransfer Tip = 몇몇 게임들의 그래픽 오류를 고치기 위해 이 설정이 필요합니다. +BlockTransferRequired = 주의 - 이 설정을 키기 위해 이 게임은 "블럭단위 전송 효과 시뮬레이트"를 사용해야 합니다. +Both = 모두 표시 +Buffer graphics commands (faster, input lag) = 버퍼 그래픽 커맨드 (빠름, 입력 렉 발생) +Buffered Rendering = 버퍼링된 렌더링 +BufferedRenderingRequired = 주의 - 이 게임은 "렌더링 모드"가 "버퍼됨" 이어야 합니다. +Camera = 카메라 +Camera Device = 카메라 장치 +Cardboard Screen Size = 화면 크기 (뷰포트의 백분율) +Cardboard Screen X Shift = X축 이동 (여백의 백분율) +Cardboard Screen Y Shift = Y축 이동 (여백의 백분율) +Cardboard VR Settings = 구글 카드보드 설정 +Cheats = 치트 +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU 코어 +Debugging = 디버깅 +DefaultCPUClockRequired = 주의 - 이 게임은 CPU 클럭이 기본 설정이어야 합니다. +Deposterize = 색조 융합 +Deposterize Tip = 업스케일링된 텍스처의 왜곡 현상 고치기 +Device = 장치 +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = 느림 효과를 비활성화 (속도 상승) +Disabled = 비활성화 +Display layout editor = 화면 레이아웃 편집기 +Display Resolution (HW scaler) = 화면 해상도 (하드웨어 스케일러) +Dump next frame to log = 로그에 다음 프레임 덤프 +Enable Cardboard VR = 구글 카드보드 활성화 +FPS = FPS +Frame Rate Control = 프레임 비율 제어 +Frame Skipping = 프레임 생략 +Frame Skipping Type = 프레임 생략 유형 +FullScreen = 전체 화면 +Hack Settings = 핵 설정 (이것은 오류의 원인이 됩니다) +Hardware Tessellation = 하드웨어 테셀레이션 +Hardware Transform = 하드웨어 변환 +hardware transform error - falling back to software = 하드웨어 변환 오류 - 소프트웨어로 전환 +HardwareTessellation Tip = 하드웨어가 곡선을 그리게 하여 언제나 고정된 품질을 사용합니다. +High = 높음 +Hybrid = 혼합 +Hybrid + Bicubic = 혼합 + 쌍입방 +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = 내부 해상도 +Lazy texture caching = 텍스처 캐싱을 줄임 (속도 상승) +Linear = 선형 필터링 +Low = 낮음 +LowCurves = 낮은 품질의 스플라인 및 베지어 곡선 (속도 상승) +LowCurves Tip = 몇몇 게임에만 사용됩니다. 곡선의 부드러움의 정도를 조정합니다. +Lower resolution for effects (reduces artifacts) = 효과 해상도 저하 (질감 감소) +Manual Scaling = 수동 스케일링 +Medium = 중간 +Mode = 방식 +Must Restart = 이 설정을 적용하기 위해서는 PPSSPP를 재시작해 주십시오. +Native device resolution = 기본 장치 해상도 +Nearest = 근접 필터링 +No buffer = 버퍼 없음 +Non-Buffered Rendering = 버퍼 없는 렌더링 (속도 상승) +None = 없음 +Number of Frames = 프레임 수 +Off = 끄기 +OpenGL = OpenGL +Overlay Information = 오버레이 정보 +Partial Stretch = 부분 늘이기 +Percent of FPS = FPS 비율 +Performance = 성능 +Postprocessing effect = Postprocessing effects +Postprocessing Shader = 후처리 셰이더 +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = 중복된 프레임을 60Hz로 렌더링 +RenderDuplicateFrames Tip = 낮은 프레임 레이트에서 동작하는 게임을 부드럽게 해 줍니다. +Rendering Mode = 렌더링 방식 +Rendering Resolution = 렌더링 해상도 +RenderingMode NonBuffered Tip = 빠르지만 몇몇 게임에서는 작동하지 않을 수 있습니다. +Retain changed textures = 변경된 텍스처를 보유 (속도 감소) +RetainChangedTextures Tip = 많은 게임들이 이 설정을 적용하면 대부분 느려지지만 몇몇 게임은 더 빨라질 수 있습니다. +Rotation = 회전 +Safe = 안전 +Screen layout = Screen layout +Screen Scaling Filter = 화면 크기 조절 필터 +Show Debug Statistics = 디버그 통계 표시 +Show FPS Counter = FPS 카운터 표시 +Simulate Block Transfer = 블록 전송 효과를 시뮬레이션 +SoftGPU Tip = 현재 매우 느림 +Software Rendering = 소프트웨어 렌더링 (실험적) +Software Skinning = 소프트웨어 스키닝 +SoftwareSkinning Tip = 스키닝 된 모델을 합쳐 CPU에 그립니다. 대부분에 게임이 빨라집니다. +Speed = 속도 +Stretching = 늘이기 +Texture Filter = 텍스처 필터링 +Texture Filtering = 텍스처 필터링 +Texture Scaling = 텍스처 크기 조절 +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = "하드웨어 테셀레이션" 끄기: 지원하지 않음 +Unlimited = 무제한 +Up to 1 = 최대 1까지 +Up to 2 = 최대 2까지 +Upscale Level = 확대 수준 +Upscale Type = 확대 종류 +UpscaleLevel Tip = CPU가 할 일이 많아집니다 - 또한 끊김 현상을 줄이기 위해 스케일링이 늦어질 수 있습니다. +Use all displays = 모든 디스플레이 사용하기 +Vertex Cache = 버텍스 캐시 +VertexCache Tip = 빠르지만 잠시동안 화면이 깜빡거릴 수 있습니다. +VSync = 수직 동기 +Vulkan = 벌칸(Vulkan) +Window Size = 창 크기 +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = ZIP 파일 삭제 +Install = 설치 +Install game from ZIP file? = ZIP 파일로부터 게임을 설치하시겠습니까? +Install textures from ZIP file? = ZIP 파일로부터 텍스처팩을 설치하시겠습니까? +Installed! = 설치되었습니다! +Texture pack doesn't support install = 이 텍스처팩의 설치는 지원하지 않습니다. +Zip archive corrupt = ZIP 파일이 손상되었습니다. +Zip file does not contain PSP software = ZIP 파일에 PSP 소프트웨어가 들어있지 않습니다. + +[KeyMapping] +Autoconfigure = 자동 설정 +Autoconfigure for device = 디바이스에 맞게 자동 설정 +Clear All = 모두 지우기 +Default All = 기본값 복원 +Map a new key for = 새로운 키 입력 +Map Key = 키 매핑 +Map Mouse = 마우스 매핑 +Test Analogs = 아날로그 테스트 +You can press ESC to cancel. = 취소하려면 ESC를 눌러주십시오. + +[MainMenu] +Browse = 찾아보기... +Buy PPSSPP Gold = PPSSPP Gold 구매 +Choose folder = 폴더 선택하기 +Credits = 만든이 +PPSSPP Homebrew Store = PPSSPP 홈브류 스토어. +Exit = 종료 +Game Settings = 게임 설정 +Games = 게임 +Give PPSSPP permission to access storage = 저장공간에 접근하기 위해 PPSSPP에 권한이 필요합니다. +Homebrew & Demos = 홈브류 및 데모 +How to get games = 어떻게 게임을 구할 수 있나요? +How to get homebrew & demos = 어떻게 홈브류 및 데모를 구할 수 있나요? +Load = 불러오기... +Loading... = 불러오는 중... +PinPath = 경로 고정 +PPSSPP can't load games or save right now = 현재 PPSSPP에서 게임을 불러오거나 저장할 수 없습니다 +Recent = 최근 게임 +SavesAreTemporary = 임시 저장장치에 저장하는 중 +SavesAreTemporaryGuidance = 영구적으로 사용하기 위해 PPSSPP를 기억장치에 복사해 주십시오. +SavesAreTemporaryIgnore = 무시하기 +UnpinPath = 고정 해제 +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = 오디오 +Controls = 조작 +Graphics = 그래픽 +Networking = 네트워킹 +System = 시스템 +Tools = 도구 + +[MappableControls] +Alt speed 1 = 대체 속도 1 +Alt speed 2 = 대체 속도 2 +An.Down = 아날로그.하 +An.Left = 아날로그.좌 +An.Right = 아날로그.우 +An.Up = 아날로그.상 +Analog limiter = 아날로그 제한자 +Analog Stick = 아날로그 스틱 +Audio/Video Recording = 소리/영상 녹화 +Auto Analog Rotation (CCW) = 자동 아날로그 회전 (CCW) +Auto Analog Rotation (CW) = 자동 아날로그 회전 (CW) +AxisSwap = 축 스왑 +Circle = 동그라미 +Cross = 십자 +D-pad down = 방향 패드.하 +D-pad left = 방향 패드.좌 +D-pad right = 방향 패드.우 +D-pad up = 방향 패드.상 +DevMenu = 개발 메뉴 +Down = 방향 패드.하 +Dpad = 방향 패드 +Frame Advance = 프레임 건너뛰기 +Hold = 잠금 +Home = 홈 +L = L +Left = 방향 패드.좌 +Load State = 상태 불러오기 +Mute toggle = 음소거 전환 +Next Slot = 다음 슬롯 +None = 없음 +Note = 참고 +OpenChat = 대화 열기 +Pause = 일시 정지 +R = R +RapidFire = 연사 +Remote hold = 리모트 잠금 +Rewind = 되감기 +Right = 방향 패드.우 +Right Analog Stick (tap to customize) = 오른쪽 아날로그 스틱 (탭해서 사용자화) +RightAn.Down = 우측An.하 +RightAn.Left = 우측An.좌 +RightAn.Right = 우측An.우 +RightAn.Up = 우측An.상 +Rotate Analog (CCW) = 아날로그 회전 (CCW) +Rotate Analog (CW) = 아날로그 회전 (CW) +Save State = 상태 저장하기 +Screen = 화면 +Screenshot = 스크린샷 +Select = 선택 +SpeedToggle = 속도 전환 +Square = 네모 +Start = 시작 +Texture Dumping = 텍스처 덤프 +Texture Replacement = 텍스처 교체 +Toggle Fullscreen = 전체화면 고정 +Toggle mode = 토글 모드 +Triangle = 세모 +Unthrottle = 터보 +Up = 방향 패드.상 +Vol + = 볼륨 + +Vol - = 볼륨 - +Wlan = 무선랜 + +[Networking] +Adhoc Multiplayer forum = 애드혹 멀티플레이어 포럼 방문 +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Mac 주소 변경 +Change proAdhocServer Address = PRO 애드혹 서버 IP 주소 변경 (localhost = multiple instances) +Chat = 대화 +Chat Button Position = 대화 버튼 위치 +Chat Here = 여기에 입력 +Chat Screen Position = 대화 화면 위치 +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = 내장된 PRO 애드혹 서버 활성화 +Enable network chat = 네트워크 대화 활성화 +Enable networking = 네트워킹/무선 랜 활성화 (베타, 게임 작동을 방해할 수 있음) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = 빠른 대화 활성화 +Enter a new PSP nickname = 새로운 PSP 별명 입력 +Enter Quick Chat 1 = 빠른 대화 1 참가 +Enter Quick Chat 2 = 빠른 대화 2 참가 +Enter Quick Chat 3 = 빠른 대화 3 참가 +Enter Quick Chat 4 = 빠른 대화 4 참가 +Enter Quick Chat 5 = 빠른 대화 5 참가 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = 올바르지 않은 IP 또는 호스트 이름 +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = 네트워크 초기화됨 +Please change your Port Offset = Please change your port offset +Port offset = 포트 오프셋(0 = PSP 호환) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = 빠른 대화 1 +Quick Chat 2 = 빠른 대화 2 +Quick Chat 3 = 빠른 대화 3 +Quick Chat 4 = 빠른 대화 4 +Quick Chat 5 = 빠른 대화 5 +QuickChat = 빠른 대화 +Send = 보내기 +Send Discord Presence information = Discord 프로필에 PPSSPP 표시 +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = 주소 검증하는 중... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = 현재 오프라인 모드입니다. 로비나 온라인 홀로 돌아갑니다. + +[Pause] +Cheats = 치트 +Continue = 계속 +Create Game Config = 게임 설정파일 생성 +Delete Game Config = 게임 설정파일 제거 +Exit to menu = 종료 후 메뉴로 +Game Settings = 게임 설정 +Load State = 상태 불러오기 +Rewind = 되감기 +Save State = 상태 저장하기 +Settings = 설정 +Switch UMD = UMD 교체 + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4배 HQ GLSL (OpenGL 셰이딩 언어) +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA 색상 +Amount = Amount +Black border = 검정 테두리 +Bloom = 블룸 +Brightness = 밝기 +Cartoon = 카툰 +ColorCorrection = 색상 교정 +Contrast = 명암 +CRT = CRT 스캔라인 +FXAA = FXAA (Fast Approximate Anti-Aliasing) +Gamma = 감마 +Grayscale = 그레이스케일 +Intensity = 강도 +InverseColors = 색 반전 +Natural = 자연 색상 +NaturalA = 자연 색상 (블러 없음) +Off = 끄기 +Power = Power +PSPColor = PSP color +Saturation = 채도 +Scanlines = 스캔라인 (CRT) +Sharpen = 선명하게 +SSAA(Gauss) = 슈퍼샘플링 AA (가우스) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = 스플라인36 확대 +VideoSmoothingAA = VideoSmoothingAA +Vignette = 비네트 + +[PSPCredits] +all the forum mods = 모든 포럼 모드 +build server = 빌드 서버 +Buy Gold = 골드 버전 구매 +check = 최고의 Wii/GC 에뮬 Dolphin 또한 확인하십시오. +CheckOutPPSSPP = 멋진 PSP 에뮬레이터 PPSSPP를 확인해 보십시오: https://www.ppsspp.org/ +contributors = 도움을 주신 분들: +created = 만든이: +Discord = Discord +info1 = PPSSPP는 교육적인 목적으로만 사용할 수 있습니다. +info2 = 설치한 게임의 소유 권리가 분명한지를 확인해 주십시오. +info3 = 해당 게임의 UMD를 소유하거나 디지털로 구매하여 플레이하십시오. +info4 = 해당 게임을 실제 PSP에 존재하는 PSN Store에서 구매해 주십시오. +info5 = PSP는 주식회사 소니의 등록 상표입니다. +iOS builds = iOS 빌드 +license = GPL 2.0+ 라이선스를 따르는 무료 소프트웨어 +list = 호환 목록, 포럼 및 개발 정보 +PPSSPP Forums = PPSSPP 포럼 +Privacy Policy = 개인 정보 정책 +Share PPSSPP = PPSSPP 공유 +specialthanks = 특별히 감사드립니다: +specialthanksKeithGalocy = - NVIDIA 로부터 (하드웨어, 지도) +specialthanksMaxim = - 놀라운 Atrac3+ 디코더 지원 +testing = 테스트 +this translation by = 번역: +title = 빠르고 휴대성이 높은 PSP 에뮬레이터 +tools = 사용된 무료 도구들: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +# It is character-set for keyboard(atlas) +# ㄱㄲㄳㄴㄵㄶㄷㄸㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅃㅄㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎㅏㅐㅑㅒㅓㅔㅕㅖㅗㅛㅜㅠㅡㅣ +translators1 = mgaver Hisman_Yosika 오원식 MrGiKILL +translators2 = DDinghoya +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = 웹 사이트에서 확인하세요: +written = 속도와 이식성을 보장하기 위해 C++로 작성되었습니다. + +[RemoteISO] +Browse Games = 게임 찾아보기 +Local Server Port = 로컬 서버 포트 +Manual Mode Client = 수동 모드 클라이언트 +Remote disc streaming = 원격 디스크 스트리밍 +Remote Port = 원격 포트 +Remote Server = 원격 서버 +Remote Subdirectory = 공유할 하위 폴더 +RemoteISODesc = 최근 게임 목록에 있는 게임들이 공유됩니다. +RemoteISOLoading = 접속 완료, 게임 목록 불러오는 중... +RemoteISOScanning = 검색 중... 서버 장치의 "게임 공유하기" 버튼을 눌러주십시오. +RemoteISOScanningTimeout = 검색 중... 방화벽 설정을 확인하십시오. +RemoteISOWifi = 팁: 같은 Wi-Fi 네트워크 상에서 서로 접속할 수 있습니다. +RemoteISOWinFirewall = 경고: Windows 방화벽이 공유를 차단하고 있습니다. +Settings = 설정 +Share Games (Server) = 게임 공유하기 (서버) +Share on PPSSPP startup = PPSSPP 시작시 자동으로 공유하기 +Stop Sharing = 공유 끝내기 +Stopping.. = 중지하는 중... + +[Reporting] +Bad = 나쁨 +FeedbackDelayInfo = 피드백 데이터를 전송 중입니다. +FeedbackDesc = 게임이 어땠나요? 저희에게 알려주십시오! +FeedbackDisabled = 서버에 호환성 문제 보고를 체크해 주십시오. +FeedbackIncludeCRC = 참고: 디스크 CRC를 위해 배터리가 사용될 수 있습니다. +FeedbackIncludeScreen = 스크린샷 포함하기 +FeedbackSubmitDone = 피드백 데이터가 전송되었습니다. +FeedbackSubmitFail = 서버에 피드백을 전송할 수 없었습니다. PPSSPP를 업데이트해 보십시오. +FeedbackThanks = 피드백 고맙습니다! +Gameplay = 게임 플레이 +Graphics = 그래픽 +Great = 좋음 +In-game = 게임 내 +In-game Description = 게임이 실행되었지만 제대로 작동하지 않았습니다 +Menu/Intro = 메뉴/인트로 +Menu/Intro Description = 게임 내에 진입할 수 없었습니다 +Nothing = 전부 +Nothing Description = 전혀 동작하지 않았습니다 +OK = 괜찮음 +Open Browser = 브라우저 열기 +Overall = 평가 +Perfect = 완벽함 +Perfect Description = 게임 전체가 흠 없이 매끄럽게 작동했습니다 - 대박! +Plays = 플레이 중 +Plays Description = 게임을 즐길 수는 있지만 문제가 있을 수 있습니다 +ReportButton = 피드백 남기기 +Speed = 속도 +Submit Feedback = 피드백 전송 +SuggestionConfig = 적합한 설정을 위해 웹사이트에 올라온 보고서들을 확인해 보십시오. +SuggestionCPUSpeed0 = 잠긴 CPU 설정을 비활성화해 주십시오. +SuggestionDowngrade = 구 버전의 PPSSPP로 내려보십시오. (그리고 이 버그를 신고해 주십시오). +SuggestionsFound = 다른 유저들이 더 나은 결과를 보고했습니다. 피드백 보기를 눌러 확인해 주십시오. +SuggestionsNone = 다른 유저들도 이 게임이 제대로 작동하지 않았습니다. +SuggestionsWaiting = 전송 및 다른 유저의 보고서 확인 중... +SuggestionUpgrade = 새로운 PPSSPP 버전으로 업데이트 하십시오. +SuggestionVerifyDisc = ISO 파일이 제대로 디스크로부터 복사되었는지 확인해 보십시오. +Unselected Overall Description = 이 게임이 얼마만큼 잘 작동했나요? +View Feedback = 모든 피드백 보기 + +[Savedata] +Date = 날짜 +Filename = 파일 이름 +No screenshot = 스크린샷 없음 +None yet. Things will appear here after you save. = 아직 없음. 저장하면 나타납니다. +Save Data = 저장 데이터 +Save States = 상태 저장 +Savedata Manager = 저장 데이터 관리자 +Size = 크기 + +[Screen] +Cardboard VR OFF = 구글 카드보드 끄기 +Chainfire3DWarning = 경고: 체인파이어 3D가 검출되었습니다. 문제가 발생할 수 있습니다. +Failed to load state = 상태 불러오기에 실패했습니다 +Failed to save state = 상태 저장에 실패했습니다 +fixed = 속도: 고정 +GLToolsWarning = 경고: GLTools가 감지되었습니다. 문제가 발생할 수 있습니다. +In menu = 메뉴 +Load savestate failed = 상태 불러오기 실패 +Loaded State = 상태 불러옴 +Loaded. Save in game, restart, and load for less bugs. = 불러왔습니다. 게임을 저장한 다음 재시작하면 적은 버그로 로드됩니다. +LoadStateDoesntExist = 상태를 불러오지 못했습니다: 상태 저장이 존재하지 않습니다! +LoadStateWrongVersion = 상태를 불러오지 못했습니다: 구 버전의 상태 저장입니다! +norewind = 되감기 저장 상태가 없습니다. +Playing = 실행 +PressESC = ESC를 누르면 중지 메뉴가 열립니다. +replaceTextures_false = 텍스처가 더 이상 대체되지 않습니다. +replaceTextures_true = 텍스처 교체가 활성화되었습니다. +Save State Failed = 상태를 저장하지 못했습니다! +Saved State = 상태 저장됨 +saveNewTextures_false = 텍스처 저장이 비활성화되었습니다. +saveNewTextures_true = 텍스처가 이제 저장 공간에 저장됩니다. +SpeedCustom2 = 속도: 고정 속도 2 +standard = 속도: 표준 +Untitled PSP game = 이름 없는 PSP 게임 + +[Store] +Already Installed = 이미 설치되어 있습니다 +Connection Error = 연결 오류 +Install = 설치 +Launch Game = 게임 실행 +Loading... = 불러오는 중... +MB = MB +Size = 크기 +Uninstall = 제거 + +[SysInfo] +%d (%d per core, %d cores) = %d (코어 당 %d, 코어 %d개) +%d bytes = %d 바이트 +(none detected) = (감지되지 않음) +3D API = 3D API +ABI = ABI +API Version = API 버전 +Audio Information = 오디오 정보 +Board = Board +Build Config = 빌드 설정 +Build Configuration = 빌드 설정 +Built by = 빌드 실행자 +Core Context = 코어 컨텍스트 +Cores = 코어 +CPU Extensions = CPU 확장 +CPU Information = CPU 정보 +CPU Name = 이름 +D3DCompiler Version = D3DCompiler 버전 +Debug = 디버그 +Debugger Present = 디버거 표시 +Device Info = 장치 정보 +Display Information = 디스플레이 정보 +Driver Version = 드라이버 버전 +EGL Extensions = EGL 확장 +Frames per buffer = 버퍼당 프레임 +GPU Information = GPU 정보 +High precision float range = High precision float range +High precision int range = 정밀한 정수 범위 +Lang/Region = 언어/지역 +Memory Page Size = 메모리 페이지 크기 +Native Resolution = 기본 해상도 +OGL Extensions = OGL 확장 +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 확장 +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 확장 +OpenGL Extensions = OpenGL 확장 +Optimal frames per buffer = 버퍼당 최적 프레임 +Optimal sample rate = 최적 샘플 속도 +OS Information = OS 정보 +PPSSPP build = PPSSPP 빌드 +Refresh rate = 주사율 +Release = 출시 +RW/RX exclusive = RW/RX 독점 +Sample rate = 샘플 속도 +Shading Language = 셰이딩 언어 +Sustained perf mode = 지속 성능 모드 +System Information = 시스템 정보 +System Name = 시스템 이름 +System Version = 시스템 버전 +Threads = 스레드 +Vendor = 공급 업체 +Vendor (detected) = 공급 업체 (감지됨) +Version Information = 버전 정보 +Vulkan Extensions = 벌칸 확장 +Vulkan Features = 벌칸 기능 + +[System] +(broken) = (이용 불가) +12HR = 12시간 +24HR = 24시간 +Auto = 자동 +Auto Load Savestate = 상태 저장 자동 불러오기 +AVI Dump started. = AVI 덤프 시작됨 +AVI Dump stopped. = AVI 덤프 정지됨 +Cache ISO in RAM = ISO 전체를 램에 캐싱 +Change CPU Clock = CPU 클럭 변경 (불안정) +Change Memory Stick folder = 메모리 스틱 폴더 변경 +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = 별명 변경 +ChangingMemstickPath = 게임 저장, 상태 저장, 기타 데이터는 이 폴더에 복사되지 않습니다.\n\n메모리 스틱 폴더를 변경하시겠습니까? +ChangingMemstickPathInvalid = 이 경로는 메모리 스틱 파일을 저장하는데 사용할 수 없습니다. +ChangingMemstickPathNotExists = 해당 폴더는 아직 존재하지 않습니다.\n\n게임 저장, 상태 저장, 기타 데이터는 이 폴더에 복사되지 않습니다.\n\n새 메모리 스틱 폴더를 만드시겠습니까? +Cheats = 치트 (실험적, 포럼 참조) +Clear Recent = "최근" 지우기 +Clear Recent Games List = 최근 게임 목록 지우기 +Clear UI background = UI 배경화면 초기화 +Confirmation Button = 확인 버튼 +Date Format = 날짜 표시 방식 +Day Light Saving = 서머 타임 +DDMMYYYY = DDMMYYYY +Decrease size = 크기 줄이기 +Developer Tools = 개발자 도구 +Display Extra Info = 추가 정보 표시 +Display Games on a grid = 그리드에 "게임 탭" 표시 +Display Homebrew on a grid = 그리드에 "홈브류 및 데모 탭" 표시 +Display Recent on a grid = 그리드에 "최근 탭" 표시 +Dynarec (JIT) = 동적 재컴파일 (JIT) +Emulation = 에뮬레이션 +Enable Cheats = 치트 활성화 +Enable Compatibility Server Reports = 서버에 호환성 문제를 보고 +Failed to load state. Error in the file system. = 상태 저장을 불러올 수 없었습니다. 파일 시스템에 오류가 있습니다. +Failed to save state. Error in the file system. = 상태 저장을 저장할 수 없었습니다. 파일 시스템에 오류가 있습니다. +Fast (lag on slow storage) = 빠름 (느린 저장 장치에서 지연 발생) +Fast Memory = 빠른 메모리 (불안정) +Force real clock sync (slower, less lag) = 강제 실제 클럭 동기화 (느림, 약간의 지연) +frames, 0:off = 프레임, 0 = 끄기 +Games list settings = 게임 목록 설정 +General = 일반 +Grid icon size = 그리드 아이콘 크기 +Help the PPSSPP team = PPSSPP 팀 돕기 +Host (bugs, less lag) = 호스트 (버그, 약간의 지연) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = 크기 늘리기 +Interpreter = 해석기 +IO timing method = I/O 타이밍 방법 +IR Interpreter = IR 인터프리터 +Memory Stick Folder = 메모리 스틱 폴더 +Memory Stick inserted = 메모리 스틱 삽입됨 +MHz, 0:default = MHz, 0 = 기본 값 +MMDDYYYY = MMDDYYYY +Newest Save = 제일 새로운 저장 +Not a PSP game = PSP 게임이 아님 +Off = 끄기 +Oldest Save = 제일 오래된 저장 +PSP Model = PSP 기종 +PSP Settings = PSP 설정 +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = 소리 녹음하기 +Record Display = 영상 녹화하기 +Reset Recording on Save/Load State = 저장/불러올 때 기록된 것을 재설정하기 +Restore Default Settings = PPSSPP의 설정을 기본으로 복원 +Rewind Snapshot Frequency = 스냅샷 주기 되감기 (mem hog) +Save path in installed.txt = 경로를 installed.txt에 저장 +Save path in My Documents = 경로를 내 문서에 저장 +Savestate Slot = 상태 저장 슬롯 +Savestate slot backups = 상태 저장 백업 +Screenshots as PNG = PNG 형식으로 스크린샷 저장 +Set UI background... = UI 배경화면 지정하기... +Show ID = ID 보기 +Show region flag = 지역코드 플래그 보기 +Simulate UMD delays = UMD 지연 시뮬레이션 +Slot 1 = 슬롯 1 +Slot 2 = 슬롯 2 +Slot 3 = 슬롯 3 +Slot 4 = 슬롯 4 +Slot 5 = 슬롯 5 +Storage full = 저장 공간 가득참 +Sustained performance mode = 지속 성능 모드 +Time Format = 시간 표시 방식 +UI = 사용자 인터페이스 +UI Sound = UI sound +undo %c = %c 백업 +Use Lossless Video Codec (FFV1) = 무손실 비디오 코덱 사용 (FFV1) +Use O to confirm = 확인 버튼으로 O 사용 +Use output buffer (with overlay) for recording = 기록에 출력 버퍼(오버레이 포함) 사용 +Use system native keyboard = 시스템 기본 키보드 사용 +Use X to confirm = 확인 버튼으로 X 사용 +VersionCheck = PPSSPP의 새로운 버전을 확인 +WARNING: Android battery save mode is on = 주의: 안드로이드 배터리 절약 모드가 켜짐 +WARNING: Battery save mode is on = 주의: 배터리 절약 모드가 켜짐 +YYYYMMDD = YYYYMMDD + +[Upgrade] +Details = Details +Dismiss = 거절 +Download = 다운로드 +New version of PPSSPP available = 새로운 버전의 PPSSPP를 이용할 수 있습니다. diff --git a/assets/lang/lo_LA.ini b/assets/lang/lo_LA.ini new file mode 100644 index 0000000000..99b35ca5d9 --- /dev/null +++ b/assets/lang/lo_LA.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = ຮູບແບບສຽງທີ່ຮອງຮັບ (ຕ້ອງຣີສຕາຣ໌ດ) +AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) +Auto = ອັດຕະໂນມັດ +Device = Device +DSound (compatible) = DSound (compatible) +Enable Sound = ເປີດໃຊ້ງານສຽງ +Global volume = ລະດັບສຽງຫຼັກ +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = WASAPI (fast) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Analog axis sensitivity +Analog Limiter = ໂຕຈຳກັດອະນາລ໋ອກ +Analog Mapper High End = ປັບປ່ຽນອະນາລ໋ອກ high-end (ການຕອບສະໜອງຂອງແກນ) +Analog Mapper Low End = ໂຕປັບອະນາລ໋ອກ low-end (ສະຫຼັບດ້ານ deadzone) +Analog Mapper Mode = ໂໝດການປັບອະນາລ໋ອກ +Analog Stick = ປຸ່ມອະນາລ໋ອກ +AnalogLimiter Tip = ເມື່ອກົດທີ່ຂອບປຸ່ມອະນາລ໋ອກ ໂຕຈຳກັດອະນາລ໋ອກຈະເຮັດວຽກ +Auto = ອັດຕະໂນມັດ +Auto-centering analog stick = ອະນາລ໋ອກກັບຄືນຈຸດສູນກາງອັດຕະໂນມັດ +Auto-hide buttons after seconds = ເຊື່ອງປຸ່ມທັນທີຫຼັງຈາກ ວິນາທີ +Binds = Binds +Button Opacity = ຄວາມເຂັ້ມຂອງປຸ່ມ +Button style = ຮູບແບບປຸ່ມກົດ +Calibrate D-Pad = ປັບຄ່າຄວາມຄາດເຄື່ອນຂອງ D-Pad +Calibration = ປັບຄ່າຄວາມຄາດເຄື່ອນ +Classic = ແບບດັ້ງເດີມ +Combo Key Setting = ຕັ້ງຄ່າປຸ່ມຄອມໂບ +Combo Key Setup = ຕິດຕັ້ງປຸ່ມຄອມໂບ +Confine Mouse = ຈຳກັດເມົ້າໃນໜ້າຕ່າງ/ພື້ນທີ່ສະແດງຜົນ +Control Mapping = ປ່ຽນແປງຄ່າຄວບຄຸມ +Custom layout... = ປັບປ່ຽນການຄວບຄຸມແບບສຳຜັດ... +Customize tilt = ປັບແຕ່ງການອຽງໂດຍໃຊ້ເຊັນເຊີ້ຄວບຄຸມ... +D-PAD = D-Pad +Deadzone Radius = ຂອບເຂດ Deadzone +DInput Analog Settings = ຕັ້ງຄ່າອະນາລ໋ອກຂອງ DInput +Disable D-Pad diagonals (4-way touch) = ປິດການໃຊ້ງານປຸ່ມ D-Pad (4-way touch) +Glowing borders = Glowing borders +HapticFeedback = ຕອບສະໜອງເມື່ອສຳຜັດ (ການສັ່ນ) +Ignore gamepads when not focused = ປະຕິເສດປຸ່ມກົດເມື່ອບໍ່ໄດ້ຫຼິ້ນໃນຕອນນັ້ນ +Ignore Windows Key = ປິດການໃຊ້ງານປຸ່ມ Windows +Invert Axes = ການສະຫຼັບດ້ານຂອງແກນ +Invert Tilt along X axis = ສະຫຼັບດ້ານການອຽງຕາມແກນ X +Invert Tilt along Y axis = ສະຫຼັບດ້ານການອຽງຕາມແກນ Y +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = ຕັ້ງຄ່າການຄວບຄຸມແປ້ນພິມ +L/R Trigger Buttons = L/R trigger buttons +Landscape = ແນວນອນ +Landscape Auto = Landscape auto +Landscape Reversed = ກັບດ້ານແນວນອນ +Mouse = ການຕັ້ງຄ່າເມົ້າ +Mouse sensitivity = ຄວາມໄວຕໍ່ການຕອບສະໜອງຂອງເມົ້າ +Mouse smoothing = ຄວາມມື່ນໄຫຼຂອງເມົ້າ +MouseControl Tip = ສາມາດປັບປຸ່ມເມົ້າໄດ້ໃນຫົວຂໍ້ປ່ຽນແປງຄ່າຄວບຄຸມ \n ໂດຍການກົດໄອຄອນ 'M'. +None (Disabled) = ບໍ່ມີ (ປິດການໃຊ້ງານ) +Off = ປິດ +OnScreen = ໃຊ້ໜ້າຈໍຄວບຄຸມແບບສຳຜັດ +Portrait = ແນວຕັ້ງ +Portrait Reversed = ກັບດ້ານແນວຕັ້ງ +PSP Action Buttons = ປຸ່ມກົດຂອງ PSP +Screen Rotation = ການໝຸນໜ້າຈໍ +seconds, 0 : off = ວິນາທີ, 0 = ປິດ +Sensitivity = ຄວາມໄວຕໍ່ການຕອບສະໜອງ +Show right analog = Show right analog +Show Touch Pause Menu Button = ສະແດງປຸ່ມຢຸດສຳລັບເຂົ້າເມນູ +Thin borders = ຂອບແບບບາງ +Tilt Base Radius = Tilt base radius +Tilt Input Type = ນຳເຂົ້າຮູບແບບການອຽງ +Tilt Sensitivity along X axis = ຄວາມໄວການອຽງຕາມແກນ X +Tilt Sensitivity along Y axis = ຄວາມໄວການອຽງໄວຕາມແກນ Y +To Calibrate = ໃຫ້ວາງອຸປະກອນເທິງພື້ນລຽບ ແລະ ກົດ "ປັບຄ່າຄວາມຄາດເຄື່ອນ". +Touch Control Visibility = ການສະແດງຜົນປຸ່ມຄວບຄຸມແບບສຳຜັດ +Use custom right analog = Use custom right analog +Use Mouse Control = ໃຊ້ເມົ້າໃນການຄວບຄຸມ +Visibility = ເຊື່ອງປຸ່ມ +X = X +X + Y = X + Y +XInput Analog Settings = ການຕັ້ງຄ່າແບບອະນາລ໋ອກ XInput +Y = Y + +[CwCheats] +Cheats = ການໃຊ້ສູດໂກງ +Edit Cheat File = ປັບແຕ່ງໄຟລ໌ສູດໂກງ +Enable/Disable All = ເປີດ/ປິດ ສູດທັງໝົດ +Import Cheats = ນຳເຂົ້າຈາກໄຟລ໌ສູດໂກງ +Options = ໂຕເລືອກ +Refresh Rate = ອັດຕາການຟື້ນຟູ + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = &ກ່ຽວກັບ PPSSPP... +Auto = &ອັດຕະໂນມັດ +Backend = &ການສະແດງຜົນທີ່ສະໜັບສະໜຸນ (ຕ້ອງຣີສຕາຣ໌ດ PPSSPP) +Bicubic = &ປັບພາບແບບ Bicubic +Break = Break +Break on Load = Break on load +Buffered Rendering = ການສະແດງຜົນແບບໃຊ້ ບັບເຟີ້ +Buy Gold = & ຊື້ແບບ Gold +Control Mapping... = &ແຜງຄວບຄຸມ... +Debugging = &ແກ້ໄຂຈຸດບົກພ່ອງ +Deposterize = &ປັບພາບແບບ Deposterize +Direct3D9 = &Direct3D9 +Direct3D11 = &Direct3D11 +Disassembly = &ການແຍກອົງປະກອບ... +Discord = Discord +Display Layout Editor = ແກ້ໄຂຮູບແບບສະແດງຜົນ... +Display Rotation = ການໝຸນໜ້າຈໍ +Dump Next Frame to Log = &ດຶງຂໍ້ມູນຂອງເຟຣມຕໍ່ໄປເພື່ອເກັບບັນທຶກຄ່າ +Emulation = &ການຈຳລອງ +Enable Chat = Enable chat +Enable Cheats = &ເປີດການໃຊ້ງານສູດໂກງເກມ +Enable Sound = &ເປີດການໃຊ້ງານສຽງ +Exit = &ອອກ +Extract File... = &ແຕກໄຟລ໌... +File = &ໄຟລ໌ +Frame Skipping = &ຂ້າມເຟຣມ +Frame Skipping Type = Frame skipping type +Fullscreen = &ເຕັມຈໍ +Game Settings = &ຕັ້ງຄ່າເກມ +GE Debugger... = &ລະບົບຊ່ອຍເຫຼືອການແກ້ໄຂຈຸດບົກພ່ອງ... +GitHub = GitHub +Hardware Transform = &ໃຊ້ຮາດແວຣ໌ໃນການແປງຄ່າປະມວນຜົນ +Help = &ຊ່ອຍເຫຼືອ +Hybrid = &ປະສົມປະສານ +Hybrid + Bicubic = & ປະສົມປະສານ + ແບບ Bicubic +Ignore Illegal Reads/Writes = &ລະເວັ້ນການອ່ານ/ຂຽນທີ່ຜິດພາດ +Ignore Windows Key = ປິດການໃຊ້ງານປຸ່ມວິນໂດ້ +Keep PPSSPP On Top = &ໃຫ້ PPSSPP ຢູ່ດ້ານໜ້າສຸດ +Landscape = ແນວນອນ +Landscape reversed = ກັບດ້ານແນວນອນ +Language... = &ພາສາ... +Linear = &ເກີດຮອຍຍັກເລັກນ້ອຍ +Load = &ໂຫຼດ +Load .sym File... = &ໂຫຼດໄຟລ໌ .sym... +Load Map File... = &ໂຫຼດໄຟລ໌ Map... +Load State = &ໂຫຼດເກມ +Load State File... = &ໂຫຼດໄຟລ໌ທີ່ບັນທຶກ... +Log Console = &ເກັບຄ່າຄອນໂຊລ +Memory View... = &ມຸມມອງຄ່າຄວາມຈຳ... +More Settings... = &ການຕັ້ງຄ່າອື່ນໆ... +Nearest = &ພາບເປັນຮອຍຍັກໄດ້ +Non-Buffered Rendering = &ຂ້າມການໃຊ້ເອັບເຟັກບັບເຟີ້ (ບໍ່ມີບັບເຟີ້, ໄວຂຶ້ນ) +Off = &ປິດ +Open Directory... = &ເປີດໄດເຣກທໍຣີ... +Open from MS:/PSP/GAME... = &ເປີດຈາກ MS:/PSP/GAME... +Open Memory Stick = &ເປີດບ່ອນເກັບຂໍ້ມູນ +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = &ຢຸດຊົ່ວຄາວ +Pause When Not Focused = &ຢຸດຊົ່ວຄາວເມື່ອບໍ່ໄດ້ຫຼິ້ນ +Portrait = ແນວຕັ້ງ +Portrait reversed = ກັບດ້ານແນວຕັ້ງ +Postprocessing Shader = &ຂະບວນການເຮັດວຽກໄລ່ປັບເສດແສງສີ +PPSSPP Forums = &ຟໍຣຳ PPSSPP +Record = ການບັນທຶກ +Record Audio = ບັນທຶກສຽງ +Record Display = ບັນທຶກພາບ +Rendering Mode = &ໂໝດການສະແດງຜົນ +Rendering Resolution = &ຄວາມລະອຽດໃນການສະແດງຜົນ +Reset = &ຣີເຊັດ +Reset Symbol Table = &ຣີເຊັດຕາຕະລາງສະແດງເຄື່ອງໝາຍ +Run = &ເອີ້ນໃຊ້ +Save .sym File... = &ບັນທຶກໄຟລ໌ .sym... +Save Map File... = &ບັນທຶກໄຟລ໌ Map... +Save State = &ບັນທຶກເກມ +Save State File... = &ໄຟລ໌ທີ່ບັນທຶກ... +Savestate Slot = &ຊ່ອງບັນທຶກເກມ +Screen Scaling Filter = &ໂຕຕອງຂະໜາດຂອງໜ້າຈໍ +Show Debug Statistics = &ສະແດງຄ່າທາງສະຖິຕິແກ້ໄຂຈຸດບົກພ່ອງ +Show FPS Counter = &ສະແດງໂຕນັບຄ່າເຟຣມເຣດ +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = &ຢຸດ +Switch UMD = ສະຫຼັບແຜ່ນ UMD +Take Screenshot = &ຈັບພາບໜ້າຈໍ +Texture Filtering = &ຕອງພື້ນຜິວ +Texture Scaling = &ປັບພື້ນຜິວ +Use Lossless Video Codec (FFV1) = Use Lossless Video Codec (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = &Vertex ແຄດ +VSync = VS&ync +Vulkan = Vulkan +Window Size = &ຂະໜາດໜ້າຈໍ +www.ppsspp.org = ຂໍ້ມູນເພີ່ມຕື່ມ www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allocator viewer (Vulkan) +Allow remote debugger = Allow remote debugger +Backspace = ຖອຍຫຼັງ +Block address = ບລັອກຄ່າທີ່ຢູ່ +By Address = ໂດຍຄ່າທີ່ຢູ່ +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = ສ້າງ/ເປີດໄຟລ໌ textures.ini ຂອງເກມນີ້ +Current = Current +Dev Tools = Development tools +DevMenu = DevMenu +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = ດຶງໄຟລ໌ EBOOT.BIN ອອກມາເກັບໄວ້ເມື່ອເລີ່ມເກມ +Dump Frame GPU Commands = ດຶງຄ່າເຟຣມຄຳສັ່ງຂອງ GPU +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = ເປີດໃຊ້ງານ logging +Enter address = ໃສ່ຄ່າທີ່ຢູ່ +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = ລາຍລະອຽດຂອງເຟຣມ +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = Jit compare +JIT debug tools = JIT debug tools +Language = ພາສາ +Load language ini = ໂຫຼດໄຟລ໌ພາສາ (.ini) +Log Dropped Frame Statistics = ເກັບຄ່າສະຖິຕິເຟຣມເຣດຕົກ +Log Level = ເກັບຄ່າລະດັບ +Log View = ເກັບຄ່າມຸມມອງ +Logging Channels = ຊ່ອງທາງເກັບຄ່າຂໍ້ມູນ +Next = ຕໍ່ໄປ +No block = ບໍ່ຕ້ອງບລັອກ +Prev = ກ່ອນໜ້າ +Random = ສຸມ +Replace textures = ແທນທີ່ພື້ນຜິວ +Reset limited logging = Reset limited logging +RestoreDefaultSettings = ເຈົ້າແນ່ໃຈຫຼືບໍ່ວ່າຕ້ອງການກູ້ການຕັ້ງຄ່າກັບເປັນປົກກະຕິ?\nການຕັ້ງຄ່າແຜງການຄວບຄຸມຈະບໍ່ປ່ຽນ\n\n\nເຈົ້າບໍ່ສາມາດຍົກເລີກ\nກະລຸນາເລີ່ມ PPSSPP ໃໝ່ອີກຄັ້ງ ເພື່ອເຫັນຜົນການປ່ຽນແປງ +RestoreGameDefaultSettings = ເຈົ້າແນ່ໃຈຫຼືບໍ່ວ່າຕ້ອງການຄືນຄ່າການຕັ້ງຄ່າເກມໂດຍສະເພາະ\nກັບສູ່ຄ່າເລີ່ມຕົ້ນ PPSSPP ຫຼືບໍ່? +Resume = Resume +Run CPU Tests = ເອີ້ນໃຊ້ການທົດສອບ CPU +Save language ini = ບັນທຶກພາສາຂອງ ini +Save new textures = ບັນທຶກພື້ນຜິວໃໝ່ +Shader Viewer = ມຸມມອງການປັບໄລ່ເສດສີ +Show Developer Menu = ສະແດງເມນູສຳລັບນັກພັດທະນາ +Show on-screen messages = Show on-screen messages +Stats = ສະຖິຕິ +System Information = ຂໍ້ມູນຂອງລະບົບ +Texture Replacement = ການແທນທີ່ພື້ນຜິວ +Toggle Audio Debug = ແກ້ໄຂຈຸດບົກພ່ອງຂອງສຽງ +Toggle Freeze = ປຸ່ມແຊ່ແຂງ +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * ຂະໜາດຈໍ PSP +Active = Active +Back = ຍ້ອນກັບ +Cancel = ຍົກເລີກ +Center = ທາງກາງ +ChangingGPUBackends = ເມື່ອປ່ຽນແປງຮູບແບບການສະໜັບສະໜູນ GPU \n ຈະຕ້ອງເລີ່ມ PPSSPP ໃໝ່ອີກຄັ້ງ. ເລີ່ມໃໝ່ເລີຍບໍ່? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = ເລືອກໂຟນເດີ້ເຊບ PPSSPP +Confirm Overwrite = ຕ້ອງການໃຫ້ຂຽນທັບຂໍ້ມູນເກົ່າຫຼືບໍ່? +Confirm Save = ຕ້ອງການບັນທຶກຂໍ້ມູນນີ້ຫຼືບໍ່? +ConfirmLoad = ຕ້ອງການໂຫຼດຂໍ້ມູນນີ້ຫຼືບໍ່? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = ລຶບ +Delete all = ລຶບທັງໝົດ +Delete completed = ລຶບຂໍ້ມູນສຳເລັດ +DeleteConfirm = ເຊບນີ້ຈະຖືກລຶບ\nເຈົ້າຕ້ອງການຈະດຳເນີນການຕໍ່ຫຼືບໍ່? +DeleteConfirmAll = ເຈົ້າຕ້ອງການທີ່ຈະລຶບເຊບທັງໝົດ\nຂອງເຈົ້າສຳລັບເກມນີ້ +DeleteConfirmGame = ເຈົ້າຕ້ອງການທີ່ຈະລຶບເກມທັງໝົດ\nຈາກອຸປະກອນຂອງເຈົ້າຫຼືບໍ່? ເຈົ້າຈະບໍ່ສາມາດຍົກເລີກໄດ້ +DeleteConfirmGameConfig = ເຈົ້າຕ້ອງການທີ່ຈະລຶບການຕັ້ງຄ່າສຳລັບເກມນີ້ຫຼືບໍ່? +DeleteFailed = ບໍ່ສາມາດລຶບຂໍ້ມູນ. +Deleting = ກຳລັງລຶບຂໍ້ມູນ\nກະລຸນາຖ້າ.. +Disable All = Disable all +Edit = Edit +Enable All = Enable all +Enter = ຢືນຢັນ +Finish = ສິ້ນສຸດ +Grid = Grid +Inactive = Inactive +InternalError = An internal error has occurred. +Load = ໂຫຼດ +Load completed = ໂຫຼດຂໍ້ມູນສຳເລັດ +Loading = ກຳລັງໂຫຼດ\nກະລຸນາລໍຖ້າ... +LoadingFailed = ບໍ່ສາມາດໂຫຼດຂໍ້ມູນ. +Move = ເຄື່ອນຍ້າຍ +Network Connection = ການເຊື່ອມຕໍ່ເຄື່ອຂ່າຍ +NEW DATA = ຂໍ້ມູນໃໝ່ +No = ບໍ່ແມ່ນ +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = ຕົກລົງ +Old savedata detected = ກວດພົບຂໍ້ມູນເຊບເກົ່າ +Options = ໂຕເລືອກ +Reset = ຕັ້ງຄ່າໃໝ່ +Resize = ປັບຂະໜາດ +Retry = ລອງໃໝ່ອີກຄັ້ງ +Save = ບັນທຶກ +Save completed = ບັນທຶກຂໍ້ມູນສຳເລັດ +Saving = ກຳລັງບັນທຶກ\nກະລຸນາຖ້າ... +SavingFailed = ບໍ່ສາມາດບັນທຶກຂໍ້ມູນ. +Select = ເລືອກ +Shift = ປ່ຽນ +Snap = Snap +Space = ຍະວ່າງ +SSID = SSID +Submit = ຍອມຮັບ +Supported = Supported +There is no data = ບໍ່ມີຂໍ້ມູນ. +Toggle All = ເລືອກທັງໝົດ +Toggle List = Toggle list +Unsupported = Unsupported +When you save, it will load on a PSP, but not an older PPSSPP = ເມື່ອເຈົ້າເຊບເກມ, ຈະສາມາດນຳໄປໂຫຼດເທິງເຄື່ອງ PSP ໄດ້\nແຕ່ບໍ່ແມ່ນສຳລັບ PPSSPP ທີ່ເກົ່າກວ່າ +When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Yes = ແມ່ນ +Zoom = ຊູມ + +[Error] +7z file detected (Require 7-Zip) = ໄຟລ໌ຖືກບີບອັດ (7z).\nກະລຸນາແຕກໄຟລ໌ກ່ອນ (ລອງໃຊ້ 7-Zip ຫຼື WinRAR). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = ບໍ່ສາມາດບັນທຶກໄຟລ໌ພາບໜ້າຈໍ. +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll not found. Please install. Or press Yes to try again using Direct3D 9 instead. +D3D11InitializationError = Direct3D 11 initialization error +D3D11Missing = Your operating system version does not include D3D11. Please run Windows Update.\n\nPress Yes to try again using Direct3D 9 instead. +D3D11NotSupported = Your GPU does not appear to support Direct3D 11.\n\nWould you like to try again using Direct3D 9 instead? +Disk full while writing data = ພື້ນທີ່ເຕັມໃນຂະນະທີ່ຂຽນຂໍ້ມູນ. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = ເກີດຂໍ້ຜິດພາດໃນການໂຫຼດເກມ. +Error reading file = ເກີດຂໍ້ຜິດພາດໃນການອ່ານໄຟລ໌ +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = ບໍ່ສາມາດລະບຸຊະນິດໄຟລ໌ +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = ລົ້ມເຫຼວໃນການເລີ່ມຕົ້ນກຣາບຟິກ. ກະລຸນາລອງອັບເກຣດໄດຣ໌ເວີ້ກຣາບຟິກ ແລະ DirectX 9 runtime ຂອງເຈົ້າ.\n\nເຈົ້າຢາກລອງປ່ຽນໄປໃຊ້ OpenGL ຫຼືບໍ່?\n\nຂໍ້ຄວາມຜິດພາດ: +GenericGraphicsError = ກຣາບຟິກຜິດພາດ +GenericOpenGLError = ລົ້ມເຫຼວໃນການເລີ່ມຕົ້ນກຣາບຟິກ. ກະລຸນາລອງອັບເກຣດໄດຣ໌ເວີ້ກຣາບຟິກຂອງເຈົ້າ.\n\nເຈົ້າຢາກຈະລອງປ່ຽນໄປໃຊ້ DirectX 9 ຫຼືບໍ່?\n\nຂໍ້ຄວາມຜິດພາດ: +GenericVulkanError = ລົ້ມເຫຼວໃນການເລີ່ມຕົ້ນກຣາບຟິກ. ກະລຸນາລອງອັບເກຣດໄດຣ໌ເວີ້ກຣາບຟິກຂອງເຈົ້າ.\n\nເຈົ້າຢາກລອງປ່ຽນໄປໃຊ້ OpenGL ຫຼືບໍ່?\n\nຂໍ້ຄວາມຜິດພາດ: +InsufficientOpenGLDriver = ໄດຣ໌ເວີ OpenGL ທີ່ພົບບໍ່ພຽງພໍສະໜັບສະໜຸນ!\n\nGPU ຂອງເຈົ້າລາຍງານວ່າບໍ່ສະໜັບສະໜູນ OpenGL 2.0 ເຊິ່ງຕ້ອງການໃນຕອນນີ້ສຳລັບເອີ້ນໃຊ້ PPSSPP\n\nຊ່ວຍກວດສອບ GPU ຂອງເຈົ້າທີ່ເຂົ້າກັນໄດ້ກັບ OpenGL 2.0. ຖ້າໄດ້ເຈົ້າຕ້ອງຫາແລະຕິດຕັ້ງໄດຣ໌ເວີກຣາບຟິກໃໝ່ຈາກເວັບໄຊຜູ້ຂາຍ GPU\n\nໄປທີ່ຟໍຣຳ https://forums.ppsspp.org ສຳລັບຂໍ້ມູນ +Just a directory. = ພຽງໄດເຣັກທໍຣີ. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = ບໍ່ພົບ EBOOT.PBP, ບໍ່ສາມາດລະບຸໄດ້ວ່າເປັນໄຟລ໌ເກມ. +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = ເກີດຂໍ້ຜິດພາດຂອງໄດຣ໌ເວີ OpenGL +PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = ຕອນນີ້ PPSSPP ບໍ່ສະໜັບສະໜຸນການເຊື່ອມຕໍ່ອິນເຕີເນັດສຳລັບ DLC, PSN, ຫຼືອັບເດດເກມ +PS1 EBOOTs are not supported by PPSSPP. = PS1 EBOOTs ບໍ່ສະໜັບສະໜຸນໂດຍ PPSSPP. +PSX game image detected. = ໄຟລ໌ນີ້ແມ່ນ MODE2 image. PPSSPP ບໍ່ສະໜັບສະໜຸນໄຟລ໌ເກມ PS1 +RAR file detected (Require UnRAR) = ໄຟລ໌ຖືກບີບອັດ (RAR).\nກະລຸນາແຕກໄຟລ໌ກ່ອນ (ລອງໃຊ້ UnRAR). +RAR file detected (Require WINRAR) = ໄຟລຖືກບີບອັດ (RAR).\nກະລຸນາແຕກໄຟລ໌ກ່ອນ (ລອງໃຊ້ WinRAR). +Running slow: try frameskip, sound is choppy when slow = ເກມເປີດຊ້າໂພດ: ລອງຂ້າມເຟຣມເບິ່ງ, ເພາະສຽງມັນຈະບໍ່ດີຖ້າມັນຊ້າເກີນໄປ +Running slow: Try turning off Software Rendering = Running slow: try turning off "software rendering" +Save encryption failed. This save won't work on real PSP = ການບັນທຶກແບບເຂົ້າລະຫັດລົ້ມເຫຼວ. ເຊບນີ້ບໍ່ສາມາດນຳໄປໃຊ້ກັບເຄື່ອງ PSP ແທ້ໆໄດ້ +textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +This is a saved state, not a game. = This is a saved state, not a game. +This is save data, not a game. = This is save data, not a game. +Unable to create cheat file, disk may be full = ບໍ່ສາມາດສ້າງໄຟລ໌ສູດໂກງ, ພື້ນທີ່ອາດຈະເຕັມ. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = ບໍ່ສາມາດຂຽນບັນທຶກຂໍ້ມູນ, ພື້ນທີ່ອາດຈະເຕັມ. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = ຄຳເຕືອນ: ໜ່ວຍຄວາມຈຳວີດີໂອເຕັມ, ຫຼຸດການ upscaling ແລະ ກຳລັງປ່ຽນໄປເປັນໂໝດແຄດແບບຊ້າ. +Warning: Video memory FULL, switching to slow caching mode = ຄຳເຕືອນ: ໜ່ວຍຄວາມຈຳວີດີໂອເຕັມ, ກຳລັງປ່ຽນໄປເປັນໂໝດແຄດແບບຊ້າ. +ZIP file detected (Require UnRAR) = ໄຟລຖືກບີບອັດ (ZIP).\nກະລຸນາແຕກໄຟລ໌ກ່ອນ (ລອງໃຊ້ UnRAR). +ZIP file detected (Require WINRAR) = ໄຟລ໌ຖືກບີບອັດ (ZIP).\nກະລຸນາແຕກໄຟລ໌ກ່ອນ (ລອງໃຊ້ WinRAR). + +[Game] +Asia = Asia +ConfirmDelete = ຢືນຢັນການລຶບ +Create Game Config = ສ້າງການຕັ້ງຄ່າເກມ +Create Shortcut = ຈາກຫຼ້າສຸດ +Delete Game = ລຶບເກມ +Delete Game Config = ລຶບການຕັ້ງຄ່າເກມ +Delete Save Data = ລຶບຂໍ້ມູນທີ່ບັນທຶກ +Europe = Europe +Game = ເກມ +Game Settings = ການຕັ້ງຄ່າເກມ +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = ຕິດຕັ້ງຂໍ້ມູນ +Japan = Japan +Korea = Korea +MB = MB +One moment please... = One moment please... +Play = ຫຼິ້ນ +Remove From Recent = ເອົາອອກຈາກໜ້າ "ຫຼ້າສຸດ" +SaveData = ບັນທຶກຂໍ້ມູນ +Setting Background = Setting background +Show In Folder = ສະແດງໃນໂຟນເດີ້ +USA = USA +Use UI background = ໃຊ້ເປັນພາບພື້ນຫຼັງ + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = ບໍ່ຈຳກັດ +(supersampling) = (supersampling) +(upscaling) = (ເພີ່ມຂະໜາດສເກລ) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = ຮຸນແຮງ +Alternative Speed = ຄວາມໄວເສີມ (ໃນ %, 0 = ບໍ່ຈຳກັດ) +Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Anisotropic Filtering = ກຳຈັດຄວາມບໍ່ຄົມຊັດ +Auto = ອັດຕະໂນມັດ +Auto (1:1) = ອັດຕະໂນມັດ (1:1) +Auto (same as Rendering) = ອັດຕະໂນມັດ (ແບບດຽວກັບຄວາມລະອຽດການສະແດງຜົນ) +Auto FrameSkip = ຂ້າມເຟຣມອັດຕະໂນມັດ +Auto Scaling = ປັບຂະໜາດສເກລອັດຕະໂນມັດ +Backend = ການສະໜັບສະໜູນ +Balanced = ສົມດຸນ +Bicubic = Bicubic +BlockTransfer Tip = ບາງເກມຕ້ອງເປີດໃຊ້ງານເພື່ອການສະແດງຜົນທີ່ຖືກຕ້ອງ +BlockTransferRequired = ຄຳເຕືອນ: ເກມນີ້ຕ້ອງການໃຫ້ເປີດໂໝດ "ຈຳລອງຜົນປິດກັ້ນການສົ່ງຜ່ານຂໍ້ມູນເອັບເຟກ" ນຳ +Both = ໃຊ້ທັງ FPS ແລະ Speed +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = ການສະແດງຜົນແບບໃຊ້ບັບເຟີ້ +BufferedRenderingRequired = Warning: This game requires "rendering mode" to be set to "buffered". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = ຂະໜາດຈໍ (ໃນ % ຂອງພອຣ໌ດມຸມມອງ) +Cardboard Screen X Shift = ປັບປ່ຽນແກນ X (ໃນ % ຂອງຊ່ອງວ່າງ) +Cardboard Screen Y Shift = ປັບປ່ຽນແກນ Y (ໃນ % ຂອງຊ່ອງວ່າງ) +Cardboard VR Settings = ການຕັ້ງຄ່າ Google Cardboard VR +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU core +Debugging = ການແກ້ຈຸດບົກພ່ອງ +DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. +Deposterize = Deposterize +Deposterize Tip = ແກ້ໄຂການສະແດງຜົນຜິດພາດຂອງແຖບພາບເມື່ອປັບເພີ່ມສເກລພື້ນຜິວ +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = ປິດເອັບເຟກທີ່ເຮັດໃຫ້ເກມຊ້າ (ໄວຂຶ້ນ) +Disabled = Disabled +Display layout editor = ແກ້ໄຂຮູບແບບໜ້າຈໍ +Display Resolution (HW scaler) = ຄວາມລະອຽດໜ້າຈໍ (ຕາມຮາດແວຣ໌) +Dump next frame to log = ດຶງຂໍ້ມູນຂອງເຟຣມຕໍ່ໄປເພື່ອເກັບບັນທຶກຄ່າ +Enable Cardboard VR = Enable Cardboard VR +FPS = FPS +Frame Rate Control = ຄວບຄຸມເຟຣມເຣດ +Frame Skipping = ຂ້າມເຟຣມ +Frame Skipping Type = Frame skipping type +FullScreen = ເຕັມໜ້າຈໍ +Hack Settings = ການຕັ້ງຄ່າແຮັກ +Hardware Tessellation = Hardware tessellation +Hardware Transform = ໃຊ້ຮາດແວຣ໌ປະມວນຜົນ +hardware transform error - falling back to software = ການແປງຄ່າຈາກຮາດແວຣ໌ລົ້ມເຫຼວ, ກັບໄປໃຊ້ແບບຊ໋ອບແວຣ໌ +HardwareTessellation Tip = ໃຊ້ຮາດແວຣ໌ໃນການສ້າງເສັ້ນໂຄ້ງ, ປັບຄຸນນະພາບຂອງເສັ້ນໃຫ້ຄົງທີ່ +High = ສູງ +Hybrid = Hybrid +Hybrid + Bicubic = Hybrid + Bicubic +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = ຄວາມລະອຽດພາຍໃນ +Lazy texture caching = ແຄດພື້ນຜິວແບບຫຍາບ (ໄວຂຶ້ນ) +Linear = Linear +Low = ຕ່ຳ +LowCurves = ລະດັບເສັ້ນສອງມິຕິ ຫຼື ເສັ້ນໂຄ້ງ +LowCurves Tip = ໃຊ້ສະເພາະບາງເກມ, ເພື່ອຄວບຄຸມຄວາມມື່ນໄຫຼຂອງເສັ້ນໂຄ້ງ +Lower resolution for effects (reduces artifacts) = ຫຼຸດຄວາມລະອຽດຂອງເອັບເຟກໃຫ້ຕ່ຳລົງ (ແກ້ພາບແຈ້ງ) +Manual Scaling = ກຳນົດຂະໜາດເອງ +Medium = ປານກາງ +Mode = ໂໝດ +Must Restart = ເຈົ້າຄວນເລີ່ມ PPSSPP ໃໝ່ເພື່ອເຫັນຜົນການປ່ຽນແປງ. +Native device resolution = ຄ່າຄວາມລະອຽດດັ້ງເດີມຂອງອຸປະກອນ +Nearest = Nearest +No buffer = No buffer +Non-Buffered Rendering = ຂ້າມການໃຊ້ບັບເຟີເອັບເຟກ (ບໍ່ໃຊ້ບັບເຟີ, ໄວຂຶ້ນ) +None = ບໍ່ມີ +Number of Frames = Number of frames +Off = ປິດ +OpenGL = OpenGL +Overlay Information = ການສະແດງຂໍ້ມູນຊ້ອນທັບ +Partial Stretch = ແນວຕັ້ງດຶງເຕັມຈໍ +Percent of FPS = Percent of FPS +Performance = ປະສິດທິພາບ +Postprocessing effect = Postprocessing effects +Postprocessing Shader = ຂະບວນການເຮັດວຽກໄລ່ປັບເສດສີ +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = ໂໝດການສະແດງຜົນ +Rendering Resolution = ຄວາມລະອຽດຂອງການສະແດງຜົນ +RenderingMode NonBuffered Tip = ໄວຂຶ້ນແທ້, ແຕ່ອາດມີອາການຈໍດຳໃນບາງເກມ +Retain changed textures = ຮັກສາການປ່ຽນແປງຂອງພື້ນຜິວ (ຊ້າບາງເທື່ອ) +RetainChangedTextures Tip = ບາງເກມໃຊ້ແລ້ວຄວາມໄວຫຼຸດລົງ ແຕ່ບາງເກມຄວາມໄວກໍເພີ່ມຂຶ້ນ +Rotation = ໝຸນຈໍ +Safe = ປອດໄພ +Screen layout = Screen layout +Screen Scaling Filter = ໂຕຕອງປັບສເກລໜ້າຈໍ +Show Debug Statistics = ສະແດງຄ່າທາງສະຖິຕິການແກ້ໄຂຈຸດບົກພ່ອງ +Show FPS Counter = ສະແດງຄ່າເຟຣມເຣດ ແລະ ຄວາມໄວ/ວິນາທີ +Simulate Block Transfer = ຈຳລອງຜົນປິດກັ້ນການສົ່ງຜ່ານຂໍ້ມູນເອັບເຟກ +SoftGPU Tip = ແນ່ນອນວ່າ ໂຄດຊ້າເລີຍ +Software Rendering = ໃຊ້ຊອບແວຣ໌ສະແດງຜົນ (ລຸ້ນທົດລອງ) +Software Skinning = ຊ໋ອບແວຣ໌ສກິນນິງ +SoftwareSkinning Tip = ປະສານໂມເດລພື້ນຜິວໃຫ້ຂຽນຜ່ານ CPU, ເກມສ່ວນໃຫຍ່ໃຊ້ແລ້ວໄວຂຶ້ນ +Speed = ຄວາມໄວ +Stretching = ດຶງເຕັມຈໍ +Texture Filter = ໂຕຕອງພື້ນຜິວ +Texture Filtering = ຕອງພື້ນຜິວ +Texture Scaling = ປັບພື້ນຜິວ +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Turn off "hardware tessellation": unsupported +Unlimited = ບໍ່ຈຳກັດ +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = ການເພີ່ມລະດັບສເກລພາບ +Upscale Type = ຮູບແບບການເພີ່ມສເກລພາບ +UpscaleLevel Tip = ຊີພີຢູເຮັດວຽກໜັກຂຶ້ນ - ບາງສເກລພາບອາດເກີດອາການໜ່ວງຈົນເຖິງຂັ້ນບໍ່ສະແດງ +Use all displays = Use all displays +Vertex Cache = Vertex Cache +VertexCache Tip = ໄວຂຶ້ນ, ແຕ່ອາດເກີດມີອາການພາບກະພິບໃນບາງເທື່ອ +VSync = ຄວບຄຸມລະດັບເຟຣມເຣດໃຫ້ຄົງທີ່ +Vulkan = Vulkan +Window Size = ຂະໜາດໜ້າຈໍ +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = ລຶບໄຟລ໌ ZIP +Install = ຕິດຕັ້ງ +Install game from ZIP file? = ຕິດຕັ້ງເກມຈາກໄຟລ໌ ZIP ຫຼືບໍ່? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = ຕິດຕັ້ງແລ້ວ! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = ກຳນົດຄ່າອັດຕະໂນມັດ +Autoconfigure for device = ກຳນົດຄ່າໃຫ້ອັດຕະໂນມັດສຳລັບອຸປະກອນນີ້ +Clear All = ລຶບທັງໝົດ +Default All = ຄືນຄ່າເລີ່ມຕົ້ນໃໝ່ໝົດ +Map a new key for = ປັບປຸ່ມໃໝ່ເພື່ອ +Map Key = Map key +Map Mouse = Map mouse +Test Analogs = ທົດສອບອະນາລ໋ອກ +You can press ESC to cancel. = ເຈົ້າສາມາດກົດ Esc ເພື່ອຍົກເລີກ. + +[MainMenu] +Browse = ຮຽກເບິ່ງ... +Buy PPSSPP Gold = Buy PPSSPP Gold +Choose folder = Choose folder +Credits = ເຄຣດິດ +PPSSPP Homebrew Store = ດາວໂຫຼດຈາກຮ້ານຄ້າໂຮມບຣິວ +Exit = ອອກ +Game Settings = ຕັ້ງຄ່າເກມ +Games = ເກມ +Give PPSSPP permission to access storage = ອະນຸຍາດໃຫ້ PPSSPP ເຂົ້າເຖິງບ່ອນຈັດເກັບຂໍ້ມູນເຄື່ອງ +Homebrew & Demos = ໂຮມບຣິວແລະເກມທົດລອງຫຼິ້ນ +How to get games = ວິທີການຮັບເກມທົດລອງຫຼິ້ນ +How to get homebrew & demos = ວິທີການໄດ້ຮັບເກມທົດລອງຫຼິ້ນແລະໂຮມບຣິວ +Load = ໂຫຼດ +Loading... = Loading... +PinPath = ປັກໝຸດ +PPSSPP can't load games or save right now = PPSSPP ບໍ່ສາມາດໂຫຼດເກມ ຫຼື ເຊບໃນຕອນນີ້ +Recent = ເກມທີ່ຫາກ່ອນຫຼິ້ນ +SavesAreTemporary = PPSSPP is saving in temporary storage +SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently +SavesAreTemporaryIgnore = Ignore warning +UnpinPath = ຖອດໝຸດ +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = ສຽງ +Controls = ການຄວບຄຸມ +Graphics = ກຣາບຟິກ +Networking = ເຄື່ອຂ່າຍ +System = ລະບົບ +Tools = ເຄື່ອງມື + +[MappableControls] +Alt speed 1 = Alt speed 1 +Alt speed 2 = Alt speed 2 +An.Down = ອະນາລ໋ອກລົງ +An.Left = ອະນາລ໋ອກຊ້າຍ +An.Right = ອະນາລ໋ອກຂວາ +An.Up = ອະນາລ໋ອກຂຶ້ນ +Analog limiter = ໂຕຈຳກັດອະນາລ໋ອກ +Analog Stick = ປຸ່ມອະນາລ໋ອກ +Audio/Video Recording = Audio/Video recording +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = ສະຫຼັບດ້ານແກນ +Circle = Circle +Cross = Cross +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = ເມນູຜູ້ພັດທະນາ +Down = Dpad ລົງ +Dpad = Dpad +Frame Advance = Frame Advance +Hold = Hold +Home = Home +L = L +Left = Dpad ຊ້າຍ +Load State = ໂຫຼດບັນທຶກເກມ +Mute toggle = Mute toggle +Next Slot = ຊ່ອງຕໍ່ໄປ +None = None +Note = Note +OpenChat = Open chat +Pause = ຢຸດຊົ່ວຄາວ +R = R +RapidFire = ປຸ່ມລົວຕໍ່ເນື່ອງ +Remote hold = Remote hold +Rewind = ໝຸນກັບ +Right = Dpad ຂວາ +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = ອະນາລ໋ອກຂວາລຸ່ມ +RightAn.Left = ອະນາລ໋ອກຂວາຊ້າຍ +RightAn.Right = ອະນາລ໋ອກຂວາຂວາ +RightAn.Up = ອະນາລ໋ອກຂວາເທິງ +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = ບັນທຶກເກມ +Screen = Screen +Screenshot = Screenshot +Select = Select +SpeedToggle = ເລັ່ງຄວາມໄວເສີມ +Square = Square +Start = Start +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = Toggle fullscreen +Toggle mode = Toggle mode +Triangle = Triangle +Unthrottle = ເລັ່ງເທີໂບ +Up = Dpad ຂຶ້ນ +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = ເຂົ້າຊົມຟໍຣຳ Ad Hoc Multiplayer +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = ປ່ຽນຄ່າທີ່ຢູ່ MAC +Change proAdhocServer Address = ປ່ຽນໄອພີທີ່ຢູ່ຂອງເຊີບເວີ Pro Adhoc (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = ເປີດການໃຊ້ງານເຊີບເວີ PRO Adhoc +Enable network chat = Enable network chat +Enable networking = ເປີດການໃຊ້ງານລະບົບເຄື່ອຂ່າຍ / WLAN (ລຸ້ນທົດລອງ) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = ເລີ່ມການເຮັດວຽກລະບົບເຄື່ອຂ່າຍແລ້ວ +Please change your Port Offset = Please change your port offset +Port offset = ພອຣ໌ດຊົດເຊີຍ (0 = ຄ່າເລີ່ມຕົ້ນຂອງ PSP) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Send Discord "Rich Presence" information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = ສູດໂກງ +Continue = ຫຼິ້ນຕໍ່ +Create Game Config = ສ້າງການຕັ້ງຄ່າເກມ +Delete Game Config = ລຶບການຕັ້ງຄ່າເກມ +Exit to menu = ອອກຈາກເມນູ +Game Settings = ຕັ້ງຄ່າເກມ +Load State = ໂຫຼດບັນທຶກເກມ +Rewind = ໝຸນກັບ +Save State = ບັນທຶກເກມ +Settings = ການຕັ້ງຄ່າ +Switch UMD = ສະຫຼັບແຜ່ນ UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Color +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Cartoon +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT +FXAA = FXAA +Gamma = Gamma +Grayscale = Grayscale +Intensity = Intensity +InverseColors = InverseColors +Natural = Natural +NaturalA = Natural Colors (no blur) +Off = ປິດ +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlines (CRT) +Sharpen = Sharpen +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 Upscaler +VideoSmoothingAA = VideoSmoothingAA +Vignette = Vignette + +[PSPCredits] +all the forum mods = all the forum mods +build server = build server +Buy Gold = ຊື້ແບບ Gold +check = ລວມໄປເຖິງອີມູເລເຕີຣ໌ Dolphin, ດີທີ່ສຸດສຳລັບຫຼິ້ນ Wii/GC ໃນຕອນນີ້: +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = ຜູ້ມີສ່ວນຊ່ອຍ: +created = ສ້າງໂດຍ +Discord = Discord +info1 = PPSSPP ຖືກອອກແບບໂດຍມີຈຸດປະສົງເພື່ອໃຊ້ການສຶກສາເທົ່ານັ້ນ. +info2 = ກະລຸນາກວດສອບໃຫ້ແນ່ໃຈວ່າເກມທີ່ເຈົ້າມີຢູ່ນັ້ນຖືກຕ້ອງຕາມລິຂະສິດ +info3 = ເຈົ້າສາມາດຫາເກມຫຼິ້ນໄດ້ຈາກແຜ່ນ UMD ຫຼື ຊື້ຜ່ານຊ່ອງທາງອອນລາຍ +info4 = ດາວໂຫຼດຜ່ານຮ້ານຄ້າ PSN ເທິງເຄື່ອງ PSP ຂອງເຈົ້າ +info5 = PSP ແມ່ນເຄື່ອງໝາຍການຄ້າຂອງ Sony, Inc. +iOS builds = iOS builds +license = ຊອບແວຣ໌ຟຣີພາຍໃຕ້ GPL 2.0+ +list = ລາຍຊື່ເກມທີ່ຫຼິ້ນໄດ້, ຟໍຣຳ ແລະ ຂໍ້ມູນການພັດທະນາ +PPSSPP Forums = ຟໍຣຳ PPSSPP +Privacy Policy = Privacy policy +Share PPSSPP = ແບ່ງປັນ PPSSPP +specialthanks = ຂໍຂອບໃຈເປັນພິເສດ ເຖິງ: +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = ແປໂດຍ: +title = ຈຳລອງເຄື່ອງ PSP ໃນ PC, Android, iOS, Blackberry, Symbian, MacOS X, Linux +tools = ເຄື່ອງມືຟຣີທີ່ນຳມາໃຊ້ງານ: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = Dothavisak +translators2 = Soutsaka College of Management and Technology +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = ກວດສອບຂໍ້ມູນທີ່ເວັບໄຊ: +written = ຂຽນໂດຍພາສາ C++ ເພື່ອປະສິດທິພາບ, ຄວາມໄວ ແລະຄວາມສະຖຽນ + +[RemoteISO] +Browse Games = Browse games +Local Server Port = Local server port +Manual Mode Client = Manual mode client +Remote disc streaming = Remote disc streaming +Remote Port = Remote port +Remote Server = Remote server +Remote Subdirectory = Remote subdirectory +RemoteISODesc = Games in your recent list will be shared +RemoteISOLoading = Connected, loading game list... +RemoteISOScanning = Scanning... Click "share games" on your server device +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Note: Connect both devices to the same Wi-Fi network +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Settings +Share Games (Server) = Share games (server) +Share on PPSSPP startup = Share on PPSSPP startup +Stop Sharing = Stop sharing +Stopping.. = Stopping... + +[Reporting] +Bad = ບໍ່ດີ +FeedbackDelayInfo = ຂໍ້ມູນຂອງເຈົ້າກຳລັງຖືກສົ່ງໃນເບື້ອງຫຼັງ. +FeedbackDesc = "ແອັບຈຳລອງນີ້ເປັນແນວໃດ? ບອກໃຫ້ເຮົາ ແລະ ຊຸມຊົນຮູ້ນຳກັນ!" +FeedbackDisabled = Compatibility server reports must be enabled. +FeedbackIncludeCRC = Note: Battery will be used to send a disc CRC +FeedbackIncludeScreen = Include a screenshot +FeedbackSubmitDone = ຂໍ້ມູນຂອງເຈົ້າຖືກສົ່ງແລ້ວ. +FeedbackSubmitFail = ບໍ່ສາມາດສົ່ງຂໍ້ມູນໄປທີ່ເຊີບເວີ. ກະລຸນາອັບເດດ PPSSPP. +FeedbackThanks = ຂໍຂອບໃຈສຳລັບການລາຍງານ. +Gameplay = Gameplay +Graphics = ກຣາບຟິກ +Great = ດີ +In-game = ພາຍໃນ-ເກມ +In-game Description = ເຂົ້າໄປຫຼິ້ນຮອດໜ້າເກມເພລ, ແຕ່ມີບັ໊ກຫຼາຍເກີນໄປ +Menu/Intro = ເມນູ/ໜ້າເລີ່ມເກມ +Menu/Intro Description = "ບໍ່ສາມາດເຂົ້າໄປຫຼິ້ນໄດ້" +Nothing = ບໍ່ມີຫຍັງ +Nothing Description = ເຂົ້າເກມບໍ່ໄດ້ເລີຍ +OK = ໃຊ້ໄດ້ +Open Browser = ເປີດບຣາວເຊິ້ +Overall = ໂດຍລວມ +Perfect = ດີຫຼາຍ +Perfect Description = ຫຼິ້ນເກມໄດ້ບໍ່ມີບ່ອນຕິຕະຫຼອດເກມ - ດີຫຼາຍ! +Plays = ໃນຕອນຫຼິ້ນ +Plays Description = ຫຼິ້ນໄດ້ຕະຫຼອດເກມ ແຕ່ມີບັນຫາໃນບາງຈຸດ +ReportButton = ລາຍງານການຕອບກັບ +Speed = ຄວາມໄວ +Submit Feedback = ຢືນຢັນການຕອບກັບ +SuggestionConfig = See reports on website for good settings. +SuggestionCPUSpeed0 = Disable locked CPU speed setting. +SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this bug). +SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. +SuggestionsNone = This game isn't working for other users too. +SuggestionsWaiting = Submitting and checking other users feedback... +SuggestionUpgrade = Upgrade to a newer PPSSPP build. +SuggestionVerifyDisc = Check your ISO is a good copy of your disc. +Unselected Overall Description = ເກມນີ້ປະມວນຜົນໄດ້ດີປານໃດ? +View Feedback = ເບິ່ງການລາຍງານ + +[Savedata] +Date = Date +Filename = Filename +No screenshot = ບໍ່ມີການຈັບພາບໜ້າຈໍ +None yet. Things will appear here after you save. = ຍັງບໍ່ມີຂໍ້ມູນເທື່ອ. ຈະມີກໍຕໍ່ເມື່ອເຈົ້າໄດ້ກົດບັນທຶກເອົາໄວ້. +Save Data = ຂໍ້ມູນເຊບ +Save States = ໄຟລ໌ບັນທຶກ +Savedata Manager = ຈັດການຂໍ້ມູນເຊບ +Size = Size + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = ລະວັງ: ກວດພົບ Chainfire3D, ອາດເກີດບັນຫາໄດ້. +Failed to load state = ລົ້ມເຫຼວໃນການໂຫຼດໄຟລ໌ບັນທຶກ +Failed to save state = ລົ້ມເຫຼວໃນການບັນທຶກໄຟລ໌ບັນທຶກ +fixed = ຄວາມໄວ: ຕາມທີ່ປັບໃຊ້ +GLToolsWarning = ລະວັງ: ກວດພົບ GLTools, ອາດເກີດບັນຫາໄດ້. +In menu = In menu +Load savestate failed = ໂຫຼດໄຟລ໌ບັນທຶກລົ້ມເຫຼວ +Loaded State = ໂຫຼດໄຟລ໌ບັນທຶກແລ້ວ +Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +LoadStateDoesntExist = "ລົ້ມເຫຼວໃນການໂຫຼດໄຟລ໌ບັນທຶກ: ໄຟລ໌ບັນທຶກບໍ່ຖືກຕ້ອງ!" +LoadStateWrongVersion = ລົ້ມເຫຼວໃນການໂຫຼດໄຟລ໌ບັນທຶກ: ໄຟລ໌ບັນທຶກແມ່ນເວີຊັ່ນເກົ່າຂອງ PPSSPP! +norewind = ບໍ່ມີຂໍ້ມູນໄຟລ໌ບັນທຶກແບບຍ້ອນຫຼັງ. +Playing = Playing +PressESC = ກົດ ESC ເພື່ອເປີດເມນູຢຸດຊົ່ວຄາວ +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = ເກີດຂໍ້ຜິດພາດໃນການບັນທຶກເກມ! +Saved State = ເຊບເກມ +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Speed: alternate 2 +standard = ຄວາມໄວ: ມາດຕະຖານ +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = ຕິດຕັ້ງຮຽບຮ້ອຍແລ້ວ +Connection Error = ການເຊື່ອມຕໍ່ລົ້ມເຫຼວ +Install = ຕິດຕັ້ງ +Launch Game = ເລີ່ມເກມ +Loading... = ກຳລັງໂຫຼດ... +MB = MB +Size = ຂະໜາດ +Uninstall = ຖອນການຕິດຕັ້ງ + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d cores) +%d bytes = %d bytes +(none detected) = (none detected) +3D API = 3D API +ABI = ABI +API Version = API version +Audio Information = Audio information +Board = Board +Build Config = Build config +Build Configuration = Build Configuration +Built by = Built by +Core Context = Core context +Cores = Cores +CPU Extensions = CPU extensions +CPU Information = CPU information +CPU Name = Name +D3DCompiler Version = D3DCompiler version +Debug = Debug +Debugger Present = Debugger present +Device Info = Device info +Display Information = Display information +Driver Version = Driver version +EGL Extensions = EGL extensions +Frames per buffer = Frames per buffer +GPU Information = GPU information +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Lang/Region +Memory Page Size = Memory page size +Native Resolution = Native resolution +OGL Extensions = OGL extensions +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 extensions +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 extensions +OpenGL Extensions = OpenGL extensions +Optimal frames per buffer = Optimal frames per buffer +Optimal sample rate = Optimal sample rate +OS Information = OS information +PPSSPP build = PPSSPP build +Refresh rate = Refresh rate +Release = Release +RW/RX exclusive = RW/RX exclusive +Sample rate = Sample rate +Shading Language = Shading language +Sustained perf mode = Sustained perf mode +System Information = System information +System Name = Name +System Version = System version +Threads = Threads +Vendor = Vendor +Vendor (detected) = Vendor (detected) +Version Information = Version information +Vulkan Extensions = Vulkan extensions +Vulkan Features = Vulkan features + +[System] +(broken) = (ເສຍຫາຍ) +12HR = 12 ຊົ່ວໂມງ +24HR = 24 ຊົ່ວໂມງ +Auto = ອັດຕະໂນມັດ +Auto Load Savestate = Auto load savestate +AVI Dump started. = ເລີ່ມຖ່າຍໂອນຂໍ້ມູນ AVI ແລ້ວ. +AVI Dump stopped. = ຢຸດຖ່າຍໂອນຂໍ້ມູນ AVI ແລ້ວ. +Cache ISO in RAM = ເກັບແຄດ ISO ໄວ້ໃນ RAM +Change CPU Clock = "ປ່ຽນຄ່າຈຳລອງຄວາມຖີ່ຂອງ CPU (ບໍ່ສະຖຽນ)" +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = ປ່ຽນຊື່ຫຼິ້ນ +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = ສູດໂກງ (ຂັ້ນທົດລອງ, ເບິ່ງເພີ່ມຕື່ມທີ່ຟໍຣຳ) +Clear Recent = Clear "Recent" +Clear Recent Games List = ລຶບລາຍການເກມທີ່ຫາກ່ອນຫຼິ້ນໄປຫຼ້າສຸດ +Clear UI background = ລຶບພາບພື້ນຫຼັງ +Confirmation Button = ປຸ່ມຢືນຢັນ +Date Format = ຮູບແບບວັນທີ +Day Light Saving = Daylight savings +DDMMYYYY = ວັນ/ເດືອນ/ປີ +Decrease size = Decrease size +Developer Tools = ເຄື່ອງມືສຳລັບນັກພັດທະນາ +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emulation +Enable Cheats = ເປີດໃຊ້ງານສູດໂກງ +Enable Compatibility Server Reports = ເປີດໃຊ້ງານຄວາມເຂົ້າກັນໄດ້ໂດຍໃຊ້ເຊີບເວີລາຍງານ +Failed to load state. Error in the file system. = ລົ້ມເຫຼວໃນການໂຫຼດບັນທຶກ. ເກີດຄວາມຜິດພາດໃນໄຟລ໌ລະບົບ. +Failed to save state. Error in the file system. = Failed to save state. Error in the file system. +Fast (lag on slow storage) = ໄວ (ອາດແລັກຫາກບ່ອນເກັບຂໍ້ມູນອ່ານຊ້າ) +Fast Memory = ໜ່ວຍຄວາມຈຳເຮັດວຽກໄວຂຶ້ນ (ໃຊ້ໄດ້ກັບບາງອຸປະກອນ) +Force real clock sync (slower, less lag) = ບັງຄັບການຊິງສັນຍານຄວາມຖີ່ (ຊ້າກວ່າ, ແລັກໜ້ອຍກວ່າ) +frames, 0:off = ເຟຣມ, 0 = ປິດ +Games list settings = Games list settings +General = ທົ່ວໄປ +Grid icon size = Grid icon size +Help the PPSSPP team = ຊ່ອຍເຫຼືອທີມງານ PPSSPP +Host (bugs, less lag) = Host (ອາດມີບັ໊ກ, ແລັກໜ້ອຍລົງ) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Interpreter +IO timing method = ທາງເລືອກຄຳນວນເວລາ ຮັບ/ສົ່ງ (I/O) +IR Interpreter = IR Interpreter +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = ໃສ່ແນວບັນທຶກຂໍ້ມູນ (Memory Stick) +MHz, 0:default = MHz, 0 = ຄ່າເລີ່ມຕົ້ນ +MMDDYYYY = ເດືອນ/ວັນ/ປີ +Newest Save = Newest save +Not a PSP game = ອັນນີ້ບໍ່ແມ່ນເກມ PSP +Off = ປິດ +Oldest Save = Oldest save +PSP Model = ໂມເດລ PSP +PSP Settings = ຕັ້ງຄ່າ PSP +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = ບັນທຶກສຽງ Audio +Record Display = ບັນທຶກພາບ Display +Reset Recording on Save/Load State = Reset recording on Save/Load state +Restore Default Settings = "ຄືນຄ່າການຕັ້ງຄ່າຂອງ PPSSPP ເປັນຄ່າເລີ່ມຕົ້ນ" +Rewind Snapshot Frequency = Rewind snapshot frequency (mem hog) +Save path in installed.txt = ບັນທຶກຂໍ້ມູນໃນ installed.txt +Save path in My Documents = ບັນທຶກຂໍ້ມູນໄວ້ທີ່ My Documents +Savestate Slot = ຊ່ອງເກັບເຊບ +Savestate slot backups = Savestate slot backups +Screenshots as PNG = ຈັບພາບໜ້າຈໍເປັນ PNG +Set UI background... = ປ່ຽນພາບພື້ນຫຼັງ... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Simulate UMD delays +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = ບ່ອນເກັບຂໍ້ມູນເຕັມ +Sustained performance mode = Sustained performance mode +Time Format = ຮູບແບບເວລາ +UI = ການໂຕ້ຕອບຜູ້ໃຊ້ +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Use Lossless Video Codec (FFV1) +Use O to confirm = ໃຊ້ O ເປັນປຸ່ມຢືນຢັນ +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = ໃຊ້ X ເປັນປຸ່ມຢືນຢັນ +VersionCheck = ກວດສອບເວີຊັ່ນໃໝ່ຂອງ PPSSPP +WARNING: Android battery save mode is on = WARNING: Android battery save mode is On +WARNING: Battery save mode is on = WARNING: Battery save mode is on +YYYYMMDD = ປີ/ເດືອນ/ວັນ + +[Upgrade] +Details = Details +Dismiss = ຍົກເລີກ +Download = ດາວໂຫຼດ +New version of PPSSPP available = ເວີຊັ່ນໃໝ່ຂອງ PPSSPP ພ້ອມໃຫ້ໂຫຼດແລ້ວ! diff --git a/assets/lang/lt-LT.ini b/assets/lang/lt-LT.ini new file mode 100644 index 0000000000..2181bd8f17 --- /dev/null +++ b/assets/lang/lt-LT.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = Audio backend (restart req.) +AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) +Auto = Auto +Device = Device +DSound (compatible) = DSound (compatible) +Enable Sound = Įjungti garsą +Global volume = Global volume +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = WASAPI (fast) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Analog axis sensitivity +Analog Limiter = Analog limiter +Analog Mapper High End = Analog mapper high-end (axis sensitivity) +Analog Mapper Low End = Analog mapper low-end (inverse deadzone) +Analog Mapper Mode = Analog mapper mode +Analog Stick = Analoginė svirtelė +AnalogLimiter Tip = When the analog limiter button is pressed +Auto = Automatinis +Auto-centering analog stick = Auto-centering analog stick +Auto-hide buttons after seconds = Auto-hide buttons after seconds +Binds = Binds +Button Opacity = Mygtukų opacity +Button style = Mygtukų stilius +Calibrate D-Pad = Kalibruoti krypčių mygtukus +Calibration = Kalibravimas +Classic = Klasikinis +Combo Key Setting = Combo key setting +Combo Key Setup = Combo key setup +Confine Mouse = Trap mouse within window/display area +Control Mapping = Valdymo mygtukų nustatymai +Custom layout... = Pakeisti liečiamo valdymo mygtukų pozicijas ir dydį... +Customize tilt = Pakeisti pakreipimo parametrus... +D-PAD = Krypčių mygtukai +Deadzone Radius = "Mirties zonos" spindulys +DInput Analog Settings = DInput analog settings +Disable D-Pad diagonals (4-way touch) = Išjungti krypčių mygtukų įstrižainę (4 paspaudimais vienu metu liečiamam ekranui) +Glowing borders = Glowing borders +HapticFeedback = "Lytėjimo" atsakomoji reakcija (vibracija) +Ignore gamepads when not focused = Ignore gamepads when not focused +Ignore Windows Key = Išjungti Windows klavišą +Invert Axes = Perkeisti ašis +Invert Tilt along X axis = Invertuoti pakreipimą palei X ašį +Invert Tilt along Y axis = Invertuoti pakreipimą palei Y ašį +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Klaviatūros valdymo parametrai... +L/R Trigger Buttons = L/R trigger buttons +Landscape = Gulsčias +Landscape Auto = Landscape auto +Landscape Reversed = Gulsčias (apsuktas) +Mouse = Mouse settings +Mouse sensitivity = Mouse sensitivity +Mouse smoothing = Mouse smoothing +MouseControl Tip = You can now map mouse in control mapping screen by pressing the 'M' icon. +None (Disabled) = Nieko (išjungta) +Off = Off +OnScreen = Ekrano liečiami kontrolės mygtukai +Portrait = Status +Portrait Reversed = Status (apsuktas) +PSP Action Buttons = PSP konsolės veiksmų mygtukai +Screen Rotation = Ekramo pasukimas +seconds, 0 : off = seconds, 0 = off +Sensitivity = Sensitivacija +Show right analog = Show right analog +Show Touch Pause Menu Button = Rodyti liečiamą pauzės meniu mygtuką +Thin borders = Ploni kraštai +Tilt Base Radius = Tilt base radius +Tilt Input Type = Pakreipimo įvedimo įrenginio tipas +Tilt Sensitivity along X axis = Pakreipimo sensitivacija palei X ašį +Tilt Sensitivity along Y axis = Pakreipimo sensitivacija palei Y ašį +To Calibrate = Jei norite kalibruoti, laikykite įrenginį ant tiesaus paviršiaus ir paspauskite "Kalibruoti". +Touch Control Visibility = Touch control visibility +Use custom right analog = Use custom right analog +Use Mouse Control = Use mouse control +Visibility = Matomumas +X = X +X + Y = X + Y +XInput Analog Settings = XInput analog settings +Y = Y + +[CwCheats] +Cheats = Kodai +Edit Cheat File = Redaguoti kodų failą +Enable/Disable All = Įjungti/Išjungti visus Kodus +Import Cheats = Importuoti iš cheat.db +Options = Parametrai +Refresh Rate = Atsinaujinimo dažnis + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = &Apie PPSSPP... +Auto = &Auto +Backend = Rendering &Backend (Restarts PPSSPP) +Bicubic = &Bicubic +Break = Break +Break on Load = Break on load +Buffered Rendering = &Buffered Rendering +Buy Gold = Nusipirkti &Gold +Control Mapping... = Va&ldymo mygtukų keitimas... +Debugging = &Ekspermentas +Deposterize = &Deposterize +Direct3D9 = &Direct3D9 +Direct3D11 = Direct3D &11 +Disassembly = "&Ardyti..." +Discord = Discord +Display Layout Editor = Display layout editor... +Display Rotation = Display rotation +Dump Next Frame to Log = "R&ašyti" kitą kadrą į "statusą" +Emulation = &Emulation +Enable Chat = Enable chat +Enable Cheats = Įjungti &kodus +Enable Sound = Įjungti g&arsą +Exit = I&šeiti +Extract File... = "I&šspausti" failą... +File = &Failas +Frame Skipping = &Kadrų praleidimas +Frame Skipping Type = Frame skipping type +Fullscreen = Pil&nas ekranas +Game Settings = &Žaidimo parametrai +GE Debugger... = GE eks&permenteris... +GitHub = Git&Hub +Hardware Transform = &Aparatūros Transformacija +Help = &Help +Hybrid = &Hybridas +Hybrid + Bicubic = H&ybridas + Bicubic +Ignore Illegal Reads/Writes = &Ignoruoti nelegalius skaitymus/rašymus +Ignore Windows Key = Ignoruoti Windows klavišą +Keep PPSSPP On Top = &Laikyti "PPSSPP" ant viršaus +Landscape = Landscape +Landscape reversed = Landscape reversed +Language... = Ka&lba... +Linear = &Linijinis +Load = &Krauti... +Load .sym File... = Lo&ad .sym File... +Load Map File... = Krauti "&žemėlapio" failą... +Load State = K&rauti statusą +Load State File... = &Krauti statuso failą... +Log Console = "&Statuso" konsolė +Memory View... = Atminties &rodymas... +More Settings... = &Daugiau parametrų... +Nearest = &Arčiausias +Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) +Off = &Išjungti +Open Directory... = Atidaryti &vietą... +Open from MS:/PSP/GAME... = A&tidaryti iš MS:/PSP/GAME... +Open Memory Stick = Atidaryti "&Memory Stick" +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = &Pauzė +Pause When Not Focused = &Stabdyti kai nefokusuota +Portrait = Portrait +Portrait reversed = Portrait reversed +Postprocessing Shader = Postprocessin&g Shader +PPSSPP Forums = PPSSPP &Forumai +Record = &Record +Record Audio = Record &audio +Record Display = Record &display +Rendering Mode = R&odymo r&ežimas +Rendering Resolution = &Rodymo rezoliucija +Reset = P&erkrauti +Reset Symbol Table = Perkrauti s&imbolių "stalą" +Run = &Paleisti +Save .sym File... = Sav&e .sym File... +Save Map File... = &Išsaugoti "žemėlapio" failą... +Save State = I&šsaugoti statusą +Save State File... = &Išsaugoti statuso failą... +Savestate Slot = Iš&saugojimo statuso vieta +Screen Scaling Filter = Scr&een Scaling Filter +Show Debug Statistics = Rodyti Debu&g statistikas +Show FPS Counter = Rodyti &kadrų per sekundę rodmenis +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = &Stabdyti +Switch UMD = Perkeisti "UMD" +Take Screenshot = &Nufotografuoti nuotrauką +Texture Filtering = Te&kstūrų filtravimas +Texture Scaling = &Tekstūrų Scaling +Use Lossless Video Codec (FFV1) = &Use lossless video codec (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = &Vertex Cache +VSync = "VS&ync" +Vulkan = Vulkan +Window Size = &Lango dydis +www.ppsspp.org = Apsilankyti www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allocator viewer (Vulkan) +Allow remote debugger = Allow remote debugger +Backspace = Backspace +Block address = Block address +By Address = By address +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Create/Open textures.ini file for current game +Current = Current +Dev Tools = Development tools +DevMenu = DevMenu +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = "Rašyti" atrakintą "EBOOT.BIN" failą žaidimui kraunantis +Dump Frame GPU Commands = Dump frame GPU commands +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Įjungti testinio režimo statuso rašymą į failus +Enter address = Enter address +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Frame profiler +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = Jit compare +JIT debug tools = JIT debug tools +Language = Kalba +Load language ini = Krauti kalbos .ini failą +Log Dropped Frame Statistics = Log dropped frame statistics +Log Level = Log level +Log View = Log view +Logging Channels = Rašymo į statusą kanalai +Next = Kitas +No block = No block +Prev = Previous +Random = Random +Replace textures = Replace textures +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Ar atstatyti "PPSSPP" parametrus į numatytuosius?\nValdymo mygtukų parametrai nebus atstatyti į numatytuosius.\n\n\nJūs negalėsite atstatyti statuso į prieš tai buvusį.\nJūs turite perkrauti "PPSSPP" programą, kad pakeisti parametrai turėtų efektą. +RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? +Resume = Resume +Run CPU Tests = Atidaryti pagrindinio procesoriaus testus +Save language ini = Išsaugoti kalbos .ini failą +Save new textures = Save new textures +Shader Viewer = Shader viewer +Show Developer Menu = Rodyti kūrėjų meniu +Show on-screen messages = Show on-screen messages +Stats = Stats +System Information = Sistemos informacija +Texture Replacement = Texture replacement +Toggle Audio Debug = Toggle audio debug +Toggle Freeze = Toggle freeze +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP res +Active = Active +Back = Atgal +Cancel = Atšaukti +Center = Center +ChangingGPUBackends = Changing GPU backends requires PPSSPP to restart. Restart now? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = Pasirinkite PPSSPP išsaugojimo aplanką +Confirm Overwrite = Ar norite perrašyti šitus duomenis? +Confirm Save = Ar norite išsaugoti šitus duomenis? +ConfirmLoad = Ar krauti šitus duomenis? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Ištrinti +Delete all = Ištrinti viską +Delete completed = Ištrinimas baigtas. +DeleteConfirm = This save data will be deleted.\nAre you sure you want to continue? +DeleteConfirmAll = Ar norite tikrai ištrinti visus\njūsų išsaugojimo duomenis šitam žaidimui? +DeleteConfirmGame = Ar norite tikrai ištrinti šitą žaidimą\niš jūsų įrenginio? Jūs negalite atstatyti šitos komandos. +DeleteConfirmGameConfig = Ar tikrai norite ištrinti šiuos nustatymus iš šito žaidimo? +DeleteFailed = Neįmanoma ištrinti duomenų. +Deleting = Ištrina\nPrašome palaukti... +Disable All = Disable all +Edit = Edit +Enable All = Enable all +Enter = Įeitis +Finish = Baigti +Grid = Grid +Inactive = Inactive +InternalError = An internal error has occurred. +Load = Krauti +Load completed = Krovimas baigtas. +Loading = Kraunama\nPrašome palaukti... +LoadingFailed = Neįmanoma krauti duomenų. +Move = Perkelti +Network Connection = Interneto tinklas +NEW DATA = NAUJI DUOMENYS +No = Ne +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = Gerai +Old savedata detected = Aptikti seniau išsaugoti duomenys +Options = Options +Reset = Perkrauti +Resize = Perkeisti dydį +Retry = Pabandyti dar kartą +Save = Išsaugoti +Save completed = Išsaugojimas baigtas. +Saving = Išsaugoma\nPrašome palaukti... +SavingFailed = Neįmanoma išsaugoti duomenų. +Select = Pasirinkti +Shift = Shift +Snap = Snap +Space = Tarpas +SSID = SSID +Submit = Patvirtinti +Supported = Supported +There is no data = Čia nėra jokių duomenų. +Toggle All = Perjungti visus +Toggle List = Toggle list +Unsupported = Unsupported +When you save, it will load on a PSP, but not an older PPSSPP = When you save, it will load on a PSP, but not an older PPSSPP +When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Yes = Taip +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = file is compressed (7z).\nPlease decompress first (try 7-Zip or WinRAR). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = Could not save screenshot file. +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll not found. Please install. Or press Yes to try again using Direct3D 9 instead. +D3D11InitializationError = Direct3D 11 initialization error +D3D11Missing = Your operating system version does not include D3D11. Please run Windows Update.\n\nPress Yes to try again using Direct3D 9 instead. +D3D11NotSupported = Your GPU does not appear to support Direct3D 11.\n\nWould you like to try again using Direct3D 9 instead? +Disk full while writing data = Disk full while writing data. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = Klaida kraunant failą: +Error reading file = Klaida skaitant failą. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = Neįmanoma indefikuoti failo. +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Failed initializing graphics. Try upgrading your graphics drivers and DirectX 9 runtime.\n\nWould you like to try switching to OpenGL?\n\nError message: +GenericGraphicsError = Graphics Error +GenericOpenGLError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to DirectX 9?\n\nError message: +GenericVulkanError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to OpenGL?\n\nError message: +InsufficientOpenGLDriver = Netinkama OpenGL tvarkyklė vaizdo procesoriuje!\n\nJūsų vaizdo procesorius sako, kad vaizdo procesorius nepalaiko "OpenGL 2.0", kuris reikalingas "PPSSPP" programai paleisti.\n\nPažiūrekite, ar vaizdo procesorius palaiko "OpenGL 2.0". Jei jis palaiko "OpenGL 2.0", jums reikia instaliuoti naujiausią vaizdo procesoriaus tvarkyklės versiją iš oficialios vaizdo procesoriaus gamintojo svetainės.\n\nEikite į forumus, kurie yra https://forums.ppsspp.org svetainėje, gad gautumėte daugiau informacijos. +Just a directory. = Tiesiog direktorija. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = Nėra "EBOOT.PBP" failo, "Blogas" žaidimas. +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = OpenGL tvarkyklės klaida +PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP dabar nepalaiko interneto funkcijos, kad būtų galima parsisiųsti daugiau žaidimų turinio arba žaidimų, žaisti internete arba prisijungti prie PlayStation Network tarnybos. +PS1 EBOOTs are not supported by PPSSPP. = PS1 EBOOTs are not supported by PPSSPP. +PSX game image detected. = Failas yra "MODE2" atvaizdas. "PPSSPP" nepalaiko PlayStation 1 žaidimų. +RAR file detected (Require UnRAR) = Failas yra suspaustas (RAR formato).\nReikia išpausti jį (pabandykite UnRAR). +RAR file detected (Require WINRAR) = Failas yra suspaustas (RAR formato).\nReikia išpausti jį (pabandykite WinRAR). +Running slow: try frameskip, sound is choppy when slow = Running slow: try frameskip, sound is choppy when slow +Running slow: Try turning off Software Rendering = Running slow: try turning off "software rendering" +Save encryption failed. This save won't work on real PSP = Save encryption failed. This save won't work on real PSP +textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +This is a saved state, not a game. = This is a saved state, not a game. +This is save data, not a game. = This is save data, not a game. +Unable to create cheat file, disk may be full = Unable to create cheat file, disk may be full. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Unable to write savedata, disk may be full. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Warning: Video memory FULL, reducing upscaling and switching to slow caching mode. +Warning: Video memory FULL, switching to slow caching mode = Warning: Video memory FULL, switching to slow caching mode. +ZIP file detected (Require UnRAR) = Failas yra suspaustas (ZIP formato).\nReikia išpausti jį (pabandykite UnRAR). +ZIP file detected (Require WINRAR) = Failas yra suspaustas (ZIP formato).\nReikia išpausti jį (pabandykite WinRAR). + +[Game] +Asia = Asia +ConfirmDelete = Ištrinti +Create Game Config = Create game config +Create Shortcut = Kurti nuorodą +Delete Game = Ištrinti žaidimą +Delete Game Config = Delete game config +Delete Save Data = Ištrinti išsaugojimą +Europe = Europe +Game = Žaidimas +Game Settings = Žaidimo parametrai +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Instaliuoti duomenis +Japan = Japan +Korea = Korea +MB = Megabaitai +One moment please... = One moment please... +Play = Žaisti +Remove From Recent = Ištrinti iš "Paskutiniai" sąrašo +SaveData = Išsaugojimai +Setting Background = Setting background +Show In Folder = Rodyti aplanke +USA = USA +Use UI background = Use UI background + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = unlimited +(supersampling) = (supersampling) +(upscaling) = (upscaling) +1x PSP = Originali PSP rezoliucija +2x = 2 kartus +2x PSP = 2 kartus didesnė originali PSP rezoliucija +3x = 3 kartus +3x PSP = 3 kartus didesnė originali PSP rezoliucija +4x = 4 kartus +4x PSP = 4 kartus didesnė originali PSP rezoliucija +5x = 5 kartus +5x PSP = 5 kartus didesnė originali PSP rezoliucija +6x PSP = 6 kartus didesnė originali PSP rezoliucija +7x PSP = 7 kartus didesnė originali PSP rezoliucija +8x = 8 kartus +8x PSP = 8 kartus didesnė originali PSP rezoliucija +9x PSP = 9 kartus didesnė originali PSP rezoliucija +10x PSP = 10 kartų didesnė originali PSP rezoliucija +16x = 16 kartų +Aggressive = Aggressive +Alternative Speed = Alternatyvus greitis (procentais, 0 procentų = neribotas) +Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Anisotropic Filtering = "Anisotropic" filtravimas +Auto = Automatinis +Auto (1:1) = Automatinė (1:1) +Auto (same as Rendering) = Automatinis (kaip Rodymo rezoliucija) +Auto FrameSkip = Automatinis kadrų praleidimas +Auto Scaling = Auto scaling +Backend = Backend +Balanced = Balanced +Bicubic = "Bicubic" +BlockTransfer Tip = Some games require this to be On for correct graphics +BlockTransferRequired = Warning: This game requires "simulate block transfer effects" to be set to On. +Both = Abu +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Buferinis rodymas +BufferedRenderingRequired = Warning: This game requires "rendering mode" to be set to "buffered". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Screen size (in % of the viewport) +Cardboard Screen X Shift = X shift (in % of the blank space) +Cardboard Screen Y Shift = Y shift (in % of the blank space) +Cardboard VR Settings = Google Cardboard VR settings +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU core +Debugging = Testinis režimas +DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. +Deposterize = "Deposterize" +Deposterize Tip = Fixes visual banding glitches in upscaled textures +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Išjungti lėtesnius efektus (greičio didintojas) +Disabled = Disabled +Display layout editor = Display layout editor +Display Resolution (HW scaler) = Ekrano rezoliucija ("HW" ištiesinimas) +Dump next frame to log = "Rašyti" kitą kadrą į statusą +Enable Cardboard VR = Enable Cardboard VR +FPS = Kadrai per sekundę +Frame Rate Control = Kadrų kontrolė +Frame Skipping = Kadrų praleidimas +Frame Skipping Type = Frame skipping type +FullScreen = Pilnas ekranas +Hack Settings = Modifikavimo parametrai (gali sukelti problemų) +Hardware Tessellation = Hardware tessellation +Hardware Transform = Aparatūros transformacija +hardware transform error - falling back to software = Hardware transform error, falling back to software +HardwareTessellation Tip = Uses hardware to make curves +High = Aukšta +Hybrid = Hybridas +Hybrid + Bicubic = Hybridas + "Bicubic" +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Vidinė rezoliucija +Lazy texture caching = "Tingus" tekstūrų spartinimas (greičio didintojas) +Linear = Linijinis +Low = Žema +LowCurves = "Spline/Bezier" lankstumų kokybė +LowCurves Tip = Only used by some games, controls smoothness of curves +Lower resolution for effects (reduces artifacts) = Lower resolution for effects (reduces artifacts) +Manual Scaling = Manual scaling +Medium = Vidutinė +Mode = Režimas +Must Restart = Jūs turite perkrauti "PPSSPP" programą, kad pakeisti parametrai turėtų efektą +Native device resolution = Įrenginio rezoliucija +Nearest = Arčiausias +No buffer = No buffer +Non-Buffered Rendering = Skip buffer effects (non-buffered, faster) +None = Nieko +Number of Frames = Number of frames +Off = Išjungti +OpenGL = OpenGL +Overlay Information = Užkadrinė informacija +Partial Stretch = Partial stretch +Percent of FPS = Percent of FPS +Performance = Greitis +Postprocessing effect = Postprocessing effects +Postprocessing Shader = "Įdėjiniminio" krovimo "šešėliai" (FX) +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = Rodymo režimas +Rendering Resolution = Rodymo rezoliucija +RenderingMode NonBuffered Tip = Faster, but nothing may draw in some games +Retain changed textures = Retain changed textures (sometimes slower) +RetainChangedTextures Tip = Makes many games slower, but some games a lot faster +Rotation = Rotation +Safe = Safe +Screen layout = Screen layout +Screen Scaling Filter = Screen scaling filter +Show Debug Statistics = Rodyti testinio režimo statistikas +Show FPS Counter = Rodyti kadrų per sekundę rodmenis +Simulate Block Transfer = Simulate block transfer effects +SoftGPU Tip = Currently VERY slow +Software Rendering = Programinės įrangos rodymas(ekspermentalus) +Software Skinning = Programinės įrangos "nulupimas" +SoftwareSkinning Tip = Combine skinned model draws on the CPU, faster in most games +Speed = Greitis +Stretching = Stretching +Texture Filter = Tekstūrų filtravimas +Texture Filtering = Tekstūrų filtravimas +Texture Scaling = Tekstūrų skalė +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Turn off "hardware tessellation": unsupported +Unlimited = Unlimited +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = "Pakėlimo" lygis +Upscale Type = "Pakėlimo" tipas +UpscaleLevel Tip = CPU heavy - some scaling may be delayed to avoid stutter +Use all displays = Use all displays +Vertex Cache = "Tikra" spartinamoji atmintis +VertexCache Tip = Faster, but may cause temporary flicker +VSync = Kadrų per sekundę sinchrovizavimas su monitoriumi +Vulkan = Vulkan +Window Size = Lango dydis +xBRZ = "xBRZ" + +[InstallZip] +Delete ZIP file = Ištrinti ZIP failą +Install = Instaliuoti +Install game from ZIP file? = Instaliuoti žaidimą iš ZIP failo? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = Instaliuota! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = Auto configure +Autoconfigure for device = Automatiškai sukonfiguruoti įrenginiui +Clear All = Ištrinti viską +Default All = Akturti numatytus parametrus +Map a new key for = Nustatyti naują klavišą +Map Key = Map key +Map Mouse = Map mouse +Test Analogs = Test analogs +You can press ESC to cancel. = You can press Esc to cancel. + +[MainMenu] +Browse = Ieškoti... +Buy PPSSPP Gold = Buy PPSSPP Gold +Choose folder = Choose folder +Credits = Kūrėjų sąrašas +PPSSPP Homebrew Store = PPSSPP "Homebrew" parduotuvės +Exit = Išeiti +Game Settings = Parametrai +Games = Žaidimai +Give PPSSPP permission to access storage = Give PPSSPP permission to access storage +Homebrew & Demos = "Homebrew" & ir & bandomosios žaidimų versijos +How to get games = Kaip aš galiu gauti žaidimų? +How to get homebrew & demos = Kaip aš galiu gauti "Homebrew" & ir & bandomųjų žaidimų versijų? +Load = Krauti... +Loading... = Loading... +PinPath = Pin +PPSSPP can't load games or save right now = PPSSPP can't load games or save right now +Recent = Paskutiniai +SavesAreTemporary = PPSSPP is saving in temporary storage +SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently +SavesAreTemporaryIgnore = Ignore warning +UnpinPath = Unpin +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Garsas +Controls = Valdymas +Graphics = Grafika +Networking = Tinklų parametrai +System = Sistema +Tools = Tools + +[MappableControls] +Alt speed 1 = Alt speed 1 +Alt speed 2 = Alt speed 2 +An.Down = Analoginė svirtelė žemyn +An.Left = Analoginė svirtelė kairėn +An.Right = Analoginė svirtelė dešinėn +An.Up = Analoginė svirtelė aukštyn +Analog limiter = Analog limiter +Analog Stick = Analoginė svirtelė +Audio/Video Recording = Audio/Video recording +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Axis swap +Circle = Circle +Cross = Cross +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = DevMenu +Down = Krypčių mygtukas žemyn +Dpad = Krypčių mygtukai +Frame Advance = Frame advance +Hold = Hold +Home = Home +L = L +Left = Krypčių mygtukas kairėn +Load State = Krauti statusą... +Mute toggle = Mute toggle +Next Slot = Next Slot +None = None +Note = Note +OpenChat = Open chat +Pause = Pauzė +R = R +RapidFire = Greita-"ugnis" +Remote hold = Remote hold +Rewind = "Rewind" +Right = Krypčių mygtukas dešinėn +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = "RightAn.Down" +RightAn.Left = "RightAn.Left" +RightAn.Right = "RightAn.Right" +RightAn.Up = "RightAn.Up" +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Išsaugoti statusą... +Screen = Screen +Screenshot = Screenshot +Select = Select +SpeedToggle = Greičio keitimas +Square = Square +Start = Start +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = Toggle fullscreen +Toggle mode = Toggle mode +Triangle = Triangle +Unthrottle = "Unthrottle" +Up = Krypčių mygtukas aukštyn +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Change MAC address +Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable network chat = Enable network chat +Enable networking = Enable networking/WLAN (beta, may break games) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Network initialized +Please change your Port Offset = Please change your port offset +Port offset = Port offset(0 = PSP compatibility) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Send Discord "Rich Presence" information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = Kodai +Continue = Tęsti +Create Game Config = Create game config +Delete Game Config = Delete game config +Exit to menu = Išeiti į pagrindinį meniu +Game Settings = Žaidimo parametrai +Load State = Krauti statusą +Rewind = "Vėjinti" +Save State = Išsaugoti statusą +Settings = Settings +Switch UMD = Pakeisti "UMD" + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Spalva +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Animacinis filmas +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT skenavimo linjos +FXAA = FXAA Antialiasing +Gamma = Gamma +Grayscale = Grayscale +Intensity = Intensity +InverseColors = Perkeisti spalvas +Natural = Naturalios spalvos +NaturalA = Natural Colors (no blur) +Off = Išjungti +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = CRT skenavimo linjos +Sharpen = Sharpen +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 Išaukštinimas +VideoSmoothingAA = VideoSmoothingAA +Vignette = Vignette + +[PSPCredits] +all the forum mods = all the forum mods +build server = build server +Buy Gold = Nusipirkti "Gold" +check = Be to, pažiūrekite Dolphin, geriausią Wii/GameCube emuliatorių aplink: +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = Pagalbininkai: +created = Sukurta: +Discord = Discord +info1 = PPSSPP skirtas naudoti tik mokomiesiems tikslams naudoti. +info2 = Prašome, kad jūs turite teises į žaidimus +info3 = kuriuos jūs žaidžiate, turėdami žaidimo UMD ar nusipirkdami skaitmeniniu +info4 = parsisiuntimu iš PlayStation Network parduotuvės ant jūsų tikro PSP. +info5 = PSP yra prekės ženklas, sukurtas ir valdomas Sony Computer Entertaiment, Inc. +iOS builds = iOS builds +license = Nemokama programinė įranga su GPL 2.0+ licenzija +list = palaikymo sąrašas, forumai, ir kūrimo informacija +PPSSPP Forums = PPSSPP forumai +Privacy Policy = Privacy policy +Share PPSSPP = Dalintis PPSSPP programa +specialthanks = Specialūs ačiū tiem: +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = Šitas išvertimas sukurtas: +title = Spartus ir portabilus PSP emuliatorius +tools = Nemokami įrankiai naudoti: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = aidas957 +translators2 = sum2012 +translators3 = vnctdj +translators4 = SViper +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Check out the website: +written = Parašyta C++ kalboje dėl greičio ir portabilumo + +[RemoteISO] +Browse Games = Browse games +Local Server Port = Local server port +Manual Mode Client = Manual mode client +Remote disc streaming = Remote disc streaming +Remote Port = Remote port +Remote Server = Remote server +Remote Subdirectory = Remote subdirectory +RemoteISODesc = Games in your recent list will be shared +RemoteISOLoading = Connected, loading game list... +RemoteISOScanning = Scanning... Click "share games" on your server device +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Note: Connect both devices to the same Wi-Fi network +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Settings +Share Games (Server) = Share games (server) +Share on PPSSPP startup = Share on PPSSPP startup +Stop Sharing = Stop sharing +Stopping.. = Stopping... + +[Reporting] +Bad = Bad +FeedbackDelayInfo = Your data is being submitted in the background. +FeedbackDesc = How's the emulation? Let us and the community know! +FeedbackDisabled = Compatibility server reports must be enabled. +FeedbackIncludeCRC = Note: Battery will be used to send a disc CRC +FeedbackIncludeScreen = Include a screenshot +FeedbackSubmitDone = Your data has been submitted. +FeedbackSubmitFail = Could not submit data to server. Try updating PPSSPP. +FeedbackThanks = Thanks for your feedback! +Gameplay = Gameplay +Graphics = Grafikos +Great = Puikiai +In-game = Žaidime +In-game Description = Gets into gameplay, but too buggy to complete +Menu/Intro = Meniu/Įvadas +Menu/Intro Description = Can't get into the game itself +Nothing = Nothing +Nothing Description = Completely broken +OK = Gerai +Open Browser = Atidaryti naršyklę +Overall = Overall +Perfect = Tobula +Perfect Description = Flawless emulation for the entire game - great! +Plays = Plays +Plays Description = Fully playable but might be with glitches +ReportButton = Report feedback +Speed = Speed +Submit Feedback = Pridėti atsiliepimą +SuggestionConfig = See reports on website for good settings. +SuggestionCPUSpeed0 = Disable locked CPU speed setting. +SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this bug). +SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. +SuggestionsNone = This game isn't working for other users too. +SuggestionsWaiting = Submitting and checking other users feedback... +SuggestionUpgrade = Upgrade to a newer PPSSPP build. +SuggestionVerifyDisc = Check your ISO is a good copy of your disc. +Unselected Overall Description = How well does this game emulate? +View Feedback = View all feedbacks + +[Savedata] +Date = Date +Filename = Filename +No screenshot = No screenshot +None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Save Data = Save data +Save States = Save states +Savedata Manager = Savedata manager +Size = Size + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = ĮSPĖJIMAS: "Chainfire3D" surastas, gali kelti problemų! +Failed to load state = Failed to load state +Failed to save state = Failed to save state +fixed = Greitis: alternatyvus +GLToolsWarning = ĮSPĖJIMAS: "GLTools" surastas, gali kelti problemų! +In menu = In menu +Load savestate failed = Load savestate failed +Loaded State = Statusas pakrautas +Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +LoadStateDoesntExist = Nepavyko pakrauti statuso: išsaugojimo statusas neegzistuoja! +LoadStateWrongVersion = Nepavyko pakrauti statuso: išsaugojimo statusas skirtas senesniai PPSSPP versijai! +norewind = No rewind save states available. +Playing = Playing +PressESC = Paspauskite ESC, kad atidarytumėte pauzės meniu. +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = Nepavyko pakrauti išsaugojimo statuso! +Saved State = Statusas išsaugotas +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Speed: alternate 2 +standard = Greitis: standartinis +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = Jau instaliuota +Connection Error = Prisijungimo klaida +Install = Instaliuoti +Launch Game = Paleisti žaidimą +Loading... = Kraunama... +MB = Megabaitai +Size = Dydis +Uninstall = Išinstaliuoti + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d cores) +%d bytes = %d bytes +(none detected) = (none detected) +3D API = 3D API +ABI = ABI +API Version = API version +Audio Information = Audio information +Board = Board +Build Config = Build config +Build Configuration = Build Configuration +Built by = Built by +Core Context = Core context +Cores = Cores +CPU Extensions = CPU extensions +CPU Information = CPU information +CPU Name = Name +D3DCompiler Version = D3DCompiler version +Debug = Debug +Debugger Present = Debugger present +Device Info = Device info +Display Information = Display information +Driver Version = Driver version +EGL Extensions = EGL extensions +Frames per buffer = Frames per buffer +GPU Information = GPU information +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Lang/Region +Memory Page Size = Memory page size +Native Resolution = Native resolution +OGL Extensions = OGL extensions +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 extensions +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 extensions +OpenGL Extensions = OpenGL extensions +Optimal frames per buffer = Optimal frames per buffer +Optimal sample rate = Optimal sample rate +OS Information = OS information +PPSSPP build = PPSSPP build +Refresh rate = Refresh rate +Release = Release +RW/RX exclusive = RW/RX exclusive +Sample rate = Sample rate +Shading Language = Shading language +Sustained perf mode = Sustained perf mode +System Information = System information +System Name = Name +System Version = System version +Threads = Threads +Vendor = Vendor +Vendor (detected) = Vendor (detected) +Version Information = Version information +Vulkan Extensions = Vulkan extensions +Vulkan Features = Vulkan features + +[System] +(broken) = (broken) +12HR = 12HR +24HR = 24HR +Auto = Auto +Auto Load Savestate = Auto load savestate +AVI Dump started. = AVI dump started +AVI Dump stopped. = AVI dump stopped +Cache ISO in RAM = Cache full ISO in RAM +Change CPU Clock = Pakeisti emuliuojamo PSP pagrindinio procesoriaus greitį (unstable) +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Pakeisti slapyvardį +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = Kodai (ekspermentalūs, žiūreti forumuose juos) +Clear Recent = Clear "Recent" +Clear Recent Games List = Ištrinti paskutinių žaidimų sąrašą +Clear UI background = Clear UI background +Confirmation Button = Patvirtinimo mygtukas +Date Format = Datos formatas +Day Light Saving = Vasaros laikas +DDMMYYYY = DDMMMMMM +Decrease size = Decrease size +Developer Tools = Kurėjų įrankiai +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emuliacija +Enable Cheats = Įjungti kodus +Enable Compatibility Server Reports = Įjungti palaikymo serverių pranešimus +Failed to load state. Error in the file system. = Failed to load state. Error in the file system. +Failed to save state. Error in the file system. = Failed to save state. Error in the file system. +Fast (lag on slow storage) = Fast (lag on slow storage) +Fast Memory = Greita atmintis (nestabili) +Force real clock sync (slower, less lag) = Priversti tikro greičio sinchronizaciją (lėtesnis, mažiau striginėjimų) +frames, 0:off = frames, 0 = off +Games list settings = Games list settings +General = Pagrindiniai +Grid icon size = Grid icon size +Help the PPSSPP team = Help the PPSSPP team +Host (bugs, less lag) = Host (bugs, less lag) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Interpreter +IO timing method = I/O timing method +IR Interpreter = IR interpreter +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = Memory Stick inserted +MHz, 0:default = MHz, 0 = default +MMDDYYYY = MMDDMMMM +Newest Save = Newest save +Not a PSP game = Not a PSP game +Off = Off +Oldest Save = Oldest save +PSP Model = Emuliuojamo PSP modelis +PSP Settings = PSP parametrai +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Record audio +Record Display = Record display +Reset Recording on Save/Load State = Reset recording on Save/Load state +Restore Default Settings = Nustatyti "PPSSPP" parametrus į numatytuosius +Rewind Snapshot Frequency = "Vėjinti" momentinės nuotraukos dažnį (atminties "rijikas") +Save path in installed.txt = Save path in installed.txt +Save path in My Documents = Save path in My Documents +Savestate Slot = Išsaugojimo statuso vieta +Savestate slot backups = Savestate slot backups +Screenshots as PNG = Išsaugoti nuotraukas PNG formatu +Set UI background... = Set UI background... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Simulate UMD delays +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Storage full +Sustained performance mode = Sustained performance mode +Time Format = Laiko formatas +UI = Vartotojo sąsaja +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) +Use O to confirm = Naudoti O kaip patvirtinimo mygtuką +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = Naudoti X kaip patvirtinimo mygtuką +VersionCheck = Patikrinti, ar yra "PPSSPP" atnaujinimų +WARNING: Android battery save mode is on = WARNING: Android battery save mode is On +WARNING: Battery save mode is on = WARNING: Battery save mode is on +YYYYMMDD = MMMMMMDD + +[Upgrade] +Details = Details +Dismiss = Atmesti +Download = Parsisiūsti +New version of PPSSPP available = Galima nauja "PPSSPP" versija diff --git a/assets/lang/ms_MY.ini b/assets/lang/ms_MY.ini new file mode 100644 index 0000000000..387f9b86f1 --- /dev/null +++ b/assets/lang/ms_MY.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = Enjin suara (PPSSPP perlu dibuka semula) +AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) +Auto = Auto +Device = Device +DSound (compatible) = DSound (compatible) +Enable Sound = Upayakan suara +Global volume = Volume keseluruhan +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = WASAPI (fast) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Analog axis sensitivity +Analog Limiter = Analog limiter +Analog Mapper High End = Analog mapper high-end (axis sensitivity) +Analog Mapper Low End = Analog mapper low-end (inverse deadzone) +Analog Mapper Mode = Analog mapper mode +Analog Stick = Analog stick +AnalogLimiter Tip = When the analog limiter button is pressed +Auto = Auto +Auto-centering analog stick = Auto-centering analog stick +Auto-hide buttons after seconds = Sembunyikan butang secara automatik selepas +Binds = Binds +Button Opacity = Kelegapan butang +Button style = Gaya butang +Calibrate D-Pad = Calibrate +Calibration = Calibration +Classic = Klasik +Combo Key Setting = Combo key setting +Combo Key Setup = Combo key setup +Confine Mouse = Trap mouse within window/display area +Control Mapping = Pemetaan kawalan +Custom layout... = Edit susunan kawalan... +Customize tilt = Customize tilt... +D-PAD = D-Pad +Deadzone Radius = Deadzone radius +DInput Analog Settings = DInput analog settings +Disable D-Pad diagonals (4-way touch) = Lumpuhkan PadD diagonal (4-jalan sentuh) +Glowing borders = Glowing borders +HapticFeedback = Tindak balas haptic (getaran) +Ignore gamepads when not focused = Ignore gamepads when not focused +Ignore Windows Key = Abaikan kekunci Tetingkap (menghalang Menu Permulaan dari muncul) +Invert Axes = Invert axes +Invert Tilt along X axis = Invert tilt along X axis +Invert Tilt along Y axis = Invert tilt along Y axis +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Tetapan papan kekunci kawalan +L/R Trigger Buttons = L/R trigger buttons +Landscape = Landskap +Landscape Auto = Landskap +Landscape Reversed = Landskap Songsang +Mouse = Tetapan Tetikus +Mouse sensitivity = Mouse sensitivity +Mouse smoothing = Mouse smoothing +MouseControl Tip = You can now map mouse in control mapping screen by pressing the 'M' icon. +None (Disabled) = None (disabled) +Off = Off +OnScreen = Kawalan sentuh di skrin +Portrait = Portrait +Portrait Reversed = Portrait reversed +PSP Action Buttons = PSP action buttons +Screen Rotation = Screen rotation +seconds, 0 : off = seconds, 0 = off +Sensitivity = Sensitivity +Show right analog = Show right analog +Show Touch Pause Menu Button = Show pause menu button +Thin borders = Tepian tipis +Tilt Base Radius = Tilt base radius +Tilt Input Type = Tilt input type +Tilt Sensitivity along X axis = Tilt sensitivity along X axis +Tilt Sensitivity along Y axis = Tilt sensitivity along Y axis +To Calibrate = To calibrate, keep device on a flat surface and press "Calibrate". +Touch Control Visibility = Touch control visibility +Use custom right analog = Use custom right analog +Use Mouse Control = Use mouse control +Visibility = Keterlihatan +X = X +X + Y = X + Y +XInput Analog Settings = XInput analog settings +Y = Y + +[CwCheats] +Cheats = Cheat +Edit Cheat File = Ubah cheat file +Enable/Disable All = Upayakan/Lumpuhkan semua Cheat +Import Cheats = Import dari cheat.db +Options = Pilihan +Refresh Rate = Refresh rate + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = &Mengenai PPSSPP... +Auto = &Automatik +Backend = Rendering &Backend (Restarts PPSSPP) +Bicubic = &Bikubik +Break = Break +Break on Load = Break on load +Buffered Rendering = &Buffered Rendering +Buy Gold = Beli ve&rsi Gold +Control Mapping... = P&emetaan kawalan... +Debugging = &Pepijat +Deposterize = &Deposterize +Direct3D9 = &Direct3D9 +Direct3D11 = Direct3D &11 +Disassembly = &Pasangkan... +Discord = Discord +Display Layout Editor = Display layout editor... +Display Rotation = Putaran skrin +Dump Next Frame to Log = L&etak frame berikutnya ke log +Emulation = &Emulasi +Enable Chat = Enable chat +Enable Cheats = Upayakan &Cheat +Enable Sound = Upayakan S&uara +Exit = Ke&luar +Extract File... = E&kstrak Fail... +File = &Fail +Frame Skipping = &Pelompatan Frame +Frame Skipping Type = Jenis Pelompatan Frame +Fullscreen = Sk&rin Penuh +Game Settings = &Tetapan Permainan +GE Debugger... = Pempepijat G&E... +GitHub = Git&Hub +Hardware Transform = &Penukaran Alatan +Help = &Bantuan +Hybrid = &Hibrid +Hybrid + Bicubic = H&ibrid + Bikubik +Ignore Illegal Reads/Writes = &Abaikan Pembacaan / Penulisan tak sah +Ignore Windows Key = Abaikan kekunci Tetingkap +Keep PPSSPP On Top = &Kekalkan tetingkap PPSSPP di atas +Landscape = Landskap +Landscape reversed = Landskap songsang +Language... = Ba&hasa... +Linear = &Garis terdekat +Load = &Muatkan... +Load .sym File... = Lo&ad .sym File... +Load Map File... = Muatkan &Fail Pemetaan... +Load State = M&uatkan State +Load State File... = &Muatkan Fail State... +Log Console = &Log Konsol +Memory View... = Lihat &Memori... +More Settings... = &Tetapan lanjutan... +Nearest = &Terdekat +Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) +Off = &Tutup +Open Directory... = Buka &Penyimpanan... +Open from MS:/PSP/GAME... = B&uka dari MS:/PSP/GAME... +Open Memory Stick = Buka &Memori Stik +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = &Jeda +Pause When Not Focused = &Jeda ketika tidak difokus +Portrait = Portrait +Portrait reversed = Portrait songsang +Postprocessing Shader = Shader pasc&apemprosesan +PPSSPP Forums = PPSSPP &Forum +Record = &Rakam +Record Audio = Rakam &audio +Record Display = Rakam &skrin +Rendering Mode = Mod Renderi&ng +Rendering Resolution = &Resolusi Rendering +Reset = Mu&la semula +Reset Symbol Table = Mula semula Jad&ual simbol +Run = &Jalankan +Save .sym File... = Simpan fail .sym... +Save Map File... = &Simpan Fail Pemetaan... +Save State = S&impan State +Save State File... = &Simpan Fail State... +Savestate Slot = Slot Saves&tate +Screen Scaling Filter = Scr&een Scaling Filter +Show Debug Statistics = Papar Stati&stik Pepijat +Show FPS Counter = Papar &penghitung FPS +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = &Henti +Switch UMD = Tukar UMD +Take Screenshot = &Ambil Gambar Skrin +Texture Filtering = Penapisan Te&kstur +Texture Scaling = &Penskalaan Tekstur +Use Lossless Video Codec (FFV1) = &Use lossless video codec (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = &Kuki Vertek +VSync = VS&ync +Vulkan = Vulkan +Window Size = &Saiz tetingkap +www.ppsspp.org = Kunjungi www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allocator viewer (Vulkan) +Allow remote debugger = Benarkan pepijat jauh +Backspace = Backspace +Block address = Block address +By Address = By address +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Create/Open textures.ini file for current game +Current = Current +Dev Tools = Alat pembangunan +DevMenu = DevMenu +Disabled JIT functionality = Fungsi JIT yang dilumpuhkan +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Dump decrypted EBOOT.BIN on game boot +Dump Frame GPU Commands = Dump frame GPU commands +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Upayakan log pepijat +Enter address = Enter address +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Frame profiler +GPU Driver Test = Ujian driver GPU +GPU Profile = GPU profile +Jit Compare = Jit compare +JIT debug tools = Alat pepijat JIT +Language = Bahasa +Load language ini = Muatkan bahasa ini +Log Dropped Frame Statistics = Log dropped frame statistics +Log Level = Log level +Log View = Log view +Logging Channels = Log Channel +Next = Next +No block = No block +Prev = Previous +Random = Rawak +Replace textures = Replace textures +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Anda pasti menetapkan semua tetapan kecuali pemetaan kawalan kembali ke lalai?\n\nAnda tidak boleh membatalkan tindakan ini.\nSila mulakan semula PPSSPP untuk perubahan berkuat kuasa. +RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? +Resume = Resume +Run CPU Tests = Jalankan percubaan CPU +Save language ini = Simpan bahasa .ini +Save new textures = Save new textures +Shader Viewer = Shader viewer +Show Developer Menu = Papar menu pembangun +Show on-screen messages = Show on-screen messages +Stats = Stats +System Information = Maklumat sistem +Texture Replacement = Texture replacement +Toggle Audio Debug = Toggle audio debug +Toggle Freeze = Toggle freeze +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP res +Active = Active +Back = Balik +Cancel = Batal +Center = Center +ChangingGPUBackends = Penukaran enjin GPU memerlukan PPSSPP untuk dimulakan semula. Mula Semula? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = Choose PPSSPP save folder +Confirm Overwrite = Anda hendak menulis ganti data ini? +Confirm Save = Anda hendak simpan data ini? +ConfirmLoad = Muatkan data ini? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Padam +Delete all = Padam semua +Delete completed = Pemadaman selesai. +DeleteConfirm = Data disimpan ini akan dipadam.\nAnda pasti hendak teruskan? +DeleteConfirmAll = Anda yakin ingin menghapus\nsemua data penyimpanan permainan ini? +DeleteConfirmGame = Anda pasti memadam permainan ini\ndari peranti? Anda tak dapat kembalikan ini. +DeleteConfirmGameConfig = Do you really want to delete the settings for this game? +DeleteFailed = Pemadaman data gagal. +Deleting = Memadam\nSila tunggu... +Disable All = Disable all +Edit = Edit +Enable All = Enable all +Enter = Masuk +Finish = Tamat +Grid = Grid +Inactive = Inactive +InternalError = An internal error has occurred. +Load = Muatkan +Load completed = Memuat selesai. +Loading = Memuat\nSila tunggu... +LoadingFailed = Unable to load data. +Move = Move +Network Connection = Network Connection +NEW DATA = DATA BAHARU +No = Tidak +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = OK +Old savedata detected = Old savedata detected +Options = Options +Reset = Mula semula +Resize = Resize +Retry = Cuba semula +Save = Simpan +Save completed = Menyimpan selesai. +Saving = Menyimpan\nSila tunggu... +SavingFailed = Unable to save data. +Select = Pilih +Shift = Shif +Snap = Snap +Space = Space +SSID = SSID +Submit = Submit +Supported = Supported +There is no data = Tiada data disini. +Toggle All = Periksa semua +Toggle List = Toggle list +Unsupported = Tidak disokong +When you save, it will load on a PSP, but not an older PPSSPP = When you save, it will load on a PSP, but not an older PPSSPP +When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Yes = Ya +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = file is compressed (7z).\nPlease decompress first (try 7-Zip or WinRAR). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = Could not save screenshot file. +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll not found. Please install. Or press Yes to try again using Direct3D 9 instead. +D3D11InitializationError = Direct3D 11 initialization error +D3D11Missing = Your operating system version does not include D3D11. Please run Windows Update.\n\nPress Yes to try again using Direct3D 9 instead. +D3D11NotSupported = Your GPU does not appear to support Direct3D 11.\n\nWould you like to try again using Direct3D 9 instead? +Disk full while writing data = Disk penuh ketika data ditulis +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = Masalah ketika muatkan fail: +Error reading file = Pembacaan fail bermasalah. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = Gagal mengidentiti fail. +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Failed initializing graphics. Try upgrading your graphics drivers and DirectX 9 runtime.\n\nWould you like to try switching to OpenGL?\n\nError message: +GenericGraphicsError = Graphics Error +GenericOpenGLError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to DirectX 9?\n\nError message: +GenericVulkanError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to OpenGL?\n\nError message: +InsufficientOpenGLDriver = Sokongan pemacu OpenGL dikesan tidak mencukupi!\n\nLaporan GPU anda ini tidak menyokong OpenGL 2.0, dimana ketika ini diperlukan untuk menjalankan PPSSPP.\n\nSila periksa kesesuaian GPU anda dengan OpenGL 2.0. Jika demikian, anda perlu mencari dan pasangkan pemacu grafik baharu dari laman web pembekal GPU.\n\nLawati forum di https://forums.ppsspp.org untuk maklumat lanjut. +Just a directory. = Hanya folder. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = Tiada EBOOT.PBP, permainan tidak dikenal pasti. +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = Pemacu OpenGL bermasalah +PPSSPP doesn't support UMD Music. = PPSSPP tidak menyokong UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP tidak menyokong UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP currently does not support connecting to the Internet for DLC, PSN, or game updates. +PS1 EBOOTs are not supported by PPSSPP. = PS1 EBOOTs tidak disokong PPSSPP. +PSX game image detected. = Fail adalah gambaran MODE2. PPSSPP tidak menyokong permainan PS1. +RAR file detected (Require UnRAR) = Fail dimampatkan (RAR).\nSila nyah-mampatkan dahulu (cuba UnRAR). +RAR file detected (Require WINRAR) = Fail dimampatkan (RAR).\nSila nyah-mampatkan dahulu (cuba WinRAR). +Running slow: try frameskip, sound is choppy when slow = Running slow: try frameskip, sound is choppy when slow +Running slow: Try turning off Software Rendering = Running slow: try turning off "software rendering" +Save encryption failed. This save won't work on real PSP = Save encryption failed. This save won't work on real PSP +textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +This is a saved state, not a game. = This is a saved state, not a game. +This is save data, not a game. = This is save data, not a game. +Unable to create cheat file, disk may be full = Unable to create cheat file, disk may be full. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Unable to write savedata, disk may be full. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Warning: Video memory FULL, reducing upscaling and switching to slow caching mode. +Warning: Video memory FULL, switching to slow caching mode = Warning: Video memory FULL, switching to slow caching mode. +ZIP file detected (Require UnRAR) = Fail dimampatkan (ZIP).\nSila nyah-mampatkan dahulu (cuba UnRAR). +ZIP file detected (Require WINRAR) = Fail dimampatkan (ZIP).\nSila nyah-mampatkan dahulu (cuba WinRAR). + +[Game] +Asia = Asia +ConfirmDelete = Padam +Create Game Config = Create game config +Create Shortcut = Buat pintasan +Delete Game = Padam permainan +Delete Game Config = Delete game config +Delete Save Data = Padam data disimpan +Europe = Europe +Game = Permainan +Game Settings = Tetapan permainan +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Data install +Japan = Japan +Korea = Korea +MB = MB +One moment please... = One moment please... +Play = Mainkan +Remove From Recent = Hapuskan dari "Semasa" +SaveData = Data disimpan +Setting Background = Setting background +Show In Folder = Papar dalam folder +USA = USA +Use UI background = Use UI background + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = unlimited +(supersampling) = (supersampling) +(upscaling) = (upscaling) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Aggressive +Alternative Speed = Kelajuan alternatif +Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Anisotropic Filtering = Anisotropic filtering +Auto = Auto +Auto (1:1) = Auto (1:1) +Auto (same as Rendering) = Auto (same as rendering resolution) +Auto FrameSkip = Auto frameskip +Auto Scaling = Auto scaling +Backend = Backend +Balanced = Balanced +Bicubic = Bikubik +BlockTransfer Tip = Some games require this to be On for correct graphics +BlockTransferRequired = Warning: This game requires "simulate block transfer effects" to be set to On. +Both = Keduanya +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Buffered rendering +BufferedRenderingRequired = Warning: This game requires "rendering mode" to be set to "buffered". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Screen size (in % of the viewport) +Cardboard Screen X Shift = X shift (in % of the blank space) +Cardboard Screen Y Shift = Y shift (in % of the blank space) +Cardboard VR Settings = Google Cardboard VR settings +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU core +Debugging = Pempepijat +DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. +Deposterize = Deposterize +Deposterize Tip = Fixes visual banding glitches in upscaled textures +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Disable slower effects (speedup) +Disabled = Disabled +Display layout editor = Display layout editor +Display Resolution (HW scaler) = Display resolution (HW scaler) +Dump next frame to log = Letak frame berikutnya ke log +Enable Cardboard VR = Enable Cardboard VR +FPS = FPS +Frame Rate Control = Kawalan kadar Frame +Frame Skipping = Pelompatan Frame +Frame Skipping Type = Frame skipping type +FullScreen = Skrin penuh +Hack Settings = Godam tetapan (mungkin menyebabkan gangguan) +Hardware Tessellation = Hardware tessellation +Hardware Transform = Penukaran Alatan +hardware transform error - falling back to software = Hardware transform error, falling back to software +HardwareTessellation Tip = Uses hardware to make curves +High = High +Hybrid = Hibrid +Hybrid + Bicubic = Hibrid + Bikubik +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Resolusi dalaman +Lazy texture caching = Pengkuki tekstur ringkas (tingkatkan kelajuan) +Linear = Garis dekat +Low = Low +LowCurves = Kualiti rendah splin dan keluk bezier (tingkatkan kelajuan) +LowCurves Tip = Only used by some games, controls smoothness of curves +Lower resolution for effects (reduces artifacts) = Lower resolution for effects (reduces artifacts) +Manual Scaling = Manual scaling +Medium = Medium +Mode = Mod +Must Restart = You must restart PPSSPP for this change to take effect. +Native device resolution = Native device resolution +Nearest = Terdekat +No buffer = No buffer +Non-Buffered Rendering = Skip buffer effects (non-buffered, faster) +None = Tiada +Number of Frames = Number of frames +Off = Tutup +OpenGL = OpenGL +Overlay Information = Maklumat pertindihan +Partial Stretch = Partial stretch +Percent of FPS = Percent of FPS +Performance = Prestasi +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Pascapemprosesan Shader +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = Mod rendering +Rendering Resolution = Resolusi rendering +RenderingMode NonBuffered Tip = Faster, but nothing may draw in some games +Retain changed textures = Retain changed textures (sometimes slower) +RetainChangedTextures Tip = Makes many games slower, but some games a lot faster +Rotation = Rotation +Safe = Safe +Screen layout = Screen layout +Screen Scaling Filter = Screen scaling filter +Show Debug Statistics = Papar statistik pepijat +Show FPS Counter = Papar penghitung FPS +Simulate Block Transfer = Simulate block transfer effects +SoftGPU Tip = Currently VERY slow +Software Rendering = Render perisian (eksperimen) +Software Skinning = Pembalutan Perisian +SoftwareSkinning Tip = Combine skinned model draws on the CPU, faster in most games +Speed = Laju +Stretching = Stretching +Texture Filter = Penapis Tekstur +Texture Filtering = Penapisan Tekstur +Texture Scaling = Penskalaan Tekstur +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Turn off "hardware tessellation": unsupported +Unlimited = Unlimited +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = Tahap penskalaan +Upscale Type = Jenis penskalaan +UpscaleLevel Tip = CPU heavy - some scaling may be delayed to avoid stutter +Use all displays = Use all displays +Vertex Cache = Kuki Vertek +VertexCache Tip = Faster, but may cause temporary flicker +VSync = VSync +Vulkan = Vulkan +Window Size = Saiz tetingkap +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Padam fail ZIP +Install = Pasang +Install game from ZIP file? = Pasang permainan dari fail ZIP? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = Dipasang! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = Auto configure +Autoconfigure for device = Autoconfigure for device +Clear All = Bersihkan semua +Default All = Lalaikan semua +Map a new key for = Petakan kekunci baru untuk +Map Key = Map key +Map Mouse = Map mouse +Test Analogs = Test analogs +You can press ESC to cancel. = You can press Esc to cancel. + +[MainMenu] +Browse = Memilah... +Buy PPSSPP Gold = Buy PPSSPP Gold +Choose folder = Choose folder +Credits = Kredit +PPSSPP Homebrew Store = PPSSPP Homebrew Store +Exit = Keluar +Game Settings = Tetapan +Games = Permainan +Give PPSSPP permission to access storage = Give PPSSPP permission to access storage +Homebrew & Demos = Homebrew && Demo +How to get games = Bagaimana saya dapatkan permainan? +How to get homebrew & demos = Bagaimana saya dapatkan homebrew && demo? +Load = Muatkan... +Loading... = Loading... +PinPath = Pin +PPSSPP can't load games or save right now = PPSSPP can't load games or save right now +Recent = Semasa +SavesAreTemporary = PPSSPP is saving in temporary storage +SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently +SavesAreTemporaryIgnore = Ignore warning +UnpinPath = Unpin +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Suara +Controls = Kawalan +Graphics = Grafik +Networking = Networking +System = Sistem +Tools = Tools + +[MappableControls] +Alt speed 1 = Alt speed 1 +Alt speed 2 = Alt speed 2 +An.Down = Analog Bawah +An.Left = Analog Kiri +An.Right = Analog Kanan +An.Up = Analog Atas +Analog limiter = Analog limiter +Analog Stick = Kayu Analog +Audio/Video Recording = Audio/Video recording +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Axis swap +Circle = Circle +Cross = Cross +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = DevMenu +Down = Dpad Bawah +Dpad = PadD +Frame Advance = Frame advance +Hold = Hold +Home = Home +L = L +Left = Dpad Kiri +Load State = Muatkan State +Mute toggle = Mute toggle +Next Slot = Next Slot +None = None +Note = Note +OpenChat = Open chat +Pause = Jeda +R = R +RapidFire = Tembak-Berterusan +Remote hold = Remote hold +Rewind = Kembali semula +Right = Dpad Kanan +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = KananAn.Bawah +RightAn.Left = KananAn.Kiri +RightAn.Right = KananAn.Kanan +RightAn.Up = KananAn.Atas +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Simpan State +Screen = Screen +Screenshot = Screenshot +Select = Select +SpeedToggle = Kurangkan kelajuan +Square = Square +Start = Start +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = Toggle fullscreen +Toggle mode = Toggle mode +Triangle = Triangle +Unthrottle = Unthrottle +Up = Dpad Atas +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Change MAC address +Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable network chat = Enable network chat +Enable networking = Enable networking/WLAN (beta, may break games) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Network initialized +Please change your Port Offset = Please change your port offset +Port offset = Port offset(0 = PSP compatibility) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Send Discord "Rich Presence" information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = Cheat +Continue = Teruskan +Create Game Config = Create game config +Delete Game Config = Delete game config +Exit to menu = Keluar ke menu +Game Settings = Tetapan permainan +Load State = Muatkan state +Rewind = Undur semula +Save State = Simpan state +Settings = Settings +Switch UMD = Tukar UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = Warna AA +Amount = Amount +Black border = Black border +Bloom = Mekar +Brightness = Brightness +Cartoon = Kartun +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT scanlines +FXAA = FXAA Anti aliasing +Gamma = Gamma +Grayscale = Grayscale +Intensity = Intensity +InverseColors = Terbalikkan warna +Natural = Warna asli +NaturalA = Natural Colors (no blur) +Off = Tutup +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlines (CRT) +Sharpen = Ketajaman +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Penskalaan spline36 +VideoSmoothingAA = VideoSmoothingAA +Vignette = Vignette + +[PSPCredits] +all the forum mods = all the forum mods +build server = build server +Buy Gold = Beli versi Gold +check = Juga lihat Dolphin,emu terbaik Wii/GC disekitar: +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = Para penyumbang: +created = Dibuat dengan +Discord = Discord +info1 = PPSSPP dimaksudkan untuk tujuan pendidikan sahaja. +info2 = Sila pastikan anda pemilik yg sah bagi mana-mana permainan +info3 = anda boleh bermain dengan memiliki UMD atau membeli kandungan digital +info4 = muat turun dari stor PSN dengan PSP milik anda. +info5 = PSP adalah cap dagang Sony, Inc. +iOS builds = iOS builds +license = Perisian percuma dibawah GPL 2.0+ +list = senarai kesesuaian, forum, dan info pembangunan +PPSSPP Forums = PPSSPP Forum +Privacy Policy = Privacy policy +Share PPSSPP = Share PPSSPP +specialthanks = Terima kasih kepada: +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = Diterjemahkan oleh: +title = PSP emulasi pantas dan mudah alih +tools = Alatan bebas digunakan: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = MrYadro, mgaver, VIRGINKLM, raven02 +translators2 = sum2012, vnctdj, unknownbrackets, ufdada +translators3 = The Dax, wuspring, hrydgard, adrian17 +translators4 = papel, AG Richard, Zie Nozie, +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Lihat laman web: +written = Ditulis dengan C++ untuk kelajuan dan mudah alih + +[RemoteISO] +Browse Games = Browse games +Local Server Port = Local server port +Manual Mode Client = Manual mode client +Remote disc streaming = Remote disc streaming +Remote Port = Remote port +Remote Server = Remote server +Remote Subdirectory = Remote subdirectory +RemoteISODesc = Games in your recent list will be shared +RemoteISOLoading = Connected, loading game list... +RemoteISOScanning = Scanning... Click "share games" on your server device +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Note: Connect both devices to the same Wi-Fi network +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Settings +Share Games (Server) = Share games (server) +Share on PPSSPP startup = Share on PPSSPP startup +Stop Sharing = Stop sharing +Stopping.. = Stopping... + +[Reporting] +Bad = Bad +FeedbackDelayInfo = Your data is being submitted in the background. +FeedbackDesc = How's the emulation? Let us and the community know! +FeedbackDisabled = Compatibility server reports must be enabled. +FeedbackIncludeCRC = Note: Battery will be used to send a disc CRC +FeedbackIncludeScreen = Include a screenshot +FeedbackSubmitDone = Your data has been submitted. +FeedbackSubmitFail = Could not submit data to server. Try updating PPSSPP. +FeedbackThanks = Thanks for your feedback! +Gameplay = Gameplay +Graphics = Graphics +Great = Great +In-game = In-game +In-game Description = Gets into gameplay, but too buggy to complete +Menu/Intro = Menu/Intro +Menu/Intro Description = Can't get into the game itself +Nothing = Nothing +Nothing Description = Completely broken +OK = OK +Open Browser = Open browser +Overall = Overall +Perfect = Perfect +Perfect Description = Flawless emulation for the entire game - great! +Plays = Plays +Plays Description = Fully playable but might be with glitches +ReportButton = Report feedback +Speed = Speed +Submit Feedback = Submit feedback +SuggestionConfig = See reports on website for good settings. +SuggestionCPUSpeed0 = Disable locked CPU speed setting. +SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this bug). +SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. +SuggestionsNone = This game isn't working for other users too. +SuggestionsWaiting = Submitting and checking other users feedback... +SuggestionUpgrade = Upgrade to a newer PPSSPP build. +SuggestionVerifyDisc = Check your ISO is a good copy of your disc. +Unselected Overall Description = How well does this game emulate? +View Feedback = View all feedbacks + +[Savedata] +Date = Date +Filename = Filename +No screenshot = No screenshot +None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Save Data = Save data +Save States = Save states +Savedata Manager = Savedata manager +Size = Size + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = AMARAN: Chainfire3D dikesan, boleh menyebabkan masalah +Failed to load state = Failed to load state +Failed to save state = Failed to save state +fixed = Kelajuan: Alternatif +GLToolsWarning = WARNING: GLTools detected, may cause problems. +In menu = In menu +Load savestate failed = Load savestate failed +Loaded State = State dimuat +Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +LoadStateDoesntExist = Gagal memuatkan state: Savestate tiada didapati! +LoadStateWrongVersion = Gagal memuatkan state: Savestate adalah untuk versi PPSSPP yang lebih lama! +norewind = No rewind save states available. +Playing = Playing +PressESC = Tekan ESC untuk membuka menu jeda. +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = Gagal untuk simpan state! +Saved State = State disimpan +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Speed: alternate 2 +standard = Kelajuan: standad +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = Telah dipasang sebelumnya +Connection Error = Kesalahan Sambungan +Install = Pasang +Launch Game = Launch game +Loading... = Memuatkan... +MB = MB +Size = Saiz +Uninstall = Nyahpasang + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d cores) +%d bytes = %d bytes +(none detected) = (none detected) +3D API = 3D API +ABI = ABI +API Version = API version +Audio Information = Audio information +Board = Board +Build Config = Build config +Build Configuration = Build Configuration +Built by = Built by +Core Context = Core context +Cores = Cores +CPU Extensions = CPU extensions +CPU Information = CPU information +CPU Name = Name +D3DCompiler Version = D3DCompiler version +Debug = Debug +Debugger Present = Debugger present +Device Info = Device info +Display Information = Display information +Driver Version = Driver version +EGL Extensions = EGL extensions +Frames per buffer = Frames per buffer +GPU Information = GPU information +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Lang/Region +Memory Page Size = Memory page size +Native Resolution = Native resolution +OGL Extensions = OGL extensions +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 extensions +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 extensions +OpenGL Extensions = OpenGL extensions +Optimal frames per buffer = Optimal frames per buffer +Optimal sample rate = Optimal sample rate +OS Information = OS information +PPSSPP build = PPSSPP build +Refresh rate = Refresh rate +Release = Release +RW/RX exclusive = RW/RX exclusive +Sample rate = Sample rate +Shading Language = Shading language +Sustained perf mode = Sustained perf mode +System Information = System information +System Name = Name +System Version = System version +Threads = Threads +Vendor = Vendor +Vendor (detected) = Vendor (detected) +Version Information = Version information +Vulkan Extensions = Vulkan extensions +Vulkan Features = Vulkan features + +[System] +(broken) = (broken) +12HR = 12 JAM +24HR = 24 JAM +Auto = Auto +Auto Load Savestate = Auto load savestate +AVI Dump started. = AVI dump started +AVI Dump stopped. = AVI dump stopped +Cache ISO in RAM = Cache full ISO in RAM +Change CPU Clock = Tukar pemasa CPU (unstable) +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Tukar nama samaran +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = Cheat (eksperimen, lihat forum) +Clear Recent = Clear "Recent" +Clear Recent Games List = Bersihkan senarai game semasa +Clear UI background = Clear UI background +Confirmation Button = Butang pengesahan +Date Format = Format tarikh +Day Light Saving = Penjimat siang +DDMMYYYY = HHBBTTTT +Decrease size = Decrease size +Developer Tools = Alatan Pengeluar +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emulasi +Enable Cheats = Upayakan cheat +Enable Compatibility Server Reports = Upayakan laporan pelayan kesesuaian +Failed to load state. Error in the file system. = Failed to load state. Error in the file system. +Failed to save state. Error in the file system. = Failed to save state. Error in the file system. +Fast (lag on slow storage) = Fast (lag on slow storage) +Fast Memory = Memori dilajukan (Tak stabil) +Force real clock sync (slower, less lag) = Force real clock sync (slower, less lag) +frames, 0:off = frames, 0 = off +Games list settings = Games list settings +General = Umum +Grid icon size = Grid icon size +Help the PPSSPP team = Help the PPSSPP team +Host (bugs, less lag) = Host (bugs, less lag) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Interpreter +IO timing method = I/O timing method +IR Interpreter = IR interpreter +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = Memory Stick inserted +MHz, 0:default = MHz, 0 = default +MMDDYYYY = BBHHTTTT +Newest Save = Newest save +Not a PSP game = Not a PSP game +Off = Off +Oldest Save = Oldest save +PSP Model = Model PSP +PSP Settings = Tetapan PSP +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Record audio +Record Display = Record display +Reset Recording on Save/Load State = Reset recording on Save/Load state +Restore Default Settings = Kembalikan tetapan PPSSPP ke lalai +Rewind Snapshot Frequency = Kekerapan pusingan gambar skrin (mem hog) +Save path in installed.txt = Save path in installed.txt +Save path in My Documents = Save path in My Documents +Savestate Slot = Slot Savestate +Savestate slot backups = Savestate slot backups +Screenshots as PNG = Simpan pembidik skrin sebagai format PNG +Set UI background... = Set UI background... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Simulate UMD delays +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Storage full +Sustained performance mode = Sustained performance mode +Time Format = Format waktu +UI = UI +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) +Use O to confirm = Guna O untuk pengesahan +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = Guna X untuk pengesahan +VersionCheck = Periksa versi terbaru PPSSPP +WARNING: Android battery save mode is on = WARNING: Android battery save mode is On +WARNING: Battery save mode is on = WARNING: Battery save mode is on +YYYYMMDD = TTTTBBHH + +[Upgrade] +Details = Details +Dismiss = Abaikan +Download = Muat turun +New version of PPSSPP available = Versi terbaru PPSSPP tersedia diff --git a/assets/lang/nl_NL.ini b/assets/lang/nl_NL.ini new file mode 100644 index 0000000000..15c09a55c3 --- /dev/null +++ b/assets/lang/nl_NL.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = Audiobackend (vereist herstart) +AudioBufferingForBluetooth = Bluetooth-vriendelijke buffer (trager) +Auto = Automatisch +Device = Device +DSound (compatible) = DirectSound (compatibel) +Enable Sound = Geluid inschakelen +Global volume = Globaal volume +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = WASAPI (snel) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Analoogasgevoeligheid +Analog Limiter = Analooglimiet +Analog Mapper High End = Analoogtoewijzing high-end (gevoeligheid as) +Analog Mapper Low End = Analoogtoewijzing low-end (omgekeerde dode zone) +Analog Mapper Mode = Analoogtoewijzingsmodus +Analog Stick = Analoge stick +AnalogLimiter Tip = Wanneer de analooglimiettoets is ingedrukt +Auto = Automatisch +Auto-centering analog stick = Analoge stick automatisch centreren +Auto-hide buttons after seconds = Toetsen verbergen na seconden +Binds = Binds +Button Opacity = Toetsdekking +Button style = Toetsstijl +Calibrate D-Pad = Kalibreren +Calibration = Kalibreren +Classic = Klassiek +Combo Key Setting = Combotoetsinstelling +Combo Key Setup = Combotoets instellen +Confine Mouse = Muis binnen venster/weergavegebied vastzetten +Control Mapping = Besturing toewijzen +Custom layout... = Indeling aanraakbesturing bewerken... +Customize tilt = Kantelen personaliseren... +D-PAD = Richtingstoetsen +Deadzone Radius = Straal dode zone +DInput Analog Settings = Analooginstellingen voor DInput +Disable D-Pad diagonals (4-way touch) = Diagonale pijltoetsen uitzetten (4 richtingen) +Glowing borders = Glowing borders +HapticFeedback = Trillen inschakelen +Ignore gamepads when not focused = Gamepads negeren wanneer niet-gefocust +Ignore Windows Key = Windows-toets uitschakelen +Invert Axes = Assen omkeren +Invert Tilt along X axis = Kantelen op X-as omkeren +Invert Tilt along Y axis = Kantelen op Y-as omkeren +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Besturingsinstellingen voor toetsenbord +L/R Trigger Buttons = L/R-triggertoetsen +Landscape = Landschap +Landscape Auto = Landscape auto +Landscape Reversed = Omgekeerd landschap +Mouse = Muisinstellingen +Mouse sensitivity = Muisgevoeligheid +Mouse smoothing = Muissmoothing +MouseControl Tip = U kunt nu de muis indelen via het besturingsindelingscherm door op het 'M'-icoon te drukken. +None (Disabled) = Geen (uitgeschakeld) +Off = Uit +OnScreen = Aanraakbesturing op het scherm +Portrait = Portret +Portrait Reversed = Omgekeerd portret +PSP Action Buttons = PSP-actietoetsen +Screen Rotation = Schermrotatie +seconds, 0 : off = seconden, 0 = uit +Sensitivity = Gevoeligheid +Show right analog = Show right analog +Show Touch Pause Menu Button = Pauzemenutoets weergeven +Thin borders = Dunne randen +Tilt Base Radius = Tilt base radius +Tilt Input Type = Invoertype voor kantelen +Tilt Sensitivity along X axis = Kantelgevoeligheid op X-as +Tilt Sensitivity along Y axis = Kantelgevoeligheid op Y-as +To Calibrate = Zet het apparaat op een vlakke ondergrond en druk op "Kalibreren". +Touch Control Visibility = Zichtbaarheid touchbesturing +Use custom right analog = Use custom right analog +Use Mouse Control = Muisbesturing gebruiken +Visibility = Indeling +X = X +X + Y = X + Y +XInput Analog Settings = Analooginstellingen voor XInput +Y = Y + +[CwCheats] +Cheats = Cheats +Edit Cheat File = Cheatbestand bewerken +Enable/Disable All = Alle cheats aan-/uitzetten +Import Cheats = Importeren van cheat.db +Options = Opties +Refresh Rate = Vernieuwingsfrequentie + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = &Over PPSSPP... +Auto = &Automatisch +Backend = &Renderbackend (herstart PPSSPP) +Bicubic = &Bicubisch +Break = Break +Break on Load = Break on load +Buffered Rendering = &Gebufferde weergave +Buy Gold = Gold &kopen +Control Mapping... = Bestur&ing toewijzen... +Debugging = &Fouten opsporen +Deposterize = &Kleuren beperken opheffen +Direct3D9 = &Direct3D9 +Direct3D11 = Direct3D &11 +Disassembly = &Demonteren... +Discord = Discord +Display Layout Editor = Schermweergave aanpassen... +Display Rotation = Schermrotatie +Dump Next Frame to Log = &Volgende frame in logboek plaatsen +Emulation = &Emulatie +Enable Chat = Enable chat +Enable Cheats = &Cheats inschakelen +Enable Sound = &Geluid inschakelen +Exit = &Afsluiten +Extract File... = B&estand uitpakken... +File = &Bestand +Frame Skipping = &Frames overslaan +Frame Skipping Type = Frame skipping type +Fullscreen = &Volledig scherm +Game Settings = &Game-instellingen +GE Debugger... = GE-&foutopspoorder... +GitHub = Git&Hub +Hardware Transform = &Hardwaretransformatie +Help = &Help +Hybrid = &Hybride +Hybrid + Bicubic = H&ybride + bicubisch +Ignore Illegal Reads/Writes = Lees- en schrijffouten &negeren +Ignore Windows Key = Windows-toets negeren +Keep PPSSPP On Top = &PPSSPP op voorgrond houden +Landscape = Landschap +Landscape reversed = Omgekeerd landschap +Language... = Taa&l... +Linear = &Lineair +Load = &Laden... +Load .sym File... = .sym-bestand l&aden... +Load Map File... = Toewijzingsbestand &laden... +Load State = Saves&tate laden +Load State File... = Savestate &laden... +Log Console = Logboek&console +Memory View... = &Geheugenweergave... +More Settings... = &Meer instellingen... +Nearest = &Naaste buur +Non-Buffered Rendering = &Buffereffecten nalaten (niet-gebufferd, sneller) +Off = &Uit +Open Directory... = &Map openen... +Open from MS:/PSP/GAME... = O&pen vanuit MS:/PSP/GAME... +Open Memory Stick = M&emory stick openen +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = &Pauzeren +Pause When Not Focused = &Pauzeren wanneer venster inactief is +Portrait = Portret +Portrait reversed = Omgekeerd portret +Postprocessing Shader = &Nabewerkingsshader +PPSSPP Forums = &PPSSPP-forum +Record = Opnemen +Record Audio = Audio opnemen +Record Display = Scherm opnemen +Rendering Mode = W&eergavemodus +Rendering Resolution = &Te renderen resolutie +Reset = &Opnieuw opstarten +Reset Symbol Table = &Symbol Table herstellen +Run = &Uitvoeren +Save .sym File... = .sym-bestand o&pslaan... +Save Map File... = Toewijzingsbestand &opslaan... +Save State = Savest&ate opslaan +Save State File... = Savestate &opslaan... +Savestate Slot = &Savestatesleuf +Screen Scaling Filter = Bee&ldschalingsfilter +Show Debug Statistics = &Foutopsporingsstatistieken tonen +Show FPS Counter = FP&S-teller weergeven +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = &Stoppen +Switch UMD = UMD verwisselen +Take Screenshot = &Screenshot nemen +Texture Filtering = &Texturefilter +Texture Scaling = Te&xtures schalen +Use Lossless Video Codec (FFV1) = Lossless videocodec gebruiken (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = Vertex &Cache +VSync = Ve&rticale Synchronisatie +Vulkan = Vulkan +Window Size = Venster&grootte +www.ppsspp.org = &Bezoek www.ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allocatoren bekijken (Vulkan) +Allow remote debugger = Allow remote debugger +Backspace = Backspace +Block address = Blokadres +By Address = Op adres +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = textures.ini-bestand voor huidige game aanmaken/openen +Current = Huidige +Dev Tools = Ontwikkelingstools +DevMenu = Ontwikkelaarsmenu +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Gedecodeerde EBOOT.BIN opslaan tijdens starten +Dump Frame GPU Commands = FPU-commando's van frame opslaan +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Foutlogboek inschakelen +Enter address = Adres invoeren +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Frameanalyse +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = Jit vergelijken +JIT debug tools = JIT debug tools +Language = Taal +Load language ini = Taal-ini laden +Log Dropped Frame Statistics = Overgeslagen framestatistieken vastleggen +Log Level = Logniveau +Log View = Logboekoverzicht +Logging Channels = Logboekkanalen +Next = Volgende +No block = Geen blok +Prev = Vorige +Random = Willekeurig +Replace textures = Textures vervangen +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Weet u zeker dat u alle instellingen wilt herstellen\nnaar hun standaardwaarden?\nDe besturingsinstellingen worden niet gewijzigd.\n\nDit kan niet ongedaan gemaakt worden. Start PPSSPP\nopnieuw op om de wijzigingen toe te passen. +RestoreGameDefaultSettings = Weet u zeker dat u de game-specifieke instellingen wilt\nherstellen naar de standaardwaarden van PPSSPP? +Resume = Resume +Run CPU Tests = CPU-controles uitvoeren +Save language ini = Taal-ini opslaan +Save new textures = Nieuwe textures opslaan +Shader Viewer = Shader weergeven +Show Developer Menu = Ontwikkelaarsmenu weergeven +Show on-screen messages = Show on-screen messages +Stats = Statistieken +System Information = Systeeminformatie +Texture Replacement = Texturevervanging +Toggle Audio Debug = Foutopsporing voor audio in-/uitschakelen +Toggle Freeze = Bevriezen in-/uitschakelen +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP-resolutie +Active = Active +Back = Terug +Cancel = Annuleren +Center = Centreren +ChangingGPUBackends = Als u de GPU-backend wijzigt moet u PPSSPP opnieuw\nopstarten. Nu opnieuw opstarten? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = PPSSPP-opslagmap selecteren +Confirm Overwrite = Wilt u de opgeslagen data overschrijven? +Confirm Save = Wilt u deze data opslaan? +ConfirmLoad = Wilt u deze data laden? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Wissen +Delete all = Alles wissen +Delete completed = Het verwijderen is voltooid. +DeleteConfirm = De opgeslagen data worden verwijderd.\nWeet u zeker dat u wilt doorgaan? +DeleteConfirmAll = Weet u zeker dat u alle opgeslagen data voor deze\ngame wilt verwijderen? +DeleteConfirmGame = Weet u zeker dat u deze game van uw apparaat wilt\nverwijderen? Dit kan niet ongedaan gemaakt worden. +DeleteConfirmGameConfig = Weet u zeker dat u de instellingen voor deze game\nwilt verwijderen? +DeleteFailed = Kan de data niet verwijderen. +Deleting = Bezig met verwijderen...\nEen ogenblik geduld. +Disable All = Alles uitschakelen +Edit = Edit +Enable All = Alles inschakelen +Enter = Bevestigen +Finish = Voltooien +Grid = Grid +Inactive = Inactief +InternalError = An internal error has occurred. +Load = Laden +Load completed = Het laden is voltooid. +Loading = Bezig met laden...\nEen ogenblik geduld. +LoadingFailed = Kan de data niet laden. +Move = Slepen +Network Connection = Netwerkverbinding +NEW DATA = NIEUWE DATA +No = Nee +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = OK +Old savedata detected = Oude savedata gedetecteerd +Options = Opties +Reset = Herstellen +Resize = Schalen +Retry = Opnieuw +Save = Opslaan +Save completed = Het opslaan is voltooid. +Saving = Bezig met opslaan...\nEen ogenblik geduld. +SavingFailed = Kan de data niet opslaan. +Select = Selecteren +Shift = Shift +Snap = Snap +Space = Spatie +SSID = SSID +Submit = Verzenden +Supported = Ondersteund +There is no data = Er zijn geen data. +Toggle All = Alles schakelen +Toggle List = Toggle list +Unsupported = Niet ondersteund +When you save, it will load on a PSP, but not an older PPSSPP = Als u opslaat kunt u de opgeslagen data laden op\nPSP-systemen, maar niet op oudere PPSSPP-versies. +When you save, it will not work on outdated PSP Firmware anymore = Als u opslaat, werkt deze niet meer op verouderde PSP-firmware. +Yes = Ja +Zoom = Vergroten + +[Error] +7z file detected (Require 7-Zip) = het bestand is verkleind (7z).\nPak het bestand eerst uit (probeer 7-Zip of WinRAR). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = Kan het screenshotbestand niet opslaan. +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll niet gevonden. Installeer deze alsublieft. Of druk op Ja om het opnieuw te proberen met Direct3D 9. +D3D11InitializationError = Direct3D 11-initialisatiefout +D3D11Missing = Uw besturingssysteemversie heeft D3D11 niet inbegrepen. Voer Windows Update uit alstublieft.\n\nDruk op Ja om het opnieuw te proberen met Direct3D 9. +D3D11NotSupported = Uw GPU lijkt geen Direct3D 11 te ondersteunen.\n\nWilt u het opnieuw proberen met Direct3D 9? +Disk full while writing data = Schijf volgeraakt tijdens het schrijven van de data. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = Kan de game niet laden. +Error reading file = Kan het bestand niet lezen. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = het bestand kan niet worden geïdentificeerd. +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Kan de graphics niet initialiseren. Probeer uw grafische drivers en de DirectX 9-runtime bij te werken.\n\nWilt u overschakelen naar OpenGL?\n\nFoutbericht: +GenericGraphicsError = Grafische fout +GenericOpenGLError = Kan de graphics niet initialiseren. Probeer uw grafische drivers bij te werken.\n\nWilt u proberen over te schakelen naar DirectX 9?\n\nFoutbericht: +GenericVulkanError = Kan de graphics niet initialiseren. Probeer uw grafische drivers bij te werken.\n\nWilt u proberen over te schakelen naar OpenGL?\n\nFoutbericht: +InsufficientOpenGLDriver = Onvoldoende ondersteuning voor het OpenGL-stuurprogramma gedetecteerd!\n\nUw GPU meldt dat het geen ondersteuning biedt voor OpenGL 2.0. Wilt u in plaats daarvan DirectX proberen?\n\nDirectX ondersteunt momenteel minder games, maar met uw GPU is het waarschijnlijk de enigste optie.\n\nBezoek het forum via https://forums.ppsspp.org voor meer informatie.\n\n +Just a directory. = Gewoon een map. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = geen EBOOT.PBP, game is niet goed geïdentificeerd. +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = OpenGL-driverfout +PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP ondersteunt momenteel geen verbinding met het internet voor DLC, PSN, of gameupdates. +PS1 EBOOTs are not supported by PPSSPP. = PS1-EBOOTs worden niet door PPSSPP ondersteund. +PSX game image detected. = dit bestand is een MODE2-schijfkopie. PPSSPP ondersteunt geen PS1-games. +RAR file detected (Require UnRAR) = het bestand is verkleind (RAR).\nPak het bestand eerst uit (probeer UnRAR) +RAR file detected (Require WINRAR) = het bestand is verkleind (RAR).\nPak het bestand eerst uit (probeer WinRAR) +Running slow: try frameskip, sound is choppy when slow = Trage prestaties: probeer frameskip, geluid hapert wanneer langzaam +Running slow: Try turning off Software Rendering = Trage prestaties: probeer "Renderen via software" uit te schakelen +Save encryption failed. This save won't work on real PSP = Versleutelen van savedata mislukt. De savedata zal\nniet werken op echte PSP-systemen. +textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +This is a saved state, not a game. = This is a saved state, not a game. +This is save data, not a game. = This is save data, not a game. +Unable to create cheat file, disk may be full = Kon het cheatbestand niet aanmaken, wellicht is de schijf vol. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Kan de savedata niet opslaan, de schijf is mogelijk vol. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Waarschuwing: het videogeheugen is vol, upscaling wordt gereduceerd en er wordt overgeschakeld naar de trage cachingmodus. +Warning: Video memory FULL, switching to slow caching mode = Waarschuwing: het videogeheugen is vol, er wordt overgeschakeld naar de trage cachingmodus. +ZIP file detected (Require UnRAR) = het bestand is verkleind (ZIP).\nPak het bestand eerst uit (probeer UnRAR) +ZIP file detected (Require WINRAR) = het bestand is verkleind (ZIP).\nPak het bestand eerst uit (probeer WinRAR) + +[Game] +Asia = Azië +ConfirmDelete = Verwijderen +Create Game Config = Gameopties aanmaken +Create Shortcut = Snelkoppeling maken +Delete Game = Game wissen +Delete Game Config = Gameopties wissen +Delete Save Data = Savedata wissen +Europe = Europa +Game = Game +Game Settings = Game-instellingen +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Data installeren +Japan = Japan +Korea = Korea +MB = MB +One moment please... = Een ogenblik geduld... +Play = Spelen +Remove From Recent = Wissen uit "Recent" +SaveData = Opgeslagen data +Setting Background = Achtergrondinstelling +Show In Folder = Weergeven in map +USA = VS +Use UI background = UI-achtergrond gebruiken + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = onbeperkt +(supersampling) = (supersampling) +(upscaling) = (upscaling) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Agressief +Alternative Speed = Alternatieve snelheid (in %, 0 = onbeperkt) +Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Anisotropic Filtering = Anisotropische filter +Auto = Automatisch +Auto (1:1) = Automatisch (1:1) +Auto (same as Rendering) = Auto (renderresolutie) +Auto FrameSkip = Frames automatisch overslaan +Auto Scaling = Automatisch schalen +Backend = Backend +Balanced = Gebalanceerd +Bicubic = Bicubisch +BlockTransfer Tip = Sommige games vereisen dat deze optie aan staat voor juiste graphics +BlockTransferRequired = Waarschuwing: Deze game vereist de optie Blokoverdrachteffecten simuleren. +Both = Beide +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Gebufferde weergave +BufferedRenderingRequired = Waarschuwing: Deze game vereist een "gebufferde renderingmodus". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Schermgrootte (in % van het kijkvenster) +Cardboard Screen X Shift = Verschuiving X-as (in % van de lege ruimte) +Cardboard Screen Y Shift = Verschuiving Y-as (in % van de lege ruimte) +Cardboard VR Settings = Instellingen voor Google Cardboard VR +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU-core +Debugging = Fouten opsporen +DefaultCPUClockRequired = Waarschuwing: Deze game vereist de standaard CPU-kloksnelheid. +Deposterize = Kleuren beperken opheffen +Deposterize Tip = Verhelpt visuele streepglitches in opgeschaalde textures +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Tragere effecten uitschakelen (sneller) +Disabled = Disabled +Display layout editor = Schermweergave bewerken +Display Resolution (HW scaler) = Schermresolutie (hardware) +Dump next frame to log = Volgende frame in logboek plaatsen +Enable Cardboard VR = Enable Cardboard VR +FPS = FPS +Frame Rate Control = Framerateinstellingen +Frame Skipping = Frames overslaan +Frame Skipping Type = Frame skipping type +FullScreen = Volledig scherm +Hack Settings = Hackinstellingen (kan glitches veroorzaken) +Hardware Tessellation = Hardwarebetegeling +Hardware Transform = Hardwaretransformatie +hardware transform error - falling back to software = Hardwaretransformatiefout, terugvallen naar software +HardwareTessellation Tip = Gebruikt hardware om curves te maken, gebruikt een vaste kwaliteit +High = Hoog +Hybrid = Hybride +Hybrid + Bicubic = Hybride + bicubisch +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Interne resolutie +Lazy texture caching = Texturecaching reduceren (sneller) +Linear = Lineair +Low = Laag +LowCurves = Kwaliteit spline- en béziercurves +LowCurves Tip = Alleen gebruikt in sommige games, bestuurt de afronding van curves +Lower resolution for effects (reduces artifacts) = Effectresolutie verlagen (minder objecten) +Manual Scaling = Handmatig schalen +Medium = Normaal +Mode = Modus +Must Restart = U moet PPSSPP herstarten om de wijzigingen door te voeren. +Native device resolution = Apparaatresolutie +Nearest = Naaste buur +No buffer = No buffer +Non-Buffered Rendering = Buffereffecten nalaten (niet-gebufferd, sneller) +None = Geen +Number of Frames = Number of frames +Off = Uit +OpenGL = OpenGL +Overlay Information = Informatie op het scherm +Partial Stretch = Gedeeltelijk uitrekken +Percent of FPS = Percent of FPS +Performance = Prestaties +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Nabewerkingsshader +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = Weergavemodus +Rendering Resolution = Renderresolutie +RenderingMode NonBuffered Tip = Sneller, maar mogelijk wordt in sommige games niets gerenderd +Retain changed textures = Gewijzigde textures behouden (soms trager) +RetainChangedTextures Tip = Maakt vele games trager, maar sommige games veel sneller +Rotation = Rotatie +Safe = Veilig +Screen layout = Screen layout +Screen Scaling Filter = Beeldschalingsfilter +Show Debug Statistics = Foutopsporingsstatistieken weergeven +Show FPS Counter = FPS-teller weergeven +Simulate Block Transfer = Blokoverdrachteffecten simuleren +SoftGPU Tip = Momenteel ERG traag +Software Rendering = Renderen via software (experimenteel) +Software Skinning = Skinning via software +SoftwareSkinning Tip = Vermindert aantal renders en is sneller in games die de geavanceerde skinningtechniek gebruiken, maar voor sommige games trager +Speed = Snelheid +Stretching = Uitrekken +Texture Filter = Texturefilter +Texture Filtering = Texturefilter +Texture Scaling = Textures schalen +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Schakel "hardwarebetegeling" uit: niet ondersteund +Unlimited = Onbeperkt +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = Upscaleniveau +Upscale Type = Upscaletype +UpscaleLevel Tip = CPU-belastend - schalen kan vertraagd worden om haperingen te voorkomen +Use all displays = Alle beeldschermen gebruiken +Vertex Cache = Vertexcache +VertexCache Tip = Sneller, maar kan tijdelijk flikkeringen veroorzaken +VSync = Verticale synchronisatie +Vulkan = Vulkan +Window Size = Venstergrootte +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = ZIP-bestand wissen +Install = Installeren +Install game from ZIP file? = Game installeren vanuit het ZIP-bestand? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = Installatie voltooid! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = Autoconfiguratie +Autoconfigure for device = Automatisch voor apparaat configureren +Clear All = Alles legen +Default All = Herstellen +Map a new key for = Stel een nieuwe toets in voor +Map Key = Toets indelen +Map Mouse = Muis indelen +Test Analogs = Analoogtest +You can press ESC to cancel. = Druk op Esc om te annuleren. + +[MainMenu] +Browse = Bladeren... +Buy PPSSPP Gold = Buy PPSSPP Gold +Choose folder = Choose folder +Credits = Credits +PPSSPP Homebrew Store = PPSSPP Homebrew Store +Exit = Afsluiten +Game Settings = Instellingen +Games = Games +Give PPSSPP permission to access storage = Geef PPSSPP toegang tot de opslagruimte +Homebrew & Demos = Homebrew && demo's +How to get games = Hoe kom ik aan games? +How to get homebrew & demos = Hoe kom ik aan homebrew && demo's? +Load = Laden... +Loading... = Loading... +PinPath = Vastmaken +PPSSPP can't load games or save right now = PPSSPP kan nu geen games laden of opslaan +Recent = Recent +SavesAreTemporary = PPSSPP is saving in temporary storage +SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently +SavesAreTemporaryIgnore = Ignore warning +UnpinPath = Losmaken +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Geluid +Controls = Besturing +Graphics = Beeld +Networking = Netwerk +System = Systeem +Tools = Hulpmiddelen + +[MappableControls] +Alt speed 1 = Alt speed 1 +Alt speed 2 = Alt speed 2 +An.Down = Stick beneden +An.Left = Stick links +An.Right = Stick rechts +An.Up = Stick boven +Analog limiter = Analooglimiet +Analog Stick = Analoge stick +Audio/Video Recording = Audio/video opnemen +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Assen wisselen +Circle = Cirkel +Cross = Kruis +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = Ontwikkelaarsmenu +Down = Beneden +Dpad = Richtingstoetsen +Frame Advance = Frame doorspoelen +Hold = Ingedrukt +Home = Home +L = L +Left = Links +Load State = State laden +Mute toggle = Mute toggle +Next Slot = Volgende sleuf +None = None +Note = Muzieknoot +OpenChat = Open chat +Pause = Pauzeren +R = R +RapidFire = Snelvuur +Remote hold = Vasthouden op afstand +Rewind = Terugspoelen +Right = Rechts +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = StickR beneden +RightAn.Left = StickR links +RightAn.Right = StickR rechts +RightAn.Up = StickR boven +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = State opslaan +Screen = Scherm +Screenshot = Screenshot +Select = Select +SpeedToggle = Turboschakelaar +Square = Vierkant +Start = Start +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = Volledig scherm schakelen +Toggle mode = Toggle mode +Triangle = Driehoek +Unthrottle = Versnellen +Up = Boven +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Ad hoc-multiplayerforum bezoeken +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = MAC-adres wijzigen +Change proAdhocServer Address = IP-adres van PRO Ad hoc-server wijzigen (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Ingebouwde PRO Ad hoc-server inschakelen +Enable network chat = Enable network chat +Enable networking = Netwerk/WLAN inschakelen (bèta, kan crashen) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Netwerk geïnitialiseerd +Please change your Port Offset = Please change your port offset +Port offset = Poortoffset (0 = PSP-compatibiliteit) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Send Discord "Rich Presence" information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = Cheats +Continue = Doorgaan +Create Game Config = Gameopties aanmaken +Delete Game Config = Gameopties wissen +Exit to menu = Afsluiten naar menu +Game Settings = Game-instellingen +Load State = State laden +Rewind = Terugspoelen +Save State = State opslaan +Settings = Instellingen +Switch UMD = UMD verwisselen + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-kleur +Amount = Amount +Black border = Black border +Bloom = Bloeieffect +Brightness = Brightness +Cartoon = Cartoon +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT-scanlijnen +FXAA = FXAA-antialiasing +Gamma = Gamma +Grayscale = Grijswaarden +Intensity = Intensity +InverseColors = Omgekeerde kleuren +Natural = Natuurlijke kleuren +NaturalA = Natural Colors (no blur) +Off = Uit +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlijnen (CRT) +Sharpen = Verscherpen +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36-upscaler +VideoSmoothingAA = VideoSmoothingAA +Vignette = Vignet + +[PSPCredits] +all the forum mods = all the forum mods +build server = build server +Buy Gold = Gold kopen +check = Probeer ook Dolphin, de beste Wii/GC-emulator van het moment: +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = Bijdragers: +created = Ontwikkeld door +Discord = Discord +info1 = PPSSPP is uitsluitend bedoeld voor educatieve doelstellingen. +info2 = Zorg dat u over alle rechten bezit van de games die +info3 = u speelt door in het bezit te zijn van de UMD of door de digitale +info4 = download aan te schaffen uit de PSN Store op uw echte PSP-systeem. +info5 = PSP is een handelsmerk van Sony, Inc. +iOS builds = iOS builds +license = Gratis software onder GPL 2.0+-licentie +list = compatibiliteitslijsten, forum en ontwikkelingsinformatie +PPSSPP Forums = PPSSPP-forum +Privacy Policy = Privacy policy +Share PPSSPP = PPSSPP delen +specialthanks = Speciale dank aan: +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = Nederlandse vertaling door: +title = Een snelle en draagbare PSP-emulator +tools = Gratis hulpprogramma's gebruikt: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = GuardianSoul +translators2 = +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Bezoek de website: +written = Geschreven in C++ voor snelheid en draagbaarheid + +[RemoteISO] +Browse Games = Games bladeren... +Local Server Port = Lokale serverpoort +Manual Mode Client = Handmatige modus client +Remote disc streaming = Externe schijf streamen +Remote Port = Externe poort +Remote Server = Externe server +Remote Subdirectory = Externe submap +RemoteISODesc = Games in uw recente lijst zullen worden gedeeld +RemoteISOLoading = Verbonden, gamelijst laden... +RemoteISOScanning = Scannen... Klik op "games delen" op uw serverapparaat +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Opmerking: Verbind beide apparaten met hetzelfde Wi-Fi-netwerk +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Instellingen +Share Games (Server) = Games delen (server) +Share on PPSSPP startup = Delen wanneer PPSSPP opstart +Stop Sharing = Stoppen met delen +Stopping.. = Stoppen... + +[Reporting] +Bad = Slecht +FeedbackDelayInfo = Uw data wordt op de achtergrond ingediend. +FeedbackDesc = Hoe bevalt de emulatie? Laat het ons en de community weten! +FeedbackDisabled = Compatibiliteitserverrapporten moet ingeschakeld zijn. +FeedbackIncludeCRC = Opmerking: Een schijf-CRC verzenden verbruikt stroom +FeedbackIncludeScreen = Een screenshot toevoegen +FeedbackSubmitDone = Uw data is ingediend. +FeedbackSubmitFail = Kon de data niet indienen naar de server. Probeer PPSSPP bij te werken. +FeedbackThanks = Bedankt voor uw feedback! +Gameplay = Gameplay +Graphics = Graphics +Great = Goed +In-game = In-game +In-game Description = Is speelbaar, maar bevat te veel bugs om uit te spelen +Menu/Intro = Menu/intro +Menu/Intro Description = Kan niet in het spel zelf komen +Nothing = Niets +Nothing Description = Werkt totaal niet +OK = Matig +Open Browser = Browser openen +Overall = Algemeen +Perfect = Perfect +Perfect Description = Het hele spel wordt zonder problemen geëmuleerd - geweldig! +Plays = Speelt af +Plays Description = Volledig speelbaar maar met mogelijke glitches +ReportButton = Feedback verzenden +Speed = Snelheid +Submit Feedback = Feedback verzenden +SuggestionConfig = See reports on website for good settings. +SuggestionCPUSpeed0 = Disable locked CPU speed setting. +SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this bug). +SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. +SuggestionsNone = This game isn't working for other users too. +SuggestionsWaiting = Submitting and checking other users feedback... +SuggestionUpgrade = Upgrade to a newer PPSSPP build. +SuggestionVerifyDisc = Check your ISO is a good copy of your disc. +Unselected Overall Description = Hoe goed wordt dit spel geëmuleerd? +View Feedback = Alle feedback bekijken + +[Savedata] +Date = Date +Filename = Filename +No screenshot = Geen screenshot +None yet. Things will appear here after you save. = Nog niets. Er zullen hier dingen verschijnen zodra u iets opslaat. +Save Data = Savedata +Save States = Savestates +Savedata Manager = Beheerder voor savedata +Size = Size + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = WAARSCHUWING: Chainfire3D gedetecteerd, kan problemen veroorzaken. +Failed to load state = Kon de savestate niet laden +Failed to save state = Kon de savestate niet opslaan +fixed = Snelheid: alternatief +GLToolsWarning = WAARSCHUWING: GLTools gedetecteerd, kan problemen veroorzaken. +In menu = In menu +Load savestate failed = Laden van savestate mislukt +Loaded State = Savestate geladen +Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +LoadStateDoesntExist = Laden mislukt: Savestate bestaat niet! +LoadStateWrongVersion = Laden mislukt: Savestate is voor een oudere versie van PPSSPP! +norewind = Geen savestates beschikbaar voor terugspoelen. +Playing = Playing +PressESC = Druk op ESC om het pauzemenu te openen +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = Opslaan van savestate mislukt! +Saved State = Savestate opgeslagen +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Speed: alternate 2 +standard = Snelheid: standaard +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = Al geïnstalleerd +Connection Error = Verbindingsfout +Install = Installeren +Launch Game = Game starten +Loading... = Laden +MB = MB +Size = Grootte +Uninstall = Deïnstalleren + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d cores) +%d bytes = %d bytes +(none detected) = (niets gedetecteerd) +3D API = 3D-API +ABI = ABI +API Version = API-versie +Audio Information = Audioinformatie +Board = Board +Build Config = Bouw +Build Configuration = Bouwconfiguratie +Built by = Gebouwd door +Core Context = Corecontext +Cores = Cores +CPU Extensions = CPU-extensies +CPU Information = CPU-informatie +CPU Name = Naam +D3DCompiler Version = D3DCompiler version +Debug = Fouten opsporen +Debugger Present = Foutopsporing aanwezig +Device Info = Apparaatinformatie +Display Information = Beeldscherminformatie +Driver Version = Driverversie +EGL Extensions = EGL-extensies +Frames per buffer = Frames per buffer +GPU Information = GPU-informatie +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Taal/regio +Memory Page Size = Grootte geheugenpagina +Native Resolution = Oorspronkelijke resolutie +OGL Extensions = OGL-extensies +OpenGL ES 2.0 Extensions = OpenGL ES 2.0-extensies +OpenGL ES 3.0 Extensions = OpenGL ES 3.0-extensies +OpenGL Extensions = OpenGL-extensies +Optimal frames per buffer = Optimale frames per buffer +Optimal sample rate = Optimale samplerate +OS Information = OS-informatie +PPSSPP build = PPSSPP build +Refresh rate = Vernieuwingsfrequentie +Release = Release +RW/RX exclusive = RW/RX-excusief +Sample rate = Samplerate +Shading Language = Shadingtaal +Sustained perf mode = Aanhoudende prestatiemodus +System Information = Systeeminformatie +System Name = Naam +System Version = System version +Threads = Threads +Vendor = Verkoper +Vendor (detected) = Verkoper (gedetecteerd) +Version Information = Versie-informatie +Vulkan Extensions = Vulkan-extensies +Vulkan Features = Vulkan-functies + +[System] +(broken) = (defect) +12HR = 12-uursweergave +24HR = 24-uursweergave +Auto = Auto +Auto Load Savestate = Auto load savestate +AVI Dump started. = AVI-dump gestart +AVI Dump stopped. = AVI-dump gestopt +Cache ISO in RAM = Hele ISO naar RAM-cache kopiëren +Change CPU Clock = CPU-kloksnelheid aanpassen (instabiel) +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Gebruikersnaam wijzigen +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = Cheats (experimenteel, bekijk het forum) +Clear Recent = Clear "Recent" +Clear Recent Games List = Lijst met recente games legen +Clear UI background = UI-achtergrond legen +Confirmation Button = Bevestigingstoets +Date Format = Datumweergave +Day Light Saving = Zomertijd +DDMMYYYY = DDMMJJJJ +Decrease size = Decrease size +Developer Tools = Ontwikkelaarsopties +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emulatie +Enable Cheats = Cheats inschakelen +Enable Compatibility Server Reports = Compatibiliteitsrapporten naar server versturen +Failed to load state. Error in the file system. = Kon de savestate niet laden. Fout in het bestandssysteem. +Failed to save state. Error in the file system. = Kon de savestate niet opslaan. Fout in het bestandssysteem. +Fast (lag on slow storage) = Snel (lagt bij traag geheugen) +Fast Memory = Snel geheugen (instabiel) +Force real clock sync (slower, less lag) = Kloksnelheid gelijkzetten (trager, minder lag) +frames, 0:off = frames, 0 = uit +Games list settings = Games list settings +General = Algemeen +Grid icon size = Grid icon size +Help the PPSSPP team = Help het PPSSPP-team +Host (bugs, less lag) = Host (bugs, minder lag) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Interpreteerder +IO timing method = I/O-timingmethode +IR Interpreter = IR-interpreteerder +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = Memory Stick ingevoerd +MHz, 0:default = MHz, 0 = standaard +MMDDYYYY = MMDDJJJJ +Newest Save = Newest save +Not a PSP game = Geen PSP-game +Off = Uit +Oldest Save = Oldest save +PSP Model = PSP-model +PSP Settings = PSP-instellingen +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Audio opnemen +Record Display = Scherm opnemen +Reset Recording on Save/Load State = Opname opnieuw opstarten bij opslaan/laden van states +Restore Default Settings = PPSSPP's standaardinstellingen herstellen +Rewind Snapshot Frequency = Terugspoelfrequentie (kost geheugen) +Save path in installed.txt = Opslagpad in installed.txt +Save path in My Documents = Opslagpad in Mijn documenten +Savestate Slot = Savestatesleuf +Savestate slot backups = Savestate slot backups +Screenshots as PNG = Screenshots opslaan in PNG-formaat +Set UI background... = UI-achtergrond instellen... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = UMD-vertraging simuleren +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Onvoldoende opslagruimte +Sustained performance mode = Aanhoudende prestatiemodus +Time Format = Tijdweergave +UI = Gebruikersomgeving +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Lossless videocodec gebruiken (FFV1) +Use O to confirm = Bevestigen met O +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = Bevestigen met X +VersionCheck = Controleer op nieuwe versies van PPSSPP +WARNING: Android battery save mode is on = WAARSCHUWING: Android batterijbesparingsmodus staat aan +WARNING: Battery save mode is on = WAARSCHUWING: Batterijbesparingsmodus staat aan +YYYYMMDD = JJJJMMDD + +[Upgrade] +Details = Details +Dismiss = Annuleren +Download = Downloaden +New version of PPSSPP available = Er is een nieuwe versie van PPSSPP beschikbaar diff --git a/assets/lang/no_NO.ini b/assets/lang/no_NO.ini new file mode 100644 index 0000000000..2478c7cf8e --- /dev/null +++ b/assets/lang/no_NO.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = Audio backend (restart req.) +AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) +Auto = Auto +Device = Device +DSound (compatible) = DSound (compatible) +Enable Sound = Lyd +Global volume = Global volume +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = WASAPI (fast) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Analog axis sensitivity +Analog Limiter = Analog limiter +Analog Mapper High End = Analog mapper high-end (axis sensitivity) +Analog Mapper Low End = Analog mapper low-end (inverse deadzone) +Analog Mapper Mode = Analog mapper mode +Analog Stick = Analog stick +AnalogLimiter Tip = When the analog limiter button is pressed +Auto = Auto +Auto-centering analog stick = Auto-centering analog stick +Auto-hide buttons after seconds = Auto-hide buttons after seconds +Binds = Binds +Button Opacity = Knappgenomsiktighet +Button style = Button style +Calibrate D-Pad = Calibrate +Calibration = Calibration +Classic = Classic +Combo Key Setting = Combo key setting +Combo Key Setup = Combo key setup +Confine Mouse = Trap mouse within window/display area +Control Mapping = Control mapping +Custom layout... = Edit touch control layout... +Customize tilt = Customize tilt... +D-PAD = D-Pad +Deadzone Radius = Deadzone radius +DInput Analog Settings = DInput analog settings +Disable D-Pad diagonals (4-way touch) = Disable D-Pad diagonals (4-way touch) +Glowing borders = Glowing borders +HapticFeedback = Haptic feedback (vibration) +Ignore gamepads when not focused = Ignore gamepads when not focused +Ignore Windows Key = Disable Windows key +Invert Axes = Invert axes +Invert Tilt along X axis = Invert tilt along X axis +Invert Tilt along Y axis = Invert tilt along Y axis +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Keyboard control settings +L/R Trigger Buttons = L/R trigger buttons +Landscape = Landscape +Landscape Auto = Landscape auto +Landscape Reversed = Landscape reversed +Mouse = Mouse settings +Mouse sensitivity = Mouse sensitivity +Mouse smoothing = Mouse smoothing +MouseControl Tip = You can now map mouse in control mapping screen by pressing the 'M' icon. +None (Disabled) = None (disabled) +Off = Off +OnScreen = Touch-kontroller på skjermen +Portrait = Portrait +Portrait Reversed = Portrait reversed +PSP Action Buttons = PSP action buttons +Screen Rotation = Screen rotation +seconds, 0 : off = seconds, 0 = off +Sensitivity = Sensitivity +Show right analog = Show right analog +Show Touch Pause Menu Button = Show pause menu button +Thin borders = Thin borders +Tilt Base Radius = Tilt base radius +Tilt Input Type = Tilt input type +Tilt Sensitivity along X axis = Tilt sensitivity along X axis +Tilt Sensitivity along Y axis = Tilt sensitivity along Y axis +To Calibrate = To calibrate, keep device on a flat surface and press "Calibrate". +Touch Control Visibility = Touch control visibility +Use custom right analog = Use custom right analog +Use Mouse Control = Use mouse control +Visibility = Visibility +X = X +X + Y = X + Y +XInput Analog Settings = XInput analog settings +Y = Y + +[CwCheats] +Cheats = Cheats +Edit Cheat File = Edit cheat file +Enable/Disable All = Enable/Disable all Cheats +Import Cheats = Import from cheat.db +Options = Options +Refresh Rate = Refresh rate + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = &About PPSSPP... +Auto = &Auto +Backend = Rendering &Backend (Restarts PPSSPP) +Bicubic = &Bicubic +Break = Break +Break on Load = Break on load +Buffered Rendering = &Buffered Rendering +Buy Gold = Buy &Gold +Control Mapping... = C&ontrol Mapping... +Debugging = &Debug +Deposterize = &Deposterize +Direct3D9 = &Direct3D9 +Direct3D11 = Direct3D &11 +Disassembly = &Disassembly... +Discord = Discord +Display Layout Editor = Display layout editor... +Display Rotation = Display rotation +Dump Next Frame to Log = D&ump Next Frame to Log +Emulation = &Emulation +Enable Chat = Enable chat +Enable Cheats = Enable &Cheats +Enable Sound = Enable S&ound +Exit = E&xit +Extract File... = E&xtract File... +File = &File +Frame Skipping = &Frame skipping +Frame Skipping Type = Frame skipping type +Fullscreen = Fu&llscreen +Game Settings = &Game Settings +GE Debugger... = GE Debugge&r... +GitHub = Git&Hub +Hardware Transform = &Hardware Transform +Help = &Help +Hybrid = &Hybrid +Hybrid + Bicubic = H&ybrid + Bicubic +Ignore Illegal Reads/Writes = &Ignore Illegal Reads/Writes +Ignore Windows Key = Ignore Windows Key +Keep PPSSPP On Top = &Keep PPSSPP on Top +Landscape = Landscape +Landscape reversed = Landscape reversed +Language... = La&nguage... +Linear = &Linear +Load = &Load... +Load .sym File... = Lo&ad .sym File... +Load Map File... = Load &Map File... +Load State = L&oad State +Load State File... = &Load State File... +Log Console = &Log Console +Memory View... = Memory &View... +More Settings... = &More Settings... +Nearest = &Nearest +Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) +Off = &Off +Open Directory... = Open &Directory... +Open from MS:/PSP/GAME... = O&pen from MS:/PSP/GAME... +Open Memory Stick = Open &Memory Stick +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = &Pause +Pause When Not Focused = &Pause When Not Focused +Portrait = Portrait +Portrait reversed = Portrait reversed +Postprocessing Shader = Postprocessin&g Shader +PPSSPP Forums = PPSSPP &Forums +Record = &Record +Record Audio = Record &audio +Record Display = Record &display +Rendering Mode = Rendering M&ode +Rendering Resolution = &Rendering Resolution +Reset = R&eset +Reset Symbol Table = Reset S&ymbol Table +Run = &Run +Save .sym File... = Sav&e .sym File... +Save Map File... = &Save Map File... +Save State = S&ave State +Save State File... = &Save State File... +Savestate Slot = Saves&tate Slot +Screen Scaling Filter = Scr&een Scaling Filter +Show Debug Statistics = Show Debu&g Statistics +Show FPS Counter = Show &FPS Counter +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = &Stop +Switch UMD = Switch UMD +Take Screenshot = &Take Screenshot +Texture Filtering = Te&xture Filtering +Texture Scaling = &Texture Scaling +Use Lossless Video Codec (FFV1) = &Use lossless video codec (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = &Vertex Cache +VSync = VS&ync +Vulkan = Vulkan +Window Size = &Window Size +www.ppsspp.org = Visit www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allocator viewer (Vulkan) +Allow remote debugger = Allow remote debugger +Backspace = Backspace +Block address = Block address +By Address = By address +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Create/Open textures.ini file for current game +Current = Current +Dev Tools = Development tools +DevMenu = DevMenu +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Dump decrypted EBOOT.BIN on game boot +Dump Frame GPU Commands = Dump frame GPU commands +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Debugloggning +Enter address = Enter address +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Frame profiler +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = Jit compare +JIT debug tools = JIT debug tools +Language = Language +Load language ini = Åpne språk-ini +Log Dropped Frame Statistics = Log dropped frame statistics +Log Level = Log level +Log View = Log view +Logging Channels = Logging channels +Next = Next +No block = No block +Prev = Previous +Random = Random +Replace textures = Replace textures +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. +RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? +Resume = Resume +Run CPU Tests = Kjør CPU-test +Save language ini = Lagre språk-ini +Save new textures = Save new textures +Shader Viewer = Shader viewer +Show Developer Menu = Show developer menu +Show on-screen messages = Show on-screen messages +Stats = Stats +System Information = Systeminformasjon +Texture Replacement = Texture replacement +Toggle Audio Debug = Toggle audio debug +Toggle Freeze = Toggle freeze +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP res +Active = Active +Back = Tilbake +Cancel = Cancel +Center = Center +ChangingGPUBackends = Changing GPU backends requires PPSSPP to restart. Restart now? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = Choose PPSSPP save folder +Confirm Overwrite = Do you want to overwrite the data? +Confirm Save = Do you want to save this data? +ConfirmLoad = Load this data? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Slett +Delete all = Delete all +Delete completed = Slettet!!. +DeleteConfirm = Slett markert fil.\nEr du sikker på at du vil dette? +DeleteConfirmAll = Do you really want to delete all\nyour save data for this game? +DeleteConfirmGame = Do you really want to delete this game\nfrom your device? You can't undo this. +DeleteConfirmGameConfig = Do you really want to delete the settings for this game? +DeleteFailed = Unable to delete data. +Deleting = Sletter\nVent litt... +Disable All = Disable all +Edit = Edit +Enable All = Enable all +Enter = Enter +Finish = Ferdig +Grid = Grid +Inactive = Inactive +InternalError = An internal error has occurred. +Load = Load +Load completed = Ferdig lastet. +Loading = Laster\nVent litt... +LoadingFailed = Unable to load data. +Move = Move +Network Connection = Network Connection +NEW DATA = NEW DATA +No = Nei +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = OK +Old savedata detected = Old savedata detected +Options = Options +Reset = Reset +Resize = Resize +Retry = Retry +Save = Save +Save completed = Ferdig lagret. +Saving = Lagrer\nVent litt... +SavingFailed = Unable to save data. +Select = Velg +Shift = Shift +Snap = Snap +Space = Space +SSID = SSID +Submit = Submit +Supported = Supported +There is no data = Det finnes ingen data. +Toggle All = Toggle all +Toggle List = Toggle list +Unsupported = Unsupported +When you save, it will load on a PSP, but not an older PPSSPP = When you save, it will load on a PSP, but not an older PPSSPP +When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Yes = Ja +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = file is compressed (7z).\nPlease decompress first (try 7-Zip or WinRAR). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = Could not save screenshot file. +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll not found. Please install. Or press Yes to try again using Direct3D 9 instead. +D3D11InitializationError = Direct3D 11 initialization error +D3D11Missing = Your operating system version does not include D3D11. Please run Windows Update.\n\nPress Yes to try again using Direct3D 9 instead. +D3D11NotSupported = Your GPU does not appear to support Direct3D 11.\n\nWould you like to try again using Direct3D 9 instead? +Disk full while writing data = Disk full while writing data. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = Feil ved lasting av fil. +Error reading file = error reading file. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = failed to identify file. +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Failed initializing graphics. Try upgrading your graphics drivers and DirectX 9 runtime.\n\nWould you like to try switching to OpenGL?\n\nError message: +GenericGraphicsError = Graphics Error +GenericOpenGLError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to DirectX 9?\n\nError message: +GenericVulkanError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to OpenGL?\n\nError message: +InsufficientOpenGLDriver = Insufficient OpenGL driver support detected!\n\nYour GPU reports that it does not support OpenGL 2.0. Would you like to try using DirectX instead?\n\nDirectX is currently compatible with less games, but on your GPU it may be the only choice.\n\nVisit the forums at https://forums.ppsspp.org for more information.\n\n +Just a directory. = just a directory. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = no EBOOT.PBP, misidentified game. +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = OpenGL driver error +PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP currently does not support connecting to the Internet for DLC, PSN, or game updates. +PS1 EBOOTs are not supported by PPSSPP. = PS1 EBOOTs are not supported by PPSSPP. +PSX game image detected. = File is a MODE2 image. PPSSPP doesn't support PS1 games. +RAR file detected (Require UnRAR) = file is compressed (RAR).\nPlease decompress first (try UnRAR). +RAR file detected (Require WINRAR) = file is compressed (RAR).\nPlease decompress first (try WinRAR). +Running slow: try frameskip, sound is choppy when slow = Running slow: try frameskip, sound is choppy when slow +Running slow: Try turning off Software Rendering = Running slow: try turning off "software rendering" +Save encryption failed. This save won't work on real PSP = Save encryption failed. This save won't work on real PSP +textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +This is a saved state, not a game. = This is a saved state, not a game. +This is save data, not a game. = This is save data, not a game. +Unable to create cheat file, disk may be full = Unable to create cheat file, disk may be full. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Unable to write savedata, disk may be full. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Warning: Video memory FULL, reducing upscaling and switching to slow caching mode. +Warning: Video memory FULL, switching to slow caching mode = Warning: Video memory FULL, switching to slow caching mode. +ZIP file detected (Require UnRAR) = file is compressed (ZIP).\nPlease decompress first (try UnRAR). +ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompress first (try WinRAR). + +[Game] +Asia = Asia +ConfirmDelete = Delete +Create Game Config = Create game config +Create Shortcut = Create shortcut +Delete Game = Delete game +Delete Game Config = Delete game config +Delete Save Data = Delete savedata +Europe = Europe +Game = Game +Game Settings = Game settings +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Data install +Japan = Japan +Korea = Korea +MB = MB +One moment please... = One moment please... +Play = Play +Remove From Recent = Remove from "Recent" +SaveData = Savedata +Setting Background = Setting background +Show In Folder = Show in folder +USA = USA +Use UI background = Use UI background + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = unlimited +(supersampling) = (supersampling) +(upscaling) = (upscaling) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Aggressive +Alternative Speed = Alternativ hastighet +Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Anisotropic Filtering = Anisotropisk filtrering +Auto = Auto +Auto (1:1) = Auto (1:1) +Auto (same as Rendering) = Auto (same as rendering resolution) +Auto FrameSkip = Auto frameskip +Auto Scaling = Auto scaling +Backend = Backend +Balanced = Balanced +Bicubic = Bicubic +BlockTransfer Tip = Some games require this to be On for correct graphics +BlockTransferRequired = Warning: This game requires "simulate block transfer effects" to be set to On. +Both = Begge +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Buffrad rendering +BufferedRenderingRequired = Warning: This game requires "rendering mode" to be set to "buffered". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Screen size (in % of the viewport) +Cardboard Screen X Shift = X shift (in % of the blank space) +Cardboard Screen Y Shift = Y shift (in % of the blank space) +Cardboard VR Settings = Google Cardboard VR settings +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU core +Debugging = Debugging +DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. +Deposterize = Deposterize +Deposterize Tip = Fixes visual banding glitches in upscaled textures +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Disable slower effects (speedup) +Disabled = Disabled +Display layout editor = Display layout editor +Display Resolution (HW scaler) = Display resolution (HW scaler) +Dump next frame to log = Dump next frame to log +Enable Cardboard VR = Enable Cardboard VR +FPS = FPS +Frame Rate Control = Framerate control +Frame Skipping = Ramme Hoppe over +Frame Skipping Type = Frame skipping type +FullScreen = Fullskjerm +Hack Settings = Hack settings (may cause glitches) +Hardware Tessellation = Hardware tessellation +Hardware Transform = Maskinvare omdanning +hardware transform error - falling back to software = Hardware transform error, falling back to software +HardwareTessellation Tip = Uses hardware to make curves +High = High +Hybrid = Hybrid +Hybrid + Bicubic = Hybrid + Bicubic +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Internal resolution +Lazy texture caching = Lazy texture caching (speedup) +Linear = Lineær +Low = Low +LowCurves = Spline/Bezier curves quality +LowCurves Tip = Only used by some games, controls smoothness of curves +Lower resolution for effects (reduces artifacts) = Lower resolution for effects (reduces artifacts) +Manual Scaling = Manual scaling +Medium = Medium +Mode = Mode +Must Restart = You must restart PPSSPP for this change to take effect. +Native device resolution = Native device resolution +Nearest = Nermest +No buffer = No buffer +Non-Buffered Rendering = Skip buffer effects (non-buffered, faster) +None = Ingen +Number of Frames = Number of frames +Off = Off +OpenGL = OpenGL +Overlay Information = Overlay information +Partial Stretch = Partial stretch +Percent of FPS = Percent of FPS +Performance = Performance +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Postprocessing shader +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = Rendering mode +Rendering Resolution = Rendering resolution +RenderingMode NonBuffered Tip = Faster, but nothing may draw in some games +Retain changed textures = Retain changed textures (sometimes slower) +RetainChangedTextures Tip = Makes many games slower, but some games a lot faster +Rotation = Rotation +Safe = Safe +Screen layout = Screen layout +Screen Scaling Filter = Screen scaling filter +Show Debug Statistics = Vis debugstatistik +Show FPS Counter = Vis FPS-teller +Simulate Block Transfer = Simulate block transfer effects +SoftGPU Tip = Currently VERY slow +Software Rendering = Programvare gjengivelse (eksperiment) +Software Skinning = Software skinning +SoftwareSkinning Tip = Combine skinned model draws on the CPU, faster in most games +Speed = Hastighet +Stretching = Stretching +Texture Filter = Tekstur filtrering +Texture Filtering = Tekstur filtrering +Texture Scaling = Teksturskalning +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Turn off "hardware tessellation": unsupported +Unlimited = Unlimited +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = Oppskaler nivå +Upscale Type = Oppskaler type +UpscaleLevel Tip = CPU heavy - some scaling may be delayed to avoid stutter +Use all displays = Use all displays +Vertex Cache = Vertex buffer +VertexCache Tip = Faster, but may cause temporary flicker +VSync = VSync +Vulkan = Vulkan +Window Size = Window size +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Delete ZIP file +Install = Install +Install game from ZIP file? = Install game from ZIP file? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = Installed! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = Auto configure +Autoconfigure for device = Autoconfigure for device +Clear All = Clear all +Default All = Restore defaults +Map a new key for = Map a new key for +Map Key = Map key +Map Mouse = Map mouse +Test Analogs = Test analogs +You can press ESC to cancel. = You can press Esc to cancel. + +[MainMenu] +Browse = Browse... +Buy PPSSPP Gold = Buy PPSSPP Gold +Choose folder = Choose folder +Credits = Om PPSSPP +PPSSPP Homebrew Store = PPSSPP Homebrew Store +Exit = Avslutt +Game Settings = Instillinger +Games = Spill +Give PPSSPP permission to access storage = Give PPSSPP permission to access storage +Homebrew & Demos = Hjemmebrygg && Demoer +How to get games = Hvordan få spill +How to get homebrew & demos = Hvordan man skaffer Hjemmebrygg && Demoer +Load = Laster... +Loading... = Loading... +PinPath = Pin +PPSSPP can't load games or save right now = PPSSPP can't load games or save right now +Recent = Sist spillt +SavesAreTemporary = PPSSPP is saving in temporary storage +SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently +SavesAreTemporaryIgnore = Ignore warning +UnpinPath = Unpin +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Lyd +Controls = Kontroll +Graphics = Grafikk +Networking = Networking +System = System +Tools = Tools + +[MappableControls] +Alt speed 1 = Alt speed 1 +Alt speed 2 = Alt speed 2 +An.Down = Analog Down +An.Left = Analog Left +An.Right = Analog Right +An.Up = Analog Up +Analog limiter = Analog limiter +Analog Stick = Analog stick +Audio/Video Recording = Audio/Video recording +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Axis swap +Circle = Circle +Cross = Cross +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = DevMenu +Down = Dpad Down +Dpad = Dpad +Frame Advance = Frame advance +Hold = Hold +Home = Home +L = L +Left = Dpad Left +Load State = Load State +Mute toggle = Mute toggle +Next Slot = Next Slot +None = None +Note = Note +OpenChat = Open chat +Pause = Pause +R = R +RapidFire = Rapid-fire +Remote hold = Remote hold +Rewind = Rewind +Right = Dpad Right +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = RightAn.Down +RightAn.Left = RightAn.Left +RightAn.Right = RightAn.Right +RightAn.Up = RightAn.Up +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Save State +Screen = Screen +Screenshot = Screenshot +Select = Select +SpeedToggle = Speed toggle +Square = Square +Start = Start +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = Toggle fullscreen +Toggle mode = Toggle mode +Triangle = Triangle +Unthrottle = Unthrottle +Up = Dpad Up +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Change MAC address +Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable network chat = Enable network chat +Enable networking = Enable networking/WLAN (beta, may break games) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Network initialized +Please change your Port Offset = Please change your port offset +Port offset = Port offset(0 = PSP compatibility) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Send Discord "Rich Presence" information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = Cheats +Continue = Fortsettelse +Create Game Config = Create game config +Delete Game Config = Delete game config +Exit to menu = Exit to menu +Game Settings = Instillinger +Load State = Åpne status +Rewind = Rewind +Save State = Lagre status +Settings = Instillinger +Switch UMD = Switch UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Color +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Cartoon +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT scanlines +FXAA = FXAA Antialiasing +Gamma = Gamma +Grayscale = Gråtoneskala +Intensity = Intensity +InverseColors = Inverse Colors +Natural = Natural Colors +NaturalA = Natural Colors (no blur) +Off = Off +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlines (CRT) +Sharpen = Sharpen +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 Upscaler +VideoSmoothingAA = VideoSmoothingAA +Vignette = Vignette + +[PSPCredits] +all the forum mods = all the forum mods +build server = build server +Buy Gold = Buy Gold +check = Also check out Dolphin, the best Wii/GC emu around: +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = Contributors: +created = Laget av +Discord = Discord +info1 = PPSSPP is intended for educational purposes only. +info2 = Please make sure that you own the rights to any games +info3 = you play by owning the UMD or by buying the digital +info4 = download from the PSN store on your real PSP. +info5 = PSP is a trademark by Sony, Inc. +iOS builds = iOS builds +license = Gratis programvare under GPL 2.0+ +list = compatibility lists, forums, and development info +PPSSPP Forums = PPSSPP Forums +Privacy Policy = Privacy policy +Share PPSSPP = Share PPSSPP +specialthanks = Special thanks to: +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = this translation by: +title = A fast and portable PSP emulator +tools = Free tools used: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = +translators2 = +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Check out the website: +written = Written in C++ for speed and portability + +[RemoteISO] +Browse Games = Browse games +Local Server Port = Local server port +Manual Mode Client = Manual mode client +Remote disc streaming = Remote disc streaming +Remote Port = Remote port +Remote Server = Remote server +Remote Subdirectory = Remote subdirectory +RemoteISODesc = Games in your recent list will be shared +RemoteISOLoading = Connected, loading game list... +RemoteISOScanning = Scanning... Click "share games" on your server device +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Note: Connect both devices to the same Wi-Fi network +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Settings +Share Games (Server) = Share games (server) +Share on PPSSPP startup = Share on PPSSPP startup +Stop Sharing = Stop sharing +Stopping.. = Stopping... + +[Reporting] +Bad = Bad +FeedbackDelayInfo = Your data is being submitted in the background. +FeedbackDesc = How's the emulation? Let us and the community know! +FeedbackDisabled = Compatibility server reports must be enabled. +FeedbackIncludeCRC = Note: Battery will be used to send a disc CRC +FeedbackIncludeScreen = Include a screenshot +FeedbackSubmitDone = Your data has been submitted. +FeedbackSubmitFail = Could not submit data to server. Try updating PPSSPP. +FeedbackThanks = Thanks for your feedback! +Gameplay = Gameplay +Graphics = Graphics +Great = Great +In-game = In-game +In-game Description = Gets into gameplay, but too buggy to complete +Menu/Intro = Menu/Intro +Menu/Intro Description = Can't get into the game itself +Nothing = Nothing +Nothing Description = Completely broken +OK = OK +Open Browser = Open browser +Overall = Overall +Perfect = Perfect +Perfect Description = Flawless emulation for the entire game - great! +Plays = Plays +Plays Description = Fully playable but might be with glitches +ReportButton = Report feedback +Speed = Speed +Submit Feedback = Submit feedback +SuggestionConfig = See reports on website for good settings. +SuggestionCPUSpeed0 = Disable locked CPU speed setting. +SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this bug). +SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. +SuggestionsNone = This game isn't working for other users too. +SuggestionsWaiting = Submitting and checking other users feedback... +SuggestionUpgrade = Upgrade to a newer PPSSPP build. +SuggestionVerifyDisc = Check your ISO is a good copy of your disc. +Unselected Overall Description = How well does this game emulate? +View Feedback = View all feedbacks + +[Savedata] +Date = Date +Filename = Filename +No screenshot = No screenshot +None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Save Data = Save data +Save States = Save states +Savedata Manager = Savedata manager +Size = Size + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = WARNING: Chainfire3D detected, may cause problems. +Failed to load state = Failed to load state +Failed to save state = Failed to save state +fixed = Hastighet: alternativ +GLToolsWarning = WARNING: GLTools detected, may cause problems. +In menu = In menu +Load savestate failed = Load savestate failed +Loaded State = Åpnet status +Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +LoadStateDoesntExist = Mislyktes å laste: Lagret fil eksisterer ikke! +LoadStateWrongVersion = Mislyktes å laste: Lagret fil er for en eldre versjon av PPSSPP! +norewind = No rewind save states available. +Playing = Playing +PressESC = Press ESC to open the pause menu. +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = Mislyktes å lagre fil! +Saved State = Lagret status +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Speed: alternate 2 +standard = Hastighet: standard +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = Already installed +Connection Error = Connection error +Install = Install +Launch Game = Launch game +Loading... = Loading... +MB = MB +Size = Size +Uninstall = Uninstall + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d cores) +%d bytes = %d bytes +(none detected) = (none detected) +3D API = 3D API +ABI = ABI +API Version = API version +Audio Information = Audio information +Board = Board +Build Config = Build config +Build Configuration = Build Configuration +Built by = Built by +Core Context = Core context +Cores = Cores +CPU Extensions = CPU extensions +CPU Information = CPU information +CPU Name = Name +D3DCompiler Version = D3DCompiler version +Debug = Debug +Debugger Present = Debugger present +Device Info = Device info +Display Information = Display information +Driver Version = Driver version +EGL Extensions = EGL extensions +Frames per buffer = Frames per buffer +GPU Information = GPU information +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Lang/Region +Memory Page Size = Memory page size +Native Resolution = Native resolution +OGL Extensions = OGL extensions +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 extensions +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 extensions +OpenGL Extensions = OpenGL extensions +Optimal frames per buffer = Optimal frames per buffer +Optimal sample rate = Optimal sample rate +OS Information = OS information +PPSSPP build = PPSSPP build +Refresh rate = Refresh rate +Release = Release +RW/RX exclusive = RW/RX exclusive +Sample rate = Sample rate +Shading Language = Shading language +Sustained perf mode = Sustained perf mode +System Information = System information +System Name = Name +System Version = System version +Threads = Threads +Vendor = Vendor +Vendor (detected) = Vendor (detected) +Version Information = Version information +Vulkan Extensions = Vulkan extensions +Vulkan Features = Vulkan features + +[System] +(broken) = (broken) +12HR = 12HR +24HR = 24HR +Auto = Auto +Auto Load Savestate = Auto load savestate +AVI Dump started. = AVI dump started +AVI Dump stopped. = AVI dump stopped +Cache ISO in RAM = Cache full ISO in RAM +Change CPU Clock = Change emulated PSP's CPU clock (unstable) +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Endre Kallenavn +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = Cheats (experimental, see forums) +Clear Recent = Clear "Recent" +Clear Recent Games List = Clear Recent games list +Clear UI background = Clear UI background +Confirmation Button = Confirmation button +Date Format = Date format +Day Light Saving = Sommertid +DDMMYYYY = DDMMYYYY +Decrease size = Decrease size +Developer Tools = Utviklerverktøy +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emulation +Enable Cheats = Juks +Enable Compatibility Server Reports = Send kompatibilitetrapport +Failed to load state. Error in the file system. = Failed to load state. Error in the file system. +Failed to save state. Error in the file system. = Failed to save state. Error in the file system. +Fast (lag on slow storage) = Fast (lag on slow storage) +Fast Memory = Turbo minne (ikke stabilt) +Force real clock sync (slower, less lag) = Force real clock sync (slower, less lag) +frames, 0:off = frames, 0 = off +Games list settings = Games list settings +General = General +Grid icon size = Grid icon size +Help the PPSSPP team = Help the PPSSPP team +Host (bugs, less lag) = Host (bugs, less lag) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Interpreter +IO timing method = I/O timing method +IR Interpreter = IR interpreter +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = Memory Stick inserted +MHz, 0:default = MHz, 0 = default +MMDDYYYY = MMDDYYYY +Newest Save = Newest save +Not a PSP game = Not a PSP game +Off = Off +Oldest Save = Oldest save +PSP Model = PSP model +PSP Settings = PSP settings +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Record audio +Record Display = Record display +Reset Recording on Save/Load State = Reset recording on Save/Load state +Restore Default Settings = Restore PPSSPP's settings to default +Rewind Snapshot Frequency = Rewind snapshot frequency (mem hog) +Save path in installed.txt = Save path in installed.txt +Save path in My Documents = Save path in My Documents +Savestate Slot = Savestate slot +Savestate slot backups = Savestate slot backups +Screenshots as PNG = Save screenshots in PNG format +Set UI background... = Set UI background... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Simulate UMD delays +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Storage full +Sustained performance mode = Sustained performance mode +Time Format = Time format +UI = UI +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) +Use O to confirm = Use O as confirmation button +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = Use X as confirmation button +VersionCheck = Check for new versions of PPSSPP +WARNING: Android battery save mode is on = WARNING: Android battery save mode is On +WARNING: Battery save mode is on = WARNING: Battery save mode is on +YYYYMMDD = YYYYMMDD + +[Upgrade] +Details = Details +Dismiss = Dismiss +Download = Download +New version of PPSSPP available = New version of PPSSPP available diff --git a/assets/lang/pl_PL.ini b/assets/lang/pl_PL.ini new file mode 100644 index 0000000000..7eaeed02e2 --- /dev/null +++ b/assets/lang/pl_PL.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = Sterownik dźwięku (wymagany restart) +AudioBufferingForBluetooth = Bufory dźwięku dost. do Bluetooth (wolniejsze) +Auto = Automatyczny +Device = Device +DSound (compatible) = DSound (kompatybilny) +Enable Sound = Włącz dźwięk +Global volume = Głośność globalna +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = WASAPI (szybki) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Czułość osi analoga +Analog Limiter = Ogranicznik analoga +Analog Mapper High End = Mapowanie analoga (czułość osi) +Analog Mapper Low End = Mapowanie analoga (odwrócona martwa strefa) +Analog Mapper Mode = Tryb mapowania analoga +Analog Stick = Gałka analogowa +AnalogLimiter Tip = Jeśli "ogranicznik analoga" jest aktywny +Auto = Automatyczny +Auto-centering analog stick = Autocentrowanie gałki analogowej +Auto-hide buttons after seconds = Automatyczne ukrywanie przycisków po: +Binds = Binds +Button Opacity = Przeźroczystość przycisków +Button style = Styl przycisków +Calibrate D-Pad = Kalibracja krzyżaka +Calibration = Kalibracja +Classic = Klasyczny +Combo Key Setting = Ustawienia przycisków kombo +Combo Key Setup = Ustawienia przycisków kombo +Confine Mouse = Zablokuj myszkę w oknie +Control Mapping = Mapowanie przycisków +Custom layout... = Edycja układu przycisków ekranowych... +Customize tilt = Zmodyfikuj przechył... +D-PAD = Krzyżak +Deadzone Radius = Promień martwej strefy +DInput Analog Settings = Ustawienia analoga DInput +Disable D-Pad diagonals (4-way touch) = Wył. przekątne krzyżaka (pozostaw 4 kierunki) +Glowing borders = Świecące krawędzie +HapticFeedback = Wibracje +Ignore gamepads when not focused = Ignoruj przyciski pada gdy okno nieaktywne +Ignore Windows Key = Ignoruj klawisz Windows +Invert Axes = Odwrócone osie +Invert Tilt along X axis = Odwróć przechył wzdłuż osi X +Invert Tilt along Y axis = Odwróć przechył wzdłuż osi Y +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Ustawienia klawiatury +L/R Trigger Buttons = Przyciski L/R +Landscape = Poziomo +Landscape Auto = Poziomo automatycznie +Landscape Reversed = Odwrócone poziomo +Mouse = Ustawienia myszy +Mouse sensitivity = Czułość myszy +Mouse smoothing = Wygładzanie myszy +MouseControl Tip = Możesz teraz przypisać myszkę na ekranie mapowania przycisków klikając w ikonkę 'M'. +None (Disabled) = Brak (wył.) +Off = Wył. +OnScreen = Przyciski ekranowe +Portrait = Pionowo +Portrait Reversed = Odwrócone pionowo +PSP Action Buttons = Klawisze akcji PSP +Screen Rotation = Obrót ekranu +seconds, 0 : off = sekundy, 0 = wył. +Sensitivity = Czułość +Show right analog = Show right analog +Show Touch Pause Menu Button = Pokaż przycisk Menu Pauzy +Thin borders = Cienkie krawędzie +Tilt Base Radius = Tilt base radius +Tilt Input Type = Typ przechyłu +Tilt Sensitivity along X axis = Czułość przechyłu wzdłuż osi X +Tilt Sensitivity along Y axis = Czułość przechyłu wzdłuż osi Y +To Calibrate = Aby skalibrować, połóż urządzenie na płaskiej powierzchni i wciśnij "Kalibracja". +Touch Control Visibility = Kontroler dotykowy (widoczny) +Use custom right analog = Use custom right analog +Use Mouse Control = Włącz kontrolę myszką +Visibility = Widoczność +X = X +X + Y = X + Y +XInput Analog Settings = Ustawienia analoga XInput +Y = Y + +[CwCheats] +Cheats = Kody +Edit Cheat File = Edytuj plik kodów +Enable/Disable All = Wł./wył. wszystkie kody +Import Cheats = Importuj z pliku cheat.db +Options = Opcje +Refresh Rate = Szybkość odświeżania + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = O PPSSPP... +Auto = Automatycznie +Backend = &Sterownik obrazu (Restartuje PPSSPP) +Bicubic = Bicubic (Dwusześcienne) +Break = Zatrzymaj +Break on Load = Zatrzymaj po załadowaniu +Buffered Rendering = Renderowanie buforowe +Buy Gold = Kup wersję Gold +Control Mapping... = Ustawienia przycisków... +Debugging = &Debugowanie +Deposterize = Deposteryzacja +Direct3D9 = &Direct3D9 +Direct3D11 = Direct3D &11 +Disassembly = Dezasembluj... +Discord = Discord +Display Layout Editor = Edytor położenia obrazu... +Display Rotation = Obracanie ekranu +Dump Next Frame to Log = Zrzuć następną klatkę do dziennika zdarzeń +Emulation = &Emulacja +Enable Chat = Enable chat +Enable Cheats = Włącz kody +Enable Sound = Włącz dźwięk +Exit = Zamknij +Extract File... = Wypakuj plik... +File = &Plik +Frame Skipping = Pomijanie klatek +Frame Skipping Type = Tryb pomijania klatek +Fullscreen = Pełny ekran +Game Settings = &Ustawienia gry +GE Debugger... = Debugger GE... +GitHub = Git&Hub +Hardware Transform = &Transformacja sprzętowa +Help = Pomo&c +Hybrid = Hybrydowe +Hybrid + Bicubic = Hybrydowe + Bicubic +Ignore Illegal Reads/Writes = Ignoruj nieprawidłowe odczyty/zapisy +Ignore Windows Key = Ignoruj klawisz Windows +Keep PPSSPP On Top = Trzymaj PPSSPP na wierzchu +Landscape = Poziomo +Landscape reversed = Odwrócone poziomo +Language... = Język... +Linear = Liniowe +Load = Otwórz... +Load .sym File... = Wczytaj plik .sym... +Load Map File... = Wczytaj plik .map... +Load State = Wczytaj stan +Load State File... = Wczytaj plik stanu +Log Console = Konsola dziennika zdarzeń +Memory View... = Podgląd pamięci... +More Settings... = Więcej ustawień... +Nearest = Najbliższe +Non-Buffered Rendering = &Nie renderuj efektów z bufora (niebuforowane, szybsze) +Off = Wyłącz +Open Directory... = Otwórz katalog... +Open from MS:/PSP/GAME... = Otwórz z MS:/PSP/GAME... +Open Memory Stick = Otwórz Kartę Pamięci +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = Pauza +Pause When Not Focused = Pauzuj, gdy okno nieaktywne +Portrait = Pionowo +Portrait reversed = Odwrócone pionowo +Postprocessing Shader = Efekty wizualne shaderów +PPSSPP Forums = Forum PPSSPP +Record = &Nagrywaj +Record Audio = Nagrywaj &dźwięk +Record Display = Nagrywaj &obraz +Rendering Mode = Tryb renderowania +Rendering Resolution = Rozdzielczość renderowania +Reset = Zrestartuj +Reset Symbol Table = Resetuj tablicę symboli +Run = Uruchom +Save .sym File... = Zapisz plik .&sym... +Save Map File... = Zapisz plik .map... +Save State = Zapisz stan +Save State File... = Zapisz plik stanu +Savestate Slot = Port zapisu stanu +Screen Scaling Filter = Filtrowanie skalowania ekranu +Show Debug Statistics = Pokaż statystyki debugowania +Show FPS Counter = Pokaż licznik FPS +Skip Number of Frames = Pomiń ilość klatek +Skip Percent of FPS = Pomiń procent FPS +Stop = Zatrzymaj +Switch UMD = Podmień UMD +Take Screenshot = Wykonaj zrzut ekranu +Texture Filtering = Filtrowanie tekstur +Texture Scaling = Skalowanie tekstur +Use Lossless Video Codec (FFV1) = &Używaj stratnego kodeka wideo (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = Pamięć podręczna wierzchołków +VSync = Limit klatek +Vulkan = Vulkan +Window Size = Rozmiar okna +www.ppsspp.org = Odwiedź stronę projektu +xBRZ = xBRZ + +[Developer] +Allocator Viewer = Podgląd alokacji (Vulkan) +Allow remote debugger = Zezwól na zdalne debugowanie +Backspace = Backspace +Block address = Adres bloku +By Address = Po adresie +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Stwórz/otwórz plik textures.ini z bieżącej gry +Current = Obecny +Dev Tools = Narzędzia Developerskie +DevMenu = DevMenu +Disabled JIT functionality = Wyłącz funkcje JIT +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Zachowuj odszyfrowany EBOOT.BIN przy starcie +Dump Frame GPU Commands = Zrzuć klatkę komend GPU +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Włącz dziennik zdarzeń debugera +Enter address = Wprowadź adres +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Profiler klatki +GPU Driver Test = Test sterownika GPU +GPU Profile = GPU profile +Jit Compare = Porównywanie JIT +JIT debug tools = Narzędzia debugowania JIT +Language = Język +Load language ini = Wczytaj plik ini języka +Log Dropped Frame Statistics = Loguj statystyki pominiętych klatek +Log Level = Poziom dziennika zdarzeń +Log View = Pokaż dziennik zdarzeń +Logging Channels = Kanały dziennika zdarzeń debugera +Next = Następny +No block = Brak bloku +Prev = Poprzedni +Random = Przypadkowy +Replace textures = Podmiana tekstur +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Czy na pewno chcesz przywrócić domyślne ustawienia?\nUstawienia sterowania pozostaną niezmienione.\n\n\nNie można tego cofnąć.\nZrestartuj PPSSPP, aby zastosować zmiany. +RestoreGameDefaultSettings = Czy na pewno chcesz przywrócić ustawienia specyficzne dla danych gier\npowrót do ustawień domyślnych PPSSPP? +Resume = Resume +Run CPU Tests = Uruchom testy CPU +Save language ini = Zapisz plik ini języka +Save new textures = Zapisz nową teksturę +Shader Viewer = Podgląd Shaderów +Show Developer Menu = Pokaż przycisk menu dewelopera +Show on-screen messages = Show on-screen messages +Stats = Statystyki +System Information = Informacje o systemie +Texture Replacement = Podmiana tekstur +Toggle Audio Debug = Wł./Wył. debugowanie audio +Toggle Freeze = Wł./Wył. zamrożenie +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * rozdz. PSP +Active = Aktywny +Back = Powrót +Cancel = Anuluj +Center = Wyśrodkuj +ChangingGPUBackends = Zmiana sterownika grafiki wymaga restartu PPSSPP. Zrestartować teraz? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = Wybierz folder do zapisu stanów PPSSPP +Confirm Overwrite = Czy chcesz nadpisać te dane? +Confirm Save = Czy chcesz zapisać te dane? +ConfirmLoad = Wczytać te dane? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Usuń +Delete all = Usuń wszystko +Delete completed = Usuwanie zakończone. +DeleteConfirm = Dane zapisu zostaną usunięte.\nCzy na pewno chcesz kontynuować? +DeleteConfirmAll = Czy na pewno chcesz usunąć wszystkie\ndane zapisu tej gry? +DeleteConfirmGame = Czy na pewno chcesz usunąć tę grę\nze swojego urządzenia? Nie można tego cofnąć. +DeleteConfirmGameConfig = Czy na pewno chcesz usunąć ustawienia dla tej gry? +DeleteFailed = Nie można usunąć danych. +Deleting = Usuwanie\nProszę czekać... +Disable All = Wyłącz wszystko +Edit = Edit +Enable All = Włącz wszystko +Enter = Dalej +Finish = Zakończ +Grid = Grid +Inactive = Nieaktywny +InternalError = An internal error has occurred. +Load = Wczytaj +Load completed = Ładowanie zakończone. +Loading = Ładowanie\nProszę czekać... +LoadingFailed = Nie można wczytać danych. +Move = Przenieś +Network Connection = Połączenie sieciowe +NEW DATA = NOWE DANE +No = Nie +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = OK +Old savedata detected = Wykryto stary zapis gry +Options = Opcje +Reset = Resetuj +Resize = Przeskaluj +Retry = Spróbuj ponownie +Save = Zapisz +Save completed = Zapisywanie zakończone. +Saving = Zapisywanie\nProszę czekać... +SavingFailed = Nie można zapisać danych. +Select = Wybierz +Shift = Shift +Snap = Snap +Space = Spacja +SSID = SSID +Submit = Wyślij +Supported = Wspierane +There is no data = Brak danych. +Toggle All = Wybierz wszystko +Toggle List = Toggle list +Unsupported = Niewspierane +When you save, it will load on a PSP, but not an older PPSSPP = Jeśli zapiszesz, PSP wczyta ten zapis gry, ale starszy PPSSPP już nie. +When you save, it will not work on outdated PSP Firmware anymore = Jeśli zapiszesz, ten zapis nie zadziała już na starych wersjach firmware PSP. +Yes = Tak +Zoom = Powiększ + +[Error] +7z file detected (Require 7-Zip) = plik skompresowany (7z).\nProszę najpierw wypakować (spróbuj 7-Zip lub WinRAR). +A PSP game couldn't be found on the disc. = Na dysku nie znaleziono gry na PSP. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = Nie można zapisać zrzutu ekranu. +D3D9or11 = Direct3D 9? (Wybierz "nie" by wybrać Direct3D 11) +D3D11CompilerMissing = Plik D3DCompiler_47.dll nie został znaleziony. Proszę go zainstalować, lub nacisnąć Tak, by przełączyć się na Direct3D 9. +D3D11InitializationError = Błąd inicjalizacji sterownika Direct3D 11 +D3D11Missing = Twój system operacyjny nie posiada D3D11. Proszę uruchomić Windows Update.\n\nNaciśnij Tak, by przełączyć się na Direct3D 9. +D3D11NotSupported = Twoja karta graficzna nie wspiera Direct3D 11.\n\nCzy chcesz przełączyć się na Direct3D 9? +Disk full while writing data = Dysk zapełniony. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = Wystąpił błąd: +Error reading file = Błąd podczas odczytywania pliku. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = Nie można rozpoznać pliku. +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Nie można odczytać danych z dysku - plik ISO uszkodzony. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Błąd inicjalizacji grafiki. Spróbuj zaktualizować sterowniki karty graficznej i biblioteki DirectX9.\n\nCzy chcesz zmienić sterownik na OpenGL?\n\nKomunikat błędu: +GenericGraphicsError = Błąd grafiki +GenericOpenGLError = Błąd inicjalizacji grafiki. Spróbuj zaktualizować sterowniki karty graficznej.\n\nCzy chcesz zmienić sterownik na DirectX 9?\n\nKomunikat błędu: +GenericVulkanError = Błąd inicjalizacji grafiki. Spróbuj zaktualizować sterowniki karty graficznej.\n\nCzy chcesz zmienić sterownik na OpenGL?\n\nKomunikat błędu: +InsufficientOpenGLDriver = Wykryto brak obsługi wystarczająco nowej wersji OpenGL!\n\nTwoja karta graficzna zgłasza, że nie obsługuje OpenGL 2.0, który jest aktualnie wymagany do uruchomienia PPSSPP.\n\nSprawdź, czy Twoja karta graficzna jest zgodna z OpenGL 2.0. Jeśli jest, musisz zainstalować nowe sterowniki ze strony producenta.\n\nOdwiedź forum https://forums.ppsspp.org, aby uzyskać więcej informacji. +Just a directory. = Tylko katalog. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = Brak EBOOT.PBP, gra nierozpoznana. +Not a valid disc image. = Nieprawidłowy obraz nośnika. +OpenGLDriverError = Błąd sterownika OpenGL. +PPSSPP doesn't support UMD Music. = PPSSPP nie wspiera UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP nie wspiera UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP aktualnie nie obsługuje połączenia z Internetem dla DLC, PSN oraz aktualizacji gier. +PS1 EBOOTs are not supported by PPSSPP. = Pliki EBOOT PS1 nie są obsługiwane przez PPSSPP. +PSX game image detected. = Plik jest obrazem MODE2. PPSSPP nie obsługuje gier z PS1. +RAR file detected (Require UnRAR) = Wykryto plik RAR.\nRozpakuj go przed użyciem (spróbuj UnRAR). +RAR file detected (Require WINRAR) = Wykryto plik RAR.\nRozpakuj go przed użyciem (spróbuj WinRAR). +Running slow: try frameskip, sound is choppy when slow = Wolne działanie: spróbuj pomijania klatek, dźwięk zacina przy wolnym działaniu +Running slow: Try turning off Software Rendering = Wolne działanie: spróbuj wyłączyć "Renderowanie programowe" +Save encryption failed. This save won't work on real PSP = Nie można zaszyfrować pliku zapisu gry. Ten zapis gry nie zadziała na prawdziwym PSP. +textures.ini filenames may not be cross-platform = Nazwy plików w "textures.ini" mogą nie być kompatybilne między platformami. +This is a saved state, not a game. = To jest zapis stanu, a nie gra. +This is save data, not a game. = To jest zapis gry, a nie gra. +Unable to create cheat file, disk may be full = Nie można utworzyć pliku kodów, dysk może być już zapełniony. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Nie można zapisać danych zapisu gry, dysk może być już zapełniony. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Ostrzeżenie: Pamięć wideo jest PEŁNA, nastąpi zmniejszenie rozdzielczości i zmiana na powolne buforowanie. +Warning: Video memory FULL, switching to slow caching mode = Ostrzeżenie: Pamięć wideo jest PEŁNA, nastąpi zmiana na powolne buforowanie. +ZIP file detected (Require UnRAR) = Wykryto plik ZIP.\nRozpakuj go przed użyciem (spróbuj UnRAR). +ZIP file detected (Require WINRAR) = Wykryto plik ZIP.\nRozpakuj go przed użyciem (spróbuj WinRAR). + +[Game] +Asia = Azja +ConfirmDelete = Usuń +Create Game Config = Utwórz konfigurację gry +Create Shortcut = Utwórz skrót +Delete Game = Usuń grę +Delete Game Config = Usuń konfigurację gry +Delete Save Data = Usuń zapisy gry +Europe = Europa +Game = Gra +Game Settings = Ustawienia gry +Homebrew = Homebrew +Hong Kong = Hongkong +InstallData = Zainstalowane dane +Japan = Japonia +Korea = Korea +MB = MB +One moment please... = Chwileczkę... +Play = Graj +Remove From Recent = Usuń z "Ostatnio granych" +SaveData = Zapisy gier +Setting Background = Ustawianie tła +Show In Folder = Pokaż w folderze +USA = USA +Use UI background = Użyj tego tła + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = bez limitu +(supersampling) = (supersampling) +(upscaling) = (skalowanie) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Agresywne +Alternative Speed = Alternatywna prędkość (w %, 0 = bez limitu) +Alternative Speed 2 = Alternatywna prędkość 2 (w %, 0 = bez limitu) +Anisotropic Filtering = Filtrowanie anizotropowe +Auto = Automatyczne +Auto (1:1) = Automatyczna (1:1) +Auto (same as Rendering) = Auto (jak roz. renderowania) +Auto FrameSkip = Automatyczne pomijanie klatek +Auto Scaling = Automatyczne skalowanie +Backend = Sterownik graficzny +Balanced = Zbalansowane +Bicubic = Bicubic (Dwusześcienne) +BlockTransfer Tip = Niektóre gry wymagają włączenia tej opcji do poprawnego działania. +BlockTransferRequired = Uwaga: Ta gra wymaga włączonej opcji "Symuluj efekty transferu bloków". +Both = Oba +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Renderowanie buforowe +BufferedRenderingRequired = Uwaga: Ta gra wymaga włączonej opcji "Renderowanie buforowe". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Rozmiar ekranu (% widocznego obszaru) +Cardboard Screen X Shift = Przesunięcie X (% pustej przestrzeni) +Cardboard Screen Y Shift = Przesunięcie Y (% pustej przestrzeni) +Cardboard VR Settings = Ustawienia Google Cardboard VR +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = Core CPU +Debugging = Debugowanie +DefaultCPUClockRequired = Uwaga: Ta gra wymaga, by częstotliwość taktowania CPU była domyślna. +Deposterize = Deposteryzacja +Deposterize Tip = Poprawia banding koloru na przeskalowanych teksturach +Device = Urządzenie +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Wył. wolniejsze efekty (przyśpieszenie) +Disabled = Wył. +Display layout editor = Edytor położenia obrazu +Display Resolution (HW scaler) = Rozdzielczość ekranu (skaler sprz.) +Dump next frame to log = Zrzuć następną klatkę do dziennika zdarzeń +Enable Cardboard VR = Enable Cardboard VR +FPS = Tylko FPS +Frame Rate Control = Kontrola klatek na sekundę +Frame Skipping = Pomijanie klatek +Frame Skipping Type = Tryb pomijania klatek +FullScreen = Pełny ekran +Hack Settings = Ustawienia specjalne (powodują problemy) +Hardware Tessellation = Sprzętowa teselacja +Hardware Transform = Transformacja sprzętowa +hardware transform error - falling back to software = Błąd transformacji sprzętowej, powrót do transformacji programowej +HardwareTessellation Tip = Tworzy krzywe sprzętowo +High = Wysokie +Hybrid = Hybrydowe +Hybrid + Bicubic = Hybrydowe + Bicubic +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Rozdzielczość wewnętrzna +Lazy texture caching = Leniwa pamięć tekstur (przyśpieszenie) +Linear = Liniowe +Low = Niskie +LowCurves = Detale krzywych sklejanych/Beziera (przyśpieszenie) +LowCurves Tip = Używane tylko przez niektóre gry, kontroluje gładkość krzywych +Lower resolution for effects (reduces artifacts) = Zmniejszenie rozdzielczość efektów (mniej błędów) +Manual Scaling = Ręczne skalowanie +Medium = Średnie +Mode = Tryb +Must Restart = Musisz zrestartować PPSSPP, aby zobaczyć zmiany. +Native device resolution = Natywna rozdzielczość urządzenia +Nearest = Najbliższe +No buffer = No buffer +Non-Buffered Rendering = Nie renderuj efektów z bufora (niebuforowane, szybsze) +None = Wył. +Number of Frames = Ilość klatek +Off = Wył. +OpenGL = OpenGL +Overlay Information = Nakładka informacyjna +Partial Stretch = Częściowe rozciągnięcie +Percent of FPS = Procent FPS +Performance = Wydajność +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Efekty wizualne shaderów +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = Tryb renderowania +Rendering Resolution = Rozdzielczość renderowania +RenderingMode NonBuffered Tip = Szybsze, ale niektóre gry mogą się nie wyświetlać +Retain changed textures = Zachowuj zmienione tekstury (czasem wolniejsze) +RetainChangedTextures Tip = Spowalnia wiele gier, ale mocno przyspiesza kilka innych +Rotation = Obrót +Safe = Bezpieczne +Screen layout = Screen layout +Screen Scaling Filter = Filtrowanie skalowania ekranu +Show Debug Statistics = Pokaż statystyki debugowania +Show FPS Counter = Pokaż licznik FPS +Simulate Block Transfer = Symuluj efekty transferu bloków +SoftGPU Tip = Obecnie BARDZO wolne +Software Rendering = Renderowanie programowe (wolne) +Software Skinning = Programowy skinning +SoftwareSkinning Tip = Łączy na CPU wywołania rysujące modele z animacjami, przyspieszenie w większości gier +Speed = Prędkość (procentowo) +Stretching = Rozciąganie +Texture Filter = Filtrowanie tekstur +Texture Filtering = Filtrowanie tekstur +Texture Scaling = Skalowanie tekstur +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Wyłącz sprzętową teselację: opcja nie jest wspierana +Unlimited = Bez limitu +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = Poziom skalowania +Upscale Type = Rodzaj skalowania +UpscaleLevel Tip = Obciąża CPU - skalowanie może zostać opóźnione by zapobiec spadkom płynności +Use all displays = Używaj wszystkich monitorów +Vertex Cache = Pamięć podręczna wierzchołków +VertexCache Tip = Szybsze, jednak może powodować krótkotrwałe migotanie +VSync = Synchronizacja pionowa +Vulkan = Vulkan +Window Size = Rozmiar okna +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Usuń plik ZIP +Install = Zainstaluj +Install game from ZIP file? = Zainstalować grę z pliku ZIP? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = Zainstalowano! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = Autokonfiguracja +Autoconfigure for device = Skonfiguruj automatycznie +Clear All = Wyczyść +Default All = Domyślne +Map a new key for = Przypisz nowy klawisz dla +Map Key = Mapuj przycisk +Map Mouse = Mapuj mysz +Test Analogs = Testuj analogi +You can press ESC to cancel. = Możesz zamknąć to okienko naciskając Esc. + +[MainMenu] +Browse = Przeglądaj... +Buy PPSSPP Gold = Kup PPSSPP Gold +Choose folder = Wybierz folder +Credits = Autorzy +PPSSPP Homebrew Store = Homebrew ze sklepu PPSSPP +Exit = Zamknij +Game Settings = Ustawienia +Games = Gry +Give PPSSPP permission to access storage = Zezwól PPSSPP na dostęp do pamięci +Homebrew & Demos = Homebrew i dema +How to get games = Jak zdobyć gry? +How to get homebrew & demos = Jak zdobyć gry homebrew i dema? +Load = Otwórz... +Loading... = Loading... +PinPath = Przypnij +PPSSPP can't load games or save right now = PPSSPP nie może teraz załadować gier ani zapisywać stanów +Recent = Ostatnio grane +SavesAreTemporary = PPSSPP zapisuje do pamięci tymczasowej +SavesAreTemporaryGuidance = Wypakuj PPSSPP, by móc trwale zapisywać +SavesAreTemporaryIgnore = Ignoruj +UnpinPath = Odepnij +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Dźwięk +Controls = Sterowanie +Graphics = Grafika +Networking = Sieć +System = System +Tools = Narzędzia + +[MappableControls] +Alt speed 1 = Alt. prędkość 1 +Alt speed 2 = Alt. prędkość 2 +An.Down = Gałka w dół +An.Left = Gałka w lewo +An.Right = Gałka w prawo +An.Up = Gałka w górę +Analog limiter = Ogranicznik analoga +Analog Stick = Gałka analogowa +Audio/Video Recording = Nagrywanie audio/video +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Zamiana osi +Circle = Circle +Cross = Cross +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = Menu developerskie +Down = Strzałka w dół +Dpad = Krzyżak +Frame Advance = Nast. klatka +Hold = Hold +Home = Home +L = L +Left = Strzałka w lewo +Load State = Wczytaj stan +Mute toggle = Mute toggle +Next Slot = Następny slot +None = None +Note = Note +OpenChat = Open chat +Pause = Pauza +R = R +RapidFire = Auto. strzelanie +Remote hold = Remote hold +Rewind = Przewiń do tyłu +Right = Strzałka w prawo +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = Pr. gałk. w dół +RightAn.Left = Pr. gałk. w lewo +RightAn.Right = Pr. gałk. w prawo +RightAn.Up = Pr. gałk. w górę +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Zapisz stan +Screen = Screen +Screenshot = Zrzut ekranu +Select = Select +SpeedToggle = Zmień prędkość +Square = Square +Start = Start +Texture Dumping = Zrzut tekstur +Texture Replacement = Podmiana tekstur +Toggle Fullscreen = Wł./wył. pełny ekran +Toggle mode = Toggle mode +Triangle = Triangle +Unthrottle = Pełna prędkość +Up = Strzałka w górę +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Odwiedź forum związane z Ad Hoc (tryb wielu graczy) +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Zmień adres MAC +Change proAdhocServer Address = Zmień adres IP serwera PRO dla trybu ad hoc (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Włącz wbudowany serwer PRO dla trybu ad hoc +Enable network chat = Enable network chat +Enable networking = Włącz sieć/WLAN (beta, może powodować błędy) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Sieć została zainicjowana +Please change your Port Offset = Please change your port offset +Port offset = Zmień port (0 = zgodne z PSP) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Transmituj informacje Discord Rich Presence +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = Kody +Continue = Kontynuuj +Create Game Config = Utwórz konfigurację gry +Delete Game Config = Usuń konfigurację gry +Exit to menu = Wyjdź do menu +Game Settings = Ustawienia gry +Load State = Wczytaj stan +Rewind = Przewiń do tyłu +Save State = Zapisz stan +Settings = Ustawienia +Switch UMD = Podmień UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = Skalowanie 4×HQ +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = Kolor AA +Amount = Amount +Black border = Black border +Bloom = Efekt rozmycia +Brightness = Brightness +Cartoon = Komiks +ColorCorrection = Color correction +Contrast = Contrast +CRT = Imitacja monitora CRT +FXAA = Wygładzanie FXAA +Gamma = Gamma +Grayscale = Skala szarości +Intensity = Intensity +InverseColors = Odwrócenie kolorów +Natural = Naturalne kolory +NaturalA = Naturalne kolory (bez rozmycia) +Off = Wyłącz +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Linie skanowania +Sharpen = Wyostrzenie +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Skalowanie Spline36 +VideoSmoothingAA = Video Smoothing AA +Vignette = Winieta + +[PSPCredits] +all the forum mods = wszystkich moderatorów forum +build server = Ciągła Integracja +Buy Gold = Kup PPSSPP Gold +check = Wypróbuj również Dolphin, najlepszy emulator Wii/GC: +CheckOutPPSSPP = Wypróbuj PPSSPP, świetny emulator PSP: https://www.ppsspp.org/ +contributors = Współautorzy: +created = Twórca: +Discord = Discord +info1 = PPSSPP przeznaczony jest jedynie do celów edukacyjnych i testowych. +info2 = Upewnij się że posiadasz prawa do gier, w które grasz. +info3 = Powinieneś posiadać oryginalny dysk UMD, +info4 = lub zakupić wersję cyfrową ze sklepu PSN. +info5 = PSP jest znakiem towarowym należącym do Sony Computer Entertainment Inc. +iOS builds = wydania na iOS +license = Darmowe oprogramowanie na licencji GPL 2.0+ +list = Znajdziesz tu listy zgodności, forum i informacje dla programistów +PPSSPP Forums = Forum PPSSPP +Privacy Policy = Polityka prywatności +Share PPSSPP = Podziel się PPSSPP +specialthanks = Specjalne podziękowania dla: +specialthanksKeithGalocy = - NVIDIA (sprzęt, porady) +specialthanksMaxim = - za świetną pracę nad dekoderem Atrac3+ +testing = testowanie +this translation by = Polskie tłumaczenie wykonali: +title = Szybki i przenośny emulator PSP +tools = Wykorzystane narzędzia: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = Daniel Kluz, Michał Kasprzak, Mateusz Godlewski, Łukasz Bereza +translators2 = oop23, Silent +translators3 = Poprzednią edycję tłumaczenia stworzyli: +translators4 = hrydgard, The Dax, mikusp, adrian17 +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Zajrzyj na stronę: +written = Napisano w C++ dla wydajności i mobilności + +[RemoteISO] +Browse Games = Przeglądaj gry +Local Server Port = Port serwera lokalnego +Manual Mode Client = Ręcznie skonfiguruj klienta +Remote disc streaming = Zdalna transmisja płyty +Remote Port = Port serwera zdalnego +Remote Server = Serwer zdalny +Remote Subdirectory = Podkatalog zdalny +RemoteISODesc = Lista aktualnie udostępnianych gier +RemoteISOLoading = Połączono. Ładowanie listy gier... +RemoteISOScanning = Skanowanie... Wciśnij "Udostępniaj gry" na urządzeniu serwerowym +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Informacja: Połącz oba urządzenia z tą samą siecią Wi-Fi +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Ustawienia +Share Games (Server) = Udostępniaj gry (serwer) +Share on PPSSPP startup = Udostępniaj przy starcie PPSSPP +Stop Sharing = Zatrzymaj udostępnianie +Stopping.. = Zatrzymywanie... + +[Reporting] +Bad = Zła +FeedbackDelayInfo = Twoje odpowiedzi wysyłane są w tle. +FeedbackDesc = Jak działa emulacja? Pozwól nam i społeczności się dowiedzieć! +FeedbackDisabled = Raporty kompatybilności muszą być włączone. +FeedbackIncludeCRC = Uwaga: Wysyłanie CRC dysku zwiększy zużycie baterii +FeedbackIncludeScreen = Dołącz zrzut ekranu +FeedbackSubmitDone = Twoje odpowiedzi zostały wysłane. +FeedbackSubmitFail = Nie udało się przesłać danych do serwera. Spróbuj zaktualizować PPSSPP. +FeedbackThanks = Dziękujemy za opinię! +Gameplay = Rozgrywka +Graphics = Grafika +Great = Świetna +In-game = W grze +In-game Description = Przechodzi do gry, jednak zbyt dużo bugów by ją ukończyć +Menu/Intro = Menu/Intro +Menu/Intro Description = Nie przechodzi do gry +Nothing = Nic +Nothing Description = Całkowicie zepsuta emulacja +OK = OK +Open Browser = Otwórz przeglądarkę +Overall = Całościowo +Perfect = Perfekcyjnie +Perfect Description = Bezbłędna emulacja w całej grze - super! +Plays = Działa +Plays Description = Całkowicie grywalna, jednak można napotkać niewielkie błędy +ReportButton = Raportuj +Speed = Szybkość +Submit Feedback = Wyślij raport +SuggestionConfig = Sprawdź dobre konfiguracje w raportach na stronie. +SuggestionCPUSpeed0 = Wyłącz blokadę szybkości CPU. +SuggestionDowngrade = Wróć do starszej wersji PPSSPP (prosimy o zgłoszenie tego błędu). +SuggestionsFound = Innym użytkownikom ta gra działa lepiej. Wciśnij "Zobacz opinie" by uzyskać więcej informacji. +SuggestionsNone = Ta gra nie działa również innym użytkownikom. +SuggestionsWaiting = Wysyłanie i sprawdzanie raportów innych użytkowników... +SuggestionUpgrade = Zaktualizuj PPSSPP do nowszej wersji. +SuggestionVerifyDisc = Sprawdź, czy ISO którego używasz jest dobrym obrazem dysku. +Unselected Overall Description = Jak dobrze emulowana jest ta gra? +View Feedback = Zobacz opinie + +[Savedata] +Date = Data +Filename = Nazwa +No screenshot = Brak obrazka +None yet. Things will appear here after you save. = Na razie nic tu nie ma. Wpisy pojawią się, gdy zapiszesz grę. +Save Data = Zapisy gier +Save States = Pliki zapisów stanów +Savedata Manager = Zarządzanie zapisami gier +Size = Rozmiar + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = UWAGA: Wykryto Chainfire3D, może powodować problemy. +Failed to load state = Nie można wczytać zapisu stanu +Failed to save state = Nie można zapisać stanu +fixed = Prędkość: alternatywna +GLToolsWarning = UWAGA: Wykryto GLTools, może powodować problemy. +In menu = In menu +Load savestate failed = Nie można wczytać zapisu stanu +Loaded State = Wczytano stan gry +Loaded. Save in game, restart, and load for less bugs. = Wczytano. By zmniejszyć ryzyko potencjalnych problemów, zapisz stan w grze, zrestartuj ją i wczytaj. +LoadStateDoesntExist = Nie można wczytać stanu: Zapis stanu nie istnieje! +LoadStateWrongVersion = Nie można wczytać stanu: Zapis stanu przeznaczony jest dla starszej wersji PPSSPP! +norewind = Brak zapisów stanów potrzebnych do przewinięcia. +Playing = Playing +PressESC = Naciśnij klawisz ESC, aby otworzyć menu pauzy. +replaceTextures_false = Tekstury nie są już podmieniane. +replaceTextures_true = Podmiana tekstur włączona. +Save State Failed = Nie można wczytać zapisu stanu! +Saved State = Stan zapisany +saveNewTextures_false = Zapisywanie tekstur wyłączone. +saveNewTextures_true = Tekstury będą zapisywane na nośnik. +SpeedCustom2 = Prędkość: alternatywna 2 +standard = Prędkość: standardowa +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = Zainstalowane +Connection Error = Błąd połączenia +Install = Zainstaluj +Launch Game = Rozpocznij grę +Loading... = Ładowanie... +MB = MB +Size = Rozmiar +Uninstall = Odinstaluj + +[SysInfo] +%d (%d per core, %d cores) = %d (%d na rdzeń, %d rdzenie) +%d bytes = %d bajtów +(none detected) = (nie wykryto) +3D API = 3D API +ABI = ABI +API Version = Wersja API +Audio Information = Informacje o Audio +Board = Płyta główna +Build Config = Konfiguracja wersji +Build Configuration = Konfiguracja Wersji +Built by = Zbudowane przez +Core Context = Core context +Cores = Rdzenie +CPU Extensions = Rozszerzenia CPU +CPU Information = Informacje o CPU +CPU Name = Nazwa +D3DCompiler Version = Wersja D3DCompiler +Debug = Debug +Debugger Present = Debugger obecny +Device Info = Inf. o urządzeniu +Display Information = Informacje o Wyświetlaczu +Driver Version = Wersja sterownika +EGL Extensions = Rozszerzenia EGL +Frames per buffer = Klatek na bufor +GPU Information = Informacje o GPU +High precision float range = High precision float range +High precision int range = Zakres l. całkowitych wys. precyzji +Lang/Region = Język/Region +Memory Page Size = Rozmiar strony pamięci +Native Resolution = Natywna rozdzielczość +OGL Extensions = Rozszerzenia OGL +OpenGL ES 2.0 Extensions = Rozszerzenia OpenGL ES 2.0 +OpenGL ES 3.0 Extensions = Rozszerzenia OpenGL ES 3.0 +OpenGL Extensions = Rozszerzenia OpenGL +Optimal frames per buffer = Optymalna ilość klatek na bufor +Optimal sample rate = Optymalna częstotliwość próbkowania +OS Information = Informacje o OS +PPSSPP build = Kompilacja PPSSPP +Refresh rate = Częstotliwość odświeżania +Release = Release +RW/RX exclusive = Wyłączne RW/RX +Sample rate = Częstotliwość próbkowania +Shading Language = Język shadingu +Sustained perf mode = Tryb wysokiej wydajności +System Information = Informacje o systemie +System Name = Nazwa +System Version = System version +Threads = Liczba wątków +Vendor = Producent +Vendor (detected) = Producent (wykryty) +Version Information = Informacje o wersji +Vulkan Extensions = Rozszerzenia Vulkana +Vulkan Features = Opcje Vulkana + +[System] +(broken) = (nie działa) +12HR = 12 godzinny +24HR = 24 godzinny +Auto = Auto +Auto Load Savestate = Automatyczne wczytywanie stanów zapisu +AVI Dump started. = Rozpoczęto zrzut do AVI +AVI Dump stopped. = Zatrzymano zrzut do AVI +Cache ISO in RAM = Wczytuj całe ISO do RAM'u +Change CPU Clock = Zmień częstotliwość zegara CPU (niestabilnie) +Change Memory Stick folder = Zmień folder Karty Pamięci +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Zmień pseudonim +ChangingMemstickPath = Zapisy gier, zapisy stanu i inne dane nie zostaną skopiowane do tego folderu.\n\nZmienić ścieżkę do folderu Karty Pamięci? +ChangingMemstickPathInvalid = Ta ścieżka nie może zostać użyta do zapisu plików Karty Pamięci. +ChangingMemstickPathNotExists = Folder nie istnieje.\n\nZapisy gier, zapisy stanu i inne dane nie zostaną skopiowane do tego folderu.\n\nUtworzyć nowy folder Karty Pamięci? +Cheats = Kody (eksperymentalne, zobacz forum) +Clear Recent = Clear "Recent" +Clear Recent Games List = Wyczyść listę ostatnio granych +Clear UI background = Przywróć tło interfejsu +Confirmation Button = Przycisk potwierdzenia +Date Format = Format daty +Day Light Saving = Czas letni +DDMMYYYY = DD/MM/RRRR +Decrease size = Decrease size +Developer Tools = Narzędzia programistyczne +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emulacja +Enable Cheats = Włącz kody +Enable Compatibility Server Reports = Włącz serwer raportów kompatybilności +Failed to load state. Error in the file system. = Nie można wczytać stanu. Błąd systemu plików. +Failed to save state. Error in the file system. = Nie można zapisać stanu. Błąd systemu plików. +Fast (lag on slow storage) = Szybka (zacina na wolnych dyskach) +Fast Memory = Szybka pamięć (niestabilne) +Force real clock sync (slower, less lag) = Wymuś rzeczywistą synchr. zegara (wolniej, mniej zacina) +frames, 0:off = klatki, 0 = wył. +Games list settings = Games list settings +General = Ogólne +Grid icon size = Grid icon size +Help the PPSSPP team = Pomóż zespołowi PPSSPP +Host (bugs, less lag) = Host (błędy, mniejsze zacinanie) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Interpreter +IO timing method = Metoda synchronizacji I/O +IR Interpreter = Interpreter IR +Memory Stick Folder = Folder Karty Pamięci +Memory Stick inserted = Karta Pamięci włożona +MHz, 0:default = MHz, 0 = domyślne +MMDDYYYY = MM/DD/RRRR +Newest Save = Najnowszy zapis +Not a PSP game = To nie jest gra PSP +Off = Wył. +Oldest Save = Najstarszy zapis +PSP Model = Model PSP +PSP Settings = Ustawienia PSP +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Nagrywaj dźwięk +Record Display = Nagrywaj obraz +Reset Recording on Save/Load State = Resetuj nagrywanie przy zapisie/wczytaniu stanu +Restore Default Settings = Przywróć domyślne ustawienia +Rewind Snapshot Frequency = Częstotl. zapisu stanów przewijania (wymaga pamięci) +Save path in installed.txt = Ścieżka zapisu w installed.txt +Save path in My Documents = Ścieżka zapisu w Dokumentach +Savestate Slot = Slot zapisu stanu +Savestate slot backups = Kopie zapasowe slota zapisu stanu +Screenshots as PNG = Zapisuj zrzuty ekranu jako PNG +Set UI background... = Zmień tło interfejsu... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Symuluj opóźnienia UMD +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Dysk zapełniony +Sustained performance mode = Tryb wysokiej wydajności +Time Format = Format czasu +UI = Interfejs użytkownika +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Używaj stratnego kodeka wideo (FFV1) +Use O to confirm = Używaj O jako potwierdzenia +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = Używaj X jako potwierdzenia +VersionCheck = Sprawdzaj dostępne aktualizacje +WARNING: Android battery save mode is on = UWAGA: Oszczędzanie energii zostało włączone +WARNING: Battery save mode is on = UWAGA: Oszczędzanie energii jest włączone +YYYYMMDD = RRRR/MM/DD + +[Upgrade] +Details = Details +Dismiss = Odrzuć +Download = Pobierz +New version of PPSSPP available = Dostępna jest nowa wersja PPSSPP! diff --git a/assets/lang/pt_BR.ini b/assets/lang/pt_BR.ini new file mode 100644 index 0000000000..c59e37344e --- /dev/null +++ b/assets/lang/pt_BR.ini @@ -0,0 +1,1096 @@ +# Thanks for your interest in translating PPSSPP. +# +# Simply copy this file to a new ini file with your language code, +# or use it to update an existing file with that name. +# +# To see a list of codes, view this page: +# https://stackoverflow.com/questions/3191664/list-of-all-locales-and-their-short-codes +# +# Please note, while translating: +# +# Hash/sharp symbols (#) in this file indicate a comment. Lines that begin without one are +# considered to be a part of the actual translations. +# +# The left side of the equals sign indicates "key" values that PPSSPP uses to identify a string. +# If they don't match correctly, PPSSPP won't use them. +# +# Ampersands (&) on the RIGHT side of an equals sign denote an underlined keyboard hotkey. +# The hotkeys are only supported currently in the DesktopUI section, however. +# +# Example 1: &File. This will make it so when you press ALT + F on Windows, it'll open the File menu. +# Example 2: Homebrew && Demos. This would show one real ampersand in the menu. +# +# Happy translating. + +[Audio] +Alternate speed volume = Alternar velocidade do volume +Audio backend = Backed do áudio (requerido reiniciar) +AudioBufferingForBluetooth = Buffer amigável do Bluetooth (mais lento) +Auto = Automático +Device = Dispositivo +DSound (compatible) = DirectSound (compatível) +Enable Sound = Ativar áudio +Global volume = Volume global +Microphone = Microfone +Microphone Device = Dispositivo Microfone +Mute = Mudo +Switch on new audio device = Trocar pro novo dispositivo de áudio +Use global volume = Usar volume global +WASAPI (fast) = WASAPI (rápido) + +[Controls] +Analog auto-rotation speed = Velocidade de auto-rotação do analógico +Analog Axis Sensitivity = Sensibilidade do eixo analógico +Analog Limiter = Limitador do analógico +Analog Mapper High End = Mapeador analógico high-end (sensibilidade dos eixos) +Analog Mapper Low End = Mapeador analógico low-end (zona morta inversa) +Analog Mapper Mode = Modo do mapeador analógico +Analog Stick = Direcional analógico +AnalogLimiter Tip = Quando o botão limitador de análogico é pressionado +Auto = Automático +Auto-centering analog stick = Auto-centralizar direcional analógico +Auto-hide buttons after seconds = Auto-esconder botões após segundos +Binds = Vinculados +Button Opacity = Opacidade dos botões +Button style = Estilo dos botões +Calibrate D-Pad = Calibrar +Calibration = Calibração +Classic = Clássico +Combo Key Setting = Configuração das teclas do combo +Combo Key Setup = Instalação das teclas do combo +Confine Mouse = Travar mouse dentro da janela/área de exibição +Control Mapping = Mapeamento dos controles +Custom layout... = Editar esquema do controle do toque... +Customize tilt = Personalizar a inclinação... +D-PAD = D-Pad +Deadzone Radius = Raio da zona morta +DInput Analog Settings = Configurações do DInput analógico +Disable D-Pad diagonals (4-way touch) = Desativar diagonais do D-Pad (toque de 4 direções) +Glowing borders = Bordas brilhantes +HapticFeedback = feedback háptico (vibração) +Ignore gamepads when not focused = Ignorar gamepads quando não focado +Ignore Windows Key = Desativar a tecla do Windows +Invert Axes = Inverter eixos +Invert Tilt along X axis = Inverter a inclinação junto do eixo X +Invert Tilt along Y axis = Inverter a inclinação junto do eixo Y +Keep this button pressed when right analog is pressed = Manter este botão pressionado quando o analógico direito é pressionado +Keyboard = Configurações do controle do teclado +L/R Trigger Buttons = Botões de gatilho L/R +Landscape = Paisagem +Landscape Auto = Paisagem automática +Landscape Reversed = Paisagem invertida +Mouse = Configurações do mouse +Mouse sensitivity = Sensibilidade do mouse +Mouse smoothing = Suavização do mouse +MouseControl Tip = Agora você pode mapear o mouse na tela de mapeamento do controle pressionando o ícone 'M'. +None (Disabled) = Nenhuma (desativado) +Off = Desativado +OnScreen = Controles do toque na tela +Portrait = Retrato +Portrait Reversed = Retrato invertido +PSP Action Buttons = Botões de ação do PSP +Screen Rotation = Rotação da tela +seconds, 0 : off = segundos, 0 = desligado +Sensitivity = Sensibilidade +Show right analog = Mostrar analógico direito +Show Touch Pause Menu Button = Mostrar o botão do menu de pausa +Thin borders = Bordas finas +Tilt Base Radius = Raio da base de inclinação +Tilt Input Type = Controle da entrada da inclinação +Tilt Sensitivity along X axis = Sensibilidade da inclinação junto do eixo X +Tilt Sensitivity along Y axis = Sensibilidade da inclinação junto do eixo Y +To Calibrate = Pra calibrar mantenha o dispositivo numa superfície plana e pressione "Calibrar". +Touch Control Visibility = Visibilidade do controle de toque +Use custom right analog = Usar analógico direito personalizado +Use Mouse Control = Usar o controle do mouse +Visibility = Visibilidade +X = X +X + Y = X + Y +XInput Analog Settings = Configurações do XInput analógico +Y = Y + +[CwCheats] +Cheats = Trapaças +Edit Cheat File = Editar arquivo de trapaças +Enable/Disable All = Ativar/Desativar todas as trapaças +Import Cheats = Importar de cheat.db +Options = Opções +Refresh Rate = Taxa de atualização + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = &Sobre o PPSSPP... +Auto = &Auto +Backend = Backend de &renderização (Reinicia o PPSSPP) +Bicubic = &Bi-cúbico +Break = Parar +Break on Load = Parar ao carregar +Buffered Rendering = &Renderização com buffer +Buy Gold = Comprar &Gold +Control Mapping... = M&apeamento dos controles +Debugging = &Debug +Deposterize = &Deposterizar +Direct3D9 = Direct3D &9 +Direct3D11 = Direct3D &11 +Disassembly = &Disassembly... +Discord = Discord +Display Layout Editor = Exibir editor do esquema... +Display Rotation = Rotação do mostrador +Dump Next Frame to Log = D&mpar o frame seguinte no log +Emulation = &Emulação +Enable Chat = Ativar bate-papo +Enable Cheats = Ativar &trapaças +Enable Sound = Ativar s&om +Exit = S&air +Extract File... = E&xtrair arquivo... +File = &Arquivo +Frame Skipping = &Pulo de frames +Frame Skipping Type = Tipo de pulo de frames +Fullscreen = Te&la cheia +Game Settings = &Configurações do jogo +GE Debugger... = Debugger do GE... +GitHub = GitHub +Hardware Transform = &Transformação por hardware +Help = &Ajuda +Hybrid = &Híbrido +Hybrid + Bicubic = Híbrido + Bi-cúbico +Ignore Illegal Reads/Writes = &Ignorar leituras/gravações ilegais +Ignore Windows Key = Ignorar a tecla do Windows +Keep PPSSPP On Top = &Manter o PPSSPP no topo +Landscape = Paisagem +Landscape reversed = Paisagem invertida +Language... = Id&ioma +Linear = &Linear +Load = &Carregar... +Load .sym File... = Carregar arquivo .sym +Load Map File... = Carregar &arquivo do mapa... +Load State = Carregar o state +Load State File... = &Carregar arquivo do state... +Log Console = &Console dos logs +Memory View... = Visualização da &memória... +More Settings... = &Mais configurações... +Nearest = &Mais perto +Non-Buffered Rendering = &Ignorar efeitos do buffer (sem buffer, mais rápido) +Off = &Desligado +Open Directory... = Abrir &diretório... +Open from MS:/PSP/GAME... = A&brir do MS:/PSP/GAME... +Open cartão de memória = Abrir &cartão de memória +Open New Instance = Abrir nova instância +OpenGL = &OpenGL +Pause = &Pausar +Pause When Not Focused = &Pausar quando não focado +Portrait = Retrato +Portrait reversed = Retrato invertido +Postprocessing Shader = Shader de pós-processamento +PPSSPP Forums = Fórums do &PPSSPP +Record = &Gravar +Record Audio = Gravar &áudio +Record Display = Gravar &mostrador +Rendering Mode = Modo de r&enderização +Rendering Resolution = &Resolução da renderização +Reset = R&esetar +Reset Symbol Table = Resetar t&abela dos símbolos +Run = &Executar +Save .sym File... = Salva&r arquivo .sym... +Save Map File... = &Salvar arquivo do mapa... +Save State = Salvar state +Save State File... = &Salvar arquivo do state... +Savestate Slot = Slo&t do save state +Screen Scaling Filter = F&iltro do dimensionamento da tela +Show Debug Statistics = Mostrar as estatíst&icas do debug +Show FPS Counter = Mostrar contador de &FPS +Skip Number of Frames = Ignorar número de frames +Skip Percent of FPS = Ignorar porcentagem do FPS +Stop = &Parar +Switch UMD = Trocar UMD +Take Screenshot = &Criar screenshot +Texture Filtering = Fi<ragem das texturas +Texture Scaling = &Dimensionamento das texturas +Use Lossless Video Codec (FFV1) = Usar codec de vídeo sem perda (FFV1) +Use output buffer for video = Usar buffer de saída pro vídeo +Vertex Cache = &Cache do vértice +VSync = VS&ync +Vulkan = Vulkan +Window Size = &Tamanho da janela +www.ppsspp.org = Visitar www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Visualizador do alocador (Vulkan) +Allow remote debugger = Permitir debug remoto +Backspace = Backspace +Block address = Bloquear endereço +By Address = Por endereço +Copy savestates to memstick root = Copiar os save states pra raiz do cartão de memória +Create/Open textures.ini file for current game = Criar/abrir o arquivo textures.ini pro jogo atual +Current = Atual +Dev Tools = Ferramentas de desenvolvimento +DevMenu = Menu do DEV +Disabled JIT functionality = Funcionalidade do JIT desativada +Draw Frametimes Graph = Desenhar gráfico dos tempos dos frames +Dump Decrypted Eboot = Dumpar EBOOT.BIN decriptado no boot do jogo +Dump Frame GPU Commands = Dumpar comandos dos frames da GPU +Enable driver bug workarounds = Ativar solução alternativa dos bugs dos drivers +Enable Logging = Ativar log do debug +Enter address = Inserir endereço +FPU = FPU +Framedump tests = Testes dos dumps dos frames +Frame Profiler = Analista dos frames +GPU Driver Test = Teste do driver da GPU +GPU Profile = Perfil da GPU +Jit Compare = Comparar JIT +JIT debug tools = Ferramentas de debug do JIT +Language = Idioma +Load language ini = Carregar ini do idioma +Log Dropped Frame Statistics = Pôr no log as estátisticas da perda dos frames +Log Level = Nível do log +Log View = Visualização do log +Logging Channels = Canais do log +Next = Próximo +No block = Nenhum bloco +Prev = Anterior +Random = Aleatório +Replace textures = Substituir texturas +Reset limited logging = Resetar o log limitado +RestoreDefaultSettings = Você tem certeza que você quer restaurar todas as configurações de volta pros padrões delas?\nAs configurações do mapeamento dos controles não são mudadas.\nVocê não pode desfazer isto.\nPor favor reinicie o PPSSPP para as mudanças acontecerem. +RestoreGameDefaultSettings = Você tem certeza que você quer restaurar as configurações específicas do jogo\nde volta para os padrões do PPSSPP? +Resume = Resumo +Run CPU Tests = Executar testes da CPU +Save language ini = Salvar o ini do idioma +Save new textures = Salvar novas texturas +Shader Viewer = Visualizador dos shaders +Show Developer Menu = Mostrar menu do desenvolvedor +Show on-screen messages = Mostrar mensagens na tela +Stats = Estatísticas +System Information = Informação do sistema +Texture Replacement = Substituição das texturas +Toggle Audio Debug = Alternar debug do áudio +Toggle Freeze = Alternar congelamento +Touchscreen Test = Teste do Touchscreen +VFPU = VFPU + +[Dialog] +* PSP res = * Resolução do PSP +Active = Ativo +Back = Voltar +Cancel = Cancelar +Center = Centro +ChangingGPUBackends = Mudar os backends da GPU requer reiniciar o PPSSPP. Reiniciar agora? +ChangingInflightFrames = Mudar o buffer do comando dos gráficos requer que o PPSSPP reinicie. Reiniciar agora? +Channel: = Canal: +Choose PPSSPP save folder = Escolher diretório dos saves do PPSPP +Confirm Overwrite = Você quer sobrescrever os dados? +Confirm Save = Você quer salvar estes dados? +ConfirmLoad = Carregar estes dados? +ConnectingAP = Conectando ao ponto de acesso.\nPor favor espere... +ConnectingPleaseWait = Conectando.\nPor favor espere... +ConnectionName = Nome da conexão +Corrupted Data = Dados corrompidos +Delete = Apagar +Delete all = Apagar tudo +Delete completed = Exclusão completada. +DeleteConfirm = Este dado do save será apagado.\nTem certeza que você quer continuar? +DeleteConfirmAll = Você realmente quer apagar todos\nos seus dados salvos deste jogo? +DeleteConfirmGame = Você realmente quer apagar este jogo\ndo seu dispositivo? Você não pode desfazer isto. +DeleteConfirmGameConfig = Você realmente quer apagar as configurações deste jogo? +DeleteFailed = Incapaz de apagar dados. +Deleting = Apagando\nPor favor espere... +Disable All = Desativar tudo +Edit = Editar +Enable All = Ativar tudo +Enter = Inserir +Finish = Concluir +Grid = Grade +Inactive = Inativo +InternalError = Um erro interno ocorreu. +Load = Carregar +Load completed = Carregamento completado. +Loading = Carregando\nPor favor espere... +LoadingFailed = Incapaz de carregar os dados. +Move = Mover +Network Connection = Conexão de rede +NEW DATA = NOVOS DADOS +No = Não +ObtainingIP = Obtendo endereço de IP.\nPor favor espere... +OK = Ok +Old savedata detected = Velhos dados do save detectados +Options = Opções +Reset = Resetar +Resize = Redimensionar +Retry = Tentar de novo +Save = Salvar +Save completed = Salvamento completado. +Saving = Salvando\nPor favor espere... +SavingFailed = Incapaz de salvar os dados. +Select = Selecionar +Shift = Shift +Snap = Grade +Space = Espaço +SSID = SSID +Submit = Submeter +Supported = Suportado +There is no data = Não há dados. +Toggle All = Alternar todos +Toggle List = Alternar lista +Unsupported = Não suportado +When you save, it will load on a PSP, but not an older PPSSPP = Quando você salvar ele carregará num PSP mas não num PPSSPP mais antigo +When you save, it will not work on outdated PSP Firmware anymore = Quando você salvar ele não funcionará mais num firmware de PSP desatualizado +Yes = Sim +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = O arquivo está comprimido (7z).\nPor favor descomprima-o primeiro (tente o 7-zip ou WinRAR). +A PSP game couldn't be found on the disc. = Um jogo de PSP não pôde ser achado no disco. +Cannot boot ELF located outside mountRoot. = Não pôde dar boot no ELF localizado fora do mountRoot. +Could not save screenshot file = Não pôde salvar o arquivo do screenshot. +D3D9or11 = Direct3D 9? (ou "não" pra Direct3D 11) +D3D11CompilerMissing = O D3DCompiler_47.dll não foi achado. Por favor instale. Ou pressione Sim pra tentar de novo usando o Direct3D 9 ao invés disto. +D3D11InitializationError = Erro de inicialização do Direct3D 11 +D3D11Missing = Sua versão do sistema operacional não inclui o D3D11. Por favor execute o Windows Update.\n\nPressione Sim pra tentar de novo usando o Direct3D 9 ao invés disto. +D3D11NotSupported = Sua GPU não aparenta suportar o Direct3D 11.\n\nVocê gostaria de tentar de novo usando o Direct3D 9 ao invés disto? +Disk full while writing data = O disco ficou cheio enquanto gravava os dados. +ELF file truncated - can't load = Arquivo ELF truncado - não pôde carregar +Error loading file = Não pôde carregar o arquivo. +Error reading file = Erro ao ler o arquivo. +Failed initializing CPU/Memory = Falhou em inicializar a CPU ou memória +Failed to identify file = Falhou em identificar o arquivo. +Failed to load executable: = Falhu em carregar o executável: +File corrupt = Arquivo corrompido +Game disc read error - ISO corrupt = Erro de leitura do disco do jogo: ISO corrompida. +GenericAllStartupError = O PPSSPP falhou em iniciar com qualquer backend dos gráficos. Tente atualizar seus gráficos e outros drivers. +GenericBackendSwitchCrash = O PPSSPP teve um crash enquanto iniciava.\n\nIsto geralmente significa um problema do driver dos gráficos. Tente atualizar seus drivers dos gráficos.\n\nO backend dos gráficos foi trocado: +GenericDirect3D9Error = Falhou em inicializar os gráficos. Tente atualizar seus drivers dos gráficos e o runtime do DirectX 9.\n\nVocê gostaria de tentar trocar pra OpenGL?\n\nMensagem de erro: +GenericGraphicsError = Erro dos Gráficos +GenericOpenGLError = Falhou em inicializar os gráficos. Tente atualizar seus drivers dos gráficos.\n\nVocê gostaria de tentar trocar pra DirectX 9?\n\nMensagem de erro: +GenericVulkanError = Falhou em inicializar os gráficos. Tente atualizar seus drivers dos gráficos.\n\nVocê gostaria de tentar trocar pra OpenGL?\n\nMensagem de erro: +InsufficientOpenGLDriver = Suporte insuficiente do driver do OpenGL detectado!\n\nSua GPU reporta que não suporta OpenGL 2.0. Você gostaria de tentar usar o DirectX ao invés disto?\n\nO DirectX atualmente é compatível com menos jogos mas na sua GPU pode ser a única escolha.\n\nVisite os fóruns em https://forums.ppsspp.org pra mais informações.\n\n +Just a directory. = Apenas uma diretório. +Missing key = Chave ausente +MsgErrorCode = Código do erro: +MsgErrorSavedataDataBroken = Os dados do save estavam corrompidos. +MsgErrorSavedataMSFull = Cartão de memória cheio. Verifique seu espaço de armazenagem. +MsgErrorSavedataNoData = Aviso: não foram achados dados do save. +MsgErrorSavedataNoMS = Cartão de memória não inserido. +No EBOOT.PBP, misidentified game = Não há EBOOT.PBP, jogo mal identificado. +Not a valid disc image. = Não é uma imagem de disco válida. +OpenGLDriverError = Erro no driver do OpenGL +PPSSPP doesn't support UMD Music. = O PPSSPP não suporta a música do UMD. +PPSSPP doesn't support UMD Video. = O PPSSPP não suporta vídeo do UMD. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = O PPSSPP roda jogos de PSP, não jogos de PlayStation 1 ou 2. +PPSSPPDoesNotSupportInternet = O PPSSPP atualmente não suporta conexão com a Internet pra DLC, PSN ou atualizações de jogos. +PS1 EBOOTs are not supported by PPSSPP. = OS EBOOTS do PS1 não são suportados pelo PPSSPP. +PSX game image detected. = O arquivo é uma imagem do MODE2. O PPSPP não suporta jogos de PS1. +RAR file detected (Require UnRAR) = O arquivo está comprimido (RAR).\nPor favor descomprima-o primeiro (tente o UnRAR). +RAR file detected (Require WINRAR) = O arquivo está comprimido (RAR).\nPor favor descomprima-o primeiro (tente o WinRAR). +Running slow: try frameskip, sound is choppy when slow = Rodando lento: tente o frameskip, o som é instável quando lento. +Running slow: Try turning off Software Rendering = Rodando lento: Tente desligar "renderização por software" +Save encryption failed. This save won't work on real PSP = Falhou em encriptar o save. Este save não funcionará num PSP de verdade +textures.ini filenames may not be cross-platform = Os nomes dos arquivos em "textures.ini" podem não ser multi-plataforma. +This is a saved state, not a game. = Este é um state salvo, não um jogo. +This is save data, not a game. = Isto são dados do save, não um jogo. +Unable to create cheat file, disk may be full = Incapaz de criar arquivo de trapaça. O disco pode estar cheio. +Unable to initialize rendering engine. = Incapaz de inicializar a engine da renderização. +Unable to write savedata, disk may be full = Incapaz de gravar os dados do save, o disco pode estar cheio. +Warning: Video memory FULL, reducing ampliação and switching to slow caching mode = AVISO: Memória de vídeo CHEIA, reduzindo a ampliação e trocando pro modo de cache lento. +Warning: Video memory FULL, switching to slow caching mode = AVISO: Memória de vídeo CHEIA, trocando pro modo de cache lento. +ZIP file detected (Require UnRAR) = O arquivo está comprimido (ZIP).\nPor favor descomprima-o primeiro (tente o UnRAR). +ZIP file detected (Require WINRAR) = O arquivo está comprimido (ZIP).\nPor favor descomprima-o primeiro (tente o WinRAR). + +[Game] +Asia = Ásia +ConfirmDelete = Apagar +Create Game Config = Criar configuração do jogo +Create Shortcut = Criar atalho +Delete Game = Apagar jogo +Delete Game Config = Apagar configuração do jogo +Delete Save Data = Apagar dados do save +Europe = Europa +Game = Jogo +Game Settings = Configurações do jogo +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Dados da instalação +Japan = Japão +Korea = Coréia +MB = MBs +One moment please... = Um momento por favor... +Play = Jogar +Remove From Recent = Remover dos "Recentes" +SaveData = Dados do save +Setting Background = Configurando o background +Show In Folder = Mostrar na pasta +USA = EUA +Use UI background = Usar background da Interface do Usuário + +[Graphics] +% of the void = % do vazio +% of viewport = % do visor +%, 0:unlimited = %, 0 = ilimitado +(supersampling) = (super amostragem) +(ampliação) = (ampliação) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Agressivo +Alternative Speed = Velocidade alternativa (em %, 0 = ilimitada) +Alternative Speed 2 = Velocidade alternativa 2 (em %, 0 = ilimitada) +Anisotropic Filtering = Filtragem anisotrópica +Auto = Auto +Auto (1:1) = Auto (1:1) +Auto (same as Rendering) = Auto (a mesma que a da resolução da renderização) +Auto FrameSkip = Auto-pulo dos frames +Auto Scaling = Auto-redimensionamento +Backend = Backend +Balanced = Balanceado +Bicubic = Bi-cúbico +BlockTransfer Tip = Alguns jogos requerem que isto esteja Ligado para os gráficos estarem corretos +BlockTransferRequired = Aviso: Esse jogo requer que a "simulação dos efeitos da transferência dos blocos" esteja definido como Ligado. +Both = Ambos +Buffer graphics commands (faster, input lag) = Buffer dos comandos dos gráficos (mais rápido, atraso na entrada dos dados) +Buffered Rendering = Renderização com buffer +BufferedRenderingRequired = Aviso: Este jogo requer que o "modo de renderização" esteja definido em "com buffer". +Camera = Câmera +Camera Device = Dispositivo de câmera +Cardboard Screen Size = Tamanho da tela (em % do visor) +Cardboard Screen X Shift = Deslocamento no eixo X +Cardboard Screen Y Shift = Deslocamento no eixo Y +Cardboard VR Settings = Configurações do VR Cardboard +Cheats = Trapaças +Clear Speedhack = Limpar buffers dos frames no primeiro uso (hack de velocidade) +ClearSpeedhack Tip = As vezes mais rápido (na maior parte em dispositivos móveis), pode causar erros gráficos +CPU Core = Core da CPU +Debugging = Depuração +DefaultCPUClockRequired = Aviso: Este jogo requer que o clock da CPU esteja definido como padrão. +Deposterize = Deposterizar +Deposterize Tip = Corrige erros gráficos visuais das bandas em texturas com ampliação +Device = Dispositivo +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Desativa efeitos mais lentos (mais veloz) +Disabled = Desativado +Display layout editor = Exibe o editor de esquemas +Display Resolution (HW scaler) = Resolução da tela (Escalador de hardware) +Dump next frame to log = Dumpa o próximo frame no log +Enable Cardboard VR = Ativa o VR Cardboard +FPS = FPS +Frame Rate Control = Controle da taxa dos frames +Frame Skipping = Pulo dos frames +Frame Skipping Type = Tipo de pulo dos frames +FullScreen = Tela cheia +Hack Settings = Configurações dos hacks (pode causar erros gráficos) +Hardware Tessellation = Tesselação por hardware +Hardware Transform = Transformação por hardware +hardware transform error - falling back to software = Erro de transformação pelo hardware, retrocedendo pro software. +HardwareTessellation Tip = Usa o hardware pra fazer as curvas +High = Alta +Hybrid = Híbrido +Hybrid + Bicubic = Híbrido + Bi-cúbico +Ignore camera notch when centering = Ignora o nível da câmera quando centralizar +Internal Resolution = Resolução interna +Lazy texture caching = Cache preguiçoso da textura (mais veloz) +Linear = Linear +Low = Baixa +LowCurves = Qualidade das curvas spline/bezier +LowCurves Tip = Usado só por alguns jogos, controla a suavidade das curvas +Lower resolution for effects (reduces artifacts) = Resolução menor dos efeitos (reduz artefatos) +Manual Scaling = Dimensionamento manual +Medium = Média +Mode = Modo +Must Restart = Você deve reiniciar o PPSSPP pra esta mudança ter efeito. +Native device resolution = Resolução nativa do dispositivo +Nearest = Mais perto +No buffer = Sem buffer +Non-Buffered Rendering = Ignorar efeitos de buffer (sem buffer, mais rápido) +None = Nenhum +Number of Frames = Número de frames +Off = Desligado +OpenGL = OpenGL +Overlay Information = Informações da sobreposição +Partial Stretch = Esticamento parcial +Percent of FPS = Porcentagem do FPS +Performance = Performance +Postprocessing effect = Efeitos de pós-processamento +Postprocessing Shader = Shader de pós-processamento +Recreate Activity = Recriar atividade +Render duplicate frames to 60hz = Renderizar frames duplicados a 60 Hz +RenderDuplicateFrames Tip = Pode tornar a taxa dos frames mais suave em jogos que executam em taxas de frames menores +Rendering Mode = Modo de renderização +Rendering Resolution = Resolução da renderização +RenderingMode NonBuffered Tip = Mais rápido, mas nada pode ser desenhado em alguns jogos +Retain changed textures = Reter texturas mudadas (as vezes mais lento) +RetainChangedTextures Tip = Torna muitos jogos mais lentos mas alguns jogos muito mais rápidos +Rotation = Rotação +Safe = Seguro +Screen layout = Esquema da tela +Screen Scaling Filter = Filtro do dimensionamento da tela +Show Debug Statistics = Mostrar estatísticas do debug +Show FPS Counter = Mostrar contador de FPS +Simulate Block Transfer = Simular efeitos de transferência dos blocos +SoftGPU Tip = Atualmente MUITO lento +Software Rendering = Renderização por software (lento) +Software Skinning = Skinning via software +SoftwareSkinning Tip = Combina os modelos de skinning na CPU, mais rápido na maioria dos jogos +Speed = Velocidade +Stretching = Esticamento +Texture Filter = Filtragem das texturas +Texture Filtering = Filtragem das texturas +Texture Scaling = Dimensionamento das texturas +Texture Shader = Shader das texturas +Turn off Hardware Tessellation - unsupported = Desliga a "Tesselação por hardware": não suportado. +Unlimited = Ilimitado +Up to 1 = Até 1 +Up to 2 = Até 2 +Upscale Level = Nível da ampliação +Upscale Type = Tipo de ampliação +UpscaleLevel Tip = Pesado pra CPU - algum dimensionamento pode ser atraso pra evitar travamentos +Use all displays = Usar todas as telas +Vertex Cache = Cache do vértice +VertexCache Tip = Mais rápido, mas pode causar tremulação da tela +VSync = VSync +Vulkan = Vulkan +Window Size = Tamanho da janela +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Apagar arquivo ZIP +Install = Instalar +Install game from ZIP file? = Instalar o jogo do arquivo ZIP? +Install textures from ZIP file? = Instalar texturas do arquivo ZIP? +Installed! = Instalado! +Texture pack doesn't support install = O pacote das texturas não suporta a instalação +Zip archive corrupt = Arquivo compactado ZIP corrompido +Zip file does not contain PSP software = O arquivo ZIP não contém software do PSP + +[KeyMapping] +Autoconfigure = Auto-configurar +Autoconfigure for device = Auto-configurar pro dispositivo +Clear All = Limpar tudo +Default All = Restaurar os padrões +Map a new key for = Mapear uma nova tecla pra +Map Key = Mapear tecla +Map Mouse = Mapear no mouse +Test Analogs = Testar analógicos +You can press ESC to cancel. = Você pode pressionar o Esc pra cancelar. + +[MainMenu] +Browse = Procurar... +Buy PPSSPP Gold = Comprar PPSPP Gold +Choose folder = Escolher pasta +Credits = Créditos +PPSSPP Homebrew Store = Armazém dos Homebrews do PPSSPP +Exit = Sair +Game Settings = Configurações +Games = Jogos +Give PPSSPP permission to access storage = Dê ao PPSSPP permissão pra acessar a armazenagem +Homebrew & Demos = Homebrew && Demos +How to get games = Como eu posso obter jogos? +How to get homebrew & demos = Como eu posso obter homebrew && demos? +Load = Carregar... +Loading... = Carregando... +PinPath = Imobilizar +PPSSPP can't load games or save right now = O PPSSPP não consegue carregar jogos ou salvar agora +Recent = Recentes +SavesAreTemporary = O PPSSPP está salvando na armazenagem temporária +SavesAreTemporaryGuidance = Extraia o PPSSPP pra algum lugar pra salvar permanentemente +SavesAreTemporaryIgnore = Ignorar aviso +UnpinPath = Remover a imobilização +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Áudio +Controls = Controles +Graphics = Gráficos +Networking = Rede +System = Sistema +Tools = Ferramentas + +[MappableControls] +Alt speed 1 = Velocidade alternativa 1 +Alt speed 2 = Velocidade alternativa 2 +An.Down = Analógico pra Baixo +An.Left = Analógico pra Esquerda +An.Right = Analógico pra Direita +An.Up = Analógico pra Cima +Analog limiter = Limitador do analógico +Analog Stick = Analógico +Audio/Video Recording = Gravação de Áudio/Vídeo +Auto Analog Rotation (CCW) = Auto-rotação do analógico (CCW) +Auto Analog Rotation (CW) = Auto-rotação do analógico (CW) +AxisSwap = Trocar eixos +Circle = Círculo +Cross = Cruz +D-pad down = Direcional pra baixo +D-pad left = Direcional pra esquerda +D-pad right = Direcional pra direita +D-pad up = Direcional pra cima +DevMenu = Menu dos desenvolvedores +Down = Direcional pra Baixo +Dpad = Direcional +Frame Advance = Avançar frames +Hold = Segurar +Home = Home +L = E +Left = Esquerda +Load State = Carregar state +Mute toggle = Alternar pro mudo +Next Slot = Próximo slot +None = Nenhum +Note = Nota +OpenChat = Abrir o bate-papo +Pause = Pausar +R = D +RapidFire = Fogo Rápido +Remote hold = Segurar remoto +Rewind = Rebobinar +Right = Direicional pra Direita +Right Analog Stick (tap to customize) = Análogico direito (pressione pra customizar) +RightAn.Down = Analógico Direito pra Baixo +RightAn.Left = Analógico Direito pra Esquerda +RightAn.Right = Analógico Direito pra Direita +RightAn.Up = Analógico Direito pra Cima +Rotate Analog (CCW) = Rotacionar analógico (CCW) +Rotate Analog (CW) = Rotacionar analógico (CW) +Save State = Salvar state +Screen = Tela +Screenshot = Screenshot +Select = Selecionar +SpeedToggle = Alternar velocidade +Square = Quadrado +Start = Start +Texture Dumping = Dumpagem das texturas +Texture Replacement = Substituição das texturas +Toggle Fullscreen = Alternar pra Tela cheia +Toggle mode = Alternar modo +Triangle = Triângulo +Unthrottle = Desacelerador +Up = Direcional pra Cima +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Visite o fórum do Multiplayer Ad Hoc +AdHoc Server = Servidor Ad hoc +AdhocServer Failed to Bind Port = O servidor Ad hoc falhou em se conectar a porta +Auto = Auto +Bottom Center = Centro da parte de baixo +Bottom Left = Parte de baixo a esquerda +Bottom Right = Parte de baixo a direita +Center Left = Centralizado a esquerda +Center Right = Centralizado a direita +Change Mac Address = Mudar o endereço do MAC +Change proAdhocServer Address = Mudar o endereço de IP do servidor Ad Hoc PRO (localhost = múltiplas instâncias) +Chat = Bate-papo +Chat Button Position = Posição do botão de bate-papo +Chat Here = Bata-papo aqui +Chat Screen Position = Posição da tela de bate-papo +Disconnected from AdhocServer = Desconectado do servidor ad hoc +DNS Error Resolving = Resolução dos erros do DNS +Enable built-in PRO Adhoc Server = Ativar o servidor ad hoc PRO embutido +Enable network chat = Ativar bate-papo em rede +Enable networking = Ativar rede/WLAN (beta, pode quebrar os jogos) +Enable UPnP = Ativar UPnP (precisa de alguns segundos pra detectar) +EnableQuickChat = Ativar bate-papo rápido +Enter a new PSP nickname = Insira um novo apelido pro PSP +Enter Quick Chat 1 = Entrar no bate-papo rápido 1 +Enter Quick Chat 2 = Entrar no bate-papo rápido 2 +Enter Quick Chat 3 = Entrar no bate-papo rápido 3 +Enter Quick Chat 4 = Entrar no bate-papo rápido 4 +Enter Quick Chat 5 = Entrar no bate-papo rápido 5 +Error = Erro +Failed to Bind Localhost IP = Falhou em se conectar ao IP do hospedeiro local +Failed to Bind Port = Falhou em se conectar a porta +Failed to connect to Adhoc Server = Falhou em conectar ao servidor ad hoc +Forced First Connect = Primeira conexão forçada (conexão mais rápida) +Invalid IP or hostname = IP ou nome do hospedeiro inválido +Minimum Timeout = Tempo mínimo pra esgotar (substituição em ms, 0 = padrão) +Misc = Miscelânea (padrão = compatibilidade com o PSP) +Network Initialized = Rede inicializada +Please change your Port Offset = Por favor mude seu deslocamento da porta +Port offset = Deslocamento da porta (0 = Compatibilidade com o PSP) +proAdhocServer Address: = Endereço do servidor ad hoc: +Quick Chat 1 = Bate-papo rápido 1 +Quick Chat 2 = Bate-papo rápido 2 +Quick Chat 3 = Bate-papo rápido 3 +Quick Chat 4 = Bate-papo rápido 4 +Quick Chat 5 = Bate-papo rápido 5 +QuickChat = Bate-papo rápido +Send = Enviar +Send Discord Presence information = Enviar informação da "Presença Rica" pro Discord +TCP No Delay = Nenhum atraso pro TCP (TCP mais rápido) +Top Center = Centro superior +Top Left = Superior esquerdo +Top Right = Superior direito +Unable to find UPnP device = Incapaz de achar o dispositivo UPnP +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) +Validating address... = Validando endereço... +WLAN Channel = Canal do WLAN +You're in Offline Mode, go to lobby or online hall = Você está no modo offline, vá pro lobby ou sala online + +[Pause] +Cheats = Trapaças +Continue = Continuar +Create Game Config = Criar configuração do jogo +Delete Game Config = Apagar configuração do jogo +Exit to menu = Sair pro menu +Game Settings = Configurações do jogo +Load State = Carregar state +Rewind = Rebobinar +Save State = Salvar state +Settings = Configurações +Switch UMD = Trocar UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (configuração duplicada, o slider anterior será usado) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = Cores-AA +Amount = Quantidade +Black border = Borda preta +Bloom = Bloom +Brightness = Brilho +Cartoon = Cartoon +ColorCorrection = Correção das cores +Contrast = Contraste +CRT = Scanlines CRT +FXAA = Antialiasing do FXAA +Gamma = Gama +Grayscale = Tons de cinza +Intensity = Intensidade +InverseColors = Cores invertidas +Natural = Cores naturais +NaturalA = Cores naturais (sem borrão) +Off = Desligado +Power = Energia +PSPColor = Cor do PSP +Saturation = Saturação +Scanlines = Scanlines (CRT) +Sharpen = Aprimorado +SSAA(Gauss) = Super-amostragem AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Ampliador Spline36 +VideoSmoothingAA = Suavização de vídeo AA +Vignette = Vinheta + +[PSPCredits] +all the forum mods = Todos os moderadores do fórum +build server = Servidor dos builds +Buy Gold = Comprar Gold +check = Verifique também o Dolphin, o melhor emu de Wii/GC: +CheckOutPPSSPP = Veja o PPSSPP, o incrível emulador de PSP: https://www.ppsspp.org/ +contributors = Contribuidores: +created = Criado por +Discord = Discord +info1 = O PPSSPP é destinado só pra propósitos educacionais. +info2 = Por favor tenha certeza que você possua os direitos pra quaisquer jogos +info3 = Você joga possuindo o UMD ou comprando o digital +info4 = Baixe da loja PSN no seu PSP real. +info5 = O PSP é uma marca registrada da Sony, Inc. +iOS builds = Builds do iOS +license = Software livre sob o GPL 2.0+ +list = Listas de compatibilidade, fóruns e informações do desenvolvimento +PPSSPP Forums = Fóruns do PPSSPP +Privacy Policy = Política de privacidade +Share PPSSPP = Compartilhar o PPSSPP +specialthanks = Agradecimentos especiais: +specialthanksKeithGalocy = da NVIDIA (hardware, conselho) +specialthanksMaxim = pelo trabalho incrível dele com o decodificador Atrac3+ +testing = Testando +this translation by = Traduzido por: +title = Um emulador de PSP rápido e portátil +tools = Ferramentas grátis usadas: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = Papel, gabrielmop, Efraim Lopes, AkiraJkr +translators2 = Felipe +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Verifique o site da web: +written = Escrito em C++ pela velocidade e portabilidade + +[RemoteISO] +Browse Games = Procurar jogos +Local Server Port = Porta do servidor local +Manual Mode Client = Configurar o cliente manualmente +Remote disc streaming = Streaming remoto do disco +Remote Port = Porta remota +Remote Server = Servidor remoto +Remote Subdirectory = Sub-diretório remoto +RemoteISODesc = Jogos na sua lista de "Recentes" serão compartilhados +RemoteISOLoading = Conectado, carregando lista de jogos... +RemoteISOScanning = Escaneando... Cliqme em "compartilhar jogos" no seu dispositivo do servidor +RemoteISOScanningTimeout = Escaneando... Verifique sua configuração do firewall no desktop +RemoteISOWifi = Nota: Conecte os dois dispositivos na mesma rede Wi-Fi +RemoteISOWinFirewall = AVISO: O Firewall do Windows está bloqueando o compartilhamento +Settings = Configurações +Share Games (Server) = Compartilhar jogos (servidor) +Share on PPSSPP startup = Compartilhar na inicialização do PPSSPP +Stop Sharing = Parar compartilhamento +Stopping.. = Parando... + +[Reporting] +Bad = Ruim +FeedbackDelayInfo = Seus dados estão sendo submetidos em segundo plano. +FeedbackDesc = Como está a emulação? Deixe a comunidade e nós sabermos! +FeedbackDisabled = Os relatórios da compatibilidade com o servidor devem estar ativados. +FeedbackIncludeCRC = Nota: A bateria será usada pra enviar um CRC do disco +FeedbackIncludeScreen = Incluir um screenshot +FeedbackSubmitDone = Seus dados foram submetidos. +FeedbackSubmitFail = Não pôde sumeter os dados ao servidor. Tente atualizar o PPSSPP. +FeedbackThanks = Obrigado pelo seu feedback! +Gameplay = Jogabilidade +Graphics = Gráficos +Great = Ótimo +In-game = Dentro do jogo +In-game Description = Entra no jogo mas está muito bugado pra completar +Menu/Intro = Menu/Intro +Menu/Intro Description = Nâo consegue entrar no jogo +Nothing = Nada +Nothing Description = Completamente quebrado +OK = Ok +Open Browser = Abrir o site da web pra relatar +Overall = Geral +Perfect = Perfeito +Perfect Description = Emulação sem falhas no jogo inteiro - ótimo! +Plays = Jogável +Plays Description = Completamente jogável mas poderia estar com problemas gráficos +ReportButton = Reportar feedback +Speed = Velocidade +Submit Feedback = Submeter feedback +SuggestionConfig = Veja os relatórios no site da web pra obter configurações boas. +SuggestionCPUSpeed0 = Desativa a configuração da velocidade do clock travado da CPU. +SuggestionDowngrade = Retroceda pra uma versão mais antiga do PPSSPP (por favor reporte este bug). +SuggestionsFound = Outros usuários relataram resultados melhores. Pressione "Visualizar Feedback" pra mais detalhes. +SuggestionsNone = Este jogo não está funcionando com outros usuários também. +SuggestionsWaiting = Submetendo e verificando o feedback dos outros usuários... +SuggestionUpgrade = Atualize pra uma versão mais nova do PPSSPP. +SuggestionVerifyDisc = Verifique se sua ISO é uma cópia boa do seu disco. +Unselected Overall Description = Quão bem este jogo é emulado? +View Feedback = Visualizar todos os feedbacks + +[Savedata] +Date = Data +Filename = Nome do arquivo +No screenshot = Sem screenshot +None yet. Things will appear here after you save. = Nada ainda. As coisas aparecerão aqui após você salvar. +Save Data = Dados salvos +Save States = States salvos +Savedata Manager = Gerenciador dos dados dos saves +Size = Tamanho + +[Screen] +Cardboard VR OFF = Cardboard VR desligado +Chainfire3DWarning = AVISO: Chainfire3D detectado, pode causar problemas. +Failed to load state = Falhou em carregar o state +Failed to save state = Falhou em salvar o state +fixed = Velocidade: alternativa +GLToolsWarning = AVISO: GLTools detectado, pode causar problemas. +In menu = No menu +Load savestate failed = Falhou em carregar o state +Loaded State = State carregado +Loaded. Save in game, restart, and load for less bugs. = Carregado. Salve no jogo, reinicie e carregue pra menos bugs. +LoadStateDoesntExist = Falhou em carregar o state: O state salvo não existe! +LoadStateWrongVersion = Falhou em carregar o state: O state salvo é de uma versão mais velha do PPSSPP! +norewind = Não há states salvos pra rebobinar disponíveis. +Playing = Jogando +PressESC = Pressione ESC pra abrir o menu de pausa. +replaceTextures_false = As texturas não estão mais sendo substituídas. +replaceTextures_true = A substituição das texturas está ativada. +Save State Failed = Falhou em salvar o state! +Saved State = State salvo +saveNewTextures_false = O salvamento das texturas foi desativado. +saveNewTextures_true = As texturas agora serão salvas no seu armazenamento. +SpeedCustom2 = Velocidade: alternativa 2 +standard = Velocidade: padrão +Untitled PSP game = Jogo de PSP sem título + +[Store] +Already Installed = Já instalado +Connection Error = Erro de conexão +Install = Instalar +Launch Game = Iniciar jogo +Loading... = Carregando... +MB = MBs +Size = Tamanho +Uninstall = Desinstalar + +[SysInfo] +%d (%d per core, %d cores) = %d (%d por núcleo, %d núcleos) +%d bytes = %d bytes +(none detected) = (nenhum detectado) +3D API = API 3D +ABI = Arquitetura +API Version = Versão da API +Audio Information = Informação do áudio +Board = Placa +Build Config = Config do build +Build Configuration = Configuração do build +Built by = Compilado por +Core Context = Contexto do núcleo +Cores = Núcleos +CPU Extensions = Extensões da CPU +CPU Information = Informações da CPU +CPU Name = Nome +D3DCompiler Version = Versão do compilador D3D +Debug = Debug +Debugger Present = Debugger presente +Device Info = Info do dispositivo +Display Information = Informação da tela +Driver Version = Versão do driver +EGL Extensions = Extensões do EGL +Frames per buffer = Frames por buffer +GPU Information = Informações da GPU +High precision float range = Alcance da flutuação de alta precisão +High precision int range = Alcance da integral de alta precisão +Lang/Region = Idioma/Região +Memory Page Size = Tamanho da página de memória +Native Resolution = Resolução nativa +OGL Extensions = Extensões do OGL +OpenGL ES 2.0 Extensions = Extensões do OpenGL 2.0 +OpenGL ES 3.0 Extensions = Extensões do OpenGL 3.0 +OpenGL Extensions = Extensões do OpenGL +Optimal frames per buffer = Melhores frames por buffer +Optimal sample rate = Melhor taxa de amostragem +OS Information = Informação do sistema operacional +PPSSPP build = Build do PPSSPP +Refresh rate = Taxa de atualização +Release = Lançamento +RW/RX exclusive = Exclusivo RW/RX +Sample rate = Taxa de amostragem +Shading Language = Idioma do shader +Sustained perf mode = Modo de performace sustentado +System Information = Informação do sistema +System Name = Nome +System Version = Versão do sistema +Threads = Threads +Vendor = Vendedor +Vendor (detected) = Vendedor (detectado) +Version Information = Informação da versão +Vulkan Extensions = Extensões do Vulkan +Vulkan Features = Características do Vulkan + +[System] +(broken) = (quebrado) +12HR = 12 HRs +24HR = 24 HRs +Auto = Auto +Auto Load Savestate = Auto-carregar state salvo +AVI Dump started. = Dump do AVI iniciado +AVI Dump stopped. = Dump do AVI parado +Cache ISO in RAM = Pôr no cache a ISO inteira na RAM +Change CPU Clock = Mudar clock da CPU do PSP emulado (instável) +Change Memory Stick folder = Mudar a pasta do cartão de memória +Change Memory Stick Size = Mudar o tamanho do cartão de memória (GBs) +Change Nickname = Mudar apelido +ChangingMemstickPath = Jogos salvos, states salvos e outros dados não serão copiados pra esta pasta.\n\nMudar a pasta do cartão de memória? +ChangingMemstickPathInvalid = Esse caminho não pôde ser usado pra salvar os arquivos do cartão de memória. +ChangingMemstickPathNotExists = Essa pasta não existe ainda.\n\nJogos salvos, states salvos e outros dados não serão copiados pra esta pasta.\n\nCriar uma nova pasta do cartão de memória? +Cheats = Trapaças (experimental, veja os fóruns) +Clear Recent = Limpar "Recentes" +Clear Recent Games List = Limpar lista dos "Recentes" +Clear UI background = Limpar 2º plano da interface do usuário +Confirmation Button = Botão de confirmação +Date Format = Formato da data +Day Light Saving = Horário de verão +DDMMYYYY = DDMMAAAA +Decrease size = Diminuir tamanho +Developer Tools = Ferramentas do desenvolvedor +Display Extra Info = Exibir informação extra +Display Games on a grid = Exibir "Jogos" numa grade +Display Homebrew on a grid = Exibir "Homebrew && Demos" numa grade +Display Recent on a grid = Exibir "Recentes" numa grade +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emulação +Enable Cheats = Ativar trapaças +Enable Compatibility Server Reports = Ativar relatórios de compatibilidade com o servidor +Failed to load state. Error in the file system. = Falhou em carregar o state. Erro no sistema de arquivos. +Failed to save state. Error in the file system. = Falhou em salvar o state. Erro no sistema de arquivos. +Fast (lag on slow storage) = Rápido (atraso na armazenagem lenta) +Fast Memory = Memória rápida (instável) +Force real clock sync (slower, less lag) = Forçar sincronização com relógio real (mais lento, menos atrasos) +frames, 0:off = frames, 0 = desligado +Games list settings = Configurações da lista de jogos +General = Geral +Grid icon size = Tamanho do ícone da grade +Help the PPSSPP team = Ajude o time do PPSSPP +Host (bugs, less lag) = Hospedeiro (bugs, menos atrasos) +I/O on thread (experimental) = E/S no thread (experimental) +Ignore bad memory accesses = Ignorar acessos ruins da memória +Increase size = Aumentar tamanho +Interpreter = Intérprete +IO timing method = Método do tempo de E/S +IR Interpreter = Intérprete do IR +Memory Stick Folder = Pasta do cartão de memória +Memory Stick inserted = Cartão de memória inserido +MHz, 0:default = MHz, 0 = padrão +MMDDYYYY = MMDDAAAA +Newest Save = Save mais novo +Not a PSP game = Não é um jogo de PSP +Off = Desligado +Oldest Save = Save mais antigo +PSP Model = Modelo do PSP +PSP Settings = Configurações do PSP +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Gravar áudio +Record Display = Gravar tela +Reset Recording on Save/Load State = Resetar a gravação ao salvar/carregar o state +Restore Default Settings = Restaurar as configurações do PPSPP para os padrões +Rewind Snapshot Frequency = Rebobinar frequência dos snapshots (consome memória) +Save path in installed.txt = Salvar o caminho em installed.txt +Save path in My Documents = Salvar o caminho em Meus Documentos +Savestate Slot = Slot do state salvo +Savestate slot backups = Backups dos slots dos states salvos +Screenshots as PNG = Salvar screenshots no formato PNG +Set UI background... = Definir 2º plano da interface do usuário... +Show ID = Mostrar ID +Show region flag = Mostrar bandeira da região +Simulate UMD delays = Simular atrasos do UMD +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Armazenamento cheio +Sustained performance mode = Modo de performace sustentado +Time Format = Formato da hora +UI Language = Idioma da interface do usuário +UI Sound = Som da interface do usuário +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Usar codec de vídeo sem perda (FFV1) +Use O to confirm = Usar O como botão de confirmação +Use output buffer (with overlay) for recording = Usar buffer de saída (com sobreposição) pra gravação +Use system native keyboard = Usar teclado nativo do sistema +Use X to confirm = Usar X como botão de confirmação +VersionCheck = Procurar novas versões do PPSPP +WARNING: Android battery save mode is on = AVISO: O modo de economia da bateria do Android está Ligado +WARNING: Battery save mode is on = AVISO: O modo de economia da bateria está Ligado +YYYYMMDD = AAAAMMDD + +[Upgrade] +Details = Detalhes +Dismiss = Ignorar +Download = Baixar +New version of PPSSPP available = Uma nova versão do PPSSPP está disponível diff --git a/assets/lang/pt_PT.ini b/assets/lang/pt_PT.ini new file mode 100644 index 0000000000..425a0004a0 --- /dev/null +++ b/assets/lang/pt_PT.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = API de áudio (requer reiniciar) +AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) +Auto = Auto +Device = Device +DSound (compatible) = DSound (compatível) +Enable Sound = Activar som +Global volume = Global volume +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = WASAPI (rápido) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Analog axis sensitivity +Analog Limiter = Limitador do analógico +Analog Mapper High End = Mapeamento max do analógico (sensibilidade dos eixos) +Analog Mapper Low End = Mapeamento min do analógico (zona não coberta inversa) +Analog Mapper Mode = Modo de mapamento do analógico +Analog Stick = Analógico +AnalogLimiter Tip = When the analog limiter button is pressed +Auto = Auto +Auto-centering analog stick = Auto-centralização do analógico +Auto-hide buttons after seconds = Auto-hide buttons after seconds +Binds = Binds +Button Opacity = Opacidade dos botões +Button style = Estilo dos botões +Calibrate D-Pad = Calibrar D-Pad +Calibration = Calibração +Classic = Clássico +Combo Key Setting = Combo key setting +Combo Key Setup = Combo key setup +Confine Mouse = Trap mouse within window/display area +Control Mapping = Mapeamento dos Controlos +Custom layout... = Editar disposição dos controlos de toque... +Customize tilt = Personalizar inclinação... +D-PAD = D-Pad +Deadzone Radius = Raio não coberto +DInput Analog Settings = Configurações do analógico DInput +Disable D-Pad diagonals (4-way touch) = Desactivar diagonais do D-Pad (4 direcções) +Glowing borders = Glowing borders +HapticFeedback = Resposta háptica (vibração) +Ignore gamepads when not focused = Ignorar controladores quando não focado +Ignore Windows Key = Ignorar a tecla Windows +Invert Axes = Inverter eixos +Invert Tilt along X axis = Inverter inclinação no eixo X +Invert Tilt along Y axis = Inverter inclinação no eixo Y +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Configurações do teclado +L/R Trigger Buttons = L/R trigger buttons +Landscape = Panorâmico +Landscape Auto = Landscape auto +Landscape Reversed = Panorâmico invertido +Mouse = Mouse settings +Mouse sensitivity = Mouse sensitivity +Mouse smoothing = Mouse smoothing +MouseControl Tip = You can now map mouse in control mapping screen by pressing the 'M' icon. +None (Disabled) = Nenhum (desactivado) +Off = Desligado +OnScreen = Controlos no ecrã +Portrait = Retrato +Portrait Reversed = Retrato invertido +PSP Action Buttons = Botões de acção da PSP +Screen Rotation = Rotação do ecrã +seconds, 0 : off = seconds, 0 = off +Sensitivity = Sensibilidade +Show right analog = Show right analog +Show Touch Pause Menu Button = Mostrar botão de menu de pausa +Thin borders = Bordas finas +Tilt Base Radius = Tilt base radius +Tilt Input Type = Tipo de input de inclinação +Tilt Sensitivity along X axis = Sensibilidade da inclinação no eixo X +Tilt Sensitivity along Y axis = Sensibilidade da inclinação no eixo Y +To Calibrate = Para calibrar, mantenha o dispositivo numa superfície plana e pressione "Calibrar". +Touch Control Visibility = Touch control visibility +Use custom right analog = Use custom right analog +Use Mouse Control = Use mouse control +Visibility = Visib. +X = X +X + Y = X + Y +XInput Analog Settings = Configurações de analógico XInput +Y = Y + +[CwCheats] +Cheats = Cheats +Edit Cheat File = Editar ficheiro de cheats +Enable/Disable All = Activar/Desactivar todos os Cheats +Import Cheats = Importar de cheat.db +Options = Opções +Refresh Rate = Taxa de refrescamento + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = &About PPSSPP... +Auto = &Auto +Backend = Rendering &Backend (Restarts PPSSPP) +Bicubic = &Bicubic +Break = Break +Break on Load = Break on load +Buffered Rendering = &Buffered Rendering +Buy Gold = Buy &Gold +Control Mapping... = C&ontrol Mapping... +Debugging = &Debug +Deposterize = &Deposterize +Direct3D9 = &Direct3D9 +Direct3D11 = Direct3D &11 +Disassembly = &Disassembly... +Discord = Discord +Display Layout Editor = Display layout editor... +Display Rotation = Display rotation +Dump Next Frame to Log = D&ump Next Frame to Log +Emulation = &Emulation +Enable Chat = Enable chat +Enable Cheats = Enable &Cheats +Enable Sound = Enable S&ound +Exit = E&xit +Extract File... = E&xtract File... +File = &File +Frame Skipping = &Frame skipping +Frame Skipping Type = Frame skipping type +Fullscreen = Fu&llscreen +Game Settings = &Game Settings +GE Debugger... = GE Debugge&r... +GitHub = Git&Hub +Hardware Transform = &Hardware Transform +Help = &Help +Hybrid = &Hybrid +Hybrid + Bicubic = H&ybrid + Bicubic +Ignore Illegal Reads/Writes = &Ignore Illegal Reads/Writes +Ignore Windows Key = Ignore Windows Key +Keep PPSSPP On Top = &Keep PPSSPP on Top +Landscape = Landscape +Landscape reversed = Landscape reversed +Language... = La&nguage... +Linear = &Linear +Load = &Load... +Load .sym File... = Lo&ad .sym File... +Load Map File... = Load &Map File... +Load State = L&oad State +Load State File... = &Load State File... +Log Console = &Log Console +Memory View... = Memory &View... +More Settings... = &More Settings... +Nearest = &Nearest +Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) +Off = &Off +Open Directory... = Open &Directory... +Open from MS:/PSP/GAME... = O&pen from MS:/PSP/GAME... +Open Memory Stick = Open &Memory Stick +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = &Pause +Pause When Not Focused = &Pause When Not Focused +Portrait = Portrait +Portrait reversed = Portrait reversed +Postprocessing Shader = Postprocessin&g Shader +PPSSPP Forums = PPSSPP &Forums +Record = &Record +Record Audio = Record &audio +Record Display = Record &display +Rendering Mode = Rendering M&ode +Rendering Resolution = &Rendering Resolution +Reset = R&eset +Reset Symbol Table = Reset S&ymbol Table +Run = &Run +Save .sym File... = Sav&e .sym File... +Save Map File... = &Save Map File... +Save State = S&ave State +Save State File... = &Save State File... +Savestate Slot = Saves&tate Slot +Screen Scaling Filter = Scr&een Scaling Filter +Show Debug Statistics = Show Debu&g Statistics +Show FPS Counter = Show &FPS Counter +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = &Stop +Switch UMD = Switch UMD +Take Screenshot = &Take Screenshot +Texture Filtering = Te&xture Filtering +Texture Scaling = &Texture Scaling +Use Lossless Video Codec (FFV1) = &Use lossless video codec (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = &Vertex Cache +VSync = VS&ync +Vulkan = Vulkan +Window Size = &Window Size +www.ppsspp.org = Visit www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allocator viewer (Vulkan) +Allow remote debugger = Allow remote debugger +Backspace = Backspace +Block address = Endereço do bloco +By Address = Por endereço +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Create/Open textures.ini file for current game +Current = Actual +Dev Tools = Development tools +DevMenu = DevMenu +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Despejar o EBOOT.BIN desencriptado no arranque do jogo +Dump Frame GPU Commands = Despejar comandos de fotogramas do GPU +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Activar log de depuração +Enter address = Introduzir endereço +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Frame profiler +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = Comparar jit +JIT debug tools = JIT debug tools +Language = Linguagem +Load language ini = Carregar ini de linguagem +Log Dropped Frame Statistics = Log dropped frame statistics +Log Level = Nível de log +Log View = Vista de log +Logging Channels = Canais de log +Next = Próximo +No block = Nenhum bloco +Prev = Anterior +Random = Aleatório +Replace textures = Replace textures +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Tem a certeza que deseja restaurar todas as configurações para as suas pre-definições?\nOs mapeamentos de controlos não serão revertidos.\n\nNão poderá reverter esta acção.\nPor favor reinicie o PPSSPP para as modificações terem efeito. +RestoreGameDefaultSettings = Tem a certeza que deseja restaurar as configurações\nespecíficas do jogo para as pre-definições do PPSSPP? +Resume = Resume +Run CPU Tests = Executar testes de CPU +Save language ini = Gravar ini de linguagem +Save new textures = Save new textures +Shader Viewer = Shader viewer +Show Developer Menu = Mostrar menu do programador +Show on-screen messages = Show on-screen messages +Stats = Estatísticas +System Information = Informação do sistema +Texture Replacement = Texture replacement +Toggle Audio Debug = Alternar depuração de áudio +Toggle Freeze = Alternar congelamento +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP res +Active = Active +Back = Voltar +Cancel = Cancelar +Center = Center +ChangingGPUBackends = Alterar a API de GPU requer que o PPSSPP reinicie.\nReiniciar agora? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = Escolher pasta de gravação do PPSSPP +Confirm Overwrite = Deseja substituir estes dados? +Confirm Save = Deseja gravar estes dados? +ConfirmLoad = Carregar estes dados? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Apagar +Delete all = Apagar tudo +Delete completed = Apagado com sucesso! +DeleteConfirm = Estes dados de gravação serão apagados. Tem a certeza que quer continuar? +DeleteConfirmAll = Tem a certeza que deseja apagar\ntodos os seus dados gravados deste jogo? +DeleteConfirmGame = Tem a certeza que deseja apagar\neste jogo? Não poderá reverter esta acção. +DeleteConfirmGameConfig = Tem a certeza que deseja\napagar as configurações para este jogo? +DeleteFailed = Erro ao apagar dados. +Deleting = A apagar, aguarde... +Disable All = Disable all +Edit = Edit +Enable All = Enable all +Enter = Aceitar +Finish = Terminar +Grid = Grid +Inactive = Inactive +InternalError = An internal error has occurred. +Load = Carregar +Load completed = Carregado com sucesso! +Loading = A carregar +LoadingFailed = Erro ao carregar dados. +Move = Mover +Network Connection = Ligação de rede +NEW DATA = Novos dados +No = Não +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = OK +Old savedata detected = Dados gravados antigos detectados +Options = Options +Reset = Reiniciar +Resize = Redimensionar +Retry = Tentar novamente +Save = Gravar +Save completed = Gravação concluída +Saving = A gravar jogo, aguarde... +SavingFailed = Erro ao gravar dados. +Select = Seleccionar +Shift = Shift +Snap = Snap +Space = Espaço +SSID = SSID +Submit = Submeter +Supported = Supported +There is no data = Não há dados +Toggle All = Marcar todos +Toggle List = Toggle list +Unsupported = Unsupported +When you save, it will load on a PSP, but not an older PPSSPP = Quando gravar, os dados vão carregar numa PSP, mas não num PPSSPP antigo. +When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Yes = Sim +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = file is compressed (7z).\nPlease decompress first (try 7-Zip or WinRAR). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = Could not save screenshot file. +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll not found. Please install. Or press Yes to try again using Direct3D 9 instead. +D3D11InitializationError = Direct3D 11 initialization error +D3D11Missing = Your operating system version does not include D3D11. Please run Windows Update.\n\nPress Yes to try again using Direct3D 9 instead. +D3D11NotSupported = Your GPU does not appear to support Direct3D 11.\n\nWould you like to try again using Direct3D 9 instead? +Disk full while writing data = Disk full while writing data. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = Could not load game. +Error reading file = error reading file. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = failed to identify file. +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Failed initializing graphics. Try upgrading your graphics drivers and DirectX 9 runtime.\n\nWould you like to try switching to OpenGL?\n\nError message: +GenericGraphicsError = Graphics Error +GenericOpenGLError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to DirectX 9?\n\nError message: +GenericVulkanError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to OpenGL?\n\nError message: +InsufficientOpenGLDriver = Insufficient OpenGL driver support detected!\n\nYour GPU reports that it does not support OpenGL 2.0. Would you like to try using DirectX instead?\n\nDirectX is currently compatible with less games, but on your GPU it may be the only choice.\n\nVisit the forums at https://forums.ppsspp.org for more information.\n\n +Just a directory. = just a directory. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = no EBOOT.PBP, misidentified game. +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = OpenGL driver error +PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP currently does not support connecting to the Internet for DLC, PSN, or game updates. +PS1 EBOOTs are not supported by PPSSPP. = PS1 EBOOTs are not supported by PPSSPP. +PSX game image detected. = File is a MODE2 image. PPSSPP doesn't support PS1 games. +RAR file detected (Require UnRAR) = file is compressed (RAR).\nPlease decompress first (try UnRAR). +RAR file detected (Require WINRAR) = file is compressed (RAR).\nPlease decompress first (try WinRAR). +Running slow: try frameskip, sound is choppy when slow = Running slow: try frameskip, sound is choppy when slow +Running slow: Try turning off Software Rendering = Running slow: try turning off "software rendering" +Save encryption failed. This save won't work on real PSP = Save encryption failed. This save won't work on real PSP +textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +This is a saved state, not a game. = This is a saved state, not a game. +This is save data, not a game. = This is save data, not a game. +Unable to create cheat file, disk may be full = Unable to create cheat file, disk may be full. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Unable to write savedata, disk may be full. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Warning: Video memory FULL, reducing upscaling and switching to slow caching mode. +Warning: Video memory FULL, switching to slow caching mode = Warning: Video memory FULL, switching to slow caching mode. +ZIP file detected (Require UnRAR) = file is compressed (ZIP).\nPlease decompress first (try UnRAR). +ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompress first (try WinRAR). + +[Game] +Asia = Asia +ConfirmDelete = Eliminar +Create Game Config = Criar configuração do jogo +Create Shortcut = Criar atalho +Delete Game = Eliminar jogo +Delete Game Config = Eliminar configuração do jogo +Delete Save Data = Eliminar dados gravados +Europe = Europe +Game = Jogo +Game Settings = Configurações do jogo +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Instalação de dados +Japan = Japan +Korea = Korea +MB = MB +One moment please... = One moment please... +Play = Jogar +Remove From Recent = Remover de "Recentes" +SaveData = Dados gravados +Setting Background = Setting background +Show In Folder = Mostrar na pasta +USA = USA +Use UI background = Use UI background + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = unlimited +(supersampling) = (supersampling) +(upscaling) = (upscaling) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Aggressive +Alternative Speed = Alternative speed (in %, 0 = unlimited) +Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Anisotropic Filtering = Anisotropic filtering +Auto = Auto +Auto (1:1) = Auto (1:1) +Auto (same as Rendering) = Auto (same as rendering resolution) +Auto FrameSkip = Auto frameskip +Auto Scaling = Auto scaling +Backend = Backend +Balanced = Balanced +Bicubic = Bicubic +BlockTransfer Tip = Some games require this to be On for correct graphics +BlockTransferRequired = Warning: This game requires "simulate block transfer effects" to be set to On. +Both = Both +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Renderizar buffers +BufferedRenderingRequired = Warning: This game requires "rendering mode" to be set to "buffered". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Screen size (in % of the viewport) +Cardboard Screen X Shift = X shift (in % of the blank space) +Cardboard Screen Y Shift = Y shift (in % of the blank space) +Cardboard VR Settings = Google Cardboard VR settings +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU core +Debugging = Debugging +DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. +Deposterize = Deposterize +Deposterize Tip = Fixes visual banding glitches in upscaled textures +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Disable slower effects (speedup) +Disabled = Disabled +Display layout editor = Display layout editor +Display Resolution (HW scaler) = Display resolution (HW scaler) +Dump next frame to log = Dump next frame to log +Enable Cardboard VR = Enable Cardboard VR +FPS = FPS +Frame Rate Control = Framerate control +Frame Skipping = Saltar fotogramas +Frame Skipping Type = Frame skipping type +FullScreen = Fullscreen +Hack Settings = Hack settings (may cause glitches) +Hardware Tessellation = Hardware tessellation +Hardware Transform = Transformação por Hardware +hardware transform error - falling back to software = Hardware transform error, falling back to software +HardwareTessellation Tip = Uses hardware to make curves +High = High +Hybrid = Hybrid +Hybrid + Bicubic = Hybrid + Bicubic +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Internal resolution +Lazy texture caching = Lazy texture caching (speedup) +Linear = Linear +Low = Low +LowCurves = Spline/Bezier curves quality +LowCurves Tip = Only used by some games, controls smoothness of curves +Lower resolution for effects (reduces artifacts) = Lower resolution for effects (reduces artifacts) +Manual Scaling = Manual scaling +Medium = Medium +Mode = Mode +Must Restart = You must restart PPSSPP for this change to take effect. +Native device resolution = Native device resolution +Nearest = Nearest +No buffer = No buffer +Non-Buffered Rendering = Skip buffer effects (non-buffered, faster) +None = None +Number of Frames = Number of frames +Off = Off +OpenGL = OpenGL +Overlay Information = Overlay information +Partial Stretch = Partial stretch +Percent of FPS = Percent of FPS +Performance = Performance +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Postprocessing shader +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = Rendering mode +Rendering Resolution = Rendering resolution +RenderingMode NonBuffered Tip = Faster, but nothing may draw in some games +Retain changed textures = Retain changed textures (sometimes slower) +RetainChangedTextures Tip = Makes many games slower, but some games a lot faster +Rotation = Rotation +Safe = Safe +Screen layout = Screen layout +Screen Scaling Filter = Screen scaling filter +Show Debug Statistics = Show debug statistics +Show FPS Counter = Show FPS counter +Simulate Block Transfer = Simulate block transfer effects +SoftGPU Tip = Currently VERY slow +Software Rendering = Software rendering (experimental) +Software Skinning = Software skinning +SoftwareSkinning Tip = Combine skinned model draws on the CPU, faster in most games +Speed = Speed +Stretching = Stretching +Texture Filter = Texture filtering +Texture Filtering = Texture filtering +Texture Scaling = Texture scaling +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Turn off "hardware tessellation": unsupported +Unlimited = Unlimited +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = Upscale level +Upscale Type = Upscale type +UpscaleLevel Tip = CPU heavy - some scaling may be delayed to avoid stutter +Use all displays = Use all displays +Vertex Cache = Vertex Cache +VertexCache Tip = Faster, but may cause temporary flicker +VSync = VSync +Vulkan = Vulkan +Window Size = Window size +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Delete ZIP file +Install = Install +Install game from ZIP file? = Install game from ZIP file? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = Installed! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = Auto configure +Autoconfigure for device = Autoconfigure for device +Clear All = Clear all +Default All = Restore defaults +Map a new key for = Map a new key for +Map Key = Map key +Map Mouse = Map mouse +Test Analogs = Test analogs +You can press ESC to cancel. = You can press Esc to cancel. + +[MainMenu] +Browse = Browse... +Buy PPSSPP Gold = Buy PPSSPP Gold +Choose folder = Choose folder +Credits = Créditos +PPSSPP Homebrew Store = PPSSPP Homebrew Store +Exit = Sair +Game Settings = Settings +Games = Games +Give PPSSPP permission to access storage = Give PPSSPP permission to access storage +Homebrew & Demos = Homebrew && Demos +How to get games = How can I get games? +How to get homebrew & demos = How can I get homebrew && demos? +Load = Carregar +Loading... = Loading... +PinPath = Pin +PPSSPP can't load games or save right now = PPSSPP can't load games or save right now +Recent = Recente +SavesAreTemporary = PPSSPP is saving in temporary storage +SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently +SavesAreTemporaryIgnore = Ignore warning +UnpinPath = Unpin +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Áudio +Controls = Controlos +Graphics = Gráficos +Networking = Networking +System = Sistema +Tools = Tools + +[MappableControls] +Alt speed 1 = Alt speed 1 +Alt speed 2 = Alt speed 2 +An.Down = Analog Down +An.Left = Analog Left +An.Right = Analog Right +An.Up = Analog Up +Analog limiter = Analog limiter +Analog Stick = Analog stick +Audio/Video Recording = Audio/Video recording +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Axis swap +Circle = Circle +Cross = Cross +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = DevMenu +Down = Dpad Down +Dpad = Dpad +Frame Advance = Frame advance +Hold = Hold +Home = Home +L = L +Left = Dpad Left +Load State = Load State +Mute toggle = Mute toggle +Next Slot = Next Slot +None = None +Note = Note +OpenChat = Open chat +Pause = Pause +R = R +RapidFire = Rapid-fire +Remote hold = Remote hold +Rewind = Rewind +Right = Dpad Right +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = RightAn.Down +RightAn.Left = RightAn.Left +RightAn.Right = RightAn.Right +RightAn.Up = RightAn.Up +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Save State +Screen = Screen +Screenshot = Screenshot +Select = Select +SpeedToggle = Speed toggle +Square = Square +Start = Start +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = Toggle fullscreen +Toggle mode = Toggle mode +Triangle = Triangle +Unthrottle = Unthrottle +Up = Dpad Up +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Change MAC address +Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable network chat = Enable network chat +Enable networking = Enable networking/WLAN (beta, may break games) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Network initialized +Please change your Port Offset = Please change your port offset +Port offset = Port offset(0 = PSP compatibility) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Send Discord "Rich Presence" information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = Cheats +Continue = Continuar +Create Game Config = Create game config +Delete Game Config = Delete game config +Exit to menu = Exit to menu +Game Settings = Game settings +Load State = Carregar Estado +Rewind = Rewind +Save State = Salvar Estado +Settings = Configurações +Switch UMD = Switch UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Color +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Cartoon +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT scanlines +FXAA = FXAA Antialiasing +Gamma = Gamma +Grayscale = Grayscale +Intensity = Intensity +InverseColors = Inverse Colors +Natural = Natural Colors +NaturalA = Natural Colors (no blur) +Off = Off +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlines (CRT) +Sharpen = Sharpen +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 Upscaler +VideoSmoothingAA = VideoSmoothingAA +Vignette = Vignette + +[PSPCredits] +all the forum mods = all the forum mods +build server = build server +Buy Gold = Buy Gold +check = Also check out Dolphin, the best Wii/GC emu around: +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = Contributors: +created = Created by +Discord = Discord +info1 = PPSSPP is intended for educational purposes only. +info2 = Please make sure that you own the rights to any games +info3 = you play by owning the UMD or by buying the digital +info4 = download from the PSN store on your real PSP. +info5 = PSP is a trademark by Sony, Inc. +iOS builds = iOS builds +license = Free software under GPL 2.0+ +list = compatibility lists, forums, and development info +PPSSPP Forums = PPSSPP Forums +Privacy Policy = Privacy policy +Share PPSSPP = Share PPSSPP +specialthanks = Special thanks to: +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = this translation by: +title = A fast and portable PSP emulator +tools = Free tools used: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = +translators2 = +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Check out the website: +written = Written in C++ for speed and portability + +[RemoteISO] +Browse Games = Browse games +Local Server Port = Local server port +Manual Mode Client = Manual mode client +Remote disc streaming = Remote disc streaming +Remote Port = Remote port +Remote Server = Remote server +Remote Subdirectory = Remote subdirectory +RemoteISODesc = Games in your recent list will be shared +RemoteISOLoading = Connected, loading game list... +RemoteISOScanning = Scanning... Click "share games" on your server device +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Note: Connect both devices to the same Wi-Fi network +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Settings +Share Games (Server) = Share games (server) +Share on PPSSPP startup = Share on PPSSPP startup +Stop Sharing = Stop sharing +Stopping.. = Stopping... + +[Reporting] +Bad = Bad +FeedbackDelayInfo = Your data is being submitted in the background. +FeedbackDesc = How's the emulation? Let us and the community know! +FeedbackDisabled = Compatibility server reports must be enabled. +FeedbackIncludeCRC = Note: Battery will be used to send a disc CRC +FeedbackIncludeScreen = Include a screenshot +FeedbackSubmitDone = Your data has been submitted. +FeedbackSubmitFail = Could not submit data to server. Try updating PPSSPP. +FeedbackThanks = Thanks for your feedback! +Gameplay = Gameplay +Graphics = Graphics +Great = Great +In-game = In-game +In-game Description = Gets into gameplay, but too buggy to complete +Menu/Intro = Menu/Intro +Menu/Intro Description = Can't get into the game itself +Nothing = Nothing +Nothing Description = Completely broken +OK = OK +Open Browser = Open browser +Overall = Overall +Perfect = Perfect +Perfect Description = Flawless emulation for the entire game - great! +Plays = Plays +Plays Description = Fully playable but might be with glitches +ReportButton = Report feedback +Speed = Speed +Submit Feedback = Submit feedback +SuggestionConfig = See reports on website for good settings. +SuggestionCPUSpeed0 = Disable locked CPU speed setting. +SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this bug). +SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. +SuggestionsNone = This game isn't working for other users too. +SuggestionsWaiting = Submitting and checking other users feedback... +SuggestionUpgrade = Upgrade to a newer PPSSPP build. +SuggestionVerifyDisc = Check your ISO is a good copy of your disc. +Unselected Overall Description = How well does this game emulate? +View Feedback = View all feedbacks + +[Savedata] +Date = Date +Filename = Filename +No screenshot = No screenshot +None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Save Data = Save data +Save States = Save states +Savedata Manager = Savedata manager +Size = Size + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = WARNING: Chainfire3D detected, may cause problems. +Failed to load state = Failed to load state +Failed to save state = Failed to save state +fixed = Speed: alternate +GLToolsWarning = WARNING: GLTools detected, may cause problems. +In menu = In menu +Load savestate failed = Load savestate failed +Loaded State = State loaded +Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +LoadStateDoesntExist = Failed to load state: Savestate doesn't exist! +LoadStateWrongVersion = Failed to load state: Savestate is for an older version of PPSSPP! +norewind = No rewind save states available. +Playing = Playing +PressESC = Press ESC to open the pause menu. +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = Failed to save state! +Saved State = State saved +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Speed: alternate 2 +standard = Speed: standard +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = Já instalado +Connection Error = Erro de conexão +Install = Instalar +Launch Game = Lançar jogo +Loading... = A carregar... +MB = MB +Size = Tamanho +Uninstall = Desinstalar + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d cores) +%d bytes = %d bytes +(none detected) = (none detected) +3D API = 3D API +ABI = ABI +API Version = API version +Audio Information = Audio information +Board = Board +Build Config = Build config +Build Configuration = Build Configuration +Built by = Built by +Core Context = Core context +Cores = Cores +CPU Extensions = CPU extensions +CPU Information = CPU information +CPU Name = Name +D3DCompiler Version = D3DCompiler version +Debug = Debug +Debugger Present = Debugger present +Device Info = Device info +Display Information = Display information +Driver Version = Driver version +EGL Extensions = EGL extensions +Frames per buffer = Frames per buffer +GPU Information = GPU information +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Lang/Region +Memory Page Size = Memory page size +Native Resolution = Native resolution +OGL Extensions = OGL extensions +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 extensions +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 extensions +OpenGL Extensions = OpenGL extensions +Optimal frames per buffer = Optimal frames per buffer +Optimal sample rate = Optimal sample rate +OS Information = OS information +PPSSPP build = PPSSPP build +Refresh rate = Refresh rate +Release = Release +RW/RX exclusive = RW/RX exclusive +Sample rate = Sample rate +Shading Language = Shading language +Sustained perf mode = Sustained perf mode +System Information = System information +System Name = Name +System Version = System version +Threads = Threads +Vendor = Vendor +Vendor (detected) = Vendor (detected) +Version Information = Version information +Vulkan Extensions = Vulkan extensions +Vulkan Features = Vulkan features + +[System] +(broken) = (broken) +12HR = 12HR +24HR = 24HR +Auto = Auto +Auto Load Savestate = Auto load savestate +AVI Dump started. = AVI dump started +AVI Dump stopped. = AVI dump stopped +Cache ISO in RAM = Carregar toda a ISO em RAM +Change CPU Clock = Alterar relógio emulado do CPU da PSP (unstable) +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Alterar alcunha +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = Cheats (experimental, ver forums) +Clear Recent = Clear "Recent" +Clear Recent Games List = Limpar lista de jogos recentes +Clear UI background = Clear UI background +Confirmation Button = Botão de confirmação +Date Format = Formato da data +Day Light Saving = Horário de verão +DDMMYYYY = DDMMAAAA +Decrease size = Decrease size +Developer Tools = Ferramentas de programador +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emulação +Enable Cheats = Activar cheats +Enable Compatibility Server Reports = Enviar de relatórios de compatibilidade para o servidor +Failed to load state. Error in the file system. = Erro ao carregar estado. Erro no sistema de ficheiros. +Failed to save state. Error in the file system. = Failed to save state. Error in the file system. +Fast (lag on slow storage) = Rápido (latência em armaz. lento) +Fast Memory = Memória rápida +Force real clock sync (slower, less lag) = Forçar sinc. com relógio real (lento, menos latência) +frames, 0:off = frames, 0 = off +Games list settings = Games list settings +General = Geral +Grid icon size = Grid icon size +Help the PPSSPP team = Ajude a equipa do PPSSPP +Host (bugs, less lag) = Anfitrião (bugs, menos latência) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Interpreter +IO timing method = Método de timing de I/O +IR Interpreter = IR interpreter +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = Memory Stick inserted +MHz, 0:default = MHz, 0 = default +MMDDYYYY = MMDDAAAA +Newest Save = Newest save +Not a PSP game = Não é um jogo de PSP +Off = Off +Oldest Save = Oldest save +PSP Model = Modelo da PSP +PSP Settings = Configurações da PSP +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Record audio +Record Display = Record display +Reset Recording on Save/Load State = Reset recording on Save/Load state +Restore Default Settings = Restaurar configurações por omissão da PPSSPP +Rewind Snapshot Frequency = Frequência de snapshots de rebobinação (mem hog) +Save path in installed.txt = Gravar caminho em installed.txt +Save path in My Documents = Gravar caminho em Meus Documentos +Savestate Slot = Espaço de gravações de estado +Savestate slot backups = Savestate slot backups +Screenshots as PNG = Gravar capturas de ecrã no formato PNG +Set UI background... = Set UI background... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Simular atrasos do UMD +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Armazenamento cheio +Sustained performance mode = Sustained performance mode +Time Format = Formato da hora +UI = Interface de usuário +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) +Use O to confirm = Usar O para confirmar +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = Usar X para confirmar +VersionCheck = Verificar actualizações do PPSSPP +WARNING: Android battery save mode is on = WARNING: Android battery save mode is On +WARNING: Battery save mode is on = WARNING: Battery save mode is on +YYYYMMDD = AAAAMMDD + +[Upgrade] +Details = Details +Dismiss = Ignorar +Download = Descarregar +New version of PPSSPP available = Está disponível uma nova versão do PPSSPP diff --git a/assets/lang/ro_RO.ini b/assets/lang/ro_RO.ini new file mode 100644 index 0000000000..303593cd53 --- /dev/null +++ b/assets/lang/ro_RO.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = Format intern audio (necesită restartare) +AudioBufferingForBluetooth = Bluetooth-friendly buffer (mai lent) +Auto = Automat +Device = Device +DSound (compatible) = DSound (compatibil) +Enable Sound = Activează Sunet +Global volume = Volum global +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = WASAPI (rapid) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Sensitivitate axa analoagă +Analog Limiter = Limită pt. control analog +Analog Mapper High End = Valoarea maxima analoagă la limita de sus (sensitivitatea axelor) +Analog Mapper Low End = Valoarea maxima analoagă la limita de jos (inversarea zonei moarte) +Analog Mapper Mode = Modul de plasare analog +Analog Stick = Butonul analog +AnalogLimiter Tip = Când este apasat butonul de limitare control analog +Auto = Automat +Auto-centering analog stick = Centrare automată a butonului analog +Auto-hide buttons after seconds = Ascunde automate butoanele după secunde +Binds = Binds +Button Opacity = Opacitatea butoanelor +Button style = Stilul butonanelor +Calibrate D-Pad = Calibrare D-Pad +Calibration = Calibrare +Classic = Clasic +Combo Key Setting = Combo key setting +Combo Key Setup = Combo key setup +Confine Mouse = Trap mouse within window/display area +Control Mapping = Editare controale +Custom layout... = Aranjare controale touch... +Customize tilt = Personificare înclinare... +D-PAD = D-Pad +Deadzone Radius = Raza zonei moarte +DInput Analog Settings = Setari analoage DInput +Disable D-Pad diagonals (4-way touch) = Dezactivare diagonale D-Pad (touch in 4 direcții) +Glowing borders = Glowing borders +HapticFeedback = Feedback tactil (vibrație) +Ignore gamepads when not focused = Ignoră gamepadurile cand nu e concentrat +Ignore Windows Key = Dezactivează tasta Windows +Invert Axes = Inversează axele +Invert Tilt along X axis = Inversează înclinarea pe axa X +Invert Tilt along Y axis = Inversează înclinarea pe axa Y +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Setări de control tastatură +L/R Trigger Buttons = L/R trigger buttons +Landscape = Vedere +Landscape Auto = Landscape auto +Landscape Reversed = Vedere întoarsă +Mouse = Setări Mouse +Mouse sensitivity = Sensitivitate Mouse +Mouse smoothing = Mouse smoothing +MouseControl Tip = You can now map mouse in control mapping screen by pressing the 'M' icon. +None (Disabled) = Fara (dezactivat) +Off = Off +OnScreen = Controale Touch pe Ecran +Portrait = Portret +Portrait Reversed = Portret intors +PSP Action Buttons = Butoane acțiune PSP +Screen Rotation = Rotație ecran +seconds, 0 : off = seconds, 0 = off +Sensitivity = Sensitivitate +Show right analog = Show right analog +Show Touch Pause Menu Button = Arată buton meniu pauză +Thin borders = Margini subțiri +Tilt Base Radius = Tilt base radius +Tilt Input Type = Tip intrare prin înclinare +Tilt Sensitivity along X axis = Inversează sensitivitatea pe axa X +Tilt Sensitivity along Y axis = Inversează sensitivitatea pe axa Y +To Calibrate = Pt. a calibra, ține aparatul pe o suprafață plată și apasă "Calibrate". +Touch Control Visibility = Touch control visibility +Use custom right analog = Use custom right analog +Use Mouse Control = Use mouse control +Visibility = Vizibilitate +X = X +X + Y = X + Y +XInput Analog Settings = Setări analoage XInput +Y = Y + +[CwCheats] +Cheats = Trișare +Edit Cheat File = Editare fișier trișare +Enable/Disable All = Activează/Dezactivează tot trișatul +Import Cheats = Importă din cheat.db +Options = Opțiuni +Refresh Rate = Rată de împrospatare + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = &About PPSSPP... +Auto = &Auto +Backend = Rendering &Backend (Restarts PPSSPP) +Bicubic = &Bicubic +Break = Break +Break on Load = Break on load +Buffered Rendering = &Buffered Rendering +Buy Gold = Buy &Gold +Control Mapping... = C&ontrol Mapping... +Debugging = &Debug +Deposterize = &Deposterize +Direct3D9 = &Direct3D9 +Direct3D11 = Direct3D &11 +Disassembly = &Disassembly... +Discord = Discord +Display Layout Editor = Display layout editor... +Display Rotation = Display rotation +Dump Next Frame to Log = D&ump Next Frame to Log +Emulation = &Emulation +Enable Chat = Enable chat +Enable Cheats = Enable &Cheats +Enable Sound = Enable S&ound +Exit = E&xit +Extract File... = E&xtract File... +File = &File +Frame Skipping = &Frame skipping +Frame Skipping Type = Frame skipping type +Fullscreen = Fu&llscreen +Game Settings = &Game Settings +GE Debugger... = GE Debugge&r... +GitHub = Git&Hub +Hardware Transform = &Hardware Transform +Help = &Help +Hybrid = &Hybrid +Hybrid + Bicubic = H&ybrid + Bicubic +Ignore Illegal Reads/Writes = &Ignore Illegal Reads/Writes +Ignore Windows Key = Ignore Windows Key +Keep PPSSPP On Top = &Keep PPSSPP on Top +Landscape = Landscape +Landscape reversed = Landscape reversed +Language... = La&nguage... +Linear = &Linear +Load = &Load... +Load .sym File... = Lo&ad .sym File... +Load Map File... = Load &Map File... +Load State = L&oad State +Load State File... = &Load State File... +Log Console = &Log Console +Memory View... = Memory &View... +More Settings... = &More Settings... +Nearest = &Nearest +Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) +Off = &Off +Open Directory... = Open &Directory... +Open from MS:/PSP/GAME... = O&pen from MS:/PSP/GAME... +Open Memory Stick = Open &Memory Stick +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = &Pause +Pause When Not Focused = &Pause When Not Focused +Portrait = Portrait +Portrait reversed = Portrait reversed +Postprocessing Shader = Postprocessin&g Shader +PPSSPP Forums = PPSSPP &Forums +Record = &Record +Record Audio = Record &audio +Record Display = Record &display +Rendering Mode = Rendering M&ode +Rendering Resolution = &Rendering Resolution +Reset = R&eset +Reset Symbol Table = Reset S&ymbol Table +Run = &Run +Save .sym File... = Sav&e .sym File... +Save Map File... = &Save Map File... +Save State = S&ave State +Save State File... = &Save State File... +Savestate Slot = Saves&tate Slot +Screen Scaling Filter = Scr&een Scaling Filter +Show Debug Statistics = Show Debu&g Statistics +Show FPS Counter = Show &FPS Counter +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = &Stop +Switch UMD = Switch UMD +Take Screenshot = &Take Screenshot +Texture Filtering = Te&xture Filtering +Texture Scaling = &Texture Scaling +Use Lossless Video Codec (FFV1) = &Use lossless video codec (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = &Vertex Cache +VSync = VS&ync +Vulkan = Vulkan +Window Size = &Window Size +www.ppsspp.org = Visit www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allocator viewer (Vulkan) +Allow remote debugger = Allow remote debugger +Backspace = Backspace +Block address = Block address +By Address = By address +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Create/Open textures.ini file for current game +Current = Current +Dev Tools = Development tools +DevMenu = DevMenu +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Dump decrypted EBOOT.BIN on game boot +Dump Frame GPU Commands = Dump frame GPU commands +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Enable debug logging +Enter address = Enter address +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Frame profiler +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = Jit compare +JIT debug tools = JIT debug tools +Language = Limbă +Load language ini = Deschide fişier ini limbă +Log Dropped Frame Statistics = Log dropped frame statistics +Log Level = Log level +Log View = Log view +Logging Channels = Logging channels +Next = Next +No block = No block +Prev = Previous +Random = Random +Replace textures = Replace textures +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. +RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? +Resume = Resume +Run CPU Tests = Run CPU tests +Save language ini = Salvează fişier ini limbă +Save new textures = Save new textures +Shader Viewer = Shader viewer +Show Developer Menu = Show developer menu +Show on-screen messages = Show on-screen messages +Stats = Stats +System Information = System information +Texture Replacement = Texture replacement +Toggle Audio Debug = Toggle audio debug +Toggle Freeze = Toggle freeze +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP res +Active = Active +Back = Înapoi +Cancel = Ignoră +Center = Center +ChangingGPUBackends = Schimbarea modului GPU necesită restart. Restart acum? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = Alege folder pt. salvări PPSSPP +Confirm Overwrite = Vrei să suprascrii datele? +Confirm Save = Vrei să savezi datele? +ConfirmLoad = Incarcă datele acestea? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Șterge +Delete all = Șterge tot +Delete completed = Ștergere completă +DeleteConfirm = Salvarea curentă va fi ștearsă.\nConfirmați? +DeleteConfirmAll = Chiar vrei să-ți ștergi\ndatele salvate pt. acest joc? +DeleteConfirmGame = Chiar vrei să ștergi acest joc\nde pe aparatul tău? Nu este cale de întoarcere. +DeleteConfirmGameConfig = Chiar vrei să ștergi setările pt. acest joc? +DeleteFailed = Nu s-au putut șterge datele. +Deleting = Ştergere în progres\nVă rugăm așteptați... +Disable All = Disable all +Edit = Edit +Enable All = Enable all +Enter = Confirmare +Finish = Stop +Grid = Grid +Inactive = Inactive +InternalError = An internal error has occurred. +Load = Încarcă +Load completed = Încărcare Completă +Loading = Se încarcă\nAșteptați... +LoadingFailed = Nu s-au putut încărca datele. +Move = Mișcă +Network Connection = Conexiune la rețea +NEW DATA = DATE NOI +No = Nu +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = OK +Old savedata detected = Date vechi salvate detectate +Options = Options +Reset = Resetare +Resize = Modificare marime +Retry = Reîncearcă +Save = Salvează +Save completed = Salvare Completă +Saving = Se Salvează\nAșteptați... +SavingFailed = Nu s-au putut salva datele. +Select = Selectează +Shift = Shift +Snap = Snap +Space = Space +SSID = SSID +Submit = Trimite +Supported = Supported +There is no data = Salvare inexistentă +Toggle All = Schimbă tot +Toggle List = Toggle list +Unsupported = Unsupported +When you save, it will load on a PSP, but not an older PPSSPP = Când salvezi, va încărca pe un PSP, dar nu un PPSSPP mai vechi +When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Yes = Da +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = Fișierul e compresat (7z).\nVă rog decompresați întai (7-Zip sau WinRAR). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = Nu s-a putut salva fișierul imagine. +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll not found. Please install. Or press Yes to try again using Direct3D 9 instead. +D3D11InitializationError = Direct3D 11 initialization error +D3D11Missing = Your operating system version does not include D3D11. Please run Windows Update.\n\nPress Yes to try again using Direct3D 9 instead. +D3D11NotSupported = Your GPU does not appear to support Direct3D 11.\n\nWould you like to try again using Direct3D 9 instead? +Disk full while writing data = Diskul s-a umplut scriind date. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = Nu s-a putut încărca jocul. +Error reading file = Eroare la citire fișier. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = Eroare la indentificare fișier. +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Failed initializing graphics. Try upgrading your graphics drivers and DirectX 9 runtime.\n\nWould you like to try switching to OpenGL?\n\nError message: +GenericGraphicsError = Graphics Error +GenericOpenGLError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to DirectX 9?\n\nError message: +GenericVulkanError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to OpenGL?\n\nError message: +InsufficientOpenGLDriver = Suport pt. driver OpenGL insuficient!\n\nPlaca dvs. video raportează că nu suportă OpenGL 2.0. Doriți să încercați folosind DirectX?\n\nDirectX este momentan compatibil cu mai puține jocuri, dar pe GPU-ul dvs. poate fi singura opțiune.\n\nVizitează forumurile la https://forums.ppsspp.org pt. mai multe informații.\n\n +Just a directory. = Doar un director. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = Fără EBOOT.PBP, indentificat joc în mod greșit. +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = Eroare driver OpenGL +PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP nu suportă momentan conectare la internet pt. DLC, PSN sau update-uri la jocuri. +PS1 EBOOTs are not supported by PPSSPP. = EBOOT-uri PS1 nu sunt suportate de PPSSPP. +PSX game image detected. = Fișierul e o imagine MODE2. PPSSPP doesn't support PS1 games. +RAR file detected (Require UnRAR) = Fișierul e compresat(RAR).\nVă rog decompresați întâi (încercați UnRAR). +RAR file detected (Require WINRAR) = Fișierul e compresat(RAR).\nVă rog decompresați întâi (încercați WINRAR). +Running slow: try frameskip, sound is choppy when slow = Running slow: try frameskip, sound is choppy when slow +Running slow: Try turning off Software Rendering = Running slow: try turning off "software rendering" +Save encryption failed. This save won't work on real PSP = Încodarea salvării ratată. Această salvare nu va funcționa pe un PSP real. +textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +This is a saved state, not a game. = This is a saved state, not a game. +This is save data, not a game. = This is save data, not a game. +Unable to create cheat file, disk may be full = Imposibil de creat fișier trișare, diskul poate fi plin. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Imposibil de scris salvare, diskul poate fi plin. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Warning: Video memory FULL, reducing upscaling and switching to slow caching mode. +Warning: Video memory FULL, switching to slow caching mode = Warning: Video memory FULL, switching to slow caching mode. +ZIP file detected (Require UnRAR) = Fișierul e compresat(ZIP).\nVă rog decompresați întâi (încercați UnRAR). +ZIP file detected (Require WINRAR) = Fișierul e compresat(ZIP).\nVă rog decompresați întâi (încercați WINRAR). + +[Game] +Asia = Asia +ConfirmDelete = Ștergere +Create Game Config = Creează configurare joc +Create Shortcut = Creează scurtătură +Delete Game = Ștergere joc +Delete Game Config = Ștergere configurare joc +Delete Save Data = Ștergere salvare +Europe = Europe +Game = Joc +Game Settings = Setări joc +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Instalare date +Japan = Japan +Korea = Korea +MB = MB +One moment please... = One moment please... +Play = Joacă +Remove From Recent = Ștergere de la "Recent" +SaveData = Salvare +Setting Background = Setting background +Show In Folder = Arată în folder +USA = USA +Use UI background = Use UI background + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = unlimited +(supersampling) = (supersampling) +(upscaling) = (upscaling) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Agresiv +Alternative Speed = Viteză alternativă (în %, 0 = nelimitat) +Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Anisotropic Filtering = Filtru Anisotropic +Auto = Automat +Auto (1:1) = Automat (1:1) +Auto (same as Rendering) = Automat (la fel ca rezoluția de afișare) +Auto FrameSkip = Sărire cadre automat +Auto Scaling = Auto scaling +Backend = Mod intern +Balanced = Balansat +Bicubic = Bicubic +BlockTransfer Tip = Some games require this to be On for correct graphics +BlockTransferRequired = Warning: This game requires "simulate block transfer effects" to be set to On. +Both = Ambele +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Afișare cu stocare +BufferedRenderingRequired = Warning: This game requires "rendering mode" to be set to "buffered". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Marime ecran (în % din vizor) +Cardboard Screen X Shift = mișcare X (în % din spațiu gol) +Cardboard Screen Y Shift = mișcare Y (în % din spațiu gol) +Cardboard VR Settings = Setări Google Cardboard VR +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU core +Debugging = Depanare +DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. +Deposterize = Deposterizare +Deposterize Tip = Fixes visual banding glitches in upscaled textures +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Dezactivare efecte lente (mărire viteză) +Disabled = Disabled +Display layout editor = Display layout editor +Display Resolution (HW scaler) = Rezoluție ecran (scalare HW) +Dump next frame to log = Dump next frame to log +Enable Cardboard VR = Enable Cardboard VR +FPS = FPS +Frame Rate Control = Control rată de cadre +Frame Skipping = Cadre Omise +Frame Skipping Type = Frame skipping type +FullScreen = Ecran intreg +Hack Settings = Setări trișare (pot cauza stricăciuni) +Hardware Tessellation = Hardware tessellation +Hardware Transform = Transformare pe Hardware +hardware transform error - falling back to software = Eroare la transformare pe hardware, întoarcere la software +HardwareTessellation Tip = Uses hardware to make curves +High = Înalt +Hybrid = Hibrid +Hybrid + Bicubic = Hibrid + Bicubic +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Rezoluție internă +Lazy texture caching = Stocare de texturi leneșă (mărire viteză) +Linear = Linear +Low = Jos +LowCurves = Calitate curbe Spline/Bezier +LowCurves Tip = Only used by some games, controls smoothness of curves +Lower resolution for effects (reduces artifacts) = Rezoluții mai mici pt. efecte (reduce artefacte) +Manual Scaling = Manual scaling +Medium = Mediu +Mode = Mod +Must Restart = Trebuie să resartezi PPSSPP pt. ca această schimbare să aibă efect. +Native device resolution = Rezoluție nativă dispozitiv +Nearest = Apropiată +No buffer = No buffer +Non-Buffered Rendering = Skip buffer effects (non-buffered, faster) +None = Fără +Number of Frames = Number of frames +Off = Oprit +OpenGL = OpenGL +Overlay Information = Informație suprapusă +Partial Stretch = Partial stretch +Percent of FPS = Percent of FPS +Performance = Performanță +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Shader postprocesare +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = Mod Afișare +Rendering Resolution = Rezoluție Afișare +RenderingMode NonBuffered Tip = Faster, but nothing may draw in some games +Retain changed textures = Retain changed textures (sometimes slower) +RetainChangedTextures Tip = Makes many games slower, but some games a lot faster +Rotation = Rotation +Safe = Sigur +Screen layout = Screen layout +Screen Scaling Filter = Filtrul de scalare al ecranului +Show Debug Statistics = Arată statistici de depanare +Show FPS Counter = Arată FPS +Simulate Block Transfer = Simulate block transfer effects +SoftGPU Tip = Currently VERY slow +Software Rendering = Afișare cu sofware (experimental) +Software Skinning = Skinning cu software +SoftwareSkinning Tip = Combine skinned model draws on the CPU, faster in most games +Speed = Viteză +Stretching = Stretching +Texture Filter = Filtru texturi +Texture Filtering = Filtrare texturi +Texture Scaling = Scalare texturi +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Turn off "hardware tessellation": unsupported +Unlimited = Unlimited +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = Nivel Suprascalare +Upscale Type = Tip Suprascalare +UpscaleLevel Tip = CPU heavy - some scaling may be delayed to avoid stutter +Use all displays = Use all displays +Vertex Cache = Stocare vertecși +VertexCache Tip = Faster, but may cause temporary flicker +VSync = VSync +Vulkan = Vulkan +Window Size = Mărime ecran +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Șterge fișier ZIP +Install = Instalează +Install game from ZIP file? = Instalează joc din fișier ZIP? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = Instalat! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = Configurare automată +Autoconfigure for device = Configurare automată pt. dispozitiv +Clear All = Curătă tot +Default All = Înapoi la inițial +Map a new key for = Configurează o nouă tastă pentru +Map Key = Map key +Map Mouse = Map mouse +Test Analogs = Testează analoage +You can press ESC to cancel. = You can press Esc to cancel. + +[MainMenu] +Browse = Răsfoiește... +Buy PPSSPP Gold = Buy PPSSPP Gold +Choose folder = Choose folder +Credits = Lista Contribuitorilor +PPSSPP Homebrew Store = PPSSPP Homebrew Store +Exit = Ieșire +Game Settings = Setări +Games = Jocuri +Give PPSSPP permission to access storage = Give PPSSPP permission to access storage +Homebrew & Demos = Homebrew && Demo-uri +How to get games = Cum pot obține jocuri? +How to get homebrew & demos = Cum pot obține homebrew && demo-uri? +Load = Deschide... +Loading... = Loading... +PinPath = Pin +PPSSPP can't load games or save right now = PPSSPP can't load games or save right now +Recent = Recente +SavesAreTemporary = PPSSPP is saving in temporary storage +SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently +SavesAreTemporaryIgnore = Ignore warning +UnpinPath = Unpin +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Audio +Controls = Setări de Control +Graphics = Grafică +Networking = Rețelistică +System = Sistem +Tools = Tools + +[MappableControls] +Alt speed 1 = Alt speed 1 +Alt speed 2 = Alt speed 2 +An.Down = Analog Jos +An.Left = Analog Stânga +An.Right = Analog Dreapta +An.Up = Analog Sus +Analog limiter = Limitator analog +Analog Stick = Băț analog +Audio/Video Recording = Audio/Video recording +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Schimbare axe +Circle = Circle +Cross = Cross +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = DevMenu +Down = Dpad Jos +Dpad = Dpad +Frame Advance = Frame advance +Hold = Hold +Home = Home +L = L +Left = Dpad Stânga +Load State = Încarcă Stare +Mute toggle = Mute toggle +Next Slot = Slotul următor +None = None +Note = Note +OpenChat = Open chat +Pause = Pauză +R = R +RapidFire = Foc-rapid +Remote hold = Remote hold +Rewind = Re-afișare +Right = Dpad Dreapta +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = RightAn.Down +RightAn.Left = RightAn.Left +RightAn.Right = RightAn.Right +RightAn.Up = RightAn.Up +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Salvează stare +Screen = Screen +Screenshot = Screenshot +Select = Select +SpeedToggle = Comutare viteză +Square = Square +Start = Start +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = Toggle fullscreen +Toggle mode = Toggle mode +Triangle = Triangle +Unthrottle = Încetinire +Up = Dpad Sus +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Visitează forumul Ad Hoc Multiplayer +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Schimbă adresa MAC +Change proAdhocServer Address = Schimbă adresa IP a serverului PRO ad hoc (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Activează serverul PRO ad hoc integrat +Enable network chat = Enable network chat +Enable networking = Activează rețelistică/WLAN (beta, poate strica jocuri) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Rețea inițializată +Please change your Port Offset = Please change your port offset +Port offset = Port offset(0 = PSP compatibility) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Send Discord "Rich Presence" information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = Trișare +Continue = Continuă +Create Game Config = Creeaza configurare pt. joc +Delete Game Config = Șterge configurare pt. joc +Exit to menu = Ieșire la meniu +Game Settings = Setări joc +Load State = Deschide Stare +Rewind = Rewind +Save State = Salvează Stare +Settings = Setări +Switch UMD = Schimbă UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Color +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Cartoon +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT scanlines +FXAA = FXAA Antialiasing +Gamma = Gamma +Grayscale = Grayscale +Intensity = Intensity +InverseColors = Culori Inversate +Natural = Culori Naturale +NaturalA = Natural Colors (no blur) +Off = Oprit +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlines (CRT) +Sharpen = Sharpen +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 Upscaler +VideoSmoothingAA = VideoSmoothingAA +Vignette = Vignette + +[PSPCredits] +all the forum mods = all the forum mods +build server = build server +Buy Gold = Cumpară Gold +check = Uitați-vă și la Dolphin, cel mai bun emulator Wii/GC +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = Contribuitori: +created = Creat de +Discord = Discord +info1 = PPSSPP e creat doar pt. scopuri educaiționale. +info2 = Te rog ai grijă să ai drepturile la oricare joc +info3 = pe care îl joci detinând UMD-ul sau cumpărând ediția +info4 = digitală de pe PSN pe PSP-ul tău real. +info5 = PSP e o marcă înregistrată Sony, Inc. +iOS builds = iOS builds +license = Software gratuit licențiat sub GPL 2.0+ +list = liste de compatibilitate, forumuri și informații despre dezvoltare +PPSSPP Forums = Forumuri PPSSPP +Privacy Policy = Privacy policy +Share PPSSPP = Împărtășește PPSSPP +specialthanks = Mulțumiri speciale: +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = această traducere: +title = Un emulator PSP rapid si portabil +tools = Utilități gratuite folosite: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = Slak44 +translators2 = +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Uitați-vă la site: +written = Scris in C++ pt. viteză si portabilitate + +[RemoteISO] +Browse Games = Browse games +Local Server Port = Local server port +Manual Mode Client = Manual mode client +Remote disc streaming = Remote disc streaming +Remote Port = Remote port +Remote Server = Remote server +Remote Subdirectory = Remote subdirectory +RemoteISODesc = Games in your recent list will be shared +RemoteISOLoading = Connected, loading game list... +RemoteISOScanning = Scanning... Click "share games" on your server device +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Note: Connect both devices to the same Wi-Fi network +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Settings +Share Games (Server) = Share games (server) +Share on PPSSPP startup = Share on PPSSPP startup +Stop Sharing = Stop sharing +Stopping.. = Stopping... + +[Reporting] +Bad = Rău +FeedbackDelayInfo = Your data is being submitted in the background. +FeedbackDesc = How's the emulation? Let us and the community know! Cum e emularea? Spuneți-ne nouă si comunității! +FeedbackDisabled = Compatibility server reports must be enabled. +FeedbackIncludeCRC = Note: Battery will be used to send a disc CRC +FeedbackIncludeScreen = Include a screenshot +FeedbackSubmitDone = Your data has been submitted. +FeedbackSubmitFail = Could not submit data to server. Try updating PPSSPP. +FeedbackThanks = Thanks for your feedback! +Gameplay = Gameplay +Graphics = Grafică +Great = Bun +In-game = În joc +In-game Description = Gets into gameplay, but too buggy to complete +Menu/Intro = Menu/Introducere +Menu/Intro Description = Can't get into the game itself +Nothing = Nimic +Nothing Description = Completely broken +OK = OK +Open Browser = Deschide browser +Overall = În total +Perfect = Perfect +Perfect Description = Flawless emulation for the entire game - great! +Plays = Plays +Plays Description = Fully playable but might be with glitches +ReportButton = Raportează feedback +Speed = Viteză +Submit Feedback = Trimite feedback +SuggestionConfig = See reports on website for good settings. +SuggestionCPUSpeed0 = Disable locked CPU speed setting. +SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this bug). +SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. +SuggestionsNone = This game isn't working for other users too. +SuggestionsWaiting = Submitting and checking other users feedback... +SuggestionUpgrade = Upgrade to a newer PPSSPP build. +SuggestionVerifyDisc = Check your ISO is a good copy of your disc. +Unselected Overall Description = How well does this game emulate? +View Feedback = View all feedbacks + +[Savedata] +Date = Date +Filename = Filename +No screenshot = No screenshot +None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Save Data = Save data +Save States = Save states +Savedata Manager = Savedata manager +Size = Size + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = AVERTIZARE: Chainfire3D detectat, poate cauza probleme. +Failed to load state = Eroare la încărcare de stare +Failed to save state = Eroare la salvare de stare +fixed = Viteză: alternare +GLToolsWarning = AVERTIZARE: GLTools detectat, poate cauza probleme. +In menu = In menu +Load savestate failed = Eroare la încărcare de stare +Loaded State = Stare încărcată +Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +LoadStateDoesntExist = Eroare la încărcare de stare: Starea nu există! +LoadStateWrongVersion = Eroare la încărcare de stare: Starea e pt. o versiune PPSSPP mai veche! +norewind = Fără stări salvare disponibile. +Playing = Playing +PressESC = Apasă ESC pt. a deschide meniul pauză. +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = Eroare la salvare de stare! +Saved State = Stare salvată +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Speed: alternate 2 +standard = Viteză: standard +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = Deja instalat +Connection Error = Eroare de conexiune +Install = Instalare +Launch Game = Launch game +Loading... = Se încarcă... +MB = MB +Size = Mărime +Uninstall = Dezinstalare + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d cores) +%d bytes = %d bytes +(none detected) = (none detected) +3D API = 3D API +ABI = ABI +API Version = API version +Audio Information = Audio information +Board = Board +Build Config = Build config +Build Configuration = Build Configuration +Built by = Built by +Core Context = Core context +Cores = Cores +CPU Extensions = CPU extensions +CPU Information = CPU information +CPU Name = Name +D3DCompiler Version = D3DCompiler version +Debug = Debug +Debugger Present = Debugger present +Device Info = Device info +Display Information = Display information +Driver Version = Driver version +EGL Extensions = EGL extensions +Frames per buffer = Frames per buffer +GPU Information = GPU information +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Lang/Region +Memory Page Size = Memory page size +Native Resolution = Native resolution +OGL Extensions = OGL extensions +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 extensions +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 extensions +OpenGL Extensions = OpenGL extensions +Optimal frames per buffer = Optimal frames per buffer +Optimal sample rate = Optimal sample rate +OS Information = OS information +PPSSPP build = PPSSPP build +Refresh rate = Refresh rate +Release = Release +RW/RX exclusive = RW/RX exclusive +Sample rate = Sample rate +Shading Language = Shading language +Sustained perf mode = Sustained perf mode +System Information = System information +System Name = Name +System Version = System version +Threads = Threads +Vendor = Vendor +Vendor (detected) = Vendor (detected) +Version Information = Version information +Vulkan Extensions = Vulkan extensions +Vulkan Features = Vulkan features + +[System] +(broken) = (broken) +12HR = 12HR +24HR = 24HR +Auto = Auto +Auto Load Savestate = Auto load savestate +AVI Dump started. = AVI dump started +AVI Dump stopped. = AVI dump stopped +Cache ISO in RAM = Cache full ISO in RAM +Change CPU Clock = Change emulated PSP's CPU clock (unstable) +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Schimbă nume +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = Trișare (experimental, vezi forumuri) +Clear Recent = Clear "Recent" +Clear Recent Games List = Curată listă jocuri recente +Clear UI background = Clear UI background +Confirmation Button = Buton confirmare +Date Format = Format date +Day Light Saving = Ora de vară +DDMMYYYY = DDMMYYYY +Decrease size = Decrease size +Developer Tools = Utilități dezvoltator +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emulare +Enable Cheats = Activează trișare +Enable Compatibility Server Reports = Activează rapoarte de compatibilitate la server +Failed to load state. Error in the file system. = Eroare la încărcare de stare. Eroare în sistem de fișiere. +Failed to save state. Error in the file system. = Failed to save state. Error in the file system. +Fast (lag on slow storage) = Rapid (lent pe stocare lentă) +Fast Memory = Memorie rapidă (instabil) +Force real clock sync (slower, less lag) = Forțează sincronizare cu ceas real (lent, mai puțină latență) +frames, 0:off = frames, 0 = off +Games list settings = Games list settings +General = General +Grid icon size = Grid icon size +Help the PPSSPP team = Ajută echipa PPSSPP +Host (bugs, less lag) = Host (cu erori, mai puțină latență) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Interpreter +IO timing method = Metodă de temporizare I/O +IR Interpreter = IR interpreter +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = Memory Stick inserted +MHz, 0:default = MHz, 0 = default +MMDDYYYY = MMDDYYYY +Newest Save = Newest save +Not a PSP game = Nu e joc PSP +Off = Off +Oldest Save = Oldest save +PSP Model = Model PSP +PSP Settings = Setări PSP +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Record audio +Record Display = Record display +Reset Recording on Save/Load State = Reset recording on Save/Load state +Restore Default Settings = Adu la setări PPSSPP inițiale +Rewind Snapshot Frequency = Rewind snapshot frequency (mem hog) +Save path in installed.txt = Save path in installed.txt +Save path in My Documents = Save path in My Documents +Savestate Slot = Slot salvare +Savestate slot backups = Savestate slot backups +Screenshots as PNG = Salvează instantanee în format PNG +Set UI background... = Set UI background... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Simulare întârzieri UMD +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Stocare plină +Sustained performance mode = Sustained performance mode +Time Format = Format timp +UI = Interfața cu utilizatorul +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) +Use O to confirm = Folosește O ca buton de confirmare +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = Folosește X ca buton de confirmare +VersionCheck = Verifică pt. versiuni noi de PPSSPP +WARNING: Android battery save mode is on = WARNING: Android battery save mode is On +WARNING: Battery save mode is on = WARNING: Battery save mode is on +YYYYMMDD = YYYYMMDD + +[Upgrade] +Details = Details +Dismiss = Ignoră +Download = Descarcă +New version of PPSSPP available = Nouă versiune de PPSSPP disponibilă. diff --git a/assets/lang/ru_RU.ini b/assets/lang/ru_RU.ini new file mode 100644 index 0000000000..ad135b285d --- /dev/null +++ b/assets/lang/ru_RU.ini @@ -0,0 +1,1073 @@ +[Audio] +Alternate speed volume = Громкость при другой скорости +Audio backend = Аудио бэкенд (нужен перезапуск) +AudioBufferingForBluetooth = Буфер, подходящий для Bluetooth (медленнее) +Auto = Авто +Device = Устройство +DSound (compatible) = DSound (совместимый) +Enable Sound = Включить звук +Global volume = Общая громкость +Microphone = Микрофон +Microphone Device = Устройство микрофона +Mute = Без звука +Switch on new audio device = Переключиться на новое аудиоустройство +Use global volume = Использовать общую громкость +WASAPI (fast) = WASAPI (быстрее) + +[Controls] +Analog auto-rotation speed = Скорость автовращения аналогового стика +Analog Axis Sensitivity = Чувствительность аналоговой оси +Analog Limiter = Аналоговый ограничитель +Analog Mapper High End = Параметры аналогового стика (чувствительность) +Analog Mapper Low End = Параметры аналогового стика (инверсия мертвой зоны) +Analog Mapper Mode = Режим аналогового стика +Analog Stick = Аналоговый стик +AnalogLimiter Tip = Когда нажата кнопка аналогового ограничителя +Auto = Авто +Auto-centering analog stick = Автоцентрируемый стик +Auto-hide buttons after seconds = Скрывать кнопки через +Binds = Привязки +Button Opacity = Прозрачность кнопок +Button style = Стиль кнопок +Calibrate D-Pad = Калибровать +Calibration = Калибровка +Classic = Классический +Combo Key Setting = Изменение комбо-клавиш +Combo Key Setup = Настройка комбо-клавиш +Confine Mouse = Не давать мыши выходить за пределы окна +Control Mapping = Назначение кнопок +Custom layout... = Изменить сенсорное управление... +Customize tilt = Настроить наклон... +D-PAD = Крестовина +Deadzone Radius = Радиус мертвой зоны +DInput Analog Settings = Параметры стиков DInput +Disable D-Pad diagonals (4-way touch) = Отключить крестовину по диагонали +Glowing borders = Подсветка краёв +HapticFeedback = Виброотдача +Ignore gamepads when not focused = Игнорировать геймпад, когда окно не в фокусе +Ignore Windows Key = Игнорировать клавишу Windows +Invert Axes = Инверсия осей +Invert Tilt along X axis = Инверсия наклона вдоль X +Invert Tilt along Y axis = Инверсия наклона вдоль Y +Keep this button pressed when right analog is pressed = Удерживать клавишу нажатой при нажатии правого аналогового стика +Keyboard = Настройки клавиатуры +L/R Trigger Buttons = Триггеры L/R +Landscape = Альбомная +Landscape Auto = Альбомная (авто) +Landscape Reversed = Альбомная (перевернутая) +Mouse = Настройки мыши +Mouse sensitivity = Чувствительность мыши +Mouse smoothing = Сглаживание мыши +MouseControl Tip = Теперь вы можете назначить мышь на экране управления, нажав на иконку 'M'. +None (Disabled) = Выключено +Off = Выкл. +OnScreen = Элементы управления на экране +Portrait = Портретная +Portrait Reversed = Портретная (перевернутая) +PSP Action Buttons = Кнопки действий PSP +Screen Rotation = Ориентация экрана +seconds, 0 : off = секунд, 0 = выкл. +Sensitivity = Чувствительность +Show right analog = Показывать правый аналоговый стик +Show Touch Pause Menu Button = Показывать кнопку паузы +Thin borders = Тонкие границы +Tilt Base Radius = Радиус наклона основания +Tilt Input Type = Замена управления наклоном +Tilt Sensitivity along X axis = Чувствительность наклона вдоль X +Tilt Sensitivity along Y axis = Чувствительность наклона вдоль Y +To Calibrate = Положите устройство на ровную поверхность и нажмите "Калибровать" +Touch Control Visibility = Видимость элементов управления +Use custom right analog = Испот\льзовать настраиваемый правый аналоговый стик +Use Mouse Control = Включить управление мышью +Visibility = Видимость +X = X +X + Y = X + Y +XInput Analog Settings = Параметры стиков XInput +Y = Y + +[CwCheats] +Cheats = Читы +Edit Cheat File = Изменить файл чита +Enable/Disable All = Включить/выключить все +Import Cheats = Импортировать из cheat.db +Options = Настройки +Refresh Rate = Частота обновления + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = &О PPSSPP... +Auto = &Авто +Backend = Бэкенд &рендеринга (нужен перезапуск) +Bicubic = &Бикубическое +Break = Останов +Break on Load = Останов после загрузки +Buffered Rendering = &Буферированный рендеринг +Buy Gold = Купить &Gold +Control Mapping... = Назначение &кнопок... +Debugging = &Отладка +Deposterize = &Депостеризация +Direct3D9 = Direct3D &9 +Direct3D11 = Direct3D &11 +Disassembly = &Дизассемблер... +Discord = Discord +Display Layout Editor = Редактор расположения экрана... +Display Rotation = Ориентация экрана +Dump Next Frame to Log = Сохранить &кадр в логе +Emulation = &Эмуляция +Enable Chat = Включить чат +Enable Cheats = Включить &читы +Enable Sound = Включить &звук +Exit = Вы&ход +Extract File... = Рас&паковать файл... +File = &Файл +Frame Skipping = &Пропуск кадров +Frame Skipping Type = Тип пропуска кадров +Fullscreen = На весь &экран +Game Settings = &Настройки +GE Debugger... = &Отладчик GE... +GitHub = Git&Hub +Hardware Transform = Аппаратное &преобразование +Help = &Справка +Hybrid = &Гибридное +Hybrid + Bicubic = Г&ибридное + бикубическое +Ignore Illegal Reads/Writes = Игнорировать о&шибки чтения/записи +Ignore Windows Key = &Игнорировать клавишу Windows +Keep PPSSPP On Top = Поверх &остальных окон +Landscape = Альбомная +Landscape reversed = Альбомная (перевернутая) +Language... = &Язык... +Linear = &Линейный +Load = &Открыть... +Load .sym File... = Загруз&ить .sym файл... +Load Map File... = &Загрузить файл карты... +Load State = Загрузить состояние +Load State File... = &Загрузить состояние из файла... +Log Console = Консоль отладки +Memory View... = Просмотрщик па&мяти... +More Settings... = &Ещё настройки... +Nearest = &Ближайший +Non-Buffered Rendering = &Пропускать эффекты (небуферированный, быстрее) +Off = В&ыключено +Open Directory... = Открыть &папку... +Open from MS:/PSP/GAME... = О&ткрыть MS:/PSP/GAME... +Open Memory Stick = Открыть карту памяти +Open New Instance = Открыть новый экземпляр программы +OpenGL = &OpenGL +Pause = &Пауза +Pause When Not Focused = &Пауза, когда окно не в фокусе +Portrait = Портретная +Portrait reversed = Портретная (перевернутая) +Postprocessing Shader = &Постобработка (шейдер) +PPSSPP Forums = &Форум PPSSPP +Record = &Запись +Record Audio = Запись &звука +Record Display = Запись &изображения +Rendering Mode = Режим рендеринга +Rendering Resolution = Разрешение рендеринга +Reset = Перезапустить +Reset Symbol Table = &Перезагрузить таблицу символов +Run = &Запустить +Save .sym File... = Сохранить& .sym файл... +Save Map File... = &Сохранить файл карты... +Save State = Сохранить состояние +Save State File... = &Сохранить состояние в файл... +Savestate Slot = Слот состояния +Screen Scaling Filter = Ф&ильтр масштабирования экрана +Show Debug Statistics = Показывать &отладочную информацию +Show FPS Counter = По&казывать FPS +Skip Number of Frames = Пропускать количество кадров +Skip Percent of FPS = Пропускать процент от FPS +Stop = Остановить +Switch UMD = Сменить UMD +Take Screenshot = Сделать скриншот +Texture Filtering = &Фильтрация текстур +Texture Scaling = &Масштабирование текстур +Use Lossless Video Codec (FFV1) = Использовать видеокодек без потерь (FFV1) +Use output buffer for video = Использовать выходной буфер для видео +Vertex Cache = &Вершинный кэш +VSync = Вертикальная син&хронизация +Vulkan = Vulkan +Window Size = Размер &окна +www.ppsspp.org = Посетить www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Просмотр выделений памяти (Vulkan) +Allow remote debugger = Разрешить удалённую отладку +Backspace = Стереть +Block address = Адрес блока +By Address = По адресу +Copy savestates to memstick root = Копировать состояния сохранений в корень карты памяти +Create/Open textures.ini file for current game = Создать/открыть файл textures.ini для текущей игры +Current = Текущий +Dev Tools = Инструменты разработчика +DevMenu = Меню разраб. +Disabled JIT functionality = Отключенный функционал JIT +Draw Frametimes Graph = Отрисовывать граф времен кадров +Dump Decrypted Eboot = Дамп дешифрованного EBOOT.BIN при запуске +Dump Frame GPU Commands = Сохранить команды ГП для кадра +Enable driver bug workarounds = Включить обход багов драйвера +Enable Logging = Включить отладочное логирование +Enter address = Ввести адрес +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Профайлер кадров +GPU Driver Test = Проверка драйвера ГП +GPU Profile = Профиль ГП +Jit Compare = Сравнение с JIT +JIT debug tools = Инструменты отладки JIT +Language = Язык +Load language ini = Загрузить языковой .ini файл +Log Dropped Frame Statistics = Логировать статистику пропущенных кадров +Log Level = Уровень отладки +Log View = Отображение логов +Logging Channels = Параметры логирования +Next = Следующий +No block = Нет блока +Prev = Предыдущий +Random = Случайный +Replace textures = Подменять текстуры +Reset limited logging = Сбросить ограниченное логирование +RestoreDefaultSettings = "Вы уверены, что хотите сбросить настройки\n(кроме управления) на стандартные?\nВы не сможете это отменить.\nПожалуйста, перезапустите PPSSPP после сброса." +RestoreGameDefaultSettings = Вы уверены, что хотите вернуть все параметры игры к стандартным? +Resume = Resume +Run CPU Tests = Запустить тесты ЦП +Save language ini = Сохранить языковой .ini файл +Save new textures = Сохранять новые текстуры +Shader Viewer = Просмотрщик шейдеров +Show Developer Menu = Показывать меню разработчика +Show on-screen messages = Показывать сообщения на экране +Stats = Статистика +System Information = Информация о системе +Texture Replacement = Подмена текстур +Toggle Audio Debug = Включить/выключить отладку аудио +Toggle Freeze = Запустить/остановить +Touchscreen Test = Тест сенсорного экрана +VFPU = VFPU + +[Dialog] +* PSP res = * разр. PSP +Active = Активно +Back = Назад +Cancel = Отмена +Center = По центру +ChangingGPUBackends = При изменении бэкенда ГП требуется перезапуск. Перезапустить сейчас? +ChangingInflightFrames = Для изменения буферирования команд графики требуется перезапуск PPSSPP. Перезапустить сейчас? +Channel: = Канал: +Choose PPSSPP save folder = Выбрать папку с сохранениями +Confirm Overwrite = Вы хотите перезаписать данные? +Confirm Save = Вы уверены, что хотите сохранить данные? +ConfirmLoad = Загрузить эти данные? +ConnectingAP = Подключение к точке доступа.\nПожалуйста, подождите... +ConnectingPleaseWait = Подключение.\nПожалуйста, подождите... +ConnectionName = Имя повреждено +Corrupted Data = Данные повреждены +Delete = Удалить +Delete all = Удалить всё +Delete completed = Удаление завершено +DeleteConfirm = Эти данные будут удалены.\nХотите продолжить? +DeleteConfirmAll = Вы уверены, что хотите удалить сохранения для данной игры? +DeleteConfirmGame = Вы уверены, что хотите безвозвратно удалить\nданную игру с вашего устройства? +DeleteConfirmGameConfig = Вы уверены, что хотите удалить настройки данной игры? +DeleteFailed = Не удалось удалить данные. +Deleting = Удаление\nПожалуйста, подождите... +Disable All = Отключить все +Edit = Изменить +Enable All = Включить все +Enter = Ввод +Finish = Сохранить +Grid = Сетка +Inactive = Неактивно +InternalError = Произошла внутренняя ошибка. +Load = Загрузить +Load completed = Загрузка завершена +Loading = Загрузка\nПожалуйста, подождите... +LoadingFailed = Невозможно загрузить даные. +Move = Положение +Network Connection = Сетевое подключение +NEW DATA = Новое сохранение +No = Нет +ObtainingIP = Получение IP-адреса.\nПожалуйста, подождите... +OK = OK +Old savedata detected = Старый формат сохранений +Options = Опции +Reset = Сбросить +Resize = Размер +Retry = Снова +Save = Сохранить +Save completed = Сохранение завершено. +Saving = Сохранение\nПожалуйста, подождите... +SavingFailed = Не удалось сохранить. +Select = Выбрать +Shift = Shift +Snap = Разметка +Space = Space +SSID = SSID +Submit = Выполнение +Supported = Поддерживается +There is no data = Нет данных +Toggle All = Переключить все +Toggle List = Переключить список +Unsupported = Не поддерживается +When you save, it will load on a PSP, but not an older PPSSPP = Когда вы сохранитесь, оно может быть загружено на PSP, но не на старой версии PPSSPP +When you save, it will not work on outdated PSP Firmware anymore = Когда вы сохранитесь, оно больше не будет работать на устаревших версиях прошивки PSP +Yes = Да +Zoom = Масштаб + +[Error] +7z file detected (Require 7-Zip) = файл сжат (7z).\nПожалуйста распакуйте (воспользуйтесь 7-Zip или WinRAR). +A PSP game couldn't be found on the disc. = На диске не удалось найти игру для PSP. +Cannot boot ELF located outside mountRoot. = Невозможно загрузить ELF, расположенный вне mountRoot. +Could not save screenshot file = Не удалось сохранить скриншот. +D3D9or11 = Direct3D 9? (или "нет" для Direct3D 11) +D3D11CompilerMissing = Не найден D3DCompiler_47.dll. Установите его. Или нажмите "Да", чтобы попытаться использовать Direct3D 9. +D3D11InitializationError = Ошибка инициализации Direct3D 11 +D3D11Missing = Ваша версия операционной системы не поддерживает D3D11. Выполните обновление Windows.\n\nНажмите "Да", чтобы попытаться использовать Direct3D 9. +D3D11NotSupported = Ваш ГП не поддерживает Direct3D 11.\n\nХотите попробовать использовать Direct3D 9? +Disk full while writing data = Закончилось место на диске. +ELF file truncated - can't load = Файл ELF обрезан - не удалось загрузить +Error loading file = Ошибка загрузки игры. +Error reading file = Ошибка при чтении файла. +Failed initializing CPU/Memory = Не удалось инициализировать ЦП или память +Failed to identify file = Не удалось опознать файл. +Failed to load executable: = не удалось запустить: +File corrupt = файл поврежден +Game disc read error - ISO corrupt = Ошибка чтения игрового диска: ISO повреждён. +GenericAllStartupError = Не удалось запустить PPSSPP ни с одним графическим бэкендом. Попробуйте обновить графические и другие драйвера. +GenericBackendSwitchCrash = При запуске PPSSPP произошла ошибка.\n\nОбычно это происходит из-за проблем с графическим драйвером. Попробуйте обновить графические драйвера.\n\nГрафический бэкенд был изменен: +GenericDirect3D9Error = Ошибка инициализации графики. Попробуйте обновить драйвер видеокарты и файлы DirectX 9.\n\nПопробовать переключиться на OpenGL?\n\nОписание ошибки: +GenericGraphicsError = Ошибка вывода графики +GenericOpenGLError = Ошибка инициализации графики. Попробуйте обновить драйвер видеокарты.\n\nПопробовать переключиться на DirectX 9?\n\nОписание ошибки: +GenericVulkanError = Ошибка инициализации графики. Попробуйте обновить драйвер видеокарты.\n\nПопробовать переключиться на OpenGL?\n\nОписание ошибки: +InsufficientOpenGLDriver = Не обнаружен необходимый драйвер OpenGL!\n\nВаш ГП не поддерживает OpenGL 2.0. Не хотите попробовать DirectX?\n\nНа данный момент DirectX-вариант поддерживает меньше игр, но с вашим ГП другого выхода, похоже, нет.\n\nПосетите форумы https://forums.ppsspp.org для подробной информации.\n\n +Just a directory. = Это папка. +Missing key = Отсутствует ключ +MsgErrorCode = Код ошибки: +MsgErrorSavedataDataBroken = Сохранения были повреждены. +MsgErrorSavedataMSFull = Карта памяти заполнена. Проверьте наличие свободного места. +MsgErrorSavedataNoData = Внимание: сохранения не найдены. +MsgErrorSavedataNoMS = Карта памяти не вставлена. +No EBOOT.PBP, misidentified game = Не найден EBOOT.PBP, не удалось определить игру. +Not a valid disc image. = Некорректный образ диска. +OpenGLDriverError = Ошибка драйвера OpenGL +PPSSPP doesn't support UMD Music. = PPSSPP не поддерживает музыкальные UMD. +PPSSPP doesn't support UMD Video. = PPSSPP не поддерживает UMD с видео. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP запускает игры для PSP, не для PlayStation 1 или 2. +PPSSPPDoesNotSupportInternet = В данный момент PPSSPP не поддерживает загрузку DLC, PSN и обновлений игры из Интернета. +PS1 EBOOTs are not supported by PPSSPP. = PS1 EBOOT не поддерживаются PPSSPP. +PSX game image detected. = Этот файл - образ MODE2. PPSSPP не поддерживает игры PS1. +RAR file detected (Require UnRAR) = файл сжат (RAR).\nПожалуйста, распакуйте (попробуйте UnRAR). +RAR file detected (Require WINRAR) = файл сжат (RAR).\nПожалуйста, распакуйте (попробуйте WinRAR). +Running slow: try frameskip, sound is choppy when slow = Медленная работа: включите пропуск кадров, звук прерывается +Running slow: Try turning off Software Rendering = Медленная работа: попробуйте отключить "программный рендеринг" +Save encryption failed. This save won't work on real PSP = Кодирование сохранения не удалось. Этот файл не будет работать на PSP +textures.ini filenames may not be cross-platform = Имена файлов в "textures.ini" могут работать не на всех платформах. +This is a saved state, not a game. = Это — сохраненное состояние, а не игра. +This is save data, not a game. = Это — данные сохранения, а не игра. +Unable to create cheat file, disk may be full = Не удалось создать файл читов: не хватает места. +Unable to initialize rendering engine. = Не удалось инициализировать движок рендеринга. +Unable to write savedata, disk may be full = Не удалось записать данные сохранения: не хватает места. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Предупреждение: видеопамять ЗАПОЛНЕНА, уменьшение масштаба и переключение на медленное кэширование. +Warning: Video memory FULL, switching to slow caching mode = Предупреждение: видеопамять ЗАПОЛНЕНА, переключение на медленное кэширование. +ZIP file detected (Require UnRAR) = файл сжат (ZIP).\nПожалуйста, распакуйте (попробуйте UnRAR). +ZIP file detected (Require WINRAR) = файл сжат (ZIP).\nПожалуйста, распакуйте (попробуйте WinRAR). + +[Game] +Asia = Азия +ConfirmDelete = Удалить +Create Game Config = Создать конфиг +Create Shortcut = Создать ярлык +Delete Game = Удалить игру +Delete Game Config = Удалить конфиг +Delete Save Data = Удалить сохранения +Europe = Европа +Game = Игра +Game Settings = Настройки игры +Homebrew = Хоумбрю +Hong Kong = Гонконг +InstallData = Установить данные +Japan = Япония +Korea = Корея +MB = Мб +One moment please... = Одну минутку... +Play = Запустить +Remove From Recent = Удалить из недавних +SaveData = Сохранения +Setting Background = Установка фона +Show In Folder = Показать в папке +USA = США +Use UI background = Использовать фон интерфейса + +[Graphics] +% of the void = % пустоты +% of viewport = % окна просмотра +%, 0:unlimited = %, 0 = без огр. +(supersampling) = (суперсэмплинг) +(upscaling) = (увеличение) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Принудительно +Alternative Speed = Другая скорость (в %, 0 = без ограничений) +Alternative Speed 2 = Другая скорость 2 (в %, 0 = без ограничений) +Anisotropic Filtering = Анизотропная фильтрация +Auto = Авто +Auto (1:1) = Авто (1:1) +Auto (same as Rendering) = Авто (как разрешение рендеринга) +Auto FrameSkip = Автопропуск кадров +Auto Scaling = Автомасштаб +Backend = Бэкенд +Balanced = Сбалансированно +Bicubic = Бикубический +BlockTransfer Tip = Требуется для корректной графики в некоторых играх +BlockTransferRequired = Предупреждение: для этой игры требуется включить "Симуляцию эффектов от передачи блоков" +Both = Оба +Buffer graphics commands (faster, input lag) = Команды буферированной графики (быстрее, задержка ввода) +Buffered Rendering = Буферированный рендеринг +BufferedRenderingRequired = Предупреждение: для этой игры требуется буферированный режим рендеринга. +Camera = Камера +Camera Device = Устройство камеры +Cardboard Screen Size = Размер экрана (в % от области видимости) +Cardboard Screen X Shift = Сдвиг по X (в % пустого пространства) +Cardboard Screen Y Shift = Сдвиг по Y (в % пустого пространства) +Cardboard VR Settings = Параметры Google Cardboard VR +Cheats = Читы +Clear Speedhack = Очищать буферы кадров при первом использовании (спидхак) +ClearSpeedhack Tip = Иногда быстрее (в основном на мобильных устройствах), может вызывать глюки +CPU Core = Ядро ЦП +Debugging = Отладка +DefaultCPUClockRequired = Предупреждение: для этой игры требуется выставить стандартную частоту ЦП. +Deposterize = Депостеризация +Deposterize Tip = Исправляет полосатость в масштабированных текстурах +Device = Устройство +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Отключить медленные эффекты (быстрее) +Disabled = Отключено +Display layout editor = Редактор расположения экрана +Display Resolution (HW scaler) = Разрешение экрана (аппаратное) +Dump next frame to log = Сохранить следующий кадр в логе +Enable Cardboard VR = Включить Cardboard VR +Features = Возможности +FPS = FPS +Frame Rate Control = Управление частотой кадров +Frame Skipping = Пропуск кадров +Frame Skipping Type = Тип пропуска кадров +FullScreen = Полноэкранный режим +Hack Settings = Параметры хаков (могут вызывать глюки) +Hardware Tessellation = Аппаратная тесселяция +Hardware Transform = Аппаратное преобразование +hardware transform error - falling back to software = Ошибка аппаратного преобразования, переключено на программное +HardwareTessellation Tip = Использует ГП для создания кривых, всегда фиксированное качество +High = Высокое +Hybrid = Гибридный +Hybrid + Bicubic = Гибридный + бикубический +Ignore camera notch when centering = Игнорировать челку камеры при центрировании +Internal Resolution = Внутренние разрешение +Lazy texture caching = Ленивое кэширование текстур (быстрее) +Linear = Линейный +Low = Низкое +LowCurves = Качество сплайнов и кривых Безье +LowCurves Tip = Используется в некоторых играх, влияет на плавность кривых +Lower resolution for effects (reduces artifacts) = Эффекты низкого качества (меньше артефактов) +Manual Scaling = Свой масштаб +Medium = Среднее +Mode = Режим +Must Restart = Вы должны перезапустить PPSSPP, чтобы изменения вступили в силу. +Native device resolution = Разрешение устройства +Nearest = Ближайший +No buffer = Нет буфера +Non-Buffered Rendering = Пропускать эффекты (небуферированный) +None = Выключено +Number of Frames = Количество кадров +Off = Выключено +OpenGL = OpenGL +Overlay Information = Информация в оверлее +Partial Stretch = Частичное растягивание +Percent of FPS = Процент от FPS +Performance = Производительность +Postprocessing effect = Эффекты постобработки +Postprocessing Shader = Постобработка (шейдер) +Recreate Activity = Создать активность заново +Render duplicate frames to 60hz = Рендеринг дублирующихся кадров до 60 Гц +RenderDuplicateFrames Tip = Может сгладить частоту кадров в тех играх, где она низкая +Rendering Mode = Режим рендеринга +Rendering Resolution = Разрешение рендеринга +RenderingMode NonBuffered Tip = Быстрее, но ничего не может в некоторых играх +Retain changed textures = Сохранять измененные текстуры (иногда медленнее) +RetainChangedTextures Tip = Делает много игр медленнее, но некоторые - намного быстрее +Rotation = Ориентация +Safe = Безопасно +Screen layout = Расположение экрана +Screen Scaling Filter = Фильтр масштабирования экрана +Show Debug Statistics = Отображать отладочную информацию +Show FPS Counter = Показывать счетчик FPS +Simulate Block Transfer = Симулировать эффекты от передачи блоков +SoftGPU Tip = В настоящее время ОЧЕНЬ медленно +Software Rendering = Программный рендеринг (медленно) +Software Skinning = Программная заливка +SoftwareSkinning Tip = Объединяет вызовы отрисовки моделей с заливкой на ЦП, быстрее во многих играх +Speed = Скорость +Stretching = Растягивание +Texture Filter = Текстурный фильтр +Texture Filtering = Фильтрация текстур +Texture Scaling = Масштабирование текстур +Texture Shader = Текстурный шейдер +Turn off Hardware Tessellation - unsupported = Выключите "аппаратную тесселяцию": не поддерживается +Unlimited = Без ограничений +Up to 1 = До 1 +Up to 2 = До 2 +Upscale Level = Уровень масштабирования +Upscale Type = Тип масштабирования +UpscaleLevel Tip = Нагружает ЦП. Масштабирование может происходить с задержкой для предотвращения заиканий +Use all displays = Задействовать все экраны +Vertex Cache = Вершинный кэш +VertexCache Tip = Быстрее, но может вызывать мерцание +VSync = Вертикальная синхронизация +Vulkan = Vulkan +Window Size = Размер окна +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Удалить ZIP файл +Install = Установить +Install game from ZIP file? = Установить игру из ZIP-файла? +Install textures from ZIP file? = Установить текстуры из ZIP-файла? +Installed! = Установлено! +Texture pack doesn't support install = Набор текстур не поддерживает установку +Zip archive corrupt = ZIP-архив повреждён +Zip file does not contain PSP software = В ZIP-файле отсутсвует ПО для PSP + +[KeyMapping] +Autoconfigure = Авто конфиг +Autoconfigure for device = Авто конфиг для устройства +Clear All = Очистить все +Default All = По умолчанию +Map a new key for = Назначить кнопку для +Map Key = Назначить кнопку +Map Mouse = Назначить мышь +Test Analogs = Тест стиков +You can press ESC to cancel. = Для отмены вы можете нажать Esc. + +[MainMenu] +Browse = Обзор... +Buy PPSSPP Gold = PPSSPP Gold +Choose folder = Выберите папку +Credits = Авторы +PPSSPP Homebrew Store = магазина хоумбрю PPSSPP +Exit = Выход +Game Settings = Настройки +Games = Игры +Give PPSSPP permission to access storage = Дать доступ к хранилищу данных +Homebrew & Demos = Хоумбрю и демо +How to get games = Как получить игры? +How to get homebrew & demos = Как получить хоумбрю и демо? +Load = Открыть... +Loading... = Загрузка... +PinPath = Закрепить +PPSSPP can't load games or save right now = PPSSPP не может загрузить игры и сохранения +Recent = Недавние +SavesAreTemporary = PPSSPP сохраняет данные во временном хранилище +SavesAreTemporaryGuidance = Извлеките PPSSPP в постоянное хранилище +SavesAreTemporaryIgnore = Игнорировать предупреждение +UnpinPath = Открепить +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Аудио +Controls = Управление +Graphics = Графика +Networking = Сеть +System = Системные +Tools = Инструменты + +[MappableControls] +Alt speed 1 = Другая скорость 1 +Alt speed 2 = Другая скорость 2 +An.Down = Стик вниз +An.Left = Стик влево +An.Right = Стик вправо +An.Up = Стик вверх +Analog limiter = Огр. аналог. +Analog Stick = Аналоговый стик +Audio/Video Recording = Запись аудио/видео +Auto Analog Rotation (CCW) = Автовращение аналогового стика ПрЧС +Auto Analog Rotation (CW) = Автовращение аналогового стика ПЧС +AxisSwap = Смена осей +Circle = Кружок +Cross = Крестик +D-pad down = D-pad вниз +D-pad left = D-pad влево +D-pad right = D-pad вправо +D-pad up = D-pad вверх +DevMenu = Меню разраб. +Down = Вниз +Dpad = Крестовина +Frame Advance = Перемотка кадров +Hold = Hold +Home = Home +L = L +Left = Влево +Load State = Загрузить +Mute toggle = Выключить звук +Next Slot = След. слот +None = Нет +Note = Нота +OpenChat = Открыть чат +Pause = Пауза +R = R +RapidFire = Турбо кнопка +Remote hold = Удалённый hold +Rewind = Возврат +Right = Вправо +Right Analog Stick (tap to customize) = Правый аналоговый стик (нажмите для настройки) +RightAn.Down = Пр. стик вниз +RightAn.Left = Пр. стик влево +RightAn.Right = Пр. стик вправо +RightAn.Up = Пр. стик вверх +Rotate Analog (CCW) = Поворот стика ПрЧС +Rotate Analog (CW) = Поворот стика ПЧС +Save State = Сохранить +Screen = Экран +Screenshot = Скриншот +Select = Select +SpeedToggle = Скорость +Square = Квадрат +Start = Start +Texture Dumping = Дамп текстур +Texture Replacement = Подмена текстур +Toggle Fullscreen = Полноэкр. режим +Toggle mode = Переключить режим +Triangle = Треугольник +Unthrottle = Неогр. скор. +Up = Вверх +Vol + = Громкость + +Vol - = Громкость - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Раздел многопользовательских игр на форуме +AdHoc Server = Ad-hoc сервер +AdhocServer Failed to Bind Port = Не удалось привязать порт ad-hoc сервера +Auto = Авто +Bottom Center = Внизу в центре +Bottom Left = Внизу слева +Bottom Right = Внизу справа +Center Left = В центре слева +Center Right = В центре справа +Change Mac Address = Изменить MAC-адрес +Change proAdhocServer Address = Изменить IP-адрес ad-hoc сервера (localhost = множество экземпляров) +Chat = Чат +Chat Button Position = Позиция кнопки чата +Chat Here = Чат здесь +Chat Screen Position = Позиция чата на экране +Disconnected from AdhocServer = Соединение с ad-hoc сервером отключено +DNS Error Resolving = Устранение ошибок DNS +Enable built-in PRO Adhoc Server = Использовать встроенный ad-hoc сервер +Enable network chat = Включить сетевой чат +Enable networking = Включить сеть через WLAN (бета, менее совместимо) +Enable UPnP = Включить UPnP (требуется несколько секунд для обнаружения) +EnableQuickChat = Включить быстрый чат +Enter a new PSP nickname = Введите новый ник PSP +Enter Quick Chat 1 = Ввести быстрый чат 1 +Enter Quick Chat 2 = Ввести быстрый чат 2 +Enter Quick Chat 3 = Ввести быстрый чат 3 +Enter Quick Chat 4 = Ввести быстрый чат 4 +Enter Quick Chat 5 = Ввести быстрый чат 5 +Error = Ошибка +Failed to Bind Localhost IP = Не удалось привязать localhost IP +Failed to Bind Port = Не удалось привязать порт +Failed to connect to Adhoc Server = Не удалось подключиться к ad-hoc серверу +Forced First Connect = Принудительное первое подключение (быстрое подключение) +Invalid IP or hostname = Некорректный IP или имя хоста +Minimum Timeout = Минимальный таймаут (задержка в мс, 0 = по умолчанию) +Misc = Прочее (по умолчанию = совместимость с PSP) +Network Initialized = Сеть активирована +Please change your Port Offset = Пожалуйста, измените ваше смещение порта +Port offset = Смещение порта (0 = совместимость с PSP) +proAdhocServer Address: = Адрес ad-hoc сервера: +Quick Chat 1 = Быстрый чат 1 +Quick Chat 2 = Быстрый чат 2 +Quick Chat 3 = Быстрый чат 3 +Quick Chat 4 = Быстрый чат 4 +Quick Chat 5 = Быстрый чат 5 +QuickChat = Быстрый чат +Send = Отправить +Send Discord Presence information = Отправлять информацию об игре в Discord +TCP No Delay = TCP без задержки (быстрый TCP) +Top Center = Вверху в центре +Top Left = Вверху слева +Top Right = Вверу справа +Unable to find UPnP device = Невозможно найти устройство UPnP +UPnP (port-forwarding) = UPnP (проброс портов) +UPnP need to be reinitialized = Необходимо перезапустить UPnP +UPnP use original port = Использовать оригинальный порт UPnP (включено = совместимость с PSP) +Validating address... = Проверка адреса... +WLAN Channel = Канал WLAN +You're in Offline Mode, go to lobby or online hall = Вы в автономном режиме, зайдите в лобби или в комнату в Интернете + +[Pause] +Cheats = Читы +Continue = Продолжить +Create Game Config = Создать конфиг +Delete Game Config = Удалить конфиг +Exit to menu = Выйти в меню +Game Settings = Настройки игры +Load State = Загрузить +Rewind = Возврат +Save State = Сохранить +Settings = Настройки +Switch UMD = Сменить UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (дублированная настройка, используется предыдущий ползунок) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-цвета +Amount = Размер +Black border = Черные рамки +Bloom = Свечение +Brightness = Яркость +Cartoon = Мультипликация +ColorCorrection = Цветокоррекция +Contrast = Контрастность +CRT = ЭЛТ-развертка +FXAA = Сглаживание FXAA +Gamma = Gamma +Grayscale = Оттенки серого +Intensity = Интенсивность +InverseColors = Инвертированные цвета +Natural = Естественные цвета +NaturalA = Естественные цвета (без размытия) +Off = Выключена +Power = Сила +PSPColor = Цвета PSP +Saturation = Насыщенность +Scanlines = Строки развертки (ЭЛТ) +Sharpen = Резкость +SSAA(Gauss) = SSAA (Гаусс) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Масштабирование Spline36 +VideoSmoothingAA = Сглаживание видео +Vignette = Виньетирование + +[PSPCredits] +all the forum mods = всем модераторам форума +build server = сборочный сервер +Buy Gold = Купить Gold +check = Также попробуйте Dolphin - лучший эмулятор Wii/GC: +CheckOutPPSSPP = Зацените PPSSPP, потрясающий эмулятор PSP: https://www.ppsspp.org/ +contributors = При участии: +created = Создан +Discord = Discord +info1 = PPSSPP создан исключительно в образовательных целях. +info2 = Пожалуйста, убедитесь, что у вас есть права на игры, +info3 = в которые вы играете - имеется UMD или игра куплена в PSN +info4 = на вашей реальной PSP. +info5 = PSP - торговая марка Sony, Inc. +iOS builds = сборки для iOS +license = Свободное ПО под лицензией GPL 2.0+ +list = списки совместимости, форум и информация для разработчика +PPSSPP Forums = Форумы PPSSPP +Privacy Policy = Конфиденциальность +Share PPSSPP = Поделиться +specialthanks = Отдельное спасибо: +specialthanksKeithGalocy = из NVIDIA (устройства, советы) +specialthanksMaxim = за его потрясающую работу над декодером Atrac3+ +testing = тестирование +this translation by = Переводили на русский: +title = Быстрый и портируемый эмулятор PSP +tools = Использованы бесплатные инструменты: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = MrYadro, QWEmct, DominatorRUS, Drui7 +translators2 = cyb3rm4n, CrazyMax, SukharevAndrey +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Посетите наш веб-сайт: +written = Написан на C++ для скорости и портируемости + +[RemoteISO] +Browse Games = Просмотр игр +Local Server Port = Локальный порт сервера +Manual Mode Client = Ручной режим клиента +Remote disc streaming = Удалённая трансляция диска +Remote Port = Удалённый порт +Remote Server = Удалённый сервер +Remote Subdirectory = Удалённый подкаталог +RemoteISODesc = Вы поделитесь играми из списка недавних +RemoteISOLoading = Подключено, загрузка списка игр... +RemoteISOScanning = Поиск... Нажмите "поделиться играми" на устройстве-сервере +RemoteISOScanningTimeout = Сканирование... Проверьте настройки вашего брандмауэра +RemoteISOWifi = Примечание: подключите оба устройства\nк одной точке Wi-Fi +RemoteISOWinFirewall = ВНИМАНИЕ: Брандмауэр Windows блокирует обмен данными +Settings = Настройки +Share Games (Server) = Поделиться играми (сервер) +Share on PPSSPP startup = Поделиться при запуске PPSSPP +Stop Sharing = Остановить передачу +Stopping.. = Остановка... + +[Reporting] +Bad = Плохо +FeedbackDelayInfo = Ваши данные передаются в фоновом режиме. +FeedbackDesc = Как эмуляция? Дайте знать нам и сообществу! +FeedbackDisabled = Отчёты на сервер совместимости должны быть включены. +FeedbackIncludeCRC = Примечание: для отправки CRC диска будет использована батарея +FeedbackIncludeScreen = Приложить скриншот +FeedbackSubmitDone = Ваши данные были отправлены. +FeedbackSubmitFail = Не удалось отправить данные на сервер. Попробуйте обновить PPSSPP. +FeedbackThanks = Благодарим за ваш отзыв! +Gameplay = Игровой процесс +Graphics = Графика +Great = Отлично +In-game = Ошибки +In-game Description = Игровой процесс работает, но слишком много багов +Menu/Intro = Меню +Menu/Intro Description = "Не удаётся попасть в саму игру" +Nothing = Не работает +Nothing Description = Полностью сломана +OK = OK +Open Browser = Открыть сайт с отчётами +Overall = В целом +Perfect = Отлично +Perfect Description = Безупречная эмуляция игры от начала до конца, круто! +Plays = Нормально +Plays Description = Полностью играбельно с незначительными глюками +ReportButton = Отправить отзыв +Speed = Скорость +Submit Feedback = Отправить отзыв +SuggestionConfig = Настройте эмулятор по отзывам на сайте. +SuggestionCPUSpeed0 = Уберите фиксированную частоту ЦП в настройках. +SuggestionDowngrade = Установите более старую версию PPSSPP (и сообщите об этой ошибке). +SuggestionsFound = У других пользователей работает лучше. Нажмите "Показать все отзывы". +SuggestionsNone = Эта игра не работает и у других пользователей. +SuggestionsWaiting = Отправка отзыва и проверка отзывов пользователей... +SuggestionUpgrade = Обновитесь до более новой сборки PPSSPP. +SuggestionVerifyDisc = Проверьте, что ISO является корректной копией диска. +Unselected Overall Description = Как хорошо эмулируется игра? +View Feedback = Показать все отзывы + +[Savedata] +Date = Дата +Filename = Имя файла +No screenshot = Нет скриншота +None yet. Things will appear here after you save. = Здесь ничего нет. Появится после сохранения. +Save Data = Сохранения +Save States = Состояния +Savedata Manager = Управление сохранениями +Size = Размер + +[Screen] +Cardboard VR OFF = Cardboard VR отключен +Chainfire3DWarning = ВНИМАНИЕ: обнаружен Chainfire3D, это может вызвать проблемы. +Failed to load state = Не удалось загрузить состояние +Failed to save state = Не удалось сохранить состояние +fixed = Скорость: другая +GLToolsWarning = ВНИМАНИЕ: обнаружен GLTools, это может вызвать проблемы. +In menu = В меню +Load savestate failed = Загрузка состояния не удалась +Loaded State = Состояние загружено +Loaded. Save in game, restart, and load for less bugs. = Загружено. Сохранитесь в игре, перезапустите игру и загрузите для исправления ошибок. +LoadStateDoesntExist = Не удалось загрузить состояние: файл не существует! +LoadStateWrongVersion = Не удалось загрузить состояние: файл состояния от старой версии PPSSPP! +norewind = Нет доступных состояний для возврата. +Playing = В игре +PressESC = Нажмите ESC, чтобы открыть меню паузы. +replaceTextures_false = Текстуры больше не будут подменяться. +replaceTextures_true = Включена подмена текстур. +Save State Failed = Не удалось сохранить состояние! +Saved State = Состояние сохранено +saveNewTextures_false = Сохранение текстур отключено. +saveNewTextures_true = Текстуры будут сохраняться в вашем хранилище. +SpeedCustom2 = Скорость: другая 2 +standard = Скорость: стандартная +Untitled PSP game = Безымянная игра для PSP + +[Store] +Already Installed = Уже установлено +Connection Error = Ошибка подключения +Install = Установить +Launch Game = Запустить игру +Loading... = Загрузка... +MB = Мб +Size = Размер +Uninstall = Удалить + +[SysInfo] +%d (%d per core, %d cores) = %d (%d на ядро, ядер: %d) +%d bytes = %d байт +(none detected) = (не обнаружено) +3D API = 3D API +ABI = ABI +API Version = Версия API +Audio Information = Информация об аудио +Board = Плата +Build Config = Конфиг сборки +Build Configuration = Конфигурация сборки +Built by = Собрано +Core Context = Контекст ядра +Cores = Ядра +CPU Extensions = Расширения ЦП +CPU Information = Информация о ЦП +CPU Name = Название +D3DCompiler Version = Версия D3DCompiler +Debug = Отладочная +Debugger Present = Отладчик присутствует +Device Info = Устройство +Display Information = Информация о дисплее +Driver Version = Версия драйвера +EGL Extensions = Расширенния EGL +Frames per buffer = Кадров на буфер +GPU Information = Информация о ГП +High precision float range = Диапазон точных дробных чисел +High precision int range = Диапазон точных целых чисел +Lang/Region = Язык/регион +Memory Page Size = Размер страницы памяти +Native Resolution = Родное разрешение +OGL Extensions = Расширения OGL +OpenGL ES 2.0 Extensions = Расширения OpenGL ES 2.0 +OpenGL ES 3.0 Extensions = Расширения OpenGL ES 3.0 +OpenGL Extensions = Расширения OpenGL +Optimal frames per buffer = Оптимально фреймов на буфер +Optimal sample rate = Оптимальная частота дискретизации +OS Information = Информация об ОС +PPSSPP build = Сборка PPSSPP +Refresh rate = Частота обновления +Release = Релизная +RW/RX exclusive = Захват RW/RX +Sample rate = Частота дискретизации +Shading Language = Язык шейдеров +Sustained perf mode = Режим длительной работы +System Information = Информация о системе +System Name = Название +System Version = Версия системы +Threads = Потоки +Vendor = Производитель +Vendor (detected) = Производитель (обнаруженный) +Version Information = Информация о версии +Vulkan Extensions = Расширения Vulkan +Vulkan Features = Возможности Vulkan + +[System] +(broken) = (сломано) +12HR = 12-часовой +24HR = 24-часовой +Auto = Авто +Auto Load Savestate = Автозагрузка состояния +AVI Dump started. = Дамп AVI запущен +AVI Dump stopped. = Дамп AVI остановлен +Cache ISO in RAM = Кэшировать ISO в ОЗУ +Change CPU Clock = Эмулируемая частота ЦП PSP (нестабильно) +Change Memory Stick folder = Изменить папку с картой памяти +Change Memory Stick Size = Изменить размер карты памяти (Гб) +Change Nickname = Изменить ник +ChangingMemstickPath = Сохранения, состояния и другие данные НЕ будут скопированы в эту папку.\n\nИзменить папку с картой памяти? +ChangingMemstickPathInvalid = Этот путь невозможно использовать для файлов карты памяти. +ChangingMemstickPathNotExists = Этой папки не существует.\n\nСохранения, состояния и другие данные НЕ будут скопированы в эту папку.\n\nСоздать новую папку для карты памяти? +Cheats = Коды к игре (тестируется, смотрите форум) +Clear Recent = Очистить "Недавние" +Clear Recent Games List = Очистить список недавно запущенных +Clear UI background = Очистить фон интерфейса +Confirmation Button = Кнопка подтверждения +Date Format = Формат даты +Day Light Saving = Летнее время +DDMMYYYY = ДДММГГГГ +Decrease size = Уменьшить размер +Developer Tools = Инструменты разработчика +Display Extra Info = Отображать дополнительную ниформацию +Display Games on a grid = Отображать "Игры" в сетке +Display Homebrew on a grid = Отображать "Хоумбрю и демо" в сетке +Display Recent on a grid = Отображать "Недавние" в сетке +Dynarec (JIT) = Динамическая рекомпиляция (JIT) +Emulation = Эмуляция +Enable Cheats = Включить коды +Enable Compatibility Server Reports = Отправка данных о совместимости +Failed to load state. Error in the file system. = Не удалось загрузить состояние. Ошибка файловой системы. +Failed to save state. Error in the file system. = Не удалось сохранить состояние. Ошибка файловой системы. +Fast (lag on slow storage) = Быстрый +Fast Memory = Быстрая память (нестабильно) +Force real clock sync (slower, less lag) = Принудительная синхронизация тактов (медленнее) +frames, 0:off = кадров, 0 = откл. +Games list settings = Настройки списка игр +General = Основные +Grid icon size = Размер ярлыков в режиме сетки +Help the PPSSPP team = Помочь команде PPSSPP +Host (bugs, less lag) = Хост (ошибки, медленнее) +I/O on thread (experimental) = Ввод/вывод на поток (экспериментально) +Ignore bad memory accesses = Игнорировать ошибки доступа к памяти +Increase size = Увеличить размер +Interpreter = Интерпретатор +IO timing method = Метод тайминга ввода-вывода +IR Interpreter = Интерпретатор с промежуточным кодом +Memory Stick Folder = Папка с картой памяти +Memory Stick inserted = Карта памяти вставлена +MHz, 0:default = МГц, 0 = по умолчанию +MMDDYYYY = ММДДГГГГ +Newest Save = Самое новое сохранение +Not a PSP game = Игра не для PSP +Off = Отключено +Oldest Save = Самое старое сохранение +PSP Model = Модель PSP +PSP Settings = Настройки PSP +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Запись звука +Record Display = Запись видео +Reset Recording on Save/Load State = Сбрасывать запись при сохранении/загрузке +Restore Default Settings = Сбросить настройки PPSSPP +Rewind Snapshot Frequency = Частота сохранения состояний (много памяти) +Save path in installed.txt = Путь до сохранений в installed.txt +Save path in My Documents = Путь до сохранений в "Мои документы" +Savestate Slot = Слот состояния +Savestate slot backups = Резервные копии слота состояния +Screenshots as PNG = Сохранять скриншоты в PNG +Set UI background... = Изменить фон интерфейса... +Show ID = Показывать ID +Show region flag = Показывать флаг региона +Simulate UMD delays = Имитировать задержки UMD +Slot 1 = Слот 1 +Slot 2 = Слот 2 +Slot 3 = Слот 3 +Slot 4 = Слот 4 +Slot 5 = Слот 5 +Storage full = Диск заполнен +Sustained performance mode = Режим длительной работы +Time Format = Формат времени +UI = Пользовательский интерфейс +UI Sound = Звуки интерфейса +undo %c = резервная копия %c +Use Lossless Video Codec (FFV1) = Использовать видеокодек без потерь (FFV1) +Use O to confirm = O для подтверждения +Use output buffer (with overlay) for recording = Использовать выходной буфер (с оверлеем) для записи +Use system native keyboard = Использовать системную клавиатуру +Use X to confirm = X для подтверждения +VersionCheck = Проверять наличие обновлений PPSSPP +WARNING: Android battery save mode is on = ВНИМАНИЕ: включен режим энергосбережения Android +WARNING: Battery save mode is on = ВНИМАНИЕ: включен режим энергосбережения +YYYYMMDD = ГГГГММДД + +[Upgrade] +Details = Подробности +Dismiss = Отклонить +Download = Загрузить +New version of PPSSPP available = Доступна новая версия PPSSPP diff --git a/assets/lang/sv_SE.ini b/assets/lang/sv_SE.ini new file mode 100644 index 0000000000..0392412682 --- /dev/null +++ b/assets/lang/sv_SE.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Volym vid alternativ hastighet +Audio backend = Uppspelningsteknik (ändring kräver omstart!) +AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) +Auto = Auto +Device = Device +DSound (compatible) = DSound (kompatibel) +Enable Sound = Ljud +Global volume = Global volym +Microphone = Microphone +Microphone Device = Microphone device +Mute = Tysta +Switch on new audio device = Switch on new audio device +Use global volume = Använd global volym +WASAPI (fast) = WASAPI (snabb) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Analog känslighet +Analog Limiter = Analog limiter +Analog Mapper High End = Analog mapper high-end (axis sensitivity) +Analog Mapper Low End = Analog mapper low-end (inverse deadzone) +Analog Mapper Mode = Analog mapper mode +Analog Stick = Analog stick +AnalogLimiter Tip = When the analog limiter button is pressed +Auto = Auto +Auto-centering analog stick = Auto-centering analog stick +Auto-hide buttons after seconds = Auto-hide buttons after seconds +Binds = Binds +Button Opacity = Knappgenomskinlighet +Button style = Knappstil +Calibrate D-Pad = Kalibrera D-pad +Calibration = Kalibrering +Classic = Klassisk +Combo Key Setting = Combo key setting +Combo Key Setup = Combo key setup +Confine Mouse = Stäng in muspekaren i fönstret +Control Mapping = Kontrollmappning +Custom layout... = Anpassad layout... +Customize tilt = Anpassa tilt... +D-PAD = D-Pad +Deadzone Radius = Deadzone-radie +DInput Analog Settings = DInput analoga inställningar +Disable D-Pad diagonals (4-way touch) = Slå av D-Pad-diagonaler (4-vägs touch) +Glowing borders = Glowing borders +HapticFeedback = Haptic feedback (vibration) +Ignore gamepads when not focused = Ignorera gamepads i bakgrunden +Ignore Windows Key = Ignorera Windows-tangenter +Invert Axes = Omvända axlar +Invert Tilt along X axis = Omvänd lutning längs X-axeln +Invert Tilt along Y axis = Omvänd lutning längs Y-axeln +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Tangentbords-kontrollinställningar +L/R Trigger Buttons = L/R triggerknappar +Landscape = Landskap +Landscape Auto = Landskap auto +Landscape Reversed = Landskap omvänt +Mouse = Musinställningar +Mouse sensitivity = Muskänslighet +Mouse smoothing = Musutjämning +MouseControl Tip = Du kan nu mappa musrörelser genom att klicka på "M"-ikonen. +None (Disabled) = Ingen (av) +Off = Av +OnScreen = Touch-kontroller på skärmen +Portrait = Porträtt +Portrait Reversed = Porträtt omvänt +PSP Action Buttons = PSP action-knappar +Screen Rotation = Skärmrotation +seconds, 0 : off = seconds, 0 = off +Sensitivity = Känslighet +Show right analog = Show right analog +Show Touch Pause Menu Button = Show Touch Pause Menu Button +Thin borders = Tunna kanter +Tilt Base Radius = Tilt base radius +Tilt Input Type = Lutningstyp +Tilt Sensitivity along X axis = Lutningskänslighet X +Tilt Sensitivity along Y axis = Lutningskänslighet Y +To Calibrate = Lägg enheten på en plan yta och tryck "Kalibrera" för kalibrering. +Touch Control Visibility = Touch control visibility +Use custom right analog = Use custom right analog +Use Mouse Control = Use mouse control +Visibility = Synlighet +X = X +X + Y = X + Y +XInput Analog Settings = XInput analog settings +Y = Y + +[CwCheats] +Cheats = Fusk +Edit Cheat File = Redigera fusk-fil +Enable/Disable All = Slå av eller på alla +Import Cheats = Importera från cheat.db +Options = Inställningar +Refresh Rate = Uppdateringsfrekvens + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = Om PPSSPP... +Auto = Auto +Backend = Backend +Bicubic = Bicubic +Break = Break +Break on Load = Break on load +Buffered Rendering = Buffrad rendering +Buy Gold = Buy Gold +Control Mapping... = Kontrollmappning... +Debugging = Debuggning +Deposterize = Deposterize +Direct3D9 = Direct3D9 +Direct3D11 = Direct3D &11 +Disassembly = Disassemblera +Discord = Discord +Display Layout Editor = Display layout editor... +Display Rotation = Skärmrotation +Dump Next Frame to Log = Dump Next Frame to Log +Emulation = Emulering +Enable Chat = Enable chat +Enable Cheats = Fusk +Enable Sound = Ljud +Exit = Avsluta +Extract File... = Extrahera fil... +File = Arkiv +Frame Skipping = Frameskipping +Frame Skipping Type = Frame skipping type +Fullscreen = Fullskärm +Game Settings = Inställningar +GE Debugger... = GE Debugger... +GitHub = Git&Hub +Hardware Transform = Hårdvarutransform +Help = Hjälp +Hybrid = Hybrid +Hybrid + Bicubic = Hybrid + Bicubic +Ignore Illegal Reads/Writes = Ignorera illegala läs- och skrivningar +Ignore Windows Key = Ignorera Windows-tangenter +Keep PPSSPP On Top = Håll PPSSPP överst +Landscape = Landskap +Landscape reversed = Landskap omvänt +Language... = Språk... +Linear = Linjär +Load = Ladda +Load .sym File... = Ladda .sym-file... +Load Map File... = Ladda map-fil... +Load State = Ladda State +Load State File... = Ladda state-fil... +Log Console = Loggkonsol +Memory View... = Minnesvy... +More Settings... = Mer inställningar... +Nearest = Nearest +Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) +Off = Off +Open Directory... = Öppna mapp... +Open from MS:/PSP/GAME... = Öppna från MS:/PSP/GAME... +Open Memory Stick = Öppna Memory Stick +Open New Instance = Open new instance +OpenGL = OpenGL +Pause = Paus +Pause When Not Focused = Pausa vid tappat fokus +Portrait = Porträtt +Portrait reversed = Porträtt omvänt +Postprocessing Shader = Postprocessing Shader +PPSSPP Forums = PPSSPP-forum +Record = &Record +Record Audio = Record &audio +Record Display = Record &display +Rendering Mode = Renderingsläge +Rendering Resolution = Renderingsupplösning +Reset = Reset +Reset Symbol Table = Återställ symboltabell +Run = &Run +Save .sym File... = Spara .sym-fil... +Save Map File... = Spara map-fil... +Save State = Spara state +Save State File... = Spara state-fil... +Savestate Slot = Savestate Slot +Screen Scaling Filter = Skärmskalningsfilter +Show Debug Statistics = Visa debug-statistik +Show FPS Counter = Visa FPS-räknare +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = Stopp +Switch UMD = Byt UMD +Take Screenshot = Ta skärmdump +Texture Filtering = Texturfiltrering +Texture Scaling = Texturskalning +Use Lossless Video Codec (FFV1) = &Use lossless video codec (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = Vertexcache +VSync = VSync +Vulkan = Vulkan +Window Size = Fönsterstorlek +www.ppsspp.org = www.ppsspp.org +xBRZ = xBRZ + +[Developer] +Allocator Viewer = Allocator viewer (Vulkan) +Allow remote debugger = Allow remote debugger +Backspace = Backspace +Block address = Blockaddress +By Address = Per address +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Create/Open textures.ini file for current game +Current = Aktuellt +Dev Tools = Development tools +DevMenu = DevMenu +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Dumpa decrypterad EBOOT.BIN när spelet startar +Dump Frame GPU Commands = Dumpa GPU-kommandon för en frame +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Debugloggning +Enter address = Address +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Frame-profiler +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = Jit-jämförare +JIT debug tools = JIT debug tools +Language = Språk +Load language ini = Ladda språk-ini +Log Dropped Frame Statistics = Log dropped frame statistics +Log Level = Loggnivå +Log View = Log view +Logging Channels = Loggkanaler +Next = Nästa +No block = Inget block +Prev = Föregående +Random = Slump +Replace textures = Ersätt texturer +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. +RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? +Resume = Resume +Run CPU Tests = Kör CPU-tester +Save language ini = Spara språk-ini +Save new textures = Spara nya texturer +Shader Viewer = Shader-visare +Show Developer Menu = Visa Developer-menyn +Show on-screen messages = Show on-screen messages +Stats = Stats +System Information = Systeminformation +Texture Replacement = Ersätt texturer +Toggle Audio Debug = Toggla audio debug +Toggle Freeze = Toggla freeze +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP res +Active = Active +Back = Tillbaka +Cancel = Avbryt +Center = Center +ChangingGPUBackends = PPSSPP måste starta om för att byta GPU-backend. Vill du starta om nu? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = Välj folder att spara i +Confirm Overwrite = Vill du skriva över datan? +Confirm Save = Vill du spara denna data? +ConfirmLoad = Ladda denna data? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Ta bort +Delete all = Ta bort allt +Delete completed = Borttaget. +DeleteConfirm = All sparad data tas bort.\nÄr du säker på att du vill göra detta? +DeleteConfirmAll = Vill du verkligen ta bort all\nsparad data för spelet? +DeleteConfirmGame = Vill du verkligen ta bort det här spelet\nfrån din enhet? Detta kan inte ångras. +DeleteConfirmGameConfig = Vill du verkligen ta bort inställningarna för det här spelet? +DeleteFailed = Misslyckades ta bort data. +Deleting = Tar bort\nVänta... +Disable All = Stäng av allt +Edit = Edit +Enable All = Slå på allt +Enter = Enter +Finish = Färdig +Grid = Grid +Inactive = Inactive +InternalError = An internal error has occurred. +Load = Ladda +Load completed = Laddat. +Loading = Laddar\nVänta... +LoadingFailed = Kunde inte ladda data. +Move = Flytta +Network Connection = Nätverksuppkoppling +NEW DATA = NY DATA +No = Nej +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = OK +Old savedata detected = Old savedata detected +Options = Options +Reset = Återställ +Resize = Ändra storlek +Retry = Försök igen +Save = Spara +Save completed = Sparat. +Saving = Sparar\nVänta... +SavingFailed = Kunde inte spara data. +Select = Välj +Shift = Skift +Snap = Snap +Space = Mellanslag +SSID = SSID +Submit = Skicka +Supported = Supported +There is no data = Det finns ingen data. +Toggle All = Vänd alla +Toggle List = Toggle list +Unsupported = Unsupported +When you save, it will load on a PSP, but not an older PPSSPP = When you save, it will load on a PSP, but not an older PPSSPP +When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Yes = Ja +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = file is compressed (7z).\nPlease decompress first (try 7-Zip or WinRAR). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = Misslyckades spara skärmdump. +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll saknas. Installera, eller tryck Ja för att försöka igen med Direct3D 9 istället. +D3D11InitializationError = Direct3D 11 initieringsfel +D3D11Missing = Ditt operativsystem inkluderar inte D3D11. Kör Windows Update.\n\nTryck Ja för att försöka igen med Direct3D 9 istället. +D3D11NotSupported = Din GPU verkar inte klara av Direct3D 11.\n\nVill du försöka igen med Direct3D 9 istället? +Disk full while writing data = Disken full under dataskrivning. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = Fel vid filladdning. +Error reading file = Fel vid filläsning. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = Kunde inte identifiera fil. +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Failed initializing graphics. Try upgrading your graphics drivers and DirectX 9 runtime.\n\nWould you like to try switching to OpenGL?\n\nError message: +GenericGraphicsError = Graphics Error +GenericOpenGLError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to DirectX 9?\n\nError message: +GenericVulkanError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to OpenGL?\n\nError message: +InsufficientOpenGLDriver = Otillräckligt OpenGL-stöd detekterat!\n\nYour GPU reports that it does not support OpenGL 2.0. Would you like to try using DirectX instead?\n\nDirectX is currently compatible with less games, but on your GPU it may be the only choice.\n\nVisit the forums at https://forums.ppsspp.org for more information.\n\n +Just a directory. = Endast en katalog. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = no EBOOT.PBP, misidentified game. +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = OpenGL drivrutinsfel +PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP currently does not support connecting to the Internet for DLC, PSN, or game updates. +PS1 EBOOTs are not supported by PPSSPP. = PS1 EBOOTs stöds inte av PPSSPP. +PSX game image detected. = Filen är en MODE2 image. PPSSPP stöder inte PS1-spel. +RAR file detected (Require UnRAR) = file is compressed (RAR).\nPlease decompress first (try UnRAR). +RAR file detected (Require WINRAR) = file is compressed (RAR).\nPlease decompress first (try WinRAR). +Running slow: try frameskip, sound is choppy when slow = Running slow: try frameskip, sound is choppy when slow +Running slow: Try turning off Software Rendering = Running slow: try turning off "software rendering" +Save encryption failed. This save won't work on real PSP = Save encryption failed. This save won't work on real PSP +textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +This is a saved state, not a game. = This is a saved state, not a game. +This is save data, not a game. = This is save data, not a game. +Unable to create cheat file, disk may be full = Unable to create cheat file, disk may be full. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Unable to write savedata, disk may be full. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Warning: Video memory FULL, reducing upscaling and switching to slow caching mode. +Warning: Video memory FULL, switching to slow caching mode = Warning: Video memory FULL, switching to slow caching mode. +ZIP file detected (Require UnRAR) = file is compressed (ZIP).\nPlease decompress first (try UnRAR). +ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompress first (try WinRAR). + +[Game] +Asia = Asia +ConfirmDelete = Ta bort +Create Game Config = Skapa spelconfig +Create Shortcut = Skapa genväg +Delete Game = Ta bort spel +Delete Game Config = Ta bort spelconfig +Delete Save Data = Ta bort sparad data +Europe = Europe +Game = Spel +Game Settings = Spelinställningar +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Installerad data +Japan = Japan +Korea = Korea +MB = MB +One moment please... = Ett ögonblick... +Play = Spela +Remove From Recent = Ta bort från "Senast spelat" +SaveData = Sparad data +Setting Background = Sätter UI-bakgrund +Show In Folder = Visa i mapp +USA = USA +Use UI background = Använd UI-bakgrund + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = unlimited +(supersampling) = (supersampling) +(upscaling) = (upscaling) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Aggressiv +Alternative Speed = Alternativ hastighet +Alternative Speed 2 = Alternativ hastighet 2 (%, 0 = obegränsad) +Anisotropic Filtering = Anisotropisk filtrering +Auto = Auto +Auto (1:1) = Auto (1:1) +Auto (same as Rendering) = Auto (samma som rendering) +Auto FrameSkip = Auto FrameSkip +Auto Scaling = Auto scaling +Backend = Backend +Balanced = Balancerad +Bicubic = Bicubisk +BlockTransfer Tip = Vissa spel kräver att denna inställning är på. +BlockTransferRequired = Varning: Detta spel kräver att "Simulera blocktransfer-effekter" är påslaget. +Both = Båda +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Buffrad rendering +BufferedRenderingRequired = Warning: This game requires "rendering mode" to be set to "buffered". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Screen size (in % of the viewport) +Cardboard Screen X Shift = X shift (in % of the blank space) +Cardboard Screen Y Shift = Y shift (in % of the blank space) +Cardboard VR Settings = Google Cardboard VR settings +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU core +Debugging = Debuggning +DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. +Deposterize = Deposterize +Deposterize Tip = Fixes visual banding glitches in upscaled textures +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Stäng av långsamma effects (speedup) +Disabled = Disabled +Display layout editor = Skärmlayouteditor +Display Resolution (HW scaler) = Skärmupplösning (HW scaler) +Dump next frame to log = Dumpa nästa frame till log +Enable Cardboard VR = Enable Cardboard VR +FPS = FPS +Frame Rate Control = Framerate-kontroll +Frame Skipping = Frameskipping +Frame Skipping Type = Frame skipping type +FullScreen = Fullskärm +Hack Settings = Hack-inställningar (kan orsaka problem) +Hardware Tessellation = Hardware tessellation +Hardware Transform = Hårdvarutransform +hardware transform error - falling back to software = Hardware transform error, falling back to software +HardwareTessellation Tip = Uses hardware to make curves +High = High +Hybrid = Hybrid +Hybrid + Bicubic = Hybrid + Bicubic +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Internal resolution +Lazy texture caching = Lazy texture caching (speedup) +Linear = Linjär +Low = Low +LowCurves = Spline/Bezier kvalitet +LowCurves Tip = Only used by some games, controls smoothness of curves +Lower resolution for effects (reduces artifacts) = Lägre upplösning för effekter (bättre kvalitet) +Manual Scaling = Manual scaling +Medium = Medium +Mode = Mode +Must Restart = Starta om PPSSPP för att ändringen ska få effekt. +Native device resolution = Native device resolution +Nearest = Närmast +No buffer = No buffer +Non-Buffered Rendering = Skippa buffereffekter (snabbare, risk för fel) +None = Inget +Number of Frames = Number of frames +Off = Off +OpenGL = OpenGL +Overlay Information = Overlay-information +Partial Stretch = Partial stretch +Percent of FPS = Percent of FPS +Performance = Prestanda +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Postprocessing-Shader +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = Renderingsläge +Rendering Resolution = Renderingsupplösning +RenderingMode NonBuffered Tip = Faster, but nothing may draw in some games +Retain changed textures = Behåll ändrade texturer i cachen (ibland långsammare) +RetainChangedTextures Tip = Makes many games slower, but some games a lot faster +Rotation = Rotation +Safe = Safe +Screen layout = Screen layout +Screen Scaling Filter = Skärmskalningsfilter +Show Debug Statistics = Visa debugstatistik +Show FPS Counter = Visa FPS-räknare +Simulate Block Transfer = Simulera blocktransfer-effekter +SoftGPU Tip = Currently VERY slow +Software Rendering = Mjukvarurendering (experiment) +Software Skinning = Software Skinning +SoftwareSkinning Tip = Combine skinned model draws on the CPU, faster in most games +Speed = Hastighet +Stretching = Stretching +Texture Filter = Texturfilter +Texture Filtering = Texturfiltrering +Texture Scaling = Texturskalning +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Turn off "hardware tessellation": unsupported +Unlimited = Unlimited +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = Uppskalningsnivå +Upscale Type = Uppskalningstyp +UpscaleLevel Tip = CPU heavy - some scaling may be delayed to avoid stutter +Use all displays = Använd alla displayer +Vertex Cache = Vertexcache +VertexCache Tip = Faster, but may cause temporary flicker +VSync = VSync +Vulkan = Vulkan +Window Size = Fönsterstorlek +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Ta bort ZIP-fil +Install = Installera +Install game from ZIP file? = Installera spel från ZIP-fil? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = Installerad! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = Autokonfiguration +Autoconfigure for device = Autokonfigurera för enhet +Clear All = Rensa +Default All = Återställ allt +Map a new key for = Mappa ny knapp för +Map Key = Mappa tangent +Map Mouse = Mappa mus +Test Analogs = Testa analoger +You can press ESC to cancel. = Tryck ESC för att avbryta. + +[MainMenu] +Browse = Bläddra... +Buy PPSSPP Gold = Köp PPSSPP Gold +Choose folder = Välj mapp +Credits = Om PPSSPP +PPSSPP Homebrew Store = PPSSPP Homebrew Store +Exit = Avsluta +Game Settings = Inställningar +Games = Spel +Give PPSSPP permission to access storage = Ge PPSSPP tillstånd att komma åt lagring +Homebrew & Demos = Homebrew && Demos +How to get games = Hur man skaffar spel +How to get homebrew & demos = Hur man skaffar homebrew && demos +Load = Ladda... +Loading... = Loading... +PinPath = Fäst +PPSSPP can't load games or save right now = PPSSPP can't load games or save right now +Recent = Senast spelat +SavesAreTemporary = PPSSPP is saving in temporary storage +SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently +SavesAreTemporaryIgnore = Ignorera varning +UnpinPath = Lossa +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Ljud +Controls = Kontroll +Graphics = Grafik +Networking = Nätverk +System = System +Tools = Verktyg + +[MappableControls] +Alt speed 1 = Alt hast. 1 +Alt speed 2 = Alt hast. 2 +An.Down = Analog Ner +An.Left = Analog Vänster +An.Right = Analog Höger +An.Up = Analog Upp +Analog limiter = Analog limiter +Analog Stick = Analog-sticka +Audio/Video Recording = Audio/Video recording +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Byt axlar +Circle = Cirkel +Cross = X +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = DevMenu +Down = Dpad Ner +Dpad = Dpad +Frame Advance = Stega frame +Hold = Hold +Home = Home +L = L +Left = Dpad Vänster +Load State = Ladda State +Mute toggle = Mute toggle +Next Slot = Nästa slot +None = None +Note = Note +OpenChat = Open chat +Pause = Paus +R = R +RapidFire = Rapid-fire +Remote hold = Remote hold +Rewind = Rewind +Right = Dpad Höger +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = RightAn.Down +RightAn.Left = RightAn.Left +RightAn.Right = RightAn.Right +RightAn.Up = RightAn.Up +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Spara State +Screen = Skärm +Screenshot = Screenshot +Select = Select +SpeedToggle = Speed toggle +Square = Kvadrat +Start = Start +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = Växla fullskärm +Toggle mode = Toggle mode +Triangle = Triangel +Unthrottle = Snabbspola +Up = Dpad Upp +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Adhoc Multiplayer forum +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Ändra Mac-adress +Change proAdhocServer Address = Ändra proAdhocServer-adress (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Enable built-in PRO Adhoc Server +Enable network chat = Enable network chat +Enable networking = Nätverk/wlan (beta) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Ogiltigt IP eller hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Nätverk initierat +Please change your Port Offset = Please change your port offset +Port offset = Port offset(0 = PSP compatibility) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Visa Discord "Rich Presence"-information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Bekräftar adress... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = Fusk +Continue = Fortsätt +Create Game Config = Skapa spel-config +Delete Game Config = Ta bort spel-config +Exit to menu = Tillbaka till menyn +Game Settings = Inställningar +Load State = Ladda state +Rewind = Spola tillbaka +Save State = Spara state +Settings = Inställningar +Switch UMD = Byt UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HqGLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AAColor +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Cartoon +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT scanlines +FXAA = FXAA +Gamma = Gamma +Grayscale = Gråskala +Intensity = Intensity +InverseColors = InverseColors +Natural = Natural +NaturalA = Natural Colors (no blur) +Off = Off +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlines +Sharpen = Sharpen +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = UpscaleSpline36 +VideoSmoothingAA = VideoSmoothingAA +Vignette = Vignette + +[PSPCredits] +all the forum mods = all the forum mods +build server = build server +Buy Gold = Köp Guld +check = Kolla också in Dolphin, den bästa Wii/GC-emulatorn +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = Contributors: +created = Skapad av +Discord = Discord +info1 = PPSSPP is intended for educational purposes only. +info2 = Please make sure that you own the rights to any games +info3 = you play by owning the UMD or by buying the digital +info4 = download from the PSN store on your real PSP. +info5 = PSP is a trademark by Sony, Inc. +iOS builds = iOS builds +license = Fri mjukvara enligt GPL 2.0+ +list = compatibility lists, forums, and development info +PPSSPP Forums = PPSSPP Forums +Privacy Policy = Privacy policy +Share PPSSPP = Share PPSSPP +specialthanks = Special thanks to: +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = denna översättning av: +title = En snabb och portabel PSP-emulator +tools = Gratisverktyg +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = Henrik +translators2 = +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Kolla in webbsidan: +written = Skriven i C++ - prestanda och portabilitet + +[RemoteISO] +Browse Games = Bläddra bland spel +Local Server Port = Lokal serverport +Manual Mode Client = Manuell klient +Remote disc streaming = Remote disc streaming +Remote Port = Remote port +Remote Server = Remote server +Remote Subdirectory = Remote subdirectory +RemoteISODesc = Games in your recent list will be shared +RemoteISOLoading = Connected, loading game list... +RemoteISOScanning = Scanning... Click "share games" on your server device +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Note: Connect both devices to the same Wi-Fi network +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Settings +Share Games (Server) = Share games (server) +Share on PPSSPP startup = Share on PPSSPP startup +Stop Sharing = Stop sharing +Stopping.. = Stopping... + +[Reporting] +Bad = Dåligt +FeedbackDelayInfo = Din data håller på att skickas i bakgrunden. +FeedbackDesc = Hur funkar emuleringen? Berätta! +FeedbackDisabled = Kompatibilitets-server-rapporter måste vara påslagna.. +FeedbackIncludeCRC = Note: Battery will be used to send a disc CRC +FeedbackIncludeScreen = Inkludera en skärmdump +FeedbackSubmitDone = Din data har skickats. +FeedbackSubmitFail = Kunde inte skicka data till servern. Prova att uppdatera PPSSPP. +FeedbackThanks = Tack för din feedback! +Gameplay = Gameplay +Graphics = Grafik +Great = Mycket bra +In-game = I spelet +In-game Description = Går att spela lite, för buggigt att spela klart +Menu/Intro = Meny/Intro +Menu/Intro Description = Kan inte komma in i själva spelandet +Nothing = Inget funkar +Nothing Description = Helt trasigt, inget funkar +OK = OK +Open Browser = Bläddra +Overall = Översikt +Perfect = Perfekt +Perfect Description = Klockren emulering genom hela spelet - perfekt! +Plays = Spelbart +Plays Description = Fullt spelbart men det kan finnas små problem +ReportButton = Rapportera feedback +Speed = Hastighet +Submit Feedback = Skicka in feedback +SuggestionConfig = See reports on website for good settings. +SuggestionCPUSpeed0 = Disable locked CPU speed setting. +SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this bug). +SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. +SuggestionsNone = This game isn't working for other users too. +SuggestionsWaiting = Submitting and checking other users feedback... +SuggestionUpgrade = Upgrade to a newer PPSSPP build. +SuggestionVerifyDisc = Check your ISO is a good copy of your disc. +Unselected Overall Description = Hur bra funkar detta spel att emulera? +View Feedback = Visa all feedback + +[Savedata] +Date = Datum +Filename = Filnamn +No screenshot = Ingen skärmdump +None yet. Things will appear here after you save. = None yet. Things will appear here after you save. +Save Data = Sparad data +Save States = Sparade states +Savedata Manager = Savedata manager +Size = Size + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = WARNING: Chainfire3D detected, may cause problems. +Failed to load state = Misslyckades ladda state +Failed to save state = Misslyckades spara state +fixed = Hastighet: alternativ +GLToolsWarning = WARNING: GLTools detected, may cause problems. +In menu = I menyn +Load savestate failed = Misslyckades ladda state +Loaded State = State laddat +Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +LoadStateDoesntExist = Misslyckades ladda state: Savestate doesn't exist! +LoadStateWrongVersion = Misslyckades ladda state: Savestate is for an older version of PPSSPP! +norewind = No rewind save states available. +Playing = Playing +PressESC = Tryck ESC för att öppna pausemenyn. +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = Misslyckades spara state! +Saved State = State sparat +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Speed: alternate 2 +standard = Hastighet: standard +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = Redan installerad +Connection Error = Uppkopplingsfel +Install = Installera +Launch Game = Starta spel +Loading... = Laddar... +MB = MB +Size = Storlek +Uninstall = Avinstallera + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d cores) +%d bytes = %d bytes +(none detected) = (none detected) +3D API = 3D API +ABI = ABI +API Version = API version +Audio Information = Audio information +Board = Board +Build Config = Build config +Build Configuration = Build Configuration +Built by = Built by +Core Context = Core context +Cores = Cores +CPU Extensions = CPU extensions +CPU Information = CPU information +CPU Name = Name +D3DCompiler Version = D3DCompiler version +Debug = Debug +Debugger Present = Debugger present +Device Info = Device info +Display Information = Display information +Driver Version = Driver version +EGL Extensions = EGL extensions +Frames per buffer = Frames per buffer +GPU Information = GPU information +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Lang/Region +Memory Page Size = Memory page size +Native Resolution = Native resolution +OGL Extensions = OGL extensions +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 extensions +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 extensions +OpenGL Extensions = OpenGL extensions +Optimal frames per buffer = Optimal frames per buffer +Optimal sample rate = Optimal sample rate +OS Information = OS information +PPSSPP build = PPSSPP build +Refresh rate = Refresh rate +Release = Release +RW/RX exclusive = RW/RX exclusive +Sample rate = Sample rate +Shading Language = Shading language +Sustained perf mode = Sustained perf mode +System Information = System information +System Name = Name +System Version = System version +Threads = Threads +Vendor = Vendor +Vendor (detected) = Vendor (detected) +Version Information = Version information +Vulkan Extensions = Vulkan extensions +Vulkan Features = Vulkan features + +[System] +(broken) = (broken) +12HR = 12HR +24HR = 24HR +Auto = Auto +Auto Load Savestate = Auto load savestate +AVI Dump started. = AVI dump started +AVI Dump stopped. = AVI dump stopped +Cache ISO in RAM = Cachea hela ISO:n i RAM +Change CPU Clock = Ändra CPU-frekvens (kan orsaka instabilitet) +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Ändra nickname +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = Fuskkoder (experimental, see forums) +Clear Recent = Clear "Recent" +Clear Recent Games List = Rensa "Senast spelat" +Clear UI background = Ta bort UI-bakgrund +Confirmation Button = Bekräftelseknapp +Date Format = Datumformat +Day Light Saving = Sommartid +DDMMYYYY = DDMMYYYY +Decrease size = Decrease size +Developer Tools = Utvecklarverktyg +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emulering +Enable Cheats = Fusk +Enable Compatibility Server Reports = Skicka kompatibilitetsrapporter +Failed to load state. Error in the file system. = Kunde inte ladda state - filsystemsfel +Failed to save state. Error in the file system. = Kunde inte spara state - filsystemsfel +Fast (lag on slow storage) = Snabbt (lag on slow storage) +Fast Memory = Snabbt minne (instabilt) +Force real clock sync (slower, less lag) = Force real clock sync (slower, less lag) +frames, 0:off = frames, 0 = avstängt +Games list settings = Games list settings +General = Blandat +Grid icon size = Grid icon size +Help the PPSSPP team = Stöd PPSSPP-teamet +Host (bugs, less lag) = Host (bugs, mindre lagg) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Interpreter +IO timing method = IO-timingsmetod +IR Interpreter = IR interpreter +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = Memory Stick insatt +MHz, 0:default = MHz, 0 = standard +MMDDYYYY = MMDDYYYY +Newest Save = Newest save +Not a PSP game = Inte ett PSP-spel +Off = Off +Oldest Save = Oldest save +PSP Model = PSP-modell +PSP Settings = PSP-inställningar +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Spela in audio till fil +Record Display = Spela in video till fil +Reset Recording on Save/Load State = Reset recording on Save/Load state +Restore Default Settings = Återställ standard-inställningar +Rewind Snapshot Frequency = Rewind Snapshot Frequency (mem hog) +Save path in installed.txt = Sparkatalog från installed.txt +Save path in My Documents = Sparkatalog i Dokument +Savestate Slot = Savestate slot +Savestate slot backups = Savestate slot backups +Screenshots as PNG = Skärmdumpar som PNG +Set UI background... = Välj UI-bakgrund... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Simulera UMD-fördröjningar +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Lagringsutrymme fullt +Sustained performance mode = Sustained performance mode +Time Format = Tidsformat +UI = Användargränssnitt +UI Sound = Ljud i användargränssnittet +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Använd förlust-fri video codec (FFV1) +Use O to confirm = Använd O för att bekräfta +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = Använd X för att bekräfta +VersionCheck = Kolla efter nya versioner av PPSSPP +WARNING: Android battery save mode is on = WARNING: Android battery save mode is On +WARNING: Battery save mode is on = WARNING: Battery save mode is on +YYYYMMDD = YYYYMMDD + +[Upgrade] +Details = Details +Dismiss = Stäng +Download = Ladda ner +New version of PPSSPP available = Ny version av PPSSPP tillgänglig diff --git a/assets/lang/tg_PH.ini b/assets/lang/tg_PH.ini new file mode 100644 index 0000000000..cc312a40a6 --- /dev/null +++ b/assets/lang/tg_PH.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = Audio backend (Kailangan pang i-Restart) +AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) +Auto = Awto +Device = Device +DSound (compatible) = DSound (Komportable) +Enable Sound = Paganahin ang Tunog +Global volume = Kahinaan/Kalakasan ng Tunog +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = WASAPI (Mabilis) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Analog axis sensitivity +Analog Limiter = Taga limit ng Analog +Analog Mapper High End = Analog Mapper High-End (axis sensitivity) +Analog Mapper Low End = Analog Mapper Low-End (Kabaliktaran ng Deadzone) +Analog Mapper Mode = Analog Mapper Mode +Analog Stick = Analog stick +AnalogLimiter Tip = When the analog limiter button is pressed +Auto = Awto +Auto-centering analog stick = Auto-centering analog stick +Auto-hide buttons after seconds = Itago ang mga Buton Tapos ng Ilang Segundo +Binds = Binds +Button Opacity = Kalinawan ng mga Buton +Button style = Istylu ng mga Buton +Calibrate D-Pad = Calibrate +Calibration = Calibration +Classic = Classic +Combo Key Setting = Combo Key Setting +Combo Key Setup = Combo Key Setup +Confine Mouse = Trap mouse within window/display area +Control Mapping = Pagtakda ng Kontrol +Custom layout... = Edit touch control layout... +Customize tilt = I-Customize ang tilt... +D-PAD = D-Pad +Deadzone Radius = Deadzone radius +DInput Analog Settings = DInput analog settings +Disable D-Pad diagonals (4-way touch) = Disable D-Pad diagonals (4-way touch) +Glowing borders = Glowing borders +HapticFeedback = Haptic feedback (vibration) +Ignore gamepads when not focused = Wag pansinin ang gamepads kapag hindi naka-focus +Ignore Windows Key = Wag Paganahin ang Windows key +Invert Axes = Invert axes +Invert Tilt along X axis = Invert tilt along X axis +Invert Tilt along Y axis = Invert tilt along Y axis +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Keyboard Control Settings +L/R Trigger Buttons = L/R trigger buttons +Landscape = Pahiga +Landscape Auto = Landscape auto +Landscape Reversed = Pabaliktad na Pahiga +Mouse = Mouse settings +Mouse sensitivity = Mouse sensitivity +Mouse smoothing = Mouse smoothing +MouseControl Tip = You can now map mouse in control mapping screen by pressing the 'M' icon. +None (Disabled) = Wala (Di Gagana) +Off = Off +OnScreen = Pindutan sa Iskrin +Portrait = Patayo +Portrait Reversed = Pabaliktad na Patayo +PSP Action Buttons = PSP action buttons +Screen Rotation = Rotation ng Screen +seconds, 0 : off = segundo, 0 = patay +Sensitivity = Sensitivity +Show right analog = Show right analog +Show Touch Pause Menu Button = Ipakita ang Pause Menu Button +Thin borders = Thin borders +Tilt Base Radius = Tilt base radius +Tilt Input Type = Tilt input type +Tilt Sensitivity along X axis = Tilt sensitivity along X axis +Tilt Sensitivity along Y axis = Tilt sensitivity along Y axis +To Calibrate = Para Ma-Calibrate, ilagay ang device sa flat na bagay at i-tap ang "Calibrate" +Touch Control Visibility = Touch Control Visibility +Use custom right analog = Use custom right analog +Use Mouse Control = Use mouse control +Visibility = Kalinawan +X = X +X + Y = X + Y +XInput Analog Settings = XInput analog settings +Y = Y + +[CwCheats] +Cheats = Mga Daya +Edit Cheat File = Edit Cheat File +Enable/Disable All = Paganahin/Wag Paganahin ang mga Cheats +Import Cheats = Import ang Cheats mula sa cheat.db +Options = Ayos +Refresh Rate = Refresh rate + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = Tungkol sa PPSSPP... +Auto = &Awto +Backend = Rendering &Backend (Restarts PPSSPP) +Bicubic = &Bicubic +Break = Break +Break on Load = Break on load +Buffered Rendering = &Buffered Rendering +Buy Gold = Bilhin &ang Gold +Control Mapping... = C&ontrol Mapping... +Debugging = &Debug +Deposterize = &Deposterize +Direct3D9 = &Direct3D9 +Direct3D11 = Direct3D &11 +Disassembly = &Disassembly... +Discord = Discord +Display Layout Editor = Display Layout Editor... +Display Rotation = Display rotation +Dump Next Frame to Log = D&ump Next Frame to Log +Emulation = &Emulasyon +Enable Chat = Enable chat +Enable Cheats = Ipaganahin ang &Cheats +Enable Sound = Ipaganahin ang S&ound +Exit = &Lumabas +Extract File... = E&xtract File... +File = &File +Frame Skipping = &Frame skipping +Frame Skipping Type = Frame skipping type +Fullscreen = Fu&llscreen +Game Settings = &Settings ng Laro +GE Debugger... = GE Debugge&r... +GitHub = Git&Hub +Hardware Transform = &Hardware Transform +Help = &Tulong +Hybrid = &Hybrid +Hybrid + Bicubic = H&ybrid + Bicubic +Ignore Illegal Reads/Writes = &Ignore Illegal Reads/Writes +Ignore Windows Key = Wag pansinin ang Windows Key +Keep PPSSPP On Top = &Keep PPSSPP on Top +Landscape = Pahiga +Landscape reversed = Pabaliktad na Pahiga +Language... = La&nguage... +Linear = &Linear +Load = &i-Load... +Load .sym File... = Lo&ad .sym File... +Load Map File... = Load &Map File... +Load State = L&oad State +Load State File... = &Load State File... +Log Console = &Log Console +Memory View... = Memory &View... +More Settings... = &Iba pang Settings... +Nearest = &Nearest +Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) +Off = &Off +Open Directory... = Buksan ang &Directory... +Open from MS:/PSP/GAME... = I-O&pen mula sa MS:/PSP/GAME... +Open Memory Stick = Buksan ang &Memory Stick +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = I-&Tigil +Pause When Not Focused = Mapa-&pause ang laro kapag hindi naka focus +Portrait = Patayo +Portrait reversed = Pabaliktad na Patayo +Postprocessing Shader = Postprocessin&g Shader +PPSSPP Forums = PPSSPP &Forums +Record = &Record +Record Audio = Record &audio +Record Display = Record &display +Rendering Mode = Rendering M&ode +Rendering Resolution = &Resolusyon ng Rendering +Reset = R&eset +Reset Symbol Table = Reset S&ymbol Table +Run = &Run +Save .sym File... = Sav&e .sym File... +Save Map File... = &Save Map File... +Save State = S&ave State +Save State File... = &Save State File... +Savestate Slot = Saves&tate Slot +Screen Scaling Filter = Scr&een Scaling Filter +Show Debug Statistics = Show Debu&g Statistics +Show FPS Counter = Ipakita ang &FPS Counter +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = I-&Hinto +Switch UMD = Switch UMD +Take Screenshot = &Kumuha ng Screenshot +Texture Filtering = Te&xture Filtering +Texture Scaling = &Texture Scaling +Use Lossless Video Codec (FFV1) = &Use lossless video codec (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = &Vertex Cache +VSync = VS&ync +Vulkan = Vulkan +Window Size = &Window Size +www.ppsspp.org = Bisitahin ang www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allocator viewer (Vulkan) +Allow remote debugger = Allow remote debugger +Backspace = Backspace +Block address = I-Block ang address +By Address = By address +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Create/Open textures.ini file for current game +Current = Kasalukuyan +Dev Tools = Development tools +DevMenu = DevMenu +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Dump decrypted EBOOT.BIN on game boot +Dump Frame GPU Commands = Dump frame GPU commands +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Paganahin ang Debug Logging +Enter address = Ilagay ang address +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Frame profiler +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = Ipagkumpara ang JIT +JIT debug tools = JIT debug tools +Language = Wika +Load language ini = i-Load ang Language ini +Log Dropped Frame Statistics = Log dropped frame statistics +Log Level = Level ng Log +Log View = Log view +Logging Channels = Logging channels +Next = Susunod +No block = No block +Prev = Nakalipas +Random = Random +Replace textures = Replace textures +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Sigurado ka bang ibalik ang Setting sa dati?\nAng Control Mapping Settings ay di mababago.\n\n\nHindi mo na ito maibabalik.\nPaki-restart ang PPSSPP para makita ang mga binago. +RestoreGameDefaultSettings = Sigurado ka bang ibalik sa dati\nang Setting ng isang spesipikong laro?\n\n\nHindi mo na ito maibabalik.\nPaki-restart ang PPSSPP para makita ang mga binago. +Resume = Resume +Run CPU Tests = Magsagawa ng CPU Tests +Save language ini = i-Save ang Language ini +Save new textures = Save new textures +Shader Viewer = Shader viewer +Show Developer Menu = Ipakita ang Developer Menu +Show on-screen messages = Show on-screen messages +Stats = Stats +System Information = Impormasyon ng Sistema +Texture Replacement = Texture replacement +Toggle Audio Debug = Toggle audio debug +Toggle Freeze = Toggle freeze +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP res +Active = Active +Back = Bumalik +Cancel = Kanselahin +Center = Gitna +ChangingGPUBackends = Kapag pinalitan ang GPU backends,\nKailangan mong I-restart ang PPSSPP. Magpatuloy? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = Piliin ang PPSSPP save folder +Confirm Overwrite = Nais mo bang patungan ang Datos? +Confirm Save = Nais mo bang i-save ang Datos? +ConfirmLoad = i-Load ang Datos? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Burahin +Delete all = Burahin Lahat +Delete completed = Burado na. +DeleteConfirm = Ang save data na ito ay mabubura.\nGusto mo bang ituloy? +DeleteConfirmAll = Gusto mo bang burahin\nang save data ng larong ito? +DeleteConfirmGame = Gusto mo bang burahin ang larong ito\nsa iyong device? Wala ng undo ito. +DeleteConfirmGameConfig = Sigurado ka bang burahin ang settings ng larong ito? +DeleteFailed = Hindi mabura ang datos. +Deleting = Binubura...\nSandali lamang... +Disable All = Disable all +Edit = Edit +Enable All = Enable all +Enter = Pumasok +Finish = Tapusin +Grid = Grid +Inactive = Inactive +InternalError = An internal error has occurred. +Load = I-Load +Load completed = Kumpletong nai-Load. +Loading = Sandali lamang... +LoadingFailed = Hindi mai-load ang datos. +Move = Galawin +Network Connection = Network Connection +NEW DATA = BAGONG DATOS +No = Hindi +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = Sige +Old savedata detected = Nahanap ang lumang savedata +Options = Options +Reset = Ibalik +Resize = Resize +Retry = Ulitin +Save = I-Save +Save completed = Kumpletong nai-Save. +Saving = Sandali lamang...\nKasalukuyang nagsesave +SavingFailed = Hindi mai-save ang datos. +Select = Piliin +Shift = Shift +Snap = Snap +Space = Space +SSID = SSID +Submit = I-Submit +Supported = Supported +There is no data = Walang Datos +Toggle All = Toggle all +Toggle List = Toggle list +Unsupported = Unsupported +When you save, it will load on a PSP, but not an older PPSSPP = Kapag iyong nai-save, gagana ito mismo sa PSP\npero hindi sa lumang bersyon ng PPSSPP +When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Yes = Oo +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = Ang file ay na-compress (7z).\nPaki-decompress muna (i-try ang 7-Zip o WinRAR). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = Hindi ma-save ang na screenshot +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll not found. Please install. Or press Yes to try again using Direct3D 9 instead. +D3D11InitializationError = Direct3D 11 initialization error +D3D11Missing = Your operating system version does not include D3D11. Please run Windows Update.\n\nPress Yes to try again using Direct3D 9 instead. +D3D11NotSupported = Your GPU does not appear to support Direct3D 11.\n\nWould you like to try again using Direct3D 9 instead? +Disk full while writing data = Puno ang Disk habang Sinusulat ang Datos +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = Mali sa pagkarga ng file: +Error reading file = Mali sa pagbasa ng file +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = Sumablay sa pagtukoy ng file +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Sumablay ang pag-initialize ng Grapiko. Try upgrading your graphics drivers and DirectX 9 runtime.\n\nGusto mo bang palitan ito ng OpenGL?\n\nError message: +GenericGraphicsError = Graphics Error +GenericOpenGLError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nGusto mo bang palitan ito ng DirectX 9?\n\nError message: +GenericVulkanError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to OpenGL?\n\nError message: +InsufficientOpenGLDriver = Insufficient OpenGL driver support detected!\n\nYour GPU reports that it does not support OpenGL 2.0. Would you like to try using DirectX instead?\n\nDirectX is currently compatible with less games, but on your GPU it may be the only choice.\n\nVisit the forums at https://forums.ppsspp.org for more information.\n\n +Just a directory. = Pamunuan Lamang. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = Walang EBOOT.PBP, maling laro +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = OpenGL driver error +PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP currently does not support connecting to the Internet for DLC, PSN, or game updates. +PS1 EBOOTs are not supported by PPSSPP. = PS1 EBOOTS ay di suportado ng PPSSPP. +PSX game image detected. = Ito ay isang MODE2 image. Hindi suportado ng PPSSPP ang PS1 games. +RAR file detected (Require UnRAR) = Ang File ay na Compress (RAR).\nPaki-decompress po muna (i-try ang UnRAR). +RAR file detected (Require WINRAR) = Ang File ay na Compress (RAR).\nPaki-decompress po muna (i-try ang WinRAR). +Running slow: try frameskip, sound is choppy when slow = Running slow: try frameskip, sound is choppy when slow +Running slow: Try turning off Software Rendering = Running slow: try turning off "software rendering" +Save encryption failed. This save won't work on real PSP = Mali ang pa-encrypt ng sinave. Itong sinave ay hindi gagana sa totoong PSP +textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +This is a saved state, not a game. = This is a saved state, not a game. +This is save data, not a game. = This is save data, not a game. +Unable to create cheat file, disk may be full = Hindi maka-create ng cheat file, baka ang disk ay puno na. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Hindi makakasulat ng sinave na datos, baka ang disk ay puno na. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Warning: Video memory FULL, reducing upscaling and switching to slow caching mode. +Warning: Video memory FULL, switching to slow caching mode = Warning: Video memory FULL, switching to slow caching mode. +ZIP file detected (Require UnRAR) = file is compressed (ZIP).\nPlease decompress first (try UnRAR). +ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompress first (try WinRAR). + +[Game] +Asia = Asia +ConfirmDelete = Burahin +Create Game Config = Gumawa ng Game Config +Create Shortcut = Gumawa ng Shortcut +Delete Game = Burahin ang Laro +Delete Game Config = Burahin ang game config +Delete Save Data = Burahin ang Sinave na Datos +Europe = Europe +Game = Laro +Game Settings = Ayos ng Laro +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = I-Install ang Datos +Japan = Japan +Korea = Korea +MB = MB +One moment please... = One moment please... +Play = Laruin +Remove From Recent = Alisin mula sa "Recent" +SaveData = I-Save and Datos +Setting Background = Setting background +Show In Folder = Ipakita sa Folder +USA = USA +Use UI background = Use UI background + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = unlimited +(supersampling) = (supersampling) +(upscaling) = (upscaling) +1x PSP = 1 ulit ng PSP +2x = 2ulit +2x PSP = 2 ulit ng PSP +3x = 3ulit +3x PSP = 3 ulit ng PSP +4x = 4 na ulit +4x PSP = 4 na ulit ng PSP +5x = 5ulit +5x PSP = 5 ulit ng PSP +6x PSP = 6 na ulit ng PSP +7x PSP = 7 ulit ng PSP +8x = 8ulit +8x PSP = 8 ulit ng PSP +9x PSP = 9 na ulit ng PSP +10x PSP = 10 ulit ng PSP +16x = 16 na ulit +Aggressive = Agresibo +Alternative Speed = Alternatibong Bilis +Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Anisotropic Filtering = Anisotropikong Pagsala +Auto = Awto +Auto (1:1) = Awto (1:1) +Auto (same as Rendering) = Auto (Kapareho sa Renderig Resolution) +Auto FrameSkip = Auto frameskip +Auto Scaling = Auto scaling +Backend = Backend +Balanced = Balanse +Bicubic = Bicubic +BlockTransfer Tip = Some games require this to be On for correct graphics +BlockTransferRequired = Warning: This game requires "simulate block transfer effects" to be set to On. +Both = Pareho +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Buffered Rendering +BufferedRenderingRequired = Warning: This game requires "rendering mode" to be set to "buffered". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Screen size (in % of the viewport) +Cardboard Screen X Shift = X shift (in % of the blank space) +Cardboard Screen Y Shift = Y shift (in % of the blank space) +Cardboard VR Settings = Google Cardboard VR settings +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU core +Debugging = Debugging +DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. +Deposterize = Deposterize +Deposterize Tip = Fixes visual banding glitches in upscaled textures +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Wag paganahin ang Slower Effects (Mapabilis) +Disabled = Disabled +Display layout editor = Display layout editor +Display Resolution (HW scaler) = Display resolution (HW scaler) +Dump next frame to log = i-Refresh ang Set-up +Enable Cardboard VR = Enable Cardboard VR +FPS = FPS +Frame Rate Control = Kontrol ng Frame Rate +Frame Skipping = Laktaw ng Frame +Frame Skipping Type = Frame skipping type +FullScreen = Isakto sa Sukat ng iyong Iskrin +Hack Settings = Setting ng Hack (ito ay MAGLILIKHA ng Glitches) +Hardware Tessellation = Hardware tessellation +Hardware Transform = Pagbago sa Hardware +hardware transform error - falling back to software = Hardware transform error, falling back to software +HardwareTessellation Tip = Uses hardware to make curves +High = Mataas +Hybrid = Hybrid +Hybrid + Bicubic = Hybrid + Bicubic +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Resolusyong Internal +Lazy texture caching = Lazy texture caching (Mapabilis) +Linear = Linyar +Low = Low +LowCurves = Mababang Kalidad ng Splines at Bezier Curves (pampabilis) +LowCurves Tip = Only used by some games, controls smoothness of curves +Lower resolution for effects (reduces artifacts) = Lower resolution for effects (reduces artifacts) +Manual Scaling = Manual scaling +Medium = Medium +Mode = Piliin ang Mode +Must Restart = Kailangan i-restart ang PPSSPP upang maging epiktibo ito +Native device resolution = Native device resolution +Nearest = Pinakamalapit +No buffer = No buffer +Non-Buffered Rendering = Skip buffer effects (non-buffered, faster) +None = Wala +Number of Frames = Number of frames +Off = Patayin +OpenGL = OpenGL +Overlay Information = Overlay na Impormasyon +Partial Stretch = Partial stretch +Percent of FPS = Percent of FPS +Performance = Performance +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Postprocessing shader +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = Uri ng Rendering +Rendering Resolution = Resolusyon ng Rendering +RenderingMode NonBuffered Tip = Faster, but nothing may draw in some games +Retain changed textures = Retain changed textures (sometimes slower) +RetainChangedTextures Tip = Makes many games slower, but some games a lot faster +Rotation = Rotation +Safe = Safe +Screen layout = Screen layout +Screen Scaling Filter = Screen Scaling Filter +Show Debug Statistics = Ipakita ang Debug Statistics +Show FPS Counter = Ipakita ang FPS +Simulate Block Transfer = Simulate block transfer effects +SoftGPU Tip = Currently VERY slow +Software Rendering = Software Rendering (eksperimental) +Software Skinning = Software skinning +SoftwareSkinning Tip = Combine skinned model draws on the CPU, faster in most games +Speed = Bilis +Stretching = Stretching +Texture Filter = Panala ng Tekstura +Texture Filtering = Pagsala sa Tekstura +Texture Scaling = Pagsukat sa Tekstura +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Turn off "hardware tessellation": unsupported +Unlimited = Unlimited +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = Antas ng Upscale +Upscale Type = Uri ng Upscale +UpscaleLevel Tip = CPU heavy - some scaling may be delayed to avoid stutter +Use all displays = Use all displays +Vertex Cache = Vertex Cache +VertexCache Tip = Faster, but may cause temporary flicker +VSync = VSync +Vulkan = Vulkan +Window Size = Window size +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Burahin ang ZIP File +Install = Install +Install game from ZIP file? = I-install ang laro mula sa ZIP? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = Installed! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = Auto configure +Autoconfigure for device = Autoconfigure for device +Clear All = Burahin Lahat +Default All = Ibalik lahat sa dati +Map a new key for = Bagong key para sa +Map Key = Map key +Map Mouse = Map mouse +Test Analogs = Test analogs +You can press ESC to cancel. = You can press Esc to cancel. + +[MainMenu] +Browse = i-Browse +Buy PPSSPP Gold = Buy PPSSPP Gold +Choose folder = Choose folder +Credits = Kredito +PPSSPP Homebrew Store = PPSSPP Homebrew Store +Exit = Umalis +Game Settings = Ayos ng Laro +Games = Mga Laro +Give PPSSPP permission to access storage = Bigyan ang PPSSPP ng permiso upang maka-acess sa storage +Homebrew & Demos = Homebrew &at Demos +How to get games = Paano Makakukuha ng Laro +How to get homebrew & demos = Paano Makakukuha ng Homebrew &at Demos +Load = Ikarga +Loading... = Loading... +PinPath = Pin +PPSSPP can't load games or save right now = PPSSPP can't load games or save right now +Recent = Huling Nilaro +SavesAreTemporary = PPSSPP is saving in temporary storage +SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently +SavesAreTemporaryIgnore = Ignore warning +UnpinPath = Unpin +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Tunog +Controls = Kontrol +Graphics = Grapiko +Networking = Networking +System = Sistema +Tools = Tools + +[MappableControls] +Alt speed 1 = Alt speed 1 +Alt speed 2 = Alt speed 2 +An.Down = An.Baba +An.Left = An.Kaliwa +An.Right = An.Kanan +An.Up = An.Taas +Analog limiter = Analog limiter +Analog Stick = Analog stick +Audio/Video Recording = Audio/Video recording +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Axis swap +Circle = Circle +Cross = Cross +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = DevMenu +Down = Baba +Dpad = Dpad +Frame Advance = Frame advance +Hold = Hold +Home = Home +L = L +Left = Kaliwa +Load State = Load State +Mute toggle = Mute toggle +Next Slot = Next Slot +None = None +Note = Note +OpenChat = Open chat +Pause = Hinto +R = R +RapidFire = RapidFire +Remote hold = Remote hold +Rewind = Rewind +Right = Kanan +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = KanangAn.Baba +RightAn.Left = KanangAn.Kaliwa +RightAn.Right = KanangAn.Kanan +RightAn.Up = KanangAn.Taas +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Save State +Screen = Screen +Screenshot = Screenshot +Select = Select +SpeedToggle = SpeedToggle +Square = Square +Start = Start +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = Toggle fullscreen +Toggle mode = Toggle mode +Triangle = Triangle +Unthrottle = Unthrottle +Up = Taas +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Visit Ad Hoc Multiplayer forum +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Baguhin ang MAC Address +Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable network chat = Enable network chat +Enable networking = Enable networking/WLAN (beta, may break games) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Network initialized +Please change your Port Offset = Please change your port offset +Port offset = Port offset(0 = PSP compatibility) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Send Discord "Rich Presence" information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = Mga Daya +Continue = Ituloy +Create Game Config = Gumawa game config +Delete Game Config = Burahin ang config +Exit to menu = Pumunta sa menu +Game Settings = Setting ng Laro +Load State = i-Load +Rewind = i-Rewind +Save State = i-Save +Settings = Settings +Switch UMD = Magpalit ng UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4テ幽Q GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Color +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Cartoon +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT scanlines +FXAA = FXAA Antialiasing +Gamma = Gamma +Grayscale = Grayscale +Intensity = Intensity +InverseColors = Inverse Colors +Natural = Natural Colors +NaturalA = Natural Colors (no blur) +Off = Off +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlines (CRT) +Sharpen = Sharpen +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 Upscaler +VideoSmoothingAA = VideoSmoothingAA +Vignette = Vignette + +[PSPCredits] +all the forum mods = all the forum mods +build server = build server +Buy Gold = Bilhin ang Gold +check = Tingnan din ang Dolphin, the Best Wii/GC emu around: +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = Mga Nag-ambag: +created = Nilikha ni +Discord = Discord +info1 = Ang PPSSPP ay Para sa Edukasyunal na Gamit Lamang. +info2 = Siguraduhing Ikaw ang May-ari ng Anumang Laro +info3 = Nakapaglaro Ka Dahil May UMD ka o Bumili ka ng Laro +info4 = O Magdownload sa PSN Store sa iyong PSP. +info5 = Ang PSP ay Orihinal na Marka ng Sony, Inc. +iOS builds = iOS builds +license = Libreng software mula sa GPL 2.0+ +list = Compatibility Lists, Forums, at Development info +PPSSPP Forums = Usapang PPSSPP +Privacy Policy = Privacy policy +Share PPSSPP = Share PPSSPP +specialthanks = Espesyal na Pasasalamat Kina: +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = Nagsalin sa Wikang tagalog: +title = Mabilis at Portable na PSP emulator +tools = Libreng Tools na Ginamit: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = globeTabada(globe94) +translators2 = kenma9123 +translators3 = Adriane Justine Tan +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Tingnan ang Website: +written = Isinulat sa C++ Para sa Bilis at Portabilidad + +[RemoteISO] +Browse Games = Browse games +Local Server Port = Local server port +Manual Mode Client = Manual mode client +Remote disc streaming = Remote disc streaming +Remote Port = Remote port +Remote Server = Remote server +Remote Subdirectory = Remote subdirectory +RemoteISODesc = Games in your recent list will be shared +RemoteISOLoading = Connected, loading game list... +RemoteISOScanning = Scanning... Click "share games" on your server device +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Note: Connect both devices to the same Wi-Fi network +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Settings +Share Games (Server) = Share games (server) +Share on PPSSPP startup = Share on PPSSPP startup +Stop Sharing = Stop sharing +Stopping.. = Stopping... + +[Reporting] +Bad = Masama +FeedbackDelayInfo = Your data is being submitted in the background. +FeedbackDesc = Kamusta ang pag-emulate? Paalamin ang Komunidad. +FeedbackDisabled = Compatibility server reports must be enabled. +FeedbackIncludeCRC = Note: Battery will be used to send a disc CRC +FeedbackIncludeScreen = Include a screenshot +FeedbackSubmitDone = Your data has been submitted. +FeedbackSubmitFail = Could not submit data to server. Try updating PPSSPP. +FeedbackThanks = Thanks for your feedback! +Gameplay = Gameplay +Graphics = Grapiko +Great = Great +In-game = In-game +In-game Description = Gets into gameplay, but too buggy to complete +Menu/Intro = Menu/Intro +Menu/Intro Description = Can't get into the game itself +Nothing = Nothing +Nothing Description = Completely broken +OK = OK +Open Browser = Open browser +Overall = Overall +Perfect = Perfect +Perfect Description = Flawless emulation for the entire game - great! +Plays = Plays +Plays Description = Fully playable but might be with glitches +ReportButton = Mag-Report +Speed = Bilis +Submit Feedback = I-Submit ang Feedback +SuggestionConfig = See reports on website for good settings. +SuggestionCPUSpeed0 = Disable locked CPU speed setting. +SuggestionDowngrade = Downgrade to an older PPSSPP version (please report this bug). +SuggestionsFound = Other users have reported better results. Tap "View Feedback" for more detail. +SuggestionsNone = This game isn't working for other users too. +SuggestionsWaiting = Submitting and checking other users feedback... +SuggestionUpgrade = Upgrade to a newer PPSSPP build. +SuggestionVerifyDisc = Check your ISO is a good copy of your disc. +Unselected Overall Description = How well does this game emulate? +View Feedback = View all feedbacks + +[Savedata] +Date = Date +Filename = Filename +No screenshot = Walang Screenshot +None yet. Things will appear here after you save. = Wala pa. Makikita mo dito kapag may na-savestate ka na +Save Data = I-Save ang Datos +Save States = Save States +Savedata Manager = Savedata Manager +Size = Size + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = WARNING: Chainfire3D detected, may cause problems. +Failed to load state = Sablay sa pag load ng savestate +Failed to save state = Sablay sa pag save ng savestate +fixed = Bilis: Salitan +GLToolsWarning = WARNING: GLTools detected, may cause problems. +In menu = In menu +Load savestate failed = Sablay sa pag load ng savestate +Loaded State = Estado ay nai- load +Loaded. Save in game, restart, and load for less bugs. = Loaded. Save in game, restart, and load for less bugs. +LoadStateDoesntExist = Problema sa load state: Walang Savestate! +LoadStateWrongVersion = Problema sa load state: Ang Savestate ay para sa lumang bersyon ng PPSSPP! +norewind = No rewind save states available. +Playing = Playing +PressESC = Pindutin ang ESC para mabuksan ang pause menu. +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = Sablay sa pag-save! +Saved State = Estado ay nai-save +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Speed: alternate 2 +standard = Bilis: Karaniwan +Untitled PSP game = Untitled PSP game + +[Store] +Already Installed = Already Installed +Connection Error = Connection Error +Install = Install +Launch Game = Launch game +Loading... = Loading... +MB = MB +Size = Size +Uninstall = Uninstall + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d cores) +%d bytes = %d bytes +(none detected) = (none detected) +3D API = 3D API +ABI = ABI +API Version = API version +Audio Information = Audio information +Board = Board +Build Config = Build config +Build Configuration = Build Configuration +Built by = Built by +Core Context = Core context +Cores = Cores +CPU Extensions = CPU extensions +CPU Information = CPU information +CPU Name = Name +D3DCompiler Version = D3DCompiler version +Debug = Debug +Debugger Present = Debugger present +Device Info = Device info +Display Information = Display information +Driver Version = Driver version +EGL Extensions = EGL extensions +Frames per buffer = Frames per buffer +GPU Information = GPU information +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Lang/Region +Memory Page Size = Memory page size +Native Resolution = Native resolution +OGL Extensions = OGL extensions +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 extensions +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 extensions +OpenGL Extensions = OpenGL extensions +Optimal frames per buffer = Optimal frames per buffer +Optimal sample rate = Optimal sample rate +OS Information = OS information +PPSSPP build = PPSSPP build +Refresh rate = Refresh rate +Release = Release +RW/RX exclusive = RW/RX exclusive +Sample rate = Sample rate +Shading Language = Shading language +Sustained perf mode = Sustained perf mode +System Information = System information +System Name = Name +System Version = System version +Threads = Threads +Vendor = Vendor +Vendor (detected) = Vendor (detected) +Version Information = Version information +Vulkan Extensions = Vulkan extensions +Vulkan Features = Vulkan features + +[System] +(broken) = (sira) +12HR = 12oras +24HR = 24oras +Auto = Auto +Auto Load Savestate = Auto load savestate +AVI Dump started. = AVI dump started +AVI Dump stopped. = AVI dump stopped +Cache ISO in RAM = Cache full ISO in RAM +Change CPU Clock = Baguhin ang PSP CPU Clock (unstable) +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Baguhin ang Palayaw +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = Mga Daya (eksperimental, tingnan sa Forums) +Clear Recent = Clear "Recent" +Clear Recent Games List = Burahin ang Listahan ng Laro +Clear UI background = Clear UI background +Confirmation Button = Buton Pangkumpirma +Date Format = Pormat ng Petsa +Day Light Saving = Daylight Savings +DDMMYYYY = PPBBTTTT +Decrease size = Decrease size +Developer Tools = Gamit ng Tagapagpaunlad +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emulasyon +Enable Cheats = Paganahin ang Daya +Enable Compatibility Server Reports = Paganahin ang ulat ng Kumpatibilidad +Failed to load state. Error in the file system. = Failed to load state. Error in the file system. +Failed to save state. Error in the file system. = Failed to save state. Error in the file system. +Fast (lag on slow storage) = Fast (lag on slow storage) +Fast Memory = Mabilis na Memorya (di matatag) +Force real clock sync (slower, less lag) = Force real clock sync (slower, less lag) +frames, 0:off = frames, 0 = off +Games list settings = Games list settings +General = Pangkalahatan +Grid icon size = Grid icon size +Help the PPSSPP team = Tulongan ang PPSSPP Team +Host (bugs, less lag) = Host (bugs, less lag) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Interpreter +IO timing method = I/O timing method +IR Interpreter = IR interpreter +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = Memory Stick inserted +MHz, 0:default = MHz, 0 = default +MMDDYYYY = BBPPTTTT +Newest Save = Newest save +Not a PSP game = Not a PSP game +Off = Off +Oldest Save = Oldest save +PSP Model = PSP model +PSP Settings = Ayos ng PSP +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Record audio +Record Display = Record display +Reset Recording on Save/Load State = Reset recording on Save/Load state +Restore Default Settings = Ibalik ang Settings sa Dati +Rewind Snapshot Frequency = Rewind snapshot frequency (mem hog) +Save path in installed.txt = I-Save ang Path sa installed.txt +Save path in My Documents = I-Save ang Path sa "My Documents" +Savestate Slot = Slot ng Savestate +Savestate slot backups = Savestate slot backups +Screenshots as PNG = i-Save ang Screenshot sa PNG Pormat +Set UI background... = Set UI background... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Simulate UMD delays +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Storage full +Sustained performance mode = Sustained performance mode +Time Format = Pormat ng Oras +UI = UI +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Use lossless video codec (FFV1) +Use O to confirm = O para pumili +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = X para pumili +VersionCheck = Check for new versions of PPSSPP +WARNING: Android battery save mode is on = WARNING: Android battery save mode is On +WARNING: Battery save mode is on = WARNING: Battery save mode is on +YYYYMMDD = TTTTBBPP + +[Upgrade] +Details = Details +Dismiss = Dismiss +Download = Download +New version of PPSSPP available = Meron nang bagong bersiyon ang PPSSPP diff --git a/assets/lang/th_TH.ini b/assets/lang/th_TH.ini new file mode 100644 index 0000000000..bdc36ab0ca --- /dev/null +++ b/assets/lang/th_TH.ini @@ -0,0 +1,1073 @@ +[Audio] +Alternate speed volume = ระดับเสียงในโหมดเร่งความเร็ว +Audio backend = รูปแบบเสียงที่สนับสนุน (จำเป็นต้องรีสตาร์ท) +AudioBufferingForBluetooth = บลูทูธ-เฟรนด์ลี่ บัฟเฟอร์ (ช้ากว่า) +Auto = อัตโนมัติ +Device = อุปกรณ์ +DSound (compatible) = DSound (เสถียร) +Enable Sound = เปิดการใช้งานเสียง +Global volume = ระดับเสียงหลัก +Microphone = ไมโครโฟน +Microphone Device = อุปกรณ์ไมโครโฟน +Mute = เงียบ +Switch on new audio device = สลับไปใช้อุปกรณ์เสียงอันใหม่ +Use global volume = ใช้ตามระดับเสียงหลัก +WASAPI (fast) = WASAPI (เร็ว) + +[Controls] +Analog auto-rotation speed = ความเร็วที่ใช้หมุนปุ่มอนาล็อก +Analog Axis Sensitivity = ความไวต่อการตอบสนองแกนอนาล็อก +Analog Limiter = ตัวจำกัดปุ่มอนาล็อก +Analog Mapper High End = ปรับเปลี่ยนค่าอนาล็อก high-end (การตอบสนองของแกน) +Analog Mapper Low End = ปรับเปลี่ยนค่าอนาล็อก low-end (สลับด้าน deadzone) +Analog Mapper Mode = โหมดการปรับอนาล็อก +Analog Stick = ปุ่มอนาล็อก +AnalogLimiter Tip = เมื่อกดที่ขอบปุ่มอนาล็อก ตัวจำกัดอนาล็อกจะทำงาน +Auto = อัตโนมัติ +Auto-centering analog stick = อนาล็อกกลับคืนจุดศูนย์กลางอัตโนมัติ +Auto-hide buttons after seconds = ซ่อนปุ่มทันทีหลังจาก/วินาที +Binds = เซ็ตปุ่ม +Button Opacity = ความชัดของปุ่มกด +Button style = รูปแบบของปุ่มกด +Calibrate D-Pad = ปรับค่าความคลาดเคลื่อน +Calibration = ปรับค่าความคลาดเคลื่อน +Classic = แบบดั้งเดิม +Combo Key Setting = ตั้งค่าปุ่มคอมโบ +Combo Key Setup = ติดตั้งปุ่มคอมโบ +Confine Mouse = จำกัดเมาส์ภายในหน้าต่าง/พื้นที่แสดงผล +Control Mapping = เปลี่ยนแปลงค่าควบคุม +Custom layout... = ปรับเปลี่ยนการควบคุมแบบสัมผัส... +Customize tilt = ปรับแต่งการเอียงโดยใช้เซ็นเซอร์ควบคุม... +D-PAD = ปุ่มลูกศร +Deadzone Radius = ขอบเขต Deadzone +DInput Analog Settings = ตั้งค่าอนาล็อกของจอย DInput +Disable D-Pad diagonals (4-way touch) = ปิดการใช้งานปุ่มลูกศรในแนวทแยง (สัมผัส 4 ทิศทาง) +Glowing borders = แบบขอบทึบแสง +HapticFeedback = ตอบสนองเมื่อสัมผัส (การสั่น) +Ignore gamepads when not focused = ละเว้นต่อปุ่มกดเมื่อไม่ได้ใช้หน้าจอนั้น +Ignore Windows Key = ละเว้นการใช้งานปุ่มวินโดวส์ +Invert Axes = การสลับด้านของแกน +Invert Tilt along X axis = สลับด้านการเอียงตามแนว X +Invert Tilt along Y axis = สลับด้านการเอียงตามแนว Y +Keep this button pressed when right analog is pressed = อนาล็อก(ขวา)เวลากด +Keyboard = ตั้งค่าการควบคุมแป้นพิมพ์ +L/R Trigger Buttons = ปุ่มตัวหน่วงนำโดยใช้ L/R +Landscape = แนวนอน +Landscape Auto = แนวนอนกลับด้านอัตโนมัติ +Landscape Reversed = แนวนอนกลับด้าน +Mouse = การตั้งค่าเมาส์ +Mouse sensitivity = ความไวต่อการตอบสนองของเมาส์ +Mouse smoothing = ความลื่นไหลของเมาส์ +MouseControl Tip = สามารถปรับปุ่มเมาส์ได้ในหัวข้อเปลี่ยนแปลงค่าควบคุม\nโดยการกดปรับในช่อง "M" +None (Disabled) = ไม่มี (ปิดการใช้งาน) +Off = ปิด +OnScreen = ปรับใช้หน้าจอควบคุมแบบปุ่มสัมผัส +Portrait = แนวตั้ง +Portrait Reversed = แนวตั้งกลับด้าน +PSP Action Buttons = ปุ่มแอ็คชั่นของ PSP +Screen Rotation = การหมุนหน้าจอ +seconds, 0 : off = วินาที, 0 = ปิด +Sensitivity = ความไวต่อการตอบสนอง +Show right analog = โชว์ปุ่มอนาล็อกขวา +Show Touch Pause Menu Button = แสดงปุ่มหยุดสำหรับเข้าหน้าเมนู +Thin borders = แบบขอบบาง +Tilt Base Radius = รัศมีของการเอียง +Tilt Input Type = นำเข้ารูปแบบการเอียง +Tilt Sensitivity along X axis = ความไวต่อการตอบสนองเอียงตามแกน X +Tilt Sensitivity along Y axis = ความไวต่อการตอบสนองเอียงตามแกน Y +To Calibrate = ให้วางอุปกรณ์ลงบนพื้นราบ และกด "ปรับค่าความคลาดเคลื่อน" +Touch Control Visibility = การแสดงผลปุ่มควบคุมแบบสัมผัส +Use custom right analog = ใช้การปรับเปลี่ยนปุ่มอนาล็อกขวา +Use Mouse Control = ใช้เมาส์ในการควบคุม +Visibility = ซ่อนปุ่ม +X = แกน X +X + Y = แกน X + แกน Y +XInput Analog Settings = ตั้งค่าอนาล็อกของจอย XInput +Y = แกน Y + +[CwCheats] +Cheats = การใช้สูตรโกง +Edit Cheat File = ปรับแต่งไฟล์สูตรโกง +Enable/Disable All = เปิด/ปิด ใช้งานสูตรทั้งหมด +Import Cheats = นำเข้าจากไฟล์สูตรโกง +Options = ตัวเลือก +Refresh Rate = อัตรารีเฟรช + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = เกี่ยวกับ PPSSPP... +Auto = อัตโนมัติ +Backend = การแสดงผลที่สนับสนุน (ต้องรีสตาร์ท PPSSPP) +Bicubic = ไบคิวบิค +Break = หยุด +Break on Load = หยุดเมื่อโหลด +Buffered Rendering = การแสดงผลแบบใช้บัฟเฟอร์ +Buy Gold = ซื้อแบบตัวสีทอง +Control Mapping... = แผงปรับการคุมควบ... +Debugging = แก้ไขจุดบกพร่อง +Deposterize = ดีโพสเตอร์ไรซ์ +Direct3D9 = ไดเร็คท์ 3D 9 +Direct3D11 = ไดเร็คท์ 3D 11 +Disassembly = การแยกองค์ประกอบ... +Discord = ไปที่ Discord +Display Layout Editor = แก้ไขรูปแบบของหน้าจอ... +Display Rotation = การสลับหมุนหน้าจอ +Dump Next Frame to Log = ดึงข้อมูลของเฟรมถัดไปเพื่อเก็บบันทึกค่า +Emulation = การจำลอง +Enable Chat = เปิดหน้าต่างแชท +Enable Cheats = เปิดการใช้งานสูตรโกง +Enable Sound = เปิดการใช้งานเสียง +Exit = ออก +Extract File... = แตกไฟล์... +File = ไฟล์ +Frame Skipping = ข้ามเฟรม +Frame Skipping Type = รูปแบบการข้ามเฟรม +Fullscreen = เต็มจอ +Game Settings = ตั้งค่าเกม +GE Debugger... = ระบบช่วยเหลือการแก้ไขจุดบกพร่อง... +GitHub = ไปที่ GitHub +Hardware Transform = ใช้ฮาร์ดแวร์ในการแปลงค่าประมวลผล +Help = ช่วยเหลือ +Hybrid = ไฮบริด +Hybrid + Bicubic = ไฮบริด + ไบคิวบิค +Ignore Illegal Reads/Writes = ละเว้นการอ่าน/เขียนที่ทำงานผิดพลาด +Ignore Windows Key = ปิดการใช้งานปุ่มวินโดวส์ +Keep PPSSPP On Top = ให้ PPSSPP อยู่ด้านหน้าสุด +Landscape = แนวนอน +Landscape reversed = แนวนอนกลับด้าน +Language... = ภาษา... +Linear = แบบเชิงเส้น +Load = โหลด... +Load .sym File... = โหลดไฟล์ .sym... +Load Map File... = โหลดไฟล์ Map... +Load State = โหลดสเตทเกม +Load State File... = โหลดไฟล์สเตทเกม... +Log Console = เก็บค่าคอนโซล +Memory View... = มุมมองค่าความจำ... +More Settings... = การตั้งค่าอื่นๆ... +Nearest = แบบใกล้เคียง +Non-Buffered Rendering = ข้ามการใช้บัฟเฟอร์เอฟเฟ็คท์ (ปิดบัฟเฟอร์) +Off = ปิด +Open Directory... = เปิดแหล่งที่เก็บ... +Open from MS:/PSP/GAME... = เปิดจาก MS:/PSP/GAME... +Open Memory Stick = เปิดที่เก็บบันทึกข้อมูล +Open New Instance = เปิดหน้าจอแยกใหม่ +OpenGL = โอเพ่นจีแอล +Pause = หยุดชั่วคราว +Pause When Not Focused = หยุดชั่วคราวเมื่อไม่ได้เล่น +Portrait = แนวตั้ง +Portrait reversed = แนวตั้งกลับด้าน +Postprocessing Shader = กระบวนการทำงานไล่ปรับเฉดแสงสี +PPSSPP Forums = เว็บ PPSSPP Forums +Record = การอัดบันทึก +Record Audio = อัดบันทึกเสียง +Record Display = อัดบันทึกวีดีโอ +Rendering Mode = โหมดการแสดงผล +Rendering Resolution = ความละเอียดในการแสดงผลภาพ +Reset = รีเซ็ต +Reset Symbol Table = รีเซ็ตตารางแสดงเครื่องหมาย +Run = เรียกใช้ +Save .sym File... = บันทึกไฟล์ .sym... +Save Map File... = บันทึกไฟล์ Map... +Save State = เซฟสเตทเกม +Save State File... = ไฟล์เซฟสเตทเกม... +Savestate Slot = ช่องเซฟสเตทเกม +Screen Scaling Filter = ตัวกรองขนาดของหน้าจอ +Show Debug Statistics = แสดงค่าทางสถิติการแก้ไขจุดบกพร่อง +Show FPS Counter = แสดงตัวจับค่าเฟรมเรท/วินาที +Skip Number of Frames = อิงจากค่าจำนวนเฟรม +Skip Percent of FPS = อิงจากเปอร์เซ็นต์เฟรมต่อวิ +Stop = หยุด +Switch UMD = สลับแผ่น UMD +Take Screenshot = จับภาพจากหน้าจอ +Texture Filtering = การกรองพื้นผิว +Texture Scaling = การปรับพื้นผิว +Use Lossless Video Codec (FFV1) = ใช้โค้ด FFV1 บันทึกวีดีโอ เพื่อรักษาความคมชัด +Use output buffer for video = ใช้การส่งออกบัฟเฟอร์ในการบันทึกวีดีโอ +Vertex Cache = เวอร์เท็กซ์ แคช +VSync = ควบคุมช่วงของเฟรมเรทให้คงที่ +Vulkan = วัลแคน +Window Size = ขนาดของหน้าจอ +www.ppsspp.org = เว็บไซต์หลัก PPSSPP +xBRZ = xBRZ + +[Developer] +Allocator Viewer = แสดงค่า Allocator (วัลแคน) +Allow remote debugger = เปิดใช้งานการแก้ไขจุดบกพร่องแบบรีโมท +Backspace = ถอยหลัง +Block address = บล็อคค่าที่อยู่ +By Address = โดยค่าที่อยู่ +Copy savestates to memstick root = คัดลอกเซฟสเตทไปยังต้นทางของเม็มสติ๊ก +Create/Open textures.ini file for current game = สร้าง/เปิด ไฟล์ textures.ini ของเกมนี้ +Current = ค่าดั้งเดิม +Dev Tools = เครื่องมือนักพัฒนา +DevMenu = เมนูผู้พัฒนา +Disabled JIT functionality = ปิดฟังก์ชั่นการทำงานของระบบ JIT +Draw Frametimes Graph = กราฟแสดงจำนวนเฟรม +Dump Decrypted Eboot = ดึงไฟล์ EBOOT.BIN ออกมาเก็บไว้เมื่อเริ่มเกม +Dump Frame GPU Commands = ดึงค่าเฟรมคำสั่งของ GPU +Enable Logging = เปิดใช้งานการเก็บค่าแก้ไขจุดบกพร่อง +Enable driver bug workarounds = Enable driver bug workarounds +Enter address = ใส่ค่าที่อยู่ +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = รายละเอียดของเฟรม +GPU Driver Test = ทดสอบไดรเวอร์ GPU +GPU Profile = โปรไฟล์ GPU +Jit Compare = เปรียบเทียบระบบ JIT +JIT debug tools = เครื่องมือตรวจสอบระบบ JIT +Language = ภาษา +Load language ini = โหลดไฟล์ภาษา (.ini) +Log Dropped Frame Statistics = เก็บสถิติค่าเฟรมเรทตก +Log Level = เก็บค่าระดับ +Log View = เก็บค่ามุมมอง +Logging Channels = ช่องทางเก็บค่าข้อมูล +Next = ถัดไป +No block = ไม่ต้องบล็อค +Prev = ถอยกลับ +Random = สุ่ม +Replace textures = แทนที่พื้นผิวจากแหล่งที่เก็บข้อมูล +Reset limited logging = รีเซ็ตขีดจำกัดของการบันทึกค่า +RestoreDefaultSettings = คุณแน่ใจรึว่าต้องการรีเซ็ตกลับไปเป็นค่าเริ่มต้น?\nการตั้งค่าของปุ่มต่างๆ จะไม่ถูกลบ\n\nคุณสามารถกดยกเลิกได้\nแต่ถ้าหากกดตกลงแล้วไม่เห็นผลการเปลี่ยนแปลง\nโปรดเริ่ม PPSSPP ใหม่อีกครั้งนึง +RestoreGameDefaultSettings = คุณแน่ใจรึว่าต้องการรีเซ็ตตั้งค่าเฉพาะเกม?\nการตั้งค่าของเกมนี้จะกลับไปใช้ค่าเริ่มต้นของ PPSSPP? +Resume = เล่นต่อ +Run CPU Tests = เรียกใช้การทดสอบซีพียู +Save language ini = บันทึกไฟล์ภาษา (.ini) +Save new textures = บันทึกพื้นผิวลงในแหล่งที่เก็บข้อมูล +Shader Viewer = มุมมองการปรับไล่เฉดแสงสี +Show Developer Menu = แสดงเมนูสำหรับนักพัฒนา +Show on-screen messages = แสดงข้อความการแจ้งเตือนต่างๆ +Stats = สถิติ +System Information = ข้อมูลโดยรวมของระบบ +Texture Replacement = การแทนที่พื้นผิว +Toggle Audio Debug = แก้ไขจุดบกพร่องของเสียง +Toggle Freeze = ปุ่มแช่แข็ง +Touchscreen Test = ทดสอบหน้าจอสัมผัส +VFPU = VFPU + +[Dialog] +* PSP res = * ขนาดจอ PSP +Active = เปิดการทำงาน +Back = ย้อนกลับ +Cancel = ยกเลิก +Center = กึ่งกลาง +ChangingGPUBackends = เมื่อเปลี่ยนแปลงรูปแบบการสนับสนุนของจีพียู\nกรุณาเริ่ม PPSSPP ใหม่อีกครั้งนึง ต้องการรีสตาร์ทเลยไหม? +ChangingInflightFrames = การเปลี่ยนแปลงค่าควบคุมกราฟิกบัฟเฟอร์จำเป็นต้องเริ่ม PPSSPP\nใหม่อีกครั้งนึง ต้องการรีสตาร์ทเลยไหม? +Channel: = แชลนอล: +Choose PPSSPP save folder = เลือกโฟลเดอร์สำหรับเก็บข้อมูลเซฟของ PPSSPP +Confirm Overwrite = ต้องการให้เขียนทับซ้ำกับข้อมูลเดิมเลยหรือไม่? +Confirm Save = ต้องการบันทึกข้อมูลนี้หรือไม่? +ConfirmLoad = ต้องการโหลดข้อมูลนี้หรือไม่? +ConnectingAP = กำลังเชื่อมต่อกับแอคเซสพอยต์\nโปรดรอสักครู่... +ConnectingPleaseWait = กำลังเชื่อมต่อ\nโปรดรอ... +ConnectionName = ชื่อเครือข่าย +Corrupted Data = ข้อมูลเสียหาย +Delete = ลบ +Delete all = ลบทั้งหมด +Delete completed = ลบข้อมูลสำเร็จ +DeleteConfirm = ข้อมูลเซฟนี้จะถูกลบ\nคุณต้องการที่จะดำเนินการต่อหรือไม่? +DeleteConfirmAll = ข้อมูลเซฟของเกมนี้ทั้งหมดจะถูกลบ\nคุณต้องการที่จะดำเนินการต่อหรือไม่? +DeleteConfirmGame = คุณต้องการลบเกมทั้งหมดที่อยู่ในอุปกรณ์ของคุณหรือไม่?\nหากกดตกลงแล้วจะไม่สามารถยกเลิกได้ +DeleteConfirmGameConfig = คุณแน่ใจนะว่าต้องการลบการตั้งค่าเฉพาะของเกมนี้? +DeleteFailed = ไม่สามารถลบข้อมูลนี้ได้ +Deleting = กำลังลบข้อมูล\nโปรดรอ... +Disable All = ปิดใช้งานทั้งหมด +Edit = แก้ไข +Enable All = เปิดใช้งานทั้งหมด +Enter = ยืนยัน +Finish = สิ้นสุด +Grid = กริด +Inactive = ปิดการทำงาน +InternalError = เกิดข้อผิดพลาดภายใน +Load = โหลด +Load completed = โหลดข้อมูลสำเร็จ +Loading = กำลังโหลด\nโปรดรอ... +LoadingFailed = ไม่สามารถโหลดข้อมูลนี้ได้ +Move = ย้าย +Network Connection = การเชื่อมต่อเครือข่าย +NEW DATA = ข้อมูลใหม่ +No = ไม่ใช่ +ObtainingIP = กำลังรับไอพี\nโปรดรอสักครู่... +OK = ตกลง +Old savedata detected = ตรวจพบข้อมูลเซฟเก่า +Options = ตัวเลือก +Reset = ตั้งค่าใหม่ +Resize = ขนาด +Retry = ลองใหม่ +Save = บันทึก +Save completed = บันทึกข้อมูลสำเร็จ +Saving = กำลังบันทึก\nโปรดรอ... +SavingFailed = ไม่สามารถบันทึกข้อมูลนี้ได้ +Select = เลือก +Shift = เปลี่ยน +Snap = ขยับ +Space = เว้นวรรค +SSID = SSID +Submit = ตกลง +Supported = รองรับ +There is no data = ไม่มีข้อมูล +Toggle All = ทั้งหมด +Toggle List = รายการ +Unsupported = ไม่รองรับ +When you save, it will load on a PSP, but not an older PPSSPP = เซฟเกมของคุณนั้น สามารถนำไปโหลดผ่านบนเครื่อง PSP ได้\nแต่นำไปใช้กับ PPSSPP ที่เวอร์ชั่นเก่ากว่าไม่ได้ +When you save, it will not work on outdated PSP Firmware anymore = เซฟเกมของคุณนั้น ไม่สามารถนำไปใช้กับเครื่อง PSP ที่ใช้เฟิร์มแวร์รุ่นเก่าได้ +Yes = ใช่ +Zoom = ขยาย + +[Error] +7z file detected (Require 7-Zip) = ไฟล์นี้ถูกบีบอัดมา (7z) โปรดแตกไฟล์ก่อน (ลองใช้ 7-Zip หรือ WinRAR หรือ Zarchiver) +A PSP game couldn't be found on the disc. = ไม่พบเกม PSP ที่อยู่ในดิสก์นี้ +Cannot boot ELF located outside mountRoot. = ไม่สามารถบู้ต ELF ที่ตั้งอยู่ข้างนอก mountRoot ได้ +Could not save screenshot file = ไม่สามารถบันทึกการจับภาพจากหน้าจอได้ +D3D9or11 = ต้องการสลับไปใช้ไดเร็คท์ 9 ใช่ไหม? (หรือเลือก "ไม่ใช่" เพื่อสลับไปใช้ ไดเร็คท์ 3D 11) +D3D11CompilerMissing = ไม่พบไฟล์ D3DCompiler_47.dll กรุณาติดตั้งเสียก่อน หรือกด ตกลง เพื่อสลับไปใช้งานไดเร็คท์ 3D 9 แทน +D3D11InitializationError = พบข้อผิดพลาดในการเรียกใช้งานไดเร็คท์ 3D 11 +D3D11Missing = เวอร์ชั่นระบบปฏิบัติการของคุณไม่มีไดเร็คท์ 3D 11 กรุณาอัพเดทวินโดวส์เสียก่อน\n\nหรือกด ตกลง เพื่อสลับไปใช้งานไดเร็คท์ 3D 9 แทน +D3D11NotSupported = การ์ดจอของคุณไม่รองรับไดเร็คท์ 3D 11\n\nคุณต้องการสลับไปใช้งานไดเร็คท์ 3D 9 แทนหรือไม่? +Disk full while writing data = ข้อมูลที่เขียนลงดิสก์กำลังจะเต็ม +ELF file truncated - can't load = ไฟล์ ELF เสียหาย - ไม่สามารถโหลดได้ +Error loading file = เกิดข้อผิดพลาดในการโหลดเกม +Error reading file = เกิดข้อผิดพลาดในการอ่านไฟล์ +Failed initializing CPU/Memory = ล้มเหลวในช่วงเริ่มต้นการทำงานของซีพียู หรือหน่วยความจำ +Failed to identify file = ไม่สามารถระบุประเภทของไฟล์ได้ +Failed to load executable: = ล้มเหลวในการโหลดไฟล์ปฏิบัติการ: +File corrupt = ไฟล์เสียหาย +Game disc read error - ISO corrupt = ไม่สามารถอ่านตัวเกมได้ - ไฟล์ ISO เสียหาย +GenericAllStartupError = PPSSPP ไม่สามารถเริ่มต้นทำงานด้วยรูปแบบการสนับสนุนกราฟิกใด ๆ ให้ลองอัพเดทไดรเวอร์การ์ดจอ และไดรเวอร์อื่น ๆ ดูก่อน +GenericBackendSwitchCrash = PPSSPP หยุดการทำงานขณะเริ่ม\n\nซึ่งสาเหตุหลักๆ อาจมาจากปัญหาไดรเวอร์ ให้ลองอัพเดทไดรเวอร์การ์ดจอดูก่อน\n\nสลับไปใช้รูปแบบการสนับสนุนกราฟิก: +GenericDirect3D9Error = ล้มเหลวในช่วงเริ่มต้นการทำงานของกราฟิก กรุณาอัพเดทไดรเวอร์การ์ดจอ และไดเร็คท์เอ็กซ์ 9 รันไทม์ด้วย\n\nหรือจะลองสลับไปใช้งานในโหมด โอเพ่นจีแอล ดูก่อนไหม?\n\nข้อผิดพลาด: +GenericGraphicsError = กราฟิกทำงานล้มเหลว +GenericOpenGLError = ล้มเหลวในช่วงเริ่มต้นการทำงานของกราฟิก กรุณาอัพเดทไดรเวอร์การ์ดจอด้วย\n\nหรือจะลองสลับไปใช้งานในโหมด ไดเร็คท์ 3D 9 ดูก่อนไหม?\n\nข้อผิดพลาด: +GenericVulkanError = ล้มเหลวในช่วงเริ่มต้นการทำงานของกราฟิก กรุณาอัพเดทไดรเวอร์การ์ดจอด้วย\n\nหรือจะลองสลับไปใช้งานในโหมด โอเพ่นจีแอล ดูก่อนไหม?\n\nข้อผิดพลาด: +InsufficientOpenGLDriver = ไดร์เวอร์โอเพ่นจีแอลที่ตรวจพบไม่รองรับการทำงาน!\n\nเนื่องจากจีพียูของคุณไม่สนับสนุนโอเพ่นจีแอล 2.0 หรือจะลองสลับไปใช้ไดเร็คท์ 3D ดูก่อนไหม?\n\nไดเร็คท์ 3D ในตอนนี้สามารถเล่นได้เสถียรอยู่หลายเกม อาจเป็นไปได้ว่าจีพียูของคุณทำงานได้เพียงแค่ตัวเลือกนี้เท่านั้น\n\nเยี่ยมชมที่ฟอรั่ม https://forums.ppsspp.org สำหรับข้อมูลเพิ่มเติม\n\n +Just a directory. = เป็นแหล่งที่เก็บ +Missing key = ไม่พบคีย์ +MsgErrorCode = โค้ดเออเร่อร์: +MsgErrorSavedataDataBroken = ข้อมูลเซฟเสียหาย +MsgErrorSavedataMSFull = เม็มสติ๊กเต็ม กรุณาเช็คพื้นที่เก็บข้อมูลก่อน +MsgErrorSavedataNoData = คำเตือน: ไม่พบข้อมูลเซฟ +MsgErrorSavedataNoMS = ไม่ได้ใส่เม็มสติ๊ก +No EBOOT.PBP, misidentified game = ไม่พบ EBOOT.PBP ไม่สามารถระบุได้ว่าเป็นไฟล์เกม +Not a valid disc image. = ดิสก์อิมเมจไม่ถูกต้อง +OpenGLDriverError = ไดร์เวอร์โอเพ่นจีแอลทำงานผิดพลาด +PPSSPP doesn't support UMD Music. = PPSSPP ไม่รองรับการอ่านแผ่น UMD Music +PPSSPP doesn't support UMD Video. = PPSSPP ไม่รองรับการอ่านแผ่น UMD Video +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP เอาไว้สำหรับใช้เล่นเกม PSP ไม่ใช่เกม PS1 หรือ PS2 นะจ้ะ +PPSSPPDoesNotSupportInternet = PPSSPP ไม่สนับสนุนการเชื่อมต่ออินเทอร์เน็ตสำหรับการเข้าถึง DLC หรือ PSN และรวมถึงการอัพเดทเกม +PS1 EBOOTs are not supported by PPSSPP. = ไฟล์เกม PS1 EBOOTs ไม่รองรับการใช้งานบน PPSSPP +PSX game image detected. = ไฟล์อิมเมจนี้คือ MODE2\nซึ่ง PPSSPP ไม่รองรับการใช้งานไฟล์เกมประเภท PS1 +RAR file detected (Require UnRAR) = ไฟล์นี้ถูกบีบอัดมา (RAR) โปรดแตกไฟล์ก่อน (ลองใช้ UnRAR หรือ Zarchiver) +RAR file detected (Require WINRAR) = ไฟล์นี้ถูกบีบอัดมา (RAR) โปรดแตกไฟล์ก่อน (ลองใช้ WinRAR หรือ Zarchiver) +Running slow: try frameskip, sound is choppy when slow = เกมรันช้า: เสียงจะกระตุกหากเกมนั้นรันได้ช้าเกินไป ให้ลองปรับข้ามเฟรมช่วย +Running slow: Try turning off Software Rendering = เกมรันช้า: ให้ลองปิดการทำงาน "ใช้ซอฟท์แวร์ในการแสดงผล" +Save encryption failed. This save won't work on real PSP = การบันทึกข้อมูลแบบเข้ารหัสล้มเหลว เซฟนี้ไม่สามารถนำไปใช้งานบนเครื่อง PSP ได้ +textures.ini filenames may not be cross-platform = ชื่อของเท็คเจอร์ที่อยู่ในไฟล์ textures.ini อาจจะใช้ไม่ได้ทุกแพลตฟอร์ม +This is a saved state, not a game. = นี่คือข้อมูลเซฟเตท, ไม่ใช่เกมนะจ้ะ +This is save data, not a game. = นี่คือข้อมูลเซฟ, ไม่ใช่เกมนะจ้ะ +Unable to create cheat file, disk may be full = ไม่สามารถสร้างไฟล์สูตรโกงได้, เนื่องจากดิสก์เต็ม +Unable to initialize rendering engine. = ไม่สามารถเริ่มต้นเครื่องมือการเรนเดอร์ได้ +Unable to write savedata, disk may be full = ไม่สามารถบันทึกข้อมูลได้, เนื่องจากดิสก์เต็ม +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = คำเตือน: หน่วยความจำวีดีโอเต็ม, ให้ลดขนาดสเกลภาพ และสลับไปใช้แคชพื้นผิวแบบหยาบ +Warning: Video memory FULL, switching to slow caching mode = คำเตือน: หน่วยความจำวีดีโอเต็ม, ให้สลับไปใช้แคชพื้นผิวแบบหยาบ +ZIP file detected (Require UnRAR) = ไฟล์นี้ถูกบีบอัดมา (ZIP) โปรดแตกไฟล์ก่อน (ลองใช้ UnRAR หรือ Zarchiver) +ZIP file detected (Require WINRAR) = ไฟล์นี้ถูกบีบอัดมา (ZIP) โปรดแตกไฟล์ก่อน (ลองใช้ WinRAR หรือ Zarchiver) + +[Game] +Asia = AS (โซนเอเชีย) +ConfirmDelete = ยืนยันการลบ +Create Game Config = สร้างการตั้งค่าเฉพาะเกม +Create Shortcut = สร้างทางลัด +Delete Game = ลบเกม +Delete Game Config = ลบการตั้งค่าเฉพาะเกม +Delete Save Data = ลบข้อมูลเซฟที่บันทึกไว้ +Europe = EU (โซนยุโรป) +Game = ขนาดไฟล์เกม +Game Settings = ตั้งค่าเกม +Homebrew = Homebrew (เกมโฮมบริว) +Hong Kong = HK (โซนฮ่องกง) +InstallData = ข้อมูลที่ถูกติดตั้ง +Japan = JP (โซนญี่ปุ่น) +Korea = เกาหลี +MB = เมกกะไบต์ +One moment please... = กรุณารอสักครู่... +Play = เริ่มเล่น +Remove From Recent = ลบออกจากในหน้า "ล่าสุด" +SaveData = ขนาดข้อมูลเซฟ +Setting Background = การตั้งค่าพื้นหลัง +Show In Folder = แสดงในโฟลเดอร์ +USA = USA (โซนอเมริกา) +Use UI background = ใช้เป็นภาพพื้นหลัง + +[Graphics] +% of the void = % ของช่องว่าง +% of viewport = % ของพอร์ตมุมมอง +%, 0:unlimited = %, 0 = ไม่จำกัด +(supersampling) = (supersampling) +(upscaling) = (เพิ่มขนาดสเกล) +1x PSP = 1× PSP (480x272p) +2x = 2× +2x PSP = 2× PSP (960x544p) +3x = 3× +3x PSP = 3× PSP (1440x816p) +4x = 4× +4x PSP = 4× PSP (1920x1088p) +5x = 5× +5x PSP = 5× PSP (2400x1360p) +6x PSP = 6× PSP (2880x1632p) +7x PSP = 7× PSP (3360x1904p) +8x = 8× +8x PSP = 8× PSP (3840x2176p) +9x PSP = 9× PSP (4320x2448p) +10x PSP = 10× PSP (4800x2720p) +16x = 16× +Aggressive = รุนแรง +Alternative Speed = เพิ่ม-ลดระดับความเร็ว (ใน %, 0 = ไม่จำกัด) +Alternative Speed 2 = เพิ่ม-ลดระดับความเร็ว 2 (ใน %, 0 = ไม่จำกัด) +Anisotropic Filtering = ขจัดความไม่คมชัดของพื้นผิว +Auto = อัตโนมัติ +Auto (1:1) = อัตโนมัติ (1:1) +Auto (same as Rendering) = อัตโนมัติ (ค่าเดียวกับที่ใช้แสดงผลภาพ) +Auto FrameSkip = ข้ามเฟรมอัตโนมัติ +Auto Scaling = สเกลอัตโนมัติ +Backend = การสนับสนุนกราฟิก +Balanced = สมดุล +Bicubic = ไบคิวบิค +BlockTransfer Tip = บางเกมจำเป็นต้องเปิดใช้งานเพื่อการแสดงผลที่ถูกต้อง +BlockTransferRequired = คำเตือน: เกมนี้ต้องปรับใช้งาน "จำลองผลปิดกั้นการส่งผ่านข้อมูลเอฟเฟ็คท์" ด้วย +Both = ใช้ทั้งคู่ +Buffer graphics commands (faster, input lag) = ควบคุมกราฟิกบัฟเฟอร์ (เร็วขึ้น, อาจทำให้เกิดอินพุตแล็ก) +Buffered Rendering = การแสดงผลแบบใช้บัฟเฟอร์ +BufferedRenderingRequired = คำเตือน: เกมนี้ต้องปรับใช้งานในโหมด "การแสดงผลแบบใช้บัฟเฟอร์" +Camera = กล้อง +Camera Device = กล้องที่พร้อมใช้งาน +Cardboard Screen Size = ขนาดจอ (ใน % ของพอร์ตมุมมอง) +Cardboard Screen X Shift = ปรับเปลี่ยนแกน X (ใน % ของช่องว่าง) +Cardboard Screen Y Shift = ปรับเปลี่ยนแกน Y (ใน % ของช่องว่าง) +Cardboard VR Settings = การตั้งค่าแว่น กูเกิ้ล การ์ดบอร์ด +Cheats = สูตรโกง +Clear Speedhack = เคลียร์เฟรมบัฟเฟอร์ก่อนจะใช้งานในครั้งแรก (แฮ็คความเร็ว) +ClearSpeedhack Tip = เร็วขึ้นในบางครั้ง (เห็นผลได้ชัดบนมือถือ) แต่อาจจะทำให้เกิดปัญหากราฟิกตามมา +CPU Core = แกนกลางหน่วยประมวลผลหลัก +Debugging = การแก้ไขจุดบกพร่อง +DefaultCPUClockRequired = คำเตือน: เกมนี้ควรปรับใช้การจำลองความถี่ของซีพียูเป็นค่าอัตโนมัติ +Deposterize = ดีโพสเตอร์ไรซ์ +Deposterize Tip = แก้ไขขอบภาพเบลอ หรือภาพแสดงผลผิดพลาด เมื่อปรับเพิ่มสเกลพื้นผิว +Device = การ์ดจอ +Direct3D 9 = ไดเร็คท์ 3D 9 +Direct3D 11 = ไดเร็คท์ 3D 11 +Disable slower effects (speedup) = ปิดเอฟเฟ็คท์ที่ทำให้เกมช้า (เร่งความเร็ว) +Disabled = ปิดการใช้งาน +Display layout editor = แก้ไขรูปแบบของหน้าจอ +Display Resolution (HW scaler) = ความละเอียดหน้าจอ (ตามฮาร์ดแวร์) +Dump next frame to log = ดึงข้อมูลของเฟรมถัดไปเก็บบันทึกค่า +Enable Cardboard VR = เปิดการทำงานแว่นการ์ดบอร์ด VR +FPS = เฟรมต่อวิ +Frame Rate Control = การควบคุมเฟรมเรท +Frame Skipping = ข้ามเฟรม +Frame Skipping Type = รูปแบบการข้ามเฟรม +FullScreen = เต็มหน้าจอ +Hack Settings = ตั้งค่าการปรับแฮ็ค (อาจแสดงผลผิดพลาด) +Hardware Tessellation = ฮาร์ดแวร์ เทสเซลเลชั่น +Hardware Transform = ใช้ฮาร์ดแวร์ในการแปลงค่าประมวลผล +hardware transform error - falling back to software = การแปลงค่าจากฮาร์ดแวร์ล้มเหลว กลับไปใช้การแปลงค่าจากซอฟต์แวร์ +HardwareTessellation Tip = ใช้ฮาร์ดแวร์ในการสร้างเส้นโค้ง Spline/Bezier ช่วยปรับปรุงคุณภาพเส้นให้คงที่ +High = สูง +Hybrid = ไฮบริด +Hybrid + Bicubic = ไฮบริด + ไบคิวบิค +Ignore camera notch when centering = ละเว้นตำแหน่งจอแหว่งเพื่อปรับภาพให้อยู่ตรงกลาง +Internal Resolution = ความละเอียดภายใน +Lazy texture caching = แคชพื้นผิวแบบหยาบ (เร็วขึ้น) +Linear = แบบเชิงเส้น +Low = ต่ำ +LowCurves = ระดับของเส้นโค้ง Spline/Bezier +LowCurves Tip = ปรับเพิ่ม-ลดคุณภาพในการแสดงผลของเส้นโค้ง Spline/Bezier +Lower resolution for effects (reduces artifacts) = ลดความละเอียดของเอฟเฟ็คต์ให้ต่ำลง (แก้ภาพสว่างจ้า) +Manual Scaling = กำหนดขนาดเอง +Medium = ปานกลาง +Mode = โหมด +Must Restart = คุณควรรีสตาร์ท PPSSPP อีกครั้งนึง เพื่อให้เกิดผลลัพธ์ที่เปลี่ยนแปลง +Native device resolution = ค่าความละเอียดดั้งเดิมของอุปกรณ์ +Nearest = แบบใกล้เคียง +No buffer = ไม่ใช้บัฟเฟอร์ +Non-Buffered Rendering = ข้ามการใช้บัฟเฟอร์เอฟเฟ็คท์ (ปิดบัฟเฟอร์) +None = ไม่มี +Number of Frames = อิงจากค่าจำนวนเฟรม +Off = ปิด +OpenGL = โอเพ่นจีแอล +Overlay Information = การแสดงข้อมูลซ้อนทับ +Partial Stretch = แนวตั้งดึงเต็มจอ +Percent of FPS = อิงจากเปอร์เซ็นต์เฟรมต่อวิ +Performance = ประสิทธิภาพ +Postprocessing effect = กระบวนการทำงานไล่ปรับเอฟเฟ็คท์ +Postprocessing Shader = กระบวนการทำงานไล่ปรับเฉดแสงสี +Recreate Activity = สร้างกิจกรรมใหม่ +Render duplicate frames to 60hz = แสดงผลเฟรมซ้ำให้ถึง 60 เฮิร์ตซ +RenderDuplicateFrames Tip = ช่วยให้ภาพดูลื่นตาขึ้น ในเกมที่ใช้เฟรมเรทต่ำ +Rendering Mode = โหมดที่ใช้ในการแสดงผล +Rendering Resolution = ความละเอียดในการแสดงผลภาพ +RenderingMode NonBuffered Tip = เร็วขึ้นก็จริง แต่มีผลข้างเคียงในบางเกมอาจเกิดอาการจอดำ +Retain changed textures = รักษาความเปลี่ยนแปลงของพื้นผิว (ช้าลงในบางครั้ง) +RetainChangedTextures Tip = มีหลายเกมที่ปรับใช้แล้วความเร็วตกลง แต่ในบางเกมความเร็วก็เพิ่มขึ้น +Rotation = หมุนจอ +Safe = ปลอดภัย +Screen layout = เค้าโครงหน้าจอ +Screen Scaling Filter = ตัวกรองปรับสเกลหน้าจอ +Show Debug Statistics = แสดงค่าทางสถิติการแก้ไขจุดบกพร่อง +Show FPS Counter = แสดงค่าเฟรมเรท และความเร็ว/วินาที +Simulate Block Transfer = จำลองผลปิดกั้นการส่งผ่านข้อมูลเอฟเฟ็คท์ +SoftGPU Tip = แน่นอนว่า ช้าอย่างมากมาย +Software Rendering = ใช้ซอฟต์แวร์ในการแสดงผล (ช้า) +Software Skinning = ซอฟต์แวร์ สกินนิ่ง +SoftwareSkinning Tip = ผสานโมเดลพื้นผิวให้เขียนผ่านซีพียู ซึ่งเกมส่วนใหญ่ปรับใช้แล้วไวขึ้น +Speed = ความเร็ว +Stretching = ดึงเต็มจอ +Texture Filter = ตัวกรองพื้นผิว +Texture Filtering = การกรองพื้นผิว +Texture Scaling = การปรับสเกลพื้นผิว +Texture Shader = โทนแสงสีพื้นผิว +Turn off Hardware Tessellation - unsupported = ปิด "ฮาร์ดแวร์ เทสเซลเลชั่น" เนื่องจากไม่สนับสนุนการทำงาน +Unlimited = ไม่จำกัด +Up to 1 = เพิ่มไปที่ 1 +Up to 2 = เพิ่มไปที่ 2 +Upscale Level = การเพิ่มระดับสเกลภาพ +Upscale Type = รูปแบบการเพิ่มสเกลภาพ +UpscaleLevel Tip = ซีพียูทำงานหนักขึ้น บางสเกลภาพอาจเกิดอาการหน่วงจนถึงขั้นไม่แสดงผล +Use all displays = ใช้กับหน้าจอการแสดงผลทั้งหมด +Vertex Cache = เวอร์เท็ค แคช +VertexCache Tip = เร็วขึ้น แต่อาจทำให้เกิดอาการภาพกระพริบชั่วครั้งชั่วคราว +VSync = ควบคุมช่วงของเฟรมเรทให้คงที่ +Vulkan = วัลแคน +Window Size = ขนาดของหน้าจอ +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = ลบไฟล์ ZIP +Install = ติดตั้ง +Install game from ZIP file? = ต้องการติดตั้งเกมจากไฟล์ ZIP เลยหรือไม่? +Install textures from ZIP file? = ต้องการติดตั้งเท็คเจอร์จากไฟล์ ZIP เลยหรือไม่? +Installed! = ติดตั้งเสร็จสิ้น! +Texture pack doesn't support install = เท็คเจอร์แพ็คนี้ไม่รองรับการติดตั้ง +Zip archive corrupt = ไฟล์ ZIP ไม่สมบูรณ์ (เสียจ้า) +Zip file does not contain PSP software = ไฟล์ ZIP นี้ ไม่มีข้อมูลซอฟแวร์ของเกม PSP + +[KeyMapping] +Autoconfigure = ค่าอัตโนมัติ +Autoconfigure for device = กำหนดค่าให้อัตโนมัติสำหรับอุปกรณ์นี้ +Clear All = ล้างทั้งหมด +Default All = คืนค่าเดิมทั้งหมด +Map a new key for = ปรับปุ่มใหม่สำหรับ +Map Key = ตั้งค่าปุ่ม +Map Mouse = ตั้งค่าปุ่มเมาส์ +Test Analogs = ทดสอบอนาล็อก +You can press ESC to cancel. = คุณสามารถกด ESC เพื่อยกเลิกได้ + +[MainMenu] +Browse = เรียกใช้... +Buy PPSSPP Gold = ซื้อ PPSSPP Gold +Choose folder = เลือกโฟลเดอร์ +Credits = เครดิต +PPSSPP Homebrew Store = ดาวน์โหลดจาก PPSSPP โฮมบริวสโตร์ +Exit = ออก +Game Settings = ตั้งค่าเกม +Games = เกมอื่นๆ +Give PPSSPP permission to access storage = อนุญาตให้สิทธิ์เข้าถึงพื้นที่เก็บข้อมูลเครื่องผ่าน PPSSPP +Homebrew & Demos = เกมโฮมบริว&&เกมทดลองเล่น +How to get games = ต้องทำอย่างไรถึงจะได้รอมเกมมา? +How to get homebrew & demos = วิธีการรับเกมโฮมบริว&&เกมทดลองเล่น? +Load = โหลดเกม... +Loading... = กำลังโหลด... +PinPath = ปักหมุด +PPSSPP can't load games or save right now = --- ไม่สามารถโหลดเข้าเกมหรือข้อมูลเซฟได้ในขณะนี้ --- +Recent = เกมที่พึ่งเล่นล่าสุด +SavesAreTemporary = PPSSPP จะเซฟข้อมูลในโฟลเดอร์ชั่วคราว +SavesAreTemporaryGuidance = แนะนำให้แตกไฟล์ PPSSPP ก่อนที่จะใช้งานนะจ้ะ เซฟจะได้ไม่บิน +SavesAreTemporaryIgnore = ไม่สนคำเตือน +UnpinPath = ถอนหมุด +www.ppsspp.org = เว็บไซต์หลัก PPSSPP + +[MainSettings] +Audio = เสียง +Controls = ควบคุม +Graphics = กราฟิก +Networking = เครือข่าย +System = ระบบ +Tools = เครื่องมือ + +[MappableControls] +Alt speed 1 = เพิ่ม-ลดความเร็ว 1 +Alt speed 2 = เพิ่ม-ลดความเร็ว 2 +An.Down = อนาล็อกลง +An.Left = อนาล็อกซ้าย +An.Right = อนาล็อกขวา +An.Up = อนาล็อกขึ้น +Analog limiter = ตัวจำกัดปุ่มอนาล็อก +Analog Stick = ปุ่มอนาล็อก +Audio/Video Recording = อัดบันทึกวีดีโอ/เสียง +Auto Analog Rotation (CCW) = หมุนปุ่มอนาล็อกอัตโนมัติ (ทวนเข็ม) +Auto Analog Rotation (CW) = หมุนปุ่มอนาล็อกอัตโนมัติ (ตามเข็ม) +AxisSwap = สลับด้านแกน +Circle = วงกลม +Cross = กากบาท +D-pad down = ปุ่มลูกศรลง +D-pad left = ปุ่มลูกศรซ้าย +D-pad right = ปุ่มลูกศรขวา +D-pad up = ปุ่มลูกศรขึ้น +DevMenu = เมนูผู้พัฒนา +Down = ลูกศรลง +Dpad = ลูกศร +Frame Advance = เฟรมขั้นสูง +Hold = ระงับ +Home = หน้าหลัก +L = แอล +Left = ลูกศรซ้าย +Load State = โหลดสเตทเกม +Mute toggle = ปิดเสียง +Next Slot = ช่องสเตทถัดไป +None = ไม่มี +Note = หมายเหตุ +OpenChat = เปิดแชท +Pause = หยุดชั่วคราว +R = อาร์ +RapidFire = กดรัวต่อเนื่อง +Remote hold = หยุดการใช้รีโมท +Rewind = โหลดสเตทพื้นหลัง +Right = ลูกศรขวา +Right Analog Stick (tap to customize) = ปุ่มอนาล็อกขวา (กดตั้งค่าเพิ่มเติม) +RightAn.Down = อนาล็อก(ขวา)ลง +RightAn.Left = อนาล็อก(ขวา)ซ้าย +RightAn.Right = อนาล็อก(ขวา)ขวา +RightAn.Up = อนาล็อก(ขวา)ขึ้น +Rotate Analog (CCW) = หมุนอนาล็อก (ทวนเข็ม) +Rotate Analog (CW) = หมุนอนาล็อก (ตามเข็ม) +Save State = เซฟสเตทเกม +Screen = ปรับหน้าจอ +Screenshot = จับภาพหน้าจอ +Select = ซีเล็คท์ +SpeedToggle = สับเปลี่ยนความเร็ว +Square = สี่เหลี่ยม +Start = สตาร์ท +Texture Dumping = บันทึกพื้นผิว +Texture Replacement = แทนที่พื้นผิว +Toggle Fullscreen = ปรับเต็มหน้าจอ +Toggle mode = โหมดสับเปลี่ยน +Triangle = สามเหลี่ยม +Unthrottle = เร่งความเร็ว +Up = ลูกศรขึ้น +Vol + = เพิ่มเสียง +Vol - = ลดเสียง +Wlan = เครือข่าย + +[Networking] +Adhoc Multiplayer forum = เยี่ยมชมเว็บ Adhoc Multiplayer Forum +AdHoc Server = เซิร์ฟเวอร์ Adhoc +AdhocServer Failed to Bind Port = เซิร์ฟเวอร์ Adhoc ล้มเหลวในการเชื่อมโยงพอร์ต +Auto = อัตโนมัติ +Bottom Center = มุมล่างกลางจอ +Bottom Left = มุมล่างซ้ายจอ +Bottom Right = มุมล่างขวาจอ +Center Left = มุมกลางซ้ายจอ +Center Right = มุมกลางขวาจอ +Change Mac Address = เปลี่ยนค่าที่อยู่ Mac +Change proAdhocServer Address = เปลี่ยนไอพีที่อยู่ของเซิร์ฟเวอร์ Pro Adhoc (localhost = แลนในเครื่องเดียวกัน) +Chat = แชท +Chat Button Position = ปุ่มตำแหน่งแชท +Chat Here = แชทที่นี่ +Chat Screen Position = ตำแหน่งหน้าต่างแชท +Disconnected from AdhocServer = เซิร์ฟเวอร์ Adhoc ถูกตัดขาดการเชื่อมต่อ +DNS Error Resolving = กำลังแก้ไขข้อผิดพลาดของ DNS +Enable built-in PRO Adhoc Server = เปิดการใช้งานเซิร์ฟเวอร์ Pro Adhoc +Enable network chat = เปิดหน้าต่างแชทเครือข่าย +Enable networking = เปิดการใช้งานระบบเครือข่าย/WLAN (ขั้นทดสอบ, เกมอาจค้าง) +Enable UPnP = เปิดการใช้งาน UPnP (ใช้เวลาสักครู่ในการตรวจสอบ) +EnableQuickChat = เปิดใช้ข้อความแชทด่วน +Enter a new PSP nickname = ใส่ชื่อเล่นใหม่ +Enter Quick Chat 1 = ข้อความแชทด่วน 1 +Enter Quick Chat 2 = ข้อความแชทด่วน 2 +Enter Quick Chat 3 = ข้อความแชทด่วน 3 +Enter Quick Chat 4 = ข้อความแชทด่วน 4 +Enter Quick Chat 5 = ข้อความแชทด่วน 5 +Error = เออเร่อร์ +Failed to Bind Localhost IP = เชื่อมโยง Localhost IP ไม่สำเร็จ +Failed to Bind Port = ล้มเหลวในการเชื่อมโยงพอร์ต +Failed to connect to Adhoc Server = ล้มเหลวในการเชื่อมต่อกับเซิร์ฟเวอร์ Adhoc +Forced First Connect = บังคับการเชื่อมต่อในครั้งแรกสุด +Invalid IP or hostname = ไอพี หรือ ชื่อโฮสต์ ไม่ถูกต้อง +Minimum Timeout = เวลาขั้นต่ำที่ใช้เชื่อมต่อ (แทนที่ค่าความหน่วงในมิลลิวินาที) +Misc = อื่นๆ (ค่าดั้งเดิม = ดีสุดแล้ว) +Network Initialized = เริ่มการทำงานของเครือข่ายเรียบร้อย +Please change your Port Offset = กรุณาเปลี่ยนค่าของพอร์ตชดเชย +Port offset = พอร์ตชดเชย (0 = ค่าเริ่มต้นของ PSP) +proAdhocServer Address: = ที่อยู่ของเซิร์ฟเวอร์ Pro Adhoc: +Quick Chat 1 = แชทด่วน 1 +Quick Chat 2 = แชทด่วน 2 +Quick Chat 3 = แชทด่วน 3 +Quick Chat 4 = แชทด่วน 4 +Quick Chat 5 = แชทด่วน 5 +QuickChat = แชทด่วน +Send = ส่ง +Send Discord Presence information = แสดงชื่อเกมที่กำลังเล่นอยู่ไปยังแอพ Discord +TCP No Delay = TCP ไม่มีการดีเลย์ (TCP ไวขึ้น) +Top Center = มุมบนกลางจอ +Top Left = มุมบนซ้ายจอ +Top Right = มุมบนขวาจอ +Unable to find UPnP device = ไม่พบอุปกรณ์ UPnP +UPnP (port-forwarding) = โพรโตคอล UPnP (ฟอร์เวิร์ด พอร์ต อัตโนมัติ) +UPnP need to be reinitialized = UPnP จำเป็นต้องเริ่มการทำงานใหม่ +UPnP use original port = UPnP ใช้พอร์ตค่าเริ่มต้น (เปิดใช้งาน = เล่นกับเครื่อง PSP) +Validating address... = กำลังตรวจสอบที่อยู่... +WLAN Channel = ช่องสัญญาณ WLAN +You're in Offline Mode, go to lobby or online hall = คุณอยู่ในโหมดออฟไลน์ ต้องเข้าไปในล็อบบี้หรือออนไลน์ฮอลล์ก่อน + +[Pause] +Cheats = สูตรโกง +Continue = ดำเนินการต่อ +Create Game Config = สร้างการตั้งค่าเฉพาะเกม +Delete Game Config = ลบการตั้งค่าเฉพาะเกม +Exit to menu = ออกจากเมนู +Game Settings = ตั้งค่าเกม +Load State = โหลดสเตทเกม +Rewind = โหลดสเตทพื้นหลัง +Save State = เซฟสเตทเกม +Settings = การตั้งค่า +Switch UMD = สลับแผ่น UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (การตั้งค่าที่ซ้ำซ้อนกัน อาจจะใช้แถบเลื่อนก่อนหน้า) +4xHqGLSL = ภาพคมชัดคูณ 4 +5xBR = ภาพคมชัดคูณ 5 +5xBR-lv2 = ภาพคมชัดคูณ 5 (เวอร์ชั่น 2) +AAColor = ภาพดูมีสีสัน +Amount = ระดับ +Black border = ขอบดำ +Bloom = ภาพสว่างขึ้น +Brightness = แสงสว่าง +Cartoon = ภาพออกแนวการ์ตูน +ColorCorrection = ภาพสีสมจริง +Contrast = ความคมชัด +CRT = ภาพออกโทนเหลืองขึ้นเส้น +FXAA = ภาพเน้นลบขอบรอยหยัก +Gamma = แกมม่า +Grayscale = ภาพโทนสีเทา +Intensity = ความเข้มของแสง +InverseColors = ภาพสีกลับ +Natural = ภาพเน้นสีธรรมชาติ +NaturalA = ภาพเน้นสีธรรมชาติ (ไม่เบลอ) +Off = ปิด +Power = ความเข้ม +PSPColor = ภาพสีแบบเครื่อง PSP +Saturation = ความอิ่มตัวของสี +Scanlines = ภาพออกมัวเป็นเส้นแนวนอน +Sharpen = ภาพเน้นขอบคมขึ้น +SSAA(Gauss) = ภาพเน้นความละเอียดให้สูงขึ้น +Tex4xBRZ = 4xBRZ +TexMMPX = MMPX +UpscaleSpline36 = ภาพลดความละเอียด เน้นสเกลคมขึ้น +VideoSmoothingAA = ภาพในฉากคัตซีนดูเนียนยิ่งขึ้น +Vignette = ภาพเน้นขอบหม่น + +[PSPCredits] +all the forum mods = และเว็บมอดต่างๆ +build server = บิ๊วด์ เซิร์ฟเวอร์ +Buy Gold = ซื้อแบบตัวสีทอง +check = รวมไปถึงอีมูเลเตอร์ Dolphin ดีที่สุดในการเล่นเกม Wii/GC ด้วยอีกเช่นเดียวกัน: +CheckOutPPSSPP = ตรวจสอบข้อมูลของ PPSSPP, PSP อีมูเลเตอร์ ขั้นเทพ ได้ที่: https://www.ppsspp.org/ +contributors = ผู้มีส่วนช่วย: +created = สร้างโดย +Discord = ไปที่ Discord +info1 = PPSSPP ถูกออกแบบขึ้นมาโดยมีจุดประสงค์เพื่อใช้ในทางการศึกษาเท่านั้น +info2 = โปรดแน่ใจว่าเกมทุกเกมที่คุณถือครองอยู่นั้นถูกต้องตามลิขสิทธิ์ +info3 = คุณสามารถหาเกมได้จากแผ่น UMD หรือโดยการซื้อแบบดิจิตอล +info4 = ดาวน์โหลดผ่านร้านค้า PSN บนเครื่อง PSP ของคุณ +info5 = PSP เป็นเครื่องหมายการค้าของ Sony Inc. +iOS builds = iOS บิ๊วด์ +license = ซอฟต์แวร์ฟรีภายใต้ GPL 2.0+ +list = รายชื่อเกมที่เล่นได้, ฟอรั่ม และข้อมูลการพัฒนา +PPSSPP Forums = เว็บ PPSSPP Forums +Privacy Policy = นโยบายส่วนบุคคล +Share PPSSPP = แชร์ PPSSPP +specialthanks = ขอขอบคุณเป็นพิเศษ ถึง: +specialthanksKeithGalocy = at NVIDIA (ฮาร์ดแวร์, คำแนะนำ) +specialthanksMaxim = สำหรับโค้ดถอดรหัส Atrac3+ สุดเมพของเขา +testing = ฝ่ายทดสอบ +this translation by = แปลโดย: +title = จำลองการทำงานเสมือนของเครื่อง PSP ที่ทั้งรวดเร็ว และมีความเสถียรภาพ +tools = เครื่องมือฟรีที่นำมาใช้งาน: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = zAlonekikuz +translators2 = weerawat8597 +translators3 = Benjamin B. Gates +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = ไปที่ Twitter +website = เพิ่มเติมข้อมูลได้ที่เว็บไซต์: +written = เขียนโดยใช้ภาษา C++ เพื่อความรวดเร็ว และความเสถียร + +[RemoteISO] +Browse Games = ค้นหาไปยังเกม +Local Server Port = พอร์ตเซิร์ฟเวอร์แหล่งภายใน +Manual Mode Client = ไคลเอ็นต์โหมดใช้งานด้วยตนเอง +Remote disc streaming = เล่นเกมผ่านสตรีมมิ่ง +Remote Port = ควบคุมพอร์ตจากระยะไกล +Remote Server = ควบคุมเซิร์ฟเวอร์จากระยะไกล +Remote Subdirectory = ควบคุมแหล่งที่เก็บย่อยจากระยะไกล +RemoteISODesc = รายชื่อเกมที่อยู่ในหน้าที่เล่นครั้งล่าสุดจะถูกแชร์มา +RemoteISOLoading = เชื่อมต่อแล้ว, กำลังโหลดรายชื่อเกม... +RemoteISOScanning = กำลังค้นหา... คลิก"แชร์เกม"ที่หน้าจอของคุณ +RemoteISOScanningTimeout = กำลังสแกน... ให้เช็คการตั้งค่าของไฟร์วอลล์ดูก่อน +RemoteISOWifi = แนะนำ: โปรดเชื่อมต่ออุปกรณ์ทั้งคู่ภายในเครือข่าย Wi-Fi เดียวกัน +RemoteISOWinFirewall = คำเตือน: ไฟร์วอลล์ของวินโดวส์กำลังบล็อคการแชร์ +Settings = ตั้งค่า +Share Games (Server) = แชร์เกม (เซิร์ฟเวอร์) +Share on PPSSPP startup = แชร์เมื่อเริ่มต้น PPSSPP +Stop Sharing = หยุดแชร์ +Stopping.. = กำลังหยุด... + +[Reporting] +Bad = แย่ +FeedbackDelayInfo = กำลังทำการส่งข้อมูลของคุณอยู่... +FeedbackDesc = อีมูเลเตอร์ PPSSPP เจ๋งแค่ไหน? มาสิ ช่วยบอกให้พวกเราทราบด้วย! +FeedbackDisabled = ต้องเปิดการใช้งานรายงานข้อมูลเกมไปยังเซิร์ฟเวอร์เสียก่อน +FeedbackIncludeCRC = หมายเหตุ: มีการส่งค่า CRC ของรอมเกมแนบพร้อมไปด้วย +FeedbackIncludeScreen = แนบรูปภาพประกอบ +FeedbackSubmitDone = ข้อมูลของคุณถูกส่งไปเรียบร้อยแล้ว! +FeedbackSubmitFail = ไม่สามารถส่งข้อมูลไปยังเซิร์ฟเวอร์ได้ ให้ลองอัพเดท PPSSPP ดูก่อน +FeedbackThanks = ขอบคุณสำหรับความคิดเห็น +Gameplay = หน้าเกมเพลย์ +Graphics = กราฟิก +Great = ดี +In-game = ภายในเกม +In-game Description = เข้าไปเล่นได้ถึงหน้าเกมเพลย์ แต่ทว่ามีบั๊กเยอะเกินไป +Menu/Intro = เมนู/หน้าเริ่มเกม +Menu/Intro Description = ไม่สามารถเข้าไปเล่นในหน้าเกมเพลย์ได้ +Nothing = ไม่มีอะไรเกิดขึ้น +Nothing Description = เข้าเกมไม่ได้อย่างสิ้นเชิง +OK = ใช้ได้ +Open Browser = ไปที่เว็บไซต์รายงาน +Overall = โดยรวม +Perfect = ยอดเยี่ยม +Perfect Description = ประมวลผลได้ไร้ที่ติตลอดทั้งเกม - เยี่ยมยอด! +Plays = ขณะเล่น +Plays Description = เล่นได้ตลอดทั้งเกม แต่ยังมีปัญหาอยู่ในบางจุด +ReportButton = รายงานการตอบกลับ +Speed = ความเร็ว +Submit Feedback = ยืนยันการตอบกลับ +SuggestionConfig = ให้เข้าไปดูที่เว็บไซต์รายงานสำหรับการปรับตั้งค่าที่แนะนำ +SuggestionCPUSpeed0 = ให้ปิดใช้งานการปรับตั้งค่าจำลองค่าความถี่ของซีพียูก่อน +SuggestionDowngrade = แนะนำให้ถอยกลับไปใช้ PPSSPP เวอร์ชั่นเก่า (รบกวนช่วยรายงานปัญหานี้ด้วย) +SuggestionsFound = มีผู้เล่นคนอื่นๆ แจ้งมาว่าเกมนี้ไม่มีปัญหา กดที่ปุ่ม "ดูความคิดเห็น" เพื่ออ่านข้อมูลเพิ่มเติม +SuggestionsNone = เกมนี้ไม่สามารถเล่นได้เหมือนกันกับผู้เล่นคนอื่นๆ ที่แจ้งเข้ามา +SuggestionsWaiting = กำลังส่ง และเช็คข้อมูลที่ผู้เล่นคนอื่นๆ ได้ส่งไปก่อนหน้านั้น +SuggestionUpgrade = แนะนำให้อัพเกรด PPSSPP Build ตัวที่ใหม่กว่านี้มาใช้งาน +SuggestionVerifyDisc = ตรวจสอบไฟล์เกม ISO ของคุณก่อนว่าคัดลอกมาสมบูรณ์จากแผ่นเกมต้นฉบับหรือไม่ +Unselected Overall Description = PPSSPP ประมวลผลเกมนี้ได้ดีแค่ไหน? +View Feedback = ดูความคิดเห็น + +[Savedata] +Date = ตามวันที่ +Filename = ตามชื่อ +No screenshot = ไม่มีภาพประกอบ +None yet. Things will appear here after you save. = ยังไม่มีข้อมูล จะมีก็ต่อเมื่อหลังจากที่คุณได้กดบันทึกเอาไว้ +Save Data = เซฟดาต้า +Save States = เซฟสเตท +Savedata Manager = การจัดการข้อมูลเซฟ +Size = ตามขนาด + +[Screen] +Cardboard VR OFF = ปิดการใช้งาน แว่นการ์ดบอร์ด VR +Chainfire3DWarning = ระวัง: ตรวจพบ Chainfire3D อาจก่อให้เกิดปัญหารบกวน +Failed to load state = ล้มเหลวในการโหลดสเตท +Failed to save state = ล้มเหลวในการเซฟสเตท +fixed = ความเร็ว: ตามที่ปรับใช้ +GLToolsWarning = ระวัง: ตรวจพบ GLTools อาจก่อให้เกิดปัญหารบกวน +In menu = ในเมนู +Load savestate failed = ล้มเหลวในการโหลดเซฟสเตท +Loaded State = โหลดสเตทเกมเรียบร้อย +Loaded. Save in game, restart, and load for less bugs. = โหลดสเตทเรียบร้อยแล้ว แต่ทางที่ดีควรโหลดผ่านเซฟในเกมแทน เพราะบั๊กจะน้อยกว่า +LoadStateDoesntExist = เกิดข้อผิดพลาดในการโหลดเกม: ไฟล์เซฟสเตทไม่ถูกต้อง! +LoadStateWrongVersion = เกิดข้อผิดพลาดในการโหลดเกม: ไฟล์เซฟสเตทนั้นมาจาก PPSSPP เวอร์ชั่นที่ใหม่กว่า! +norewind = ไม่มีข้อมูลเซฟสเตทแบบย้อนหลัง +Playing = กำลังเล่น +PressESC = กดปุ่ม ESC เพื่อเปิดเมนูหยุดชั่วขณะ +replaceTextures_false = ยกเลิกการแทนที่พื้นผิวจากแหล่งที่เก็บข้อมูล +replaceTextures_true = เปิดใช้งานการแทนที่พื้นผิวจากแหล่งที่เก็บข้อมูล +Save State Failed = เกิดข้อผิดพลาดในการเซฟสเตทเกม! +Saved State = เซฟสเตทเกมเรียบร้อย +saveNewTextures_false = ยกเลิกการบันทึกพื้นผิวลงในแหล่งที่เก็บข้อมูล +saveNewTextures_true = เปิดใช้งานการบันทึกพื้นผิวลงในแหล่งที่เก็บข้อมูล +SpeedCustom2 = ความเร็ว: มาตรฐาน 2 +standard = ความเร็ว: มาตรฐาน +Untitled PSP game = ไม่มีชื่อของเกม PSP นี้ + +[Store] +Already Installed = ติดตั้งเรียบร้อยแล้ว +Connection Error = การเชื่อมต่อล้มเหลว +Install = ติดตั้ง +Launch Game = เริ่มเกม +Loading... = กำลังโหลด... +MB = เมกกะไบต์ +Size = ขนาด +Uninstall = ถอนการติดตั้ง + +[SysInfo] +%d (%d per core, %d cores) = %d (%d เธรด ต่อคอร์, %d คอร์) +%d bytes = %d ไบต์ +(none detected) = (ไม่พบ) +3D API = แอพพลิเคชั่น โปรแกรม อินเตอร์เฟซ สามมิติ +ABI = แอพพลิเคชั่น ไบนารี่ อินเตอร์เฟซ +API Version = เวอร์ชั่นของแอพพลิเคชั่น โปรแกรม อินเตอร์เฟซ +Audio Information = ข้อมูลของระบบเสียง +Board = ชื่อบอร์ด +Build Config = การกำหนดค่า +Build Configuration = การกำหนดค่าที่ถูกสร้างไว้ +Built by = สร้างโดย +Core Context = บริบทของแกน +Cores = จำนวนแกน +CPU Extensions = ส่วนขยายซีพียู +CPU Information = ข้อมูลของหน่วยประมวลผลหลัก +CPU Name = ชื่อหน่วยประมวลผลหลัก +D3DCompiler Version = เวอร์ชั่นตัวคอมไพล์ของ D3D +Debug = แก้ไขบั๊ก +Debugger Present = ตัวช่วยแก้ไขบั๊ก +Device Info = ข้อมูลอุปกรณ์ +Display Information = ข้อมูลของหน้าจอแสดงผล +Driver Version = เวอร์ชั่นของไดรเวอร์ +EGL Extensions = ส่วนขยายอีจีแอล +Frames per buffer = จำนวนเฟรมต่อบัฟเฟอร์ +GPU Information = ข้อมูลของหน่วยประมวลผลกราฟิก +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = ภาษา/ภูมิภาค +Memory Page Size = ขนาดหน้าของหน่วยความจำ +Native Resolution = ความละเอียดดั้งเดิม +OGL Extensions = ส่วนขยายโอจีแอล +OpenGL ES 2.0 Extensions = ส่วนขยายของโอเพ่นจีแอล อีเอส 2.0 +OpenGL ES 3.0 Extensions = ส่วนขยายของโอเพ่นจีแอล อีเอส 3.0 +OpenGL Extensions = ส่วนขยายของโอเพ่นจีแอล +Optimal frames per buffer = จำนวนเฟรมต่อบัฟเฟอร์ที่เหมาะสม +Optimal sample rate = อัตราค่าความถี่เสียงที่เหมาะสม +OS Information = ข้อมูลของระบบปฏิบัติการ +PPSSPP build = การสร้าง PPSSPP +Refresh rate = อัตราการรีเฟรชของหน้าจอ +Release = ทำได้ +RW/RX exclusive = RW/RX แบบพิเศษ +Sample rate = อัตราค่าความถี่เสียง +Shading Language = ภาษาของเฉดเดอร์ +Sustained perf mode = โหมดประสิทธิภาพที่ยั่งยืน +System Information = ข้อมูลโดยรวมของระบบ +System Name = ชื่อระบบ +System Version = เวอร์ชั่นของระบบ +Threads = จำนวนเธรด +Vendor = ชื่อหน่วยประมวลผลกราฟิก +Vendor (detected) = ผู้จัดจำหน่าย (ที่ตรวจพบ) +Version Information = ข้อมูลของเวอร์ชั่น +Vulkan Extensions = ส่วนขยายของวัลแคน +Vulkan Features = ฟีเจอร์วัลแคน + +[System] +(broken) = (เสียหาย) +12HR = 12 ชั่วโมง +24HR = 24 ชั่วโมง +Auto = อัตโนมัติ +Auto Load Savestate = โหลดเซฟสเตทให้อัตโนมัติ +AVI Dump started. = เริ่มการอัดบันทึกวีดีโอ +AVI Dump stopped. = หยุดการอัดบันทึกวีดีโอ +Cache ISO in RAM = เก็บแคช ISO ทั้งหมดเอาไว้ในแรม +Change CPU Clock = เปลี่ยนค่าจำลองความถี่ของซีพียู (ไม่เสถียร) +Change Memory Stick folder = เปลี่ยนแหล่งที่เก็บข้อมูล (เม็มโมรี่ สติ๊ก) +Change Memory Stick Size = เปลี่ยนขนาดของแหล่งที่เก็บข้อมูล (กิ๊กกะไบต์) +Change Nickname = เปลี่ยนชื่อเล่น +ChangingMemstickPath = เซฟดาต้า เซฟสเตท และข้อมูลอื่นๆ อาจจะไม่สามารถคัดลอกไปยังโฟลเดอร์นี้ได้\n\nต้องการปรับเปลี่ยนไปใช้แหล่งที่เก็บข้อมูลนี้เลยหรือไม่? +ChangingMemstickPathInvalid = เส้นทางนี้ไม่สามารถใช้งานสำหรับการเปลี่ยนแหล่งที่เก็บข้อมูลได้ +ChangingMemstickPathNotExists = ไม่พบโฟลเดอร์ดังกล่าว\n\nเซฟเกม, เซฟสเตท และข้อมูลอื่นๆ อาจจะไม่สามารถคัดลอกไปยังโฟลเดอร์นี้ได้\n\nจะให้สร้างโฟลเดอร์สำหรับแหล่งที่เก็บข้อมูลอันใหม่เลยไหม? +Cheats = สูตรโกง (ขั้นทดสอบ, ดูเพิ่มเติมที่ฟอรั่ม) +Clear Recent = ลบรายการเกมที่เล่นล่าสุด +Clear Recent Games List = ลบรายการเกมที่พึ่งเล่นไปในครั้งล่าสุด +Clear UI background = ลบภาพพื้นหลัง +Confirmation Button = ปุ่มยืนยัน +Date Format = รูปแบบวันที่ +Day Light Saving = เวลาออมแสง +DDMMYYYY = วัน/เดือน/ปี +Decrease size = ลดขนาดไอคอน +Developer Tools = เครื่องมือสำหรับนักพัฒนา +Display Extra Info = แสดงข้อมูลเพิ่มเติม +Display Games on a grid = แสดงแบบกริดในแถบ "เกมอื่นๆ" +Display Homebrew on a grid = แสดงแบบกริดในแถบ "เกมโฮมบริว" +Display Recent on a grid = แสดงแบบกริดในแถบ "เกมที่พึ่งเล่นล่าสุด" +Dynarec (JIT) = ไดนาเร็ค (JIT) +Emulation = การจำลองเสมือน +Enable Cheats = เปิดใช้งานสูตรโกง +Enable Compatibility Server Reports = เปิดใช้การส่ง-แนบรายงานข้อมูลเกมไปยังเซิร์ฟเวอร์ +Failed to load state. Error in the file system. = ล้มเหลวในการโหลดสเตทเกม เนื่องจากไฟล์ระบบเสียหาย +Failed to save state. Error in the file system. = ล้มเหลวในการเซฟสเตทเกม เนื่องจากไฟล์ระบบเสียหาย +Fast (lag on slow storage) = เร็ว (อาจแล็ก หากที่เก็บข้อมูลอ่านช้า) +Fast Memory = หน่วยความจำทำงานได้เร็วขึ้น (ไม่เสถียร) +Force real clock sync (slower, less lag) = บังคับการซิงค์สัญญาณความถี่ (ช้ากว่า, เเล็กน้อยลง) +frames, 0:off = เฟรม, 0 = ปิด +Games list settings = การตั้งค่าในรายการเกม +General = ทั่วไป +Grid icon size = ขนาดของไอคอนเกม +Help the PPSSPP team = ช่วยเหลือทีมงาน PPSSPP +Host (bugs, less lag) = โฮสต์ (อาจเกิดบั๊ก, แล็กน้อยลง) +I/O on thread (experimental) = การรับ/ส่ง ข้อมูล บนเธรด (ขั้นทดสอบ) +Ignore bad memory accesses = ละเว้นการเข้าถึงหน่วยความจำที่ผิดพลาด +Increase size = เพิ่มขนาดไอคอน +Interpreter = อินเตอร์พรีเตอร์ +IO timing method = ทางเลือกคำนวณเวลา รับ/ส่ง ข้อมูล +IR Interpreter = ไออาร์ อินเตอร์พรีเตอร์ +Memory Stick Folder = โฟลเดอร์แหล่งที่เก็บข้อมูล (เม็มโมรี่ สติ๊ก) +Memory Stick inserted = ใส่ที่บันทึกข้อมูล (เม็มโมรี่ สติ๊ก) +MHz, 0:default = MHz, 0 = ค่าเริ่มต้น +MMDDYYYY = เดือน/วัน/ปี +Newest Save = เซฟอันใหม่สุด +Not a PSP game = นี่ไม่ใช่เกม PSP นะจ้ะ +Off = ปิด +Oldest Save = เซฟอันเก่าสุด +PSP Model = โมเดลของ PSP +PSP Settings = การตั้งค่า PSP +PSP-1000 = PSP รุ่น 1000 +PSP-2000/3000 = PSP รุ่น 2000/3000 +Record Audio = อัดบันทึกเสียง +Record Display = อัดบันทึกวีดีโอ +Reset Recording on Save/Load State = เริ่มการอัดบันทึกไฟล์ใหม่ เมื่อกดเซฟ/โหลดสเตทเกม +Restore Default Settings = รีเซ็ตการตั้งค่าของ PPSSPP ทั้งหมด +Rewind Snapshot Frequency = เซฟสเตทแบบอัตโนมัติ (สูบแรม) +Save path in installed.txt = บันทึกข้อมูลตามเส้นทางที่เลือกไว้ +Save path in My Documents = บันทึกข้อมูลไว้ที่ My Documents +Savestate Slot = ช่องเก็บเซฟสเตทเกม +Savestate slot backups = สำรองข้อมูลเซฟสเตท +Screenshots as PNG = จับภาพหน้าจอเป็นไฟล์ PNG +Set UI background... = เปลี่ยนภาพพื้นหลัง... +Show ID = แสดงไอดี/เวอร์ชั่นเกม +Show region flag = แสดงรูปธงโซนเกม +Simulate UMD delays = จำลองความหน่วงเหมือนแผ่น UMD +Slot 1 = เซฟช่องที่ 1 +Slot 2 = เซฟช่องที่ 2 +Slot 3 = เซฟช่องที่ 3 +Slot 4 = เซฟช่องที่ 4 +Slot 5 = เซฟช่องที่ 5 +Storage full = ที่เก็บข้อมูลเต็ม +Sustained performance mode = โหมดประสิทธิภาพที่ยั่งยืน +Time Format = รูปแบบเวลา +UI = หน้าจอผู้ใช้ +UI Sound = เสียงของอินเตอร์เฟซ +undo %c = สำรอง %c +Use Lossless Video Codec (FFV1) = ใช้โค้ด FFV1 บันทึกวีดีโอ เพื่อรักษาความคมชัด +Use O to confirm = ใช้ O เป็นปุ่มยืนยัน +Use output buffer (with overlay) for recording = ใช้การส่งออกบัฟเฟอร์ (พร้อมด้วยการซ้อนทับ) ในการบันทึกวีดีโอ +Use system native keyboard = ใช้คีย์บอร์ดติดเครื่องในการกรอกข้อความ +Use X to confirm = ใช้ X เป็นปุ่มยืนยัน +VersionCheck = ตรวจสอบ PPSSPP เวอร์ชั่นใหม่ +WARNING: Android battery save mode is on = คำเตือน: โหมดประหยัดแบตเตอรี่แอนดรอยด์เริ่มทำงาน +WARNING: Battery save mode is on = คำเตือน: โหมดประหยัดแบตเตอรี่เริ่มทำงาน +YYYYMMDD = ปี/เดือน/วัน + +[Upgrade] +Details = รายละเอียด +Dismiss = ยกเลิก +Download = ดาวน์โหลด +New version of PPSSPP available = PPSSPP เวอร์ชั่นใหม่พร้อมให้ดาวน์โหลดแล้ว! diff --git a/assets/lang/tr_TR.ini b/assets/lang/tr_TR.ini new file mode 100644 index 0000000000..8645a76f98 --- /dev/null +++ b/assets/lang/tr_TR.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = Ses alttabanı (Yeniden başlatma lazım) +AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower) +Auto = Otomatik +Device = Device +DSound (compatible) = DSound (Uyumlu) +Enable Sound = Sesi etkinleştir +Global volume = Genel ses +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = WASAPI (Hızlı) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Analog eksen uyarlılığı +Analog Limiter = Analog sınırlayıcı +Analog Mapper High End = Analog mapper high-end (axis sensitivity) +Analog Mapper Low End = Analog mapper low-end (inverse deadzone) +Analog Mapper Mode = Analog mapper mode +Analog Stick = Analog çubuk +AnalogLimiter Tip = Analog sınırlayıcı tuşuna basınca +Auto = Otomatik +Auto-centering analog stick = Analog çubuğu otomatik ortala +Auto-hide buttons after seconds = Belirli bir süre sonra tuşları otomatik sakla +Binds = Binds +Button Opacity = Tuş görünürlüğü +Button style = Tuş biçimi +Calibrate D-Pad = D-Pad'i kalibre et +Calibration = Ayarlama +Classic = Klasik +Combo Key Setting = Combo key setting +Combo Key Setup = Combo key setup +Confine Mouse = Fareyi belirli bir pencere/görüntü alanı içinde sınırla +Control Mapping = Kontrolleri ayarla +Custom layout... = Dokunmatik kontrol düzenini düzenle... +Customize tilt = Customize tilt... +D-PAD = D-Pad +Deadzone Radius = Deadzone radius +DInput Analog Settings = DInput analog ayarları +Disable D-Pad diagonals (4-way touch) = D-Pad'i devre dışı bırak (4'lü Yön Tuşları) +Glowing borders = Glowing borders +HapticFeedback = Dokunsal geribildirim (Titreşim) +Ignore gamepads when not focused = Başka programa geçildiğinde oyun kolunu yoksay +Ignore Windows Key = Windows tuşunu devre dışı bırak +Invert Axes = Eksenleri ters çevir +Invert Tilt along X axis = Invert tilt along X axis +Invert Tilt along Y axis = Invert tilt along Y axis +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Klavye kontrol ayarları +L/R Trigger Buttons = L/R Tetik düğmeleri +Landscape = Yatay +Landscape Auto = Landscape auto +Landscape Reversed = Ters yatay +Mouse = Fare ayarları +Mouse sensitivity = Fare hassasiyeti +Mouse smoothing = Fare yumuşatma +MouseControl Tip = Fareye 'Kontrolleri Ayarlama' bölümünden 'M' simgesine basarak kontrol atayabilirsiniz. +None (Disabled) = Hiçbiri (Devredışı) +Off = Kapalı +OnScreen = Dokunmatik ekran kontrolleri +Portrait = Dikey +Portrait Reversed = Ters dikey +PSP Action Buttons = PSP eylem tuşları +Screen Rotation = Ekran rotasyonu +seconds, 0 : off = saniyeler, 0 = kapalı +Sensitivity = Hassasiyet +Show right analog = Show right analog +Show Touch Pause Menu Button = Duraklama menüsü tuşunu göster +Thin borders = İnce sınırlar +Tilt Base Radius = Tilt base radius +Tilt Input Type = Tilt input type +Tilt Sensitivity along X axis = Tilt sensitivity along X axis +Tilt Sensitivity along Y axis = Tilt sensitivity along Y axis +To Calibrate = Ayarlamak için cihazı düz bir zemin üzerinde tutun ve "Ayarla" tuşuna basın. +Touch Control Visibility = Dokunmatik kontrol görünürlüğü +Use custom right analog = Use custom right analog +Use Mouse Control = Fareyle kontrolü etkinleştir +Visibility = Görünürlük +X = X +X + Y = X + Y +XInput Analog Settings = XInput analog ayarları +Y = Y + +[CwCheats] +Cheats = Hileler +Edit Cheat File = Hile dosyasını düzenle +Enable/Disable All = Bütün hileleri Aç/Kapat +Import Cheats = cheat.db'den hile al +Options = Ayarlar +Refresh Rate = Yenileme hızı + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = &PPSSPP Hakkında... +Auto = &Otomatik +Backend = Rendering &Backend (Restarts PPSSPP) +Bicubic = &Bicubic +Break = Break +Break on Load = Break on load +Buffered Rendering = &Buffered Rendering +Buy Gold = Altın Sürümünü Satın Al +Control Mapping... = Kontrol Ayarlama... +Debugging = &Hata Ayıklama +Deposterize = &Deposterize +Direct3D9 = &Direct3D9 +Direct3D11 = Direct3D &11 +Disassembly = &Disassembly... +Discord = Discord +Display Layout Editor = Görüntü düzeni düzenleyici... +Display Rotation = Ekran rotasyonu +Dump Next Frame to Log = D&ump Next Frame to Log +Emulation = &Emülasyon +Enable Chat = Enable chat +Enable Cheats = &Hileleri Aç +Enable Sound = Sesi Aç +Exit = Çıkış +Extract File... = Dosya Çıkart... +File = Dosya +Frame Skipping = &Kare Atlama +Frame Skipping Type = Frame skipping type +Fullscreen = Tam Ekran +Game Settings = &Oyun Ayarları +GE Debugger... = GE Debugge&r... +GitHub = Git&Hub +Hardware Transform = &Donanım Dönüştürme +Help = Yardım +Hybrid = &Hybrid +Hybrid + Bicubic = H&ybrid + Bicubic +Ignore Illegal Reads/Writes = &İllegal Yazıları Yoksay +Ignore Windows Key = Windows Tuşunu Yoksay +Keep PPSSPP On Top = &PPSSPP'yi En Üstte Tut +Landscape = Yatay +Landscape reversed = Ters Yatay +Language... = Dil... +Linear = Doğrusal +Load = &Yükle... +Load .sym File... = &.sym Dosyası Yükle... +Load Map File... = &Harita Dosyası Yükle... +Load State = &Durum Yükle +Load State File... = &Durum Dosyası Yükle... +Log Console = &Log Console +Memory View... = Memory &View... +More Settings... = &Daha Fazla Ayar... +Nearest = &En Yakın +Non-Buffered Rendering = &Skip buffer effects (non-buffered, faster) +Off = &Kapalı +Open Directory... = Dizin Aç... +Open from MS:/PSP/GAME... = Şurdan Aç MS:/PSP/GAME... +Open Memory Stick = Hafıza Kartını Aç +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = PPSSPP Menüsü +Pause When Not Focused = &Başka programa geçildiğinde duraklat +Portrait = Dikey +Portrait reversed = Ters Dikey +Postprocessing Shader = Postprocessin&g Shader +PPSSPP Forums = PPSSPP Forumları +Record = Kayıt +Record Audio = Ses Kaydet +Record Display = Görüntü Kaydet +Rendering Mode = İşleme Modu +Rendering Resolution = &İşleme Çözünürlüğü +Reset = Sıfırla +Reset Symbol Table = Reset S&ymbol Table +Run = Çalıştır +Save .sym File... = .sym Dosyası Kaydet... +Save Map File... = &Harita Dosyası Kaydet... +Save State = Durum Kaydet +Save State File... = &Durum Kaydı Dosyası... +Savestate Slot = Durum Kaydı Yeri +Screen Scaling Filter = Scr&een Scaling Filter +Show Debug Statistics = Hata Ayıklama İstatistiklerini Göster +Show FPS Counter = FPS Sayacını Göster +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = &Dur +Switch UMD = UMD Değiştir +Take Screenshot = &Ekran Görüntüsü Al +Texture Filtering = Doku Filtreleme +Texture Scaling = &Doku Ölçekleme +Use Lossless Video Codec (FFV1) = &Use lossless video codec (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = &Vertex Cache +VSync = Dikey Eşleme (VSync) +Vulkan = Vulkan +Window Size = &Pencere Büyüklüğü +www.ppsspp.org = www.&ppsspp.org Ziyaret Et +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allocator viewer (Vulkan) +Allow remote debugger = Allow remote debugger +Backspace = Geri Tuşu +Block address = Block address +By Address = By address +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Şu anki oyun için textures.ini dosyası Oluştur/Aç +Current = Current +Dev Tools = Geliştirme araçları +DevMenu = DevMenu +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Dump decrypted EBOOT.BIN on game boot +Dump Frame GPU Commands = Dump frame GPU commands +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Enable debug logging +Enter address = Adres Gir +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Frame profiler +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = Jit compare +JIT debug tools = JIT debug tools +Language = Dil +Load language ini = Dil Dosyası Yükle(.ini) +Log Dropped Frame Statistics = Log dropped frame statistics +Log Level = Log level +Log View = Log view +Logging Channels = Logging channels +Next = Sonraki +No block = No block +Prev = Önceki +Random = Rastgele +Replace textures = Dokuları değiştir +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Bütün ayarları varsayılanlarına döndürmek istediğine emin misin?\nKontrol ayarları değiştirilmedi.\n\nBunu geri alamazsın.\nDeğişikliklerin uygulanması için lütfen PPSSPP'yi yeniden başlatın. +RestoreGameDefaultSettings = Oyun için ayarlanmış olan özel ayarları PPSSPP varsayılanlarına döndürmek istediğinden emin misin? +Resume = Resume +Run CPU Tests = İşlemci testlerini başlat +Save language ini = Dil Dosyası Kaydet (.ini) +Save new textures = Yeni dokuları kaydet +Shader Viewer = Shader viewer +Show Developer Menu = Geliştirici Menüsünü Göster +Show on-screen messages = Show on-screen messages +Stats = Stats +System Information = Sistem bilgisi +Texture Replacement = Doku değiştirme +Toggle Audio Debug = Ses hata ayıklamasını Aç/Kapat +Toggle Freeze = Donmayı Aç/Kapa +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP Çözünürlüğü +Active = Active +Back = Geri +Cancel = İptal +Center = Merkez +ChangingGPUBackends = GPU arkaucunu değiştirmek için PPSSPP'nin yeniden başlatılması gerek. Şimdi yeniden başlatılsın mı? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = PPSSPP kayıt dosyası seç +Confirm Overwrite = Veriyi üstüne yazmak istiyor musun? +Confirm Save = Bu veriyi kaydetmek istiyor musun? +ConfirmLoad = Veriyi yüklemek istiyor musun? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Sil +Delete all = Hepsini sil +Delete completed = Silme işlemi tamamlandı. +DeleteConfirm = Bu kayıt silinecek.\nDevam etmek istiyor musunuz? +DeleteConfirmAll = Bu oyun için bütün kayıtları silmek istediğine emin misin? +DeleteConfirmGame = Bu oyunu cihazından silmek istediğine emin misin?\nBunu geri alamazsın. +DeleteConfirmGameConfig = Bu oyun için ayarları silmek istediğine emin misin? +DeleteFailed = Veri silinemedi. +Deleting = Siliniyor\nLütfen Bekleyin... +Disable All = Hepsini devre dışı bırak +Edit = Edit +Enable All = Hepsini etkinleştir +Enter = Gir +Finish = Bitir +Grid = Grid +Inactive = Inactive +InternalError = An internal error has occurred. +Load = Yükle +Load completed = Yükleme tamamlandı. +Loading = Yükleniyor\nLütfen Bekleyin... +LoadingFailed = Veri yüklenemedi. +Move = Taşı +Network Connection = Ağ Bağlantısı +NEW DATA = YENİ VERİ +No = Hayır +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = Tamam +Old savedata detected = Eski kayıt bulundu. +Options = Ayarlar +Reset = Sıfırla +Resize = Yeniden Boyutlandır +Retry = Yeniden Dene +Save = Kaydet +Save completed = Kaydedildi. +Saving = Kayıt ediliyor\nLütfen Bekleyin... +SavingFailed = Veriyi kaydedemiyor. +Select = Seç +Shift = Shift +Snap = Snap +Space = Boşluk +SSID = SSID +Submit = Gönder +Supported = Supported +There is no data = Veri yok +Toggle All = Hepsini değiştir +Toggle List = Toggle list +Unsupported = Unsupported +When you save, it will load on a PSP, but not an older PPSSPP = Kayıt aldığında almış olduğunuz kayıt PSP'de yüklenebilecek ama eski bir PPSSPP sürümünde yüklenemeyecek. +When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore +Yes = Evet +Zoom = Yakınlaştır + +[Error] +7z file detected (Require 7-Zip) = dosya sıkıştırılmış (7z).\nLütfen ilk olarak dosyayı çıkartın (7-zip ya da WinRAR kullanın). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = Ekran görüntüsü kaydedilemedi. +D3D9or11 = Direct3D 9? (Direct3D 11 için hayır'a basın) +D3D11CompilerMissing = D3DCompiler_47.dll bulunamadı. Lütfen yükleyin. Ya da yerine Direct3D 9 kullanarak yeniden denemek için Evete basın. +D3D11InitializationError = Direct3D 11 başlatma hatası +D3D11Missing = İşletim sisteminiz D3D11'i içermiyor. Lütfen Windows Update'i çalıştırınız.\n\nYerine Direct3D 9 kullanarak tekrar denemek için Evete basın. +D3D11NotSupported = Grafik işlemciniz Direct3D 11'i destekliyor gibi görünmüyor.\n\nYerine Direct3D 9 kullanarak yeniden denemek ister misiniz? +Disk full while writing data = Veri yazılırken disk dolu. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = Oyun yüklenemedi. +Error reading file = Dosya okumada hata. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = Dosya tanımlanamadı. +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Grafikler başlatılamadı. Ekran kartınızın sürücülerini ve DirectX'i güncellemeyi deneyin.\n\nOpenGL'ye geçmek ister misiniz?\n\nHata Mesajı: +GenericGraphicsError = Grafik Hatası +GenericOpenGLError = Grafikler başlatılamadı. Ekran kartınızın sürücülerini güncellemeyi deneyin.\n\nDirectX 9'a geçmek ister misiniz?\n\nHata Mesajı: +GenericVulkanError = Grafikler başlatılamadı. Ekran kartınızın sürücülerini güncellemeyi deneyin.\n\nOpenGL'ye geçmek ister misiniz?\n\nHata Mesajı: +InsufficientOpenGLDriver = Yetersiz OpenGL desteği tespit edildi!\n\nEkran işlemciniz OpenGL 2.0'ı desteklemiyor. Onun yerine DirectX'u kullanmayı denemek ister misiniz?\n\nDirectX şimdilik az sayıda oyunla uyumlu ama belkide ekran kartınız için tek seçenek bu.\n\nDaha fazla bilgi için https://forums.ppsspp.org sitesindeki forumları ziyaret edin\n\n +Just a directory. = Sadece bir klasör. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = no EBOOT.PBP, misidentified game. +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = OpenGL Sürücü Hatası +PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP şuan DLC, PSN ya da oyun güncellemeleri için internete bağlanmayı desteklemiyor. +PS1 EBOOTs are not supported by PPSSPP. = PS1 EBOOT'ları PPSSPP tarafından desteklenmiyor. +PSX game image detected. = Dosya bir MODE2 imajı. PPSSPP PS1 oyunlarını desteklemiyor. +RAR file detected (Require UnRAR) = Dosya sıkıştırılmış (RAR).\nLütfen ilk olarak dosyayı çıkartın (UnRAR'ı deneyin). +RAR file detected (Require WINRAR) = Dosya sıkıştırılmış (RAR).\nLütfen ilk olarak dosyayı çıkartın (WinRAR'ı deneyin). +Running slow: try frameskip, sound is choppy when slow = Yavaş çalışıyor : Kare atlamayı deneyin, yavaş çalışırken ses kesikli olur +Running slow: Try turning off Software Rendering = Yavaş çalışıyor: Yazılımsal işlemeyi kapamayı deneyin. +Save encryption failed. This save won't work on real PSP = Kayıt şifrelemesi başarısız oldu. Bu kayıt PSP'de çalışmayacak +textures.ini filenames may not be cross-platform = "textures.ini" filenames may not be cross-platform. +This is a saved state, not a game. = Bu bir durum kaydı, bir oyun değil +This is save data, not a game. = Bu bir kayıt dosyası, bir oyun değil. +Unable to create cheat file, disk may be full = Hile dosyası oluşturulamadı, belkide disk doludur. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Kayıt verisi yazılamadı, belkide disk doludur. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = UYARI: Video hafızası DOLU, video ölçekleme azaltılıyor ve yavaş önbellekleme moduna geçiliyor. +Warning: Video memory FULL, switching to slow caching mode = UYARI: Video hafızası DOLU, yavaş önbellekleme moduna geçiliyor. +ZIP file detected (Require UnRAR) = Dosya sıkıştırılmış (ZIP).\nLütfen ilk olarak dosyayı çıkartın (UnRAR'ı deneyin). +ZIP file detected (Require WINRAR) = Dosya sıkıştırlmış (ZIP).\nLütfen ilk olarak dosyayı çıkartın (WinRAR'ı deneyin). + +[Game] +Asia = Asya +ConfirmDelete = Sil +Create Game Config = Oyun için yapılandırma dosyası oluştur +Create Shortcut = Kısayol oluştur +Delete Game = Oyunu Sil +Delete Game Config = Oyun ayarını sil +Delete Save Data = Oyun kaydını sil +Europe = Avrupa +Game = Oyun +Game Settings = Oyun ayarları +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Veri yükle +Japan = Japonya +Korea = Korea +MB = MB +One moment please... = Bir dakika lütfen... +Play = Oyna +Remove From Recent = Geçmişten sil +SaveData = Kayıt +Setting Background = Setting background +Show In Folder = Dosyada göster +USA = USA +Use UI background = Arayüz arkaplanı olarak kullan + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = sınırsız +(supersampling) = (supersampling) +(upscaling) = (ölçekleme) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Agresif +Alternative Speed = Alternatif Hız (in %, 0 = sınırsız) +Alternative Speed 2 = Alternative speed 2 (in %, 0 = unlimited) +Anisotropic Filtering = Anisotropic filtreleme +Auto = Otomatik +Auto (1:1) = Otomatik (1:1) +Auto (same as Rendering) = Otomatik (İşleme Çözünürlüğüyle Aynı) +Auto FrameSkip = Otomatik kare atlama +Auto Scaling = Otomatik ölçekleme +Backend = Arkauç +Balanced = Dengeli +Bicubic = Çift Kübik +BlockTransfer Tip = Bazı oyunlarda doğru grafikler için bu ayarın açık olması gerekir +BlockTransferRequired = Warning: This game requires Simulate Block Transfer Mode to be set to On. +Both = İkisi +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Yükleyerek çöz +BufferedRenderingRequired = Warning: This game requires "rendering mode" to be set to "buffered". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Ekran Boyutu (in % of the viewport) +Cardboard Screen X Shift = X shift (in % of the blank space) +Cardboard Screen Y Shift = Y shift (in % of the blank space) +Cardboard VR Settings = Google Cardboard VR Ayarları +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = İşlemci Çekirdeği +Debugging = Hata Ayıklama +DefaultCPUClockRequired = Warning: This game requires the CPU clock to be set to default. +Deposterize = Deposterize +Deposterize Tip = Fixes visual banding glitches in upscaled textures +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Disable slower effects (speedup) +Disabled = Disabled +Display layout editor = Ekran Düzeni Düzenleyicisi +Display Resolution (HW scaler) = Görüntü Çözünürlüğü (HW scaler) +Dump next frame to log = Dump next frame to log +Enable Cardboard VR = Enable Cardboard VR +FPS = FPS +Frame Rate Control = Kare hızı denetimi +Frame Skipping = Kare atla +Frame Skipping Type = Frame skipping type +FullScreen = Tam ekran +Hack Settings = Hack ayarları (Küçük teknik problemlere neden olabilir.) +Hardware Tessellation = Hardware tessellation +Hardware Transform = Donanım dönüştürme +hardware transform error - falling back to software = Donanım dönüştürme hatası, yazılıma geri dönülüyor +HardwareTessellation Tip = Uses hardware to make curves +High = Yüksek +Hybrid = Hybrid +Hybrid + Bicubic = Hybrid + Bicubic +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = İç çözünürlük +Lazy texture caching = Lazy texture caching (speedup) +Linear = Linear +Low = Düşük +LowCurves = Spline/Bezier curves quality +LowCurves Tip = Sadece bazı oyunlar tarafından kullanılır, eğrilerin pürüzsüzlüğünü kontrol eder +Lower resolution for effects (reduces artifacts) = Efektler için daha az çözünürlük ( sorunları azaltır ) +Manual Scaling = El ile ölçekleme +Medium = Orta +Mode = Mod +Must Restart = Bu değişikliğin uygulanması için PPSSPP'yi yeniden başlatmalısın. +Native device resolution = Yerel aygıt çözünürlüğü +Nearest = En yakın +No buffer = No buffer +Non-Buffered Rendering = Skip buffer effects (non-buffered, faster) +None = Hiçbiri +Number of Frames = Number of frames +Off = Kapalı +OpenGL = OpenGL +Overlay Information = Ek Bilgi +Partial Stretch = Partial stretch +Percent of FPS = Percent of FPS +Performance = Performans +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Postprocessing shader +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = İşleme modu +Rendering Resolution = İşleme çözünürlüğü +RenderingMode NonBuffered Tip = Faster, but nothing may draw in some games +Retain changed textures = Retain changed textures (sometimes slower) +RetainChangedTextures Tip = Çoğu oyunu yavaşlatır ama bazı oyunları çok hızlandırır. +Rotation = Rotasyon +Safe = Güvenli +Screen layout = Screen layout +Screen Scaling Filter = Ekran ölçekleme filtresi +Show Debug Statistics = Hata ayıklama istatistiklerini göster +Show FPS Counter = FPS sayacını göster +Simulate Block Transfer = Simulate block transfer effects +SoftGPU Tip = Şuan çok yavaş +Software Rendering = Yazılımsal işleme (Deneysel) +Software Skinning = Software skinning +SoftwareSkinning Tip = Combine skinned model draws on the CPU, faster in most games +Speed = Hız +Stretching = Stretching +Texture Filter = Doku filtreleme +Texture Filtering = Doku filtreleme +Texture Scaling = Doku ölçekleme +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Turn off "hardware tessellation": unsupported +Unlimited = Sınırsız +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = Upscale level +Upscale Type = Upscale type +UpscaleLevel Tip = CPU heavy - some scaling may be delayed to avoid stutter +Use all displays = Use all displays +Vertex Cache = Vertex önbellek +VertexCache Tip = Faster, but may cause temporary flicker +VSync = Dikey eşleme (Vsync) +Vulkan = Vulkan +Window Size = Pencere büyüklüğü +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Zip dosyasını sil +Install = Yükle +Install game from ZIP file? = Zip dosyasından oyun yüklesin mi? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = Yüklendi! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = Otomatik ayarla +Autoconfigure for device = Cihaz için otomatik ayarla +Clear All = Hepsini Temizle +Default All = Varsayılana Döndür +Map a new key for = Yeni bir tuş girin +Map Key = Map key +Map Mouse = Map mouse +Test Analogs = Analogları test et +You can press ESC to cancel. = İptal etmek için Esc'ye basabilirsiniz. + +[MainMenu] +Browse = Aç... +Buy PPSSPP Gold = Buy PPSSPP Gold +Choose folder = Choose folder +Credits = Emeği Geçenler +PPSSPP Homebrew Store = PPSSPP Homebrew Store'dan indir +Exit = Çıkış +Game Settings = Ayarlar +Games = Oyunlar +Give PPSSPP permission to access storage = PPSSPP'ye depolamaya erişmesi için izin ver +Homebrew & Demos = Demolar ve Bağımsız Yapımlar +How to get games = Nasıl oyun alırım? +How to get homebrew & demos = Demo veya bağımsız yapım nasıl bulurum? +Load = Yükle... +Loading... = Loading... +PinPath = İşaretle +PPSSPP can't load games or save right now = PPSSPP şuan kayıt ya da oyun yükleyemiyor. +Recent = Geçmiş +SavesAreTemporary = PPSSPP is saving in temporary storage +SavesAreTemporaryGuidance = Extract PPSSPP somewhere to save permanently +SavesAreTemporaryIgnore = Ignore warning +UnpinPath = İşaretlemeyi Kaldır +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Ses +Controls = Kontroller +Graphics = Grafik +Networking = Ağ ayarları +System = Sistem +Tools = Araçlar + +[MappableControls] +Alt speed 1 = Alt hız 1 +Alt speed 2 = Alt hız 2 +An.Down = Analog Aşağı +An.Left = Analog Sola +An.Right = Analog Sağa +An.Up = Analog Yukarı +Analog limiter = Analog sınırlayıcı +Analog Stick = Analog çubuk +Audio/Video Recording = Audio/Video recording +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Axis swap +Circle = Çember +Cross = Çapraz +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = Geliştirici Menüsü +Down = Dpad Aşağı +Dpad = Dpad +Frame Advance = Frame advance +Hold = Hold +Home = Home +L = L +Left = Dpad Sol +Load State = Durum Yükle +Mute toggle = Mute toggle +Next Slot = Sonraki Yer +None = None +Note = Not +OpenChat = Open chat +Pause = PPSSPP Menüsü +R = R +RapidFire = Seri Ateş +Remote hold = Remote hold +Rewind = Geri Sarma +Right = Dpad Sağ +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = SağAn.Aşağı +RightAn.Left = SağAn.Sol +RightAn.Right = SağAn.Sağ +RightAn.Up = SağAn.Yukarı +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Durum Kaydet +Screen = Ekran +Screenshot = Screenshot +Select = Select +SpeedToggle = Speed toggle +Square = Kare +Start = Start +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = Toggle fullscreen +Toggle mode = Toggle mode +Triangle = Üçgen +Unthrottle = Unthrottle +Up = Dpad Yukarı +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Ad Hoc Multiplayer Forumunu ziyaret et +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = MAC adresini değiştir +Change proAdhocServer Address = PRO Ad Hoc Server IP adresini değiştir (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Yerleşik PRO Ad Hoc Server'ı etkinleştir +Enable network chat = Enable network chat +Enable networking = Ağ Oluşturma/WLAN'ı aç (Beta, oyun çalışmayı durdurabilir.) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Network Switch +Please change your Port Offset = Please change your port offset +Port offset = Port offset(0 = PSP compatibility) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Send Discord "Rich Presence" information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = Hileler +Continue = Devam +Create Game Config = Oyun için yapılandırma dosyası oluştur +Delete Game Config = Yapılandırma dosyasını sil +Exit to menu = Menüye çık +Game Settings = Oyun ayarları +Load State = Kayıt yükle +Rewind = Geri Sar +Save State = Kaydet +Settings = Ayarlar +Switch UMD = UMD değiştir + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Color +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Cartoon +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT scanlines +FXAA = FXAA Antialiasing +Gamma = Gamma +Grayscale = Grayscale +Intensity = Intensity +InverseColors = Inverse Colors +Natural = Doğal Renkler +NaturalA = Natural Colors (no blur) +Off = Kapalı +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Tarama Çizgileri (CRT) +Sharpen = Sharpen +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 Upscaler +VideoSmoothingAA = VideoSmoothingAA +Vignette = Vignette + +[PSPCredits] +all the forum mods = Bütün forum modlarına +build server = build server +Buy Gold = Altın Sürümü alın +check = Ayrıca Etraftaki En İyi Wii/GC Emülatörü Olan Dolphin'e Gözatın: +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = Yardımcılar: +created = Yaratıcı +Discord = Discord +info1 = PPSSPP sadece eğitimsel amaçlar için tasarlandı. +info2 = Lütfen oynadığınız herhangi bir oyunun haklarına sahip olduğunuzu, +info3 = oyunun UMD'sini veya PSP'niz üzerinden +info4 = PSN Store'dan dijital sürümünü satın alarak emin olunuz. +info5 = PSP SONY'nin tescilli markasıdır. +iOS builds = iOS builds +license = GPL 2.0+ altında özgür yazılım +list = Uyumluluk Listeleri, Forumlar ve Geliştirme Bilgisi +PPSSPP Forums = PPSSPP Forumları +Privacy Policy = Privacy policy +Share PPSSPP = PPSSPP'yi Paylaş +specialthanks = Özel Teşekkürler: +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = Türkçe Çeviri Yapan: +title = Hızlı ve Taşınabilir PSP Emülatörü +tools = Kullanılan Ücretsiz Araçlar: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = Gravityy +translators2 = mygizli04 +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Web Sitesini Ziyaret Et: PPSSPP.org +written = Hız ve Taşınabilirlik İçin C++ İle Yazıldı + +[RemoteISO] +Browse Games = Oyunlara bak... +Local Server Port = Local server port +Manual Mode Client = Manual mode client +Remote disc streaming = Uzaktan disk akışı +Remote Port = Uzaktan port +Remote Server = Uzaktan sunucu +Remote Subdirectory = Uzaktan alt dizi +RemoteISODesc = Geçmiş listendeki oyunlar paylaştırılacak +RemoteISOLoading = Bağlandı, oyun listesi yükleniyor... +RemoteISOScanning = Taranıyor... Sunucu cihazınızdan "Oyunları paylaş" kısmına tıklayın +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Not: İki cihazı da aynı Wi-Fi ağına bağlayın. +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Ayarlar +Share Games (Server) = Oyunları paylaş (sunucu) +Share on PPSSPP startup = PPSSPP açılışında paylaşın +Stop Sharing = Paylaşmayı durdur +Stopping.. = Durduruluyor... + +[Reporting] +Bad = Kötü +FeedbackDelayInfo = Veriniz arkaplanda gönderiliyor. +FeedbackDesc = Program nasıldı? Bizi ve topluluğu haberdar et! +FeedbackDisabled = Uyumluluk sunucusu raporları etkinleştirilmelidir. +FeedbackIncludeCRC = Not: Batarya diskin döngüsel artıklık denetimini yollamak için kullanılacak +FeedbackIncludeScreen = Ekran görüntüsü dahil et +FeedbackSubmitDone = Veriniz gönderildi. +FeedbackSubmitFail = Veri sunucuya gönderilemedi. PPSSPP'yi güncellemeyi deneyin. +FeedbackThanks = Geribildirimin için teşekkürler! +Gameplay = Oynanış +Graphics = Grafikler +Great = İyi +In-game = Oyun içi +In-game Description = Oyuna giriyor, ama tamamlamak için çok buglu +Menu/Intro = Menü/Giriş +Menu/Intro Description = Asıl oyuna girilmiyor +Nothing = Hiçbir şey +Nothing Description = Tamamiyle bozuk +OK = Orta +Open Browser = Tarayıcıyı aç +Overall = Genel +Perfect = Harika +Perfect Description = Bütün oyun boyunca kusursuz emülasyon - harika! +Plays = Plays +Plays Description = Fully playable but might be with glitches +ReportButton = Geribildirimde bulun +Speed = Hız +Submit Feedback = Geribildirimi yolla +SuggestionConfig = İyi ayarlar için sitedeki ayarlara bakın. +SuggestionCPUSpeed0 = Kilitlenmiş CPU hızını kapat. +SuggestionDowngrade = Daha eski bir PPSSPP sürümüne indirin ( Bu bugu rapor edin, lütfen. ) +SuggestionsFound = Diğer kullanıcılar daha iyi sonuçlar rapor etti. Daha fazla ayrıntı için "Geri dönüşü görüntüle" tuşuna basın. +SuggestionsNone = Bu oyun diğer kullanıcılar için de çalışmıyor. +SuggestionsWaiting = Gönderiliyor ve diğer kullanıcıların da sonuçlarına bakılıyor... +SuggestionUpgrade = Daha yeni bir PPSSPP sürümüne güncelleyin. +SuggestionVerifyDisc = ISO dosyanızın doğru olduğunu kontrol edin. +Unselected Overall Description = Bu oyun nasıl simule ediliyor? +View Feedback = Bütün geribildirimleri göster + +[Savedata] +Date = Date +Filename = Dosya adı +No screenshot = Ekran görüntüsü yok +None yet. Things will appear here after you save. = Henüz birşey yok.Kayıt aldığında kayıtların burada gözükecek. +Save Data = Normal Kayıtlar +Save States = Durum Kayıtları +Savedata Manager = Kayıt yöneticisi +Size = Boyut + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = UYARI: Chainfire3D algılandı, problemlere sebep olabilir. +Failed to load state = Durum yüklenemedi. +Failed to save state = Durum kaydedilemedi. +fixed = Hız: Alternatif +GLToolsWarning = UYARI: GLTools algılandı, problemlere sebep olabilir. +In menu = In menu +Load savestate failed = Durum kaydı yüklenemedi. +Loaded State = Durum yüklendi. +Loaded. Save in game, restart, and load for less bugs. = Yüklendi. Daha az bug için oyunda kaydedin, yeniden başlatın ve yükleyin. +LoadStateDoesntExist = Durum yüklenemedi: Durum kaydı yerinde yok! +LoadStateWrongVersion = Durum yüklenemedi: Durum kaydı eski bir PPSSPP versiyonu için uygun! +norewind = Geriye sarma durumu bulunamadı. +Playing = Oynatılıyor... +PressESC = PPSSPP menüsünü açmak için ESC'ye bas. +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = Durum kaydı yapılamadı! +Saved State = Durum kaydedildi. +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Hız: Alternatif 2 +standard = Hız: Standart +Untitled PSP game = Başlıksız PSP oyunu + +[Store] +Already Installed = Zaten yüklü +Connection Error = Bağlantı hatası +Install = Yükle +Launch Game = Oyunu başlat +Loading... = Yükleniyor... +MB = MB +Size = Boyut +Uninstall = Sil + +[SysInfo] +%d (%d per core, %d cores) = %d (çekirdek başına %d , %d çekirdek ) +%d bytes = %d bytes +(none detected) = (hiç bulunamadı) +3D API = 3D API +ABI = ABI +API Version = API sürümü +Audio Information = Ses bilgisi +Board = Board +Build Config = Yapı konfigürasyonu +Build Configuration = Yapı konfigürasyonu +Built by = Tarafından yapılsı +Core Context = Core context +Cores = Çekirdekler +CPU Extensions = CPU uzantıları +CPU Information = CPU bilgisi +CPU Name = Ad +D3DCompiler Version = D3DCompiler version +Debug = Hata Ayıklama +Debugger Present = Hata ayıklayıcı var +Device Info = Cihaz bilgisi +Display Information = Ekran bilgisi +Driver Version = Sürücü sürümü +EGL Extensions = EGL eklentileri +Frames per buffer = Frames per buffer +GPU Information = GPU bilgisi +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Dil/Bölge +Memory Page Size = Memory page size +Native Resolution = Doğal çözünürlük +OGL Extensions = OGL eklentileri +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 eklentileri +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 eklentileri +OpenGL Extensions = OpenGL eklentileri +Optimal frames per buffer = Optimal frames per buffer +Optimal sample rate = Optimal sample rate +OS Information = İS bilgisi +PPSSPP build = PPSSPP yapımı +Refresh rate = Refresh rate +Release = Release +RW/RX exclusive = RW/RX 'e özel +Sample rate = Sample rate +Shading Language = Shading language +Sustained perf mode = Sustained perf mode +System Information = Sistem bilgisi +System Name = Ad +System Version = System version +Threads = Threads +Vendor = Vendor +Vendor (detected) = Vendor (detected) +Version Information = Sürüm bilgisi +Vulkan Extensions = Vulkan eklentileri +Vulkan Features = Vulkan özellikleri + +[System] +(broken) = (bozuk) +12HR = 12 saat +24HR = 24 saat +Auto = Otomatik +Auto Load Savestate = Auto load savestate +AVI Dump started. = AVI kaydı başladı +AVI Dump stopped. = AVI kaydı bitti +Cache ISO in RAM = Bütün ISO'yu RAM'e önbellekle +Change CPU Clock = Taklit edilen PSP'nin CPU sayacını değiştir ( kararlı değil ) +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Kullanıcı adını değiştir +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = Hileler (Deneysel, Forumlara Bakın) +Clear Recent = Clear "Recent" +Clear Recent Games List = Geçmiş listesini temizle +Clear UI background = Arayüz arkaplanını varsayılana döndür +Confirmation Button = Onaylama tuşu +Date Format = Tarih biçimi +Day Light Saving = Yaz saati uygulaması +DDMMYYYY = GGAAYYYY +Decrease size = Decrease size +Developer Tools = Geliştirici araçları +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = Emülasyon +Enable Cheats = Hileleri aç +Enable Compatibility Server Reports = Uyumluluk sunucusu raporlarını etkinleştir +Failed to load state. Error in the file system. = Durum yüklenemedi. Dosya sistemi hatası. +Failed to save state. Error in the file system. = Durum kaydedilemedi. Dosya sistemi hatası. +Fast (lag on slow storage) = Hızlı (Yavaş depolamada gecikmeye(lag) neden olur) +Fast Memory = Hızlı Bellek (Kararsız) +Force real clock sync (slower, less lag) = Gerçek sayaç senkronizasyonuna zorla (daha yavaş, daha az kasma) +frames, 0:off = frames, 0 = off +Games list settings = Games list settings +General = Genel +Grid icon size = Grid icon size +Help the PPSSPP team = PPSSPP takımına yardım et +Host (bugs, less lag) = Host (bugs, less lag) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Interpreter +IO timing method = I/O timing method +IR Interpreter = IR interpreter +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = Hafıza kartı takıldı +MHz, 0:default = MHz, 0 = varsayılan +MMDDYYYY = AAGGYYYY +Newest Save = En yeni kayıt +Not a PSP game = Bir PSP oyunu değil +Off = Kapalı +Oldest Save = En eski kayıt +PSP Model = PSP modeli +PSP Settings = PSP ayarları +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Sesi kaydet +Record Display = Görüntüyü kaydet +Reset Recording on Save/Load State = Reset recording on Save/Load state +Restore Default Settings = Varsayılan ayarları yükle +Rewind Snapshot Frequency = Geri sarma görüntüsü sıklılığı (mem hog) +Save path in installed.txt = Save path in installed.txt +Save path in My Documents = Dosyaları "Belgeler"'e kaydet +Savestate Slot = Durum kaydı yeri +Savestate slot backups = Savestate slot backups +Screenshots as PNG = Ekran görüntülerini PNG formatında kaydet +Set UI background... = Arayüz arkaplanı ayarla... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = UMD gecikmelerini simule et +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Depolama dolu +Sustained performance mode = Sürekli performans modu +Time Format = Zaman biçimi +UI = Kullanıcı arayüzü +UI Sound = UI sound +undo %c = %c 'yi yedekle +Use Lossless Video Codec (FFV1) = Kayıpsız video kodek'i kullan (FFV1) +Use O to confirm = O Onaylama Tuşu Olarak Kullan +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = X Onaylama Tuşu Olarak Kullan +VersionCheck = Güncellemeleri denetle +WARNING: Android battery save mode is on = UYARI: Android güç tasaruufu açık +WARNING: Battery save mode is on = UYARI: Güç tasarrufu açık +YYYYMMDD = YYYYAAGG + +[Upgrade] +Details = Details +Dismiss = Reddet +Download = İndir +New version of PPSSPP available = PPSSPP'nin yeni versiyonu var diff --git a/assets/lang/uk_UA.ini b/assets/lang/uk_UA.ini new file mode 100644 index 0000000000..66f55f404f --- /dev/null +++ b/assets/lang/uk_UA.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Гучність при альтернативній швидкості +Audio backend = Бекенд аудіо (потрібне перезавантаження) +AudioBufferingForBluetooth = Буфер, який підходить для Bluetooth (повільніше) +Auto = Авто +Device = Пристрій +DSound (compatible) = DSound (сумісний) +Enable Sound = Ввімкнути звук +Global volume = Глобальна гучність +Microphone = Microphone +Microphone Device = Microphone device +Mute = Вимкнути звук +Switch on new audio device = Увімкніть новий аудіопристрій +Use global volume = Використовувати загальну гучність +WASAPI (fast) = WASAPI (швидко) + +[Controls] +Analog auto-rotation speed = Швидкість автоматичного обертання аналогу +Analog Axis Sensitivity = Чутливість аналогової вісі +Analog Limiter = Аналоговий обмежувач +Analog Mapper High End = Параметри аналогового стіку (вісь чутливості) +Analog Mapper Low End = Параметри аналогового стіку (інверсія мертвої зони) +Analog Mapper Mode = Режим аналогового стіку +Analog Stick = Аналоговий стік +AnalogLimiter Tip = Коли натиснена кнопка аналогового обмежувача +Auto = Авто +Auto-centering analog stick = Автоматичне центрування аналогового стіку +Auto-hide buttons after seconds = Приховувати кнопки через +Binds = Прив'язка +Button Opacity = Прозорість кнопок +Button style = Стиль кнопок +Calibrate D-Pad = Калібрувати хрестовину +Calibration = Калібрування +Classic = Класичний +Combo Key Setting = Зміна комбо-кнопок +Combo Key Setup = Налаштуванн комбо-кнопок... +Confine Mouse = Не давати миші виходити за межі екрану +Control Mapping = Призначення кнопок +Custom layout... = Розташування кнопок... +Customize tilt = Налаштування нахилу... +D-PAD = Хрестовина +Deadzone Radius = Радіус мертвої зони +DInput Analog Settings = Налаштування стіків DInput +Disable D-Pad diagonals (4-way touch) = Вимкнути хрестовину по діагоналі +Glowing borders = Тонкі границі (підсвічування) +HapticFeedback = Вібровіддача +Ignore gamepads when not focused = Ігнорувати геймпади, коли немає сфокусованості +Ignore Windows Key = Ігнорувати клавішу Windows +Invert Axes = Інверсія вісі +Invert Tilt along X axis = Інверсія нахилу вздовж X +Invert Tilt along Y axis = Інверсія нахилу вздовж Y +Keep this button pressed when right analog is pressed = Утримуйте цю кнопку натиснутою, коли натискається правий аналог +Keyboard = Налаштування клавіатури +L/R Trigger Buttons = Триггери L/R +Landscape = Альбомна +Landscape Auto = Альбомна (авто) +Landscape Reversed = Альбомна (перевернута) +Mouse = Налаштування миші +Mouse sensitivity = Чутливість миші +Mouse smoothing = Згладжування миші +MouseControl Tip = Тепер ви можете налаштувати мишу на екрані керування, натиснувши на іконку 'M'. +None (Disabled) = Вимкнено +Off = Вимкнено +OnScreen = Елементи управління на екрані +Portrait = Портретна +Portrait Reversed = Портретна (перевернута) +PSP Action Buttons = Кнопки дій PSP +Screen Rotation = Орієнтація екрану +seconds, 0 : off = сек., 0 = вимкнено +Sensitivity = Чутливість +Show right analog = Показати правий аналог +Show Touch Pause Menu Button = Показувати кнопку меню +Thin borders = Тонкі границі (збільшення) +Tilt Base Radius = Радіус нахилу основи +Tilt Input Type = Тип управління нахилом +Tilt Sensitivity along X axis = Чутливість нахилу по осі X +Tilt Sensitivity along Y axis = Чутливість нахилу по осі Y +To Calibrate = Для калібрування поставте пристрій на рівну поверхню і натисніть "Калібрувати". +Touch Control Visibility = Видимість елементів управління +Use custom right analog = Використовуйте кастомний правий аналог +Use Mouse Control = Використовувати керування мишою +Visibility = Видимість +X = X +X + Y = X + Y +XInput Analog Settings = Параметри стіків XInput +Y = Y + +[CwCheats] +Cheats = Чит-коди +Edit Cheat File = Змінити файл чит-коду +Enable/Disable All = Ввімкнути/Вимкнути все +Import Cheats = Імпортувати з cheat.db +Options = Налаштування +Refresh Rate = Частота оновлення + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = &Про PPSSPP... +Auto = Авто +Backend = Бекенд &рендерингу (потрібне перезавантаження) +Bicubic = &Бікубічний +Break = Перервати +Break on Load = Перервати при завантаженні +Buffered Rendering = Буферинізований рендеринг +Buy Gold = Купити &Gold +Control Mapping... = Призначення &кнопок... +Debugging = &Налагодження +Deposterize = &Деполяризація +Direct3D9 = Direct3D &9 +Direct3D11 = Direct3D &11 +Disassembly = &Розбирання... +Discord = Discord +Display Layout Editor = Редактор розташування екрану... +Display Rotation = Орієнтація екрану +Dump Next Frame to Log = Зберегти &кадр у лог +Emulation = &Емуляція +Enable Chat = Увімкнути чат +Enable Cheats = Ввімкнути &чит-коди +Enable Sound = Ввімкнути &звук +Exit = Ви&хід +Extract File... = Роз&пакувати Файл... +File = &Файл +Frame Skipping = &Пропуск кадрів +Frame Skipping Type = Тип пропуску кадрів +Fullscreen = На весь &екран +Game Settings = &Налаштування +GE Debugger... = &Налаштувач GE... +GitHub = Git&Hub +Hardware Transform = Аппаратне &перетворення +Help = &Довідка +Hybrid = &Гібридний +Hybrid + Bicubic = Г&ібридний + Бікубічний +Ignore Illegal Reads/Writes = Ігнорувати по&милки читання/запису +Ignore Windows Key = &Ігнорувати клавішу Windows +Keep PPSSPP On Top = Зверху &інших вікон +Landscape = Альбомне +Landscape reversed = Альбомна (перевернуто) +Language... = Мо&ва... +Linear = &Лінійний +Load = &Завантажити +Load .sym File... = За&вантажити .sym файл... +Load Map File... = &Завантажити файл карти... +Load State = Завантажити стан +Load State File... = &Завантажити стан з файлу... +Log Console = Консоль журналу (log) +Memory View... = Переглядач па&м'яті... +More Settings... = &Ще налаштування... +Nearest = &Найближчий +Non-Buffered Rendering = &Пропустити ефекти (небуферований, швидше) +Off = В&имкнено +Open Directory... = Відкрити &папку... +Open from MS:/PSP/GAME... = Ві&дкрити MS:/PSP/GAME... +Open Memory Stick = Відкрити карту пам'яті +Open New Instance = Open new instance +OpenGL = &OpenGL +Pause = &Пауза +Pause When Not Focused = &Пауза коли вікно не в фокусі +Portrait = Портретне +Portrait reversed = Портретна (перевернуто) +Postprocessing Shader = &Подальша обробка (шейдер) +PPSSPP Forums = &Форум PPSSPP +Record = &Запис +Record Audio = Запис &аудіо +Record Display = Запис &зображення +Rendering Mode = Режим рендерингу +Rendering Resolution = Розширення рендерингу +Reset = Скинути +Reset Symbol Table = &Скинути таблицю символів +Run = &Запустити +Save .sym File... = Зберегти& .sym файл... +Save Map File... = &Зберегти файл карти... +Save State = Зберегти стан +Save State File... = &Зберегти стан в файл... +Savestate Slot = Слот збереження +Screen Scaling Filter = Ф&ільтр масштабування екрану +Show Debug Statistics = Показувати &статистику налагодження +Show FPS Counter = По&казувати FPS +Skip Number of Frames = Пропускати кількільсть кадрів +Skip Percent of FPS = Пропускати відсоток від FPS +Stop = Зупинити +Switch UMD = Змінити UMD +Take Screenshot = Зробити знімок +Texture Filtering = &Фільтрація текстур +Texture Scaling = &Масштабування текстур +Use Lossless Video Codec (FFV1) = &Використовувати відеокодек без втрат (FFV1) +Use output buffer for video = Використовувати вихідний буфер для відео +Vertex Cache = &Вершинний кеш +VSync = Вертикальна син&хронізація +Vulkan = Vulkan +Window Size = Розмір &вікна +www.ppsspp.org = Відвідати www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Перегляд виділень памяті (Vulkan) +Allow remote debugger = Дозволити віддалене налагодження +Backspace = Стерти +Block address = Адреса блоку +By Address = За адресою +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Створити/Відкрити файл textures.ini для поточної гри +Current = Поточний +Dev Tools = Інструменти розробника +DevMenu = Меню розроб. +Disabled JIT functionality = Вимкнений функціонал JIT +Draw Frametimes Graph = Намалюйте графік фрагментів +Dump Decrypted Eboot = Дамп дешифрування Eboot.bin при паузі +Dump Frame GPU Commands = Дамп команд GPU кадру +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Ввімкнути логування +Enter address = Введіть адресу +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Профілі кадрів +GPU Driver Test = Перевірка драйверу GPU +GPU Profile = Профіль GPU +Jit Compare = Порівняння з Jit +JIT debug tools = Інструменти налагодження JIT +Language = Мова +Load language ini = Завантажити мовний .ini файл +Log Dropped Frame Statistics = Лог статистики пропущених кадрів +Log Level = Лог рівня +Log View = Лог виду +Logging Channels = Параметри логування +Next = Наступний +No block = Немає блоку +Prev = Попередній +Random = Випадковий +Replace textures = Заміна текстур +Reset limited logging = Reset limited logging +RestoreDefaultSettings = "Ви впевненні,що хочете скинути налаштування \n(окрім керування) на стандартні?\nВи не зможите це відмінити.\nБудь ласка, презавантажте PPSSPP після скидання." +RestoreGameDefaultSettings = Ви впевнені, що хочете повернути всі параметри гри до стардартних\nповернути PPSSPP за замовчуванням ? +Resume = Resume +Run CPU Tests = Запустити тести CPU +Save language ini = Зберегти мовний .ini файл +Save new textures = Зберегти нові текстури +Shader Viewer = Переглядач шейдеру +Show Developer Menu = Показати меню розробника +Show on-screen messages = Show on-screen messages +Stats = Статистика +System Information = Інформація про систему +Texture Replacement = Заміна текстур +Toggle Audio Debug = Ввімкнути/Вимкнути налагодження аудіо +Toggle Freeze = Запустити/Зупинити +Touchscreen Test = Тест сенсорного екрану +VFPU = VFPU + +[Dialog] +* PSP res = * дозв. PSP +Active = Активно +Back = Назад +Cancel = Відміна +Center = По центру +ChangingGPUBackends = Зміна бекенду GPU вимагає перезавантажити PPSSPP. Перезавантажити зараз? +ChangingInflightFrames = Зміна буферизації графічних команд вимагає перезавантажити PPSSPP. Перезавантажити зараз? +Channel: = Channel: +Choose PPSSPP save folder = Виберіть папку для збереження +Confirm Overwrite = Ви хочете перезаписати дані? +Confirm Save = Ви впевнені, що хочете зберегти дані? +ConfirmLoad = Завантажити ці дані? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Видалити +Delete all = Видалити все +Delete completed = Видалення завершено +DeleteConfirm = Ці дані будуть видалені.\nХочете продовжити? +DeleteConfirmAll = Всі збереження гри будуть видалені.\nВи впевнені, що хочете продовжити? +DeleteConfirmGame = Ця гра буде повністю видалена.\nВи впевнені, що хочете продовжити? +DeleteConfirmGameConfig = Параметри налаштування для цієї гри будуть видалені.\nВи впевнені, що хочете продовжити? +DeleteFailed = Неможливо видалити дані. +Deleting = Видалення\nБудь ласка, зачекайте... +Disable All = Вимкнути все +Edit = Edit +Enable All = Ввімкнути все +Enter = Введення +Finish = Зберегти +Grid = Сітка +Inactive = Неактивно +InternalError = An internal error has occurred. +Load = Завантажити +Load completed = Завантаження завершене +Loading = Завантаження\nБудь ласка, зачекайте... +LoadingFailed = Не вдалося завантажити дані. +Move = Положення +Network Connection = Підключення до мережі +NEW DATA = Нове збереження +No = Ні +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = OK +Old savedata detected = Виявлено старий формат збережень +Options = Опції: +Reset = Скинути +Resize = Розмір +Retry = Повторити +Save = Зберегти +Save completed = Збереження завершено. +Saving = Збереження\nБудь ласка, зачекайте... +SavingFailed = Неможливо зберегти дані. +Select = Вибрати +Shift = Shift +Snap = Snap +Space = Space +SSID = SSID +Submit = Виконання +Supported = Підтримується +There is no data = Немає даних +Toggle All = Переключити все +Toggle List = Toggle list +Unsupported = Не підтримується +When you save, it will load on a PSP, but not an older PPSSPP = Коли ви збережетесь, це може завантажуватись на PSP, але не старій версії PPSSPP +When you save, it will not work on outdated PSP Firmware anymore = Коли ви бережетесь, це більше не буде працювати на старих версіях прошивки PSP +Yes = Так +Zoom = Масштаб + +[Error] +7z file detected (Require 7-Zip) = файл стиснутий (7z). \ nБудь ласка, спочатку розпакуйте (спробуйте 7-Zip або WinRAR). +A PSP game couldn't be found on the disc. = На диску не вдалось знайти гру для PSP. +Cannot boot ELF located outside mountRoot. = Неможливо завантажити ELF, який знаходиться за межами mountRoot. +Could not save screenshot file = Не вдалось зберегти файл знімку екрана. +D3D9or11 = Direct3D 9? (чи "Ні" для Direct3D 11) +D3D11CompilerMissing = Не знайдено D3DCompiler_47.dll. Встановіть його. Чи натисніть "Так" щоб спробувати знову використовувати Direct3D 9. +D3D11InitializationError = Помилка ініціалізації Direct3D 11 +D3D11Missing = Ваша версія операційної системи не підтримує D3D11. Виконайте оновлення Windows.\n\nНатисніть "Так" щоб спробувати використовувати Direct3D 9. +D3D11NotSupported = Ваш GPU не підтримує Direct3D 11.\n\nХочете спробувати використовувати Direct3D 9 ? +Disk full while writing data = Закінчилось місце на диску. +ELF file truncated - can't load = Файл ELF спотворений - не вдається завантажити. +Error loading file = Помилка завантаження гри. +Error reading file = Помилка при читанні файлу. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = Не вдалось ідентифікувати файл. +Failed to load executable: = Не вдалось завантажити: +File corrupt = Файл пошкоджений +Game disc read error - ISO corrupt = Помилка читання ігрового диску: ISO пошкоджено. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Помилка ініціалізації графіки. Спробуйте оновити ваші драйвера на відеокарту та файли DirectX 9 .\n\nСпробувати переключитись на OpenGL?\n\nПовідомлення про помилку: +GenericGraphicsError = Помилка виводу графіки +GenericOpenGLError = Помилка ініціалізації графіки. Спробуйте оновити ваші драйвера на відеокарту.\n\nСпробувати переключитись на DirectX 9?\n\nПовідомлення про помилку: +GenericVulkanError = Помилка ініціалізації графіки. Спробуйте оновити ваші драйвера на відеокарту.\n\nСпробувати переключитись на OpenGL?\n\nПовідомлення про помилку: +InsufficientOpenGLDriver = Не знайдено необхідний драйвер OpenGL!\n\nВаш ГП не підтримує OpenGL 2.0, який потрібний для запуску PPSSPP.\n\nБудь ласка, уточніть чи сумісний ваш ГП з OpenGL 2.0. Якщо так - вам потрібно встановити нові драйвери з сайту виробника вашого ГП.\n\nВідвідайте форуми https://forums.ppsspp.org для точнішої інформації. +Just a directory. = Просто каталог. +Missing key = Відсутній ключ +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = Не знайдено EBOOT.PBP, не вдалось визначити гру +Not a valid disc image. = Некоректний образ диску. +OpenGLDriverError = Помилка драйверу OpenGL +PPSSPP doesn't support UMD Music. = PPSSPP не підтримує UMD Музику. +PPSSPP doesn't support UMD Video. = PPSSPP не підтримує UMD Відео. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP даний час не підтримує підключення до Інтернету для оновлення DLC, PSN, або гри. +PS1 EBOOTs are not supported by PPSSPP. = PS1 EBOOT не підтримуються PPSSPP. +PSX game image detected. = Виявлено файл зображення PSX. PPSSPP браузер не підтримує PS1 ігри +RAR file detected (Require UnRAR) = Файл стиснуто (RAR).\nБудь ласка, розархівуйте (спробуйте UnRAR). +RAR file detected (Require WINRAR) = Файл стиснуто (RAR).\nБудь ласка, розархівуйте (спробуйте WinRAR). +Running slow: try frameskip, sound is choppy when slow = Повільна робота: ввімкніть пропуск кадрів, звук переривається +Running slow: Try turning off Software Rendering = Повільна робота: спробуйте вимкнути "програмний рендеринг" +Save encryption failed. This save won't work on real PSP = Не вдалося зберегти шифрування. Це збереження не буде працювати на реальному PSP +textures.ini filenames may not be cross-platform = Імена файлів в"textures.ini" можуть працювати не на всіх платформах. +This is a saved state, not a game. = Це - збережений стан, а не гра. +This is save data, not a game. = Це - збережені дані, а не гра. +Unable to create cheat file, disk may be full = Неможливо створити чит-файлів: диск переповнено. +Unable to initialize rendering engine. = Неможливо ініціалізувати двигун візуалізації. +Unable to write savedata, disk may be full = Неможливо записати збереження: диск переповнено. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Попередження: Відеопам'ять ЗАПОВНЕНА, зменшення масштабу та перемикання в режим повільного кешування. +Warning: Video memory FULL, switching to slow caching mode = Попередження: Відеопам'ять ЗАПОВНЕНА, перемикання в режим повілього кешування. +ZIP file detected (Require UnRAR) = Файл стиснуто (ZIP).\nБудь ласка, розархівуйте (спробуйте UnRAR). +ZIP file detected (Require WINRAR) = Файл стиснуто (ZIP).\nБудь ласка, розархівуйте (спробуйте WinRAR). + +[Game] +Asia = Азія +ConfirmDelete = Видалити +Create Game Config = Створити конфіг +Create Shortcut = Створити ярлик +Delete Game = Видалити гру +Delete Game Config = Видалити конфіг +Delete Save Data = Видалити збереження +Europe = Європа +Game = Гра +Game Settings = Налаштування гри +Homebrew = Homebrew +Hong Kong = Гонконг +InstallData = Встановити дані +Japan = Японія +Korea = Корея +MB = МБ +One moment please... = Будь ласка, хвилиночку... +Play = Грати +Remove From Recent = Видалити з останніх +SaveData = Збереження +Setting Background = Налаштування фону +Show In Folder = Показати в теці +USA = США +Use UI background = Використати фон інтерфейсу + +[Graphics] +% of the void = % з пустого +% of viewport = % з огляду +%, 0:unlimited = %, 0 = необмежено +(supersampling) = (надвибірка) +(upscaling) = (збільшення) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Примусово +Alternative Speed = Альтернативна шв. (к %, 0 = необмежено) +Alternative Speed 2 = Альтернативна шв. 2 (к %, 0 = необмежено) +Anisotropic Filtering = Анізотропна фільтрація +Auto = Авто +Auto (1:1) = Авто (1:1) +Auto (same as Rendering) = Авто (таке ж як розширення рендерингу) +Auto FrameSkip = Автопропуск кадрів +Auto Scaling = Автоматичне масштабування +Backend = Бекенд +Balanced = Збалансовано +Bicubic = Бікубічний +BlockTransfer Tip = Потрібно для правильної графіки в деяких іграх +BlockTransferRequired = Попередження: Ця гра вимагає, щоб "імітувати ефекти передачі блоку" було встановлено на Увімкнено. +Both = Обидва +Buffer graphics commands (faster, input lag) = Буферні графічні команди (швидше, можливі глюки) +Buffered Rendering = Буферинізований рендеринг +BufferedRenderingRequired = Попередження: Ця гра вимагає, щоб "режим візуалізації" був встановлений на "буферний". +Camera = Камера +Camera Device = Пристрій камери +Cardboard Screen Size = Розмір екрану +Cardboard Screen X Shift = Налаштування - X - +Cardboard Screen Y Shift = Налаштування - Y - +Cardboard VR Settings = Управління 3D кінотеатром +Cheats = Чит-коди +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = Ядро CPU +Debugging = Налагодження +DefaultCPUClockRequired = Попередження: Ця гра вимагає, щоб частота процесора була встановлена за замовчуванням. +Deposterize = Деполяризація +Deposterize Tip = Виправляє візуальні глюки в масштабованих текстурах +Device = Пристрій +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Вимкнути повільні ефекти (прискорення) +Disabled = Вимкнено +Display layout editor = Редактор розташування екрану +Display Resolution (HW scaler) = Розширення екрану (HW масштабування) +Dump next frame to log = Зберегти кадр у лог +Enable Cardboard VR = Увімкнути Cardboard VR +FPS = FPS +Frame Rate Control = Управління частотою кадрів +Frame Skipping = Пропуск кадрів +Frame Skipping Type = Тип пропуску кадрів +FullScreen = Повноекранний режим +Hack Settings = Параметри хаків (можуть викликати глюки) +Hardware Tessellation = Апаратна тесселляція +Hardware Transform = Апаратне перетворення +hardware transform error - falling back to software = Помилка перетворення устаткування, повернення назад на програмне забезпечення +HardwareTessellation Tip = Для виготовлення кривих використовується апаратне обладнання +High = Висока +Hybrid = Гібридний +Hybrid + Bicubic = Гібридний + Бікубічний +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Внутрішнє розширення +Lazy texture caching = Кешування текстур +Linear = Лінійний +Low = Низька +LowCurves = Якість сплайну +LowCurves Tip = Використовується лише в деяких іграх, контролюючи плавність кривих +Lower resolution for effects (reduces artifacts) = Ефекти низької якості (зменшує артефакти) +Manual Scaling = Свій масштаб +Medium = Середня +Mode = Режим +Must Restart = Ви повинні перезавантажити PPSSPP, щоб зміни вступили в силу. +Native device resolution = Роздільна здатність пристрою +Nearest = Найближчий +No buffer = Без буфера +Non-Buffered Rendering = Пропускати ефекти (небуференізованний, швидше) +None = Немає +Number of Frames = Кількість кадрів +Off = Вимкнено +OpenGL = OpenGL +Overlay Information = Інформація про накладення +Partial Stretch = Часткове розтягнення +Percent of FPS = Відсоток FPS +Performance = Продуктивність +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Шейдери +Recreate Activity = Відтворити діяльність +Render duplicate frames to 60hz = Відображення повторюваних кадрів до 60 Гц +RenderDuplicateFrames Tip = Можна зробити більш плавний кадр в іграх, які працюють у нижчих кадрах +Rendering Mode = Режим рендерингу +Rendering Resolution = Розширення рендерингу +RenderingMode NonBuffered Tip = Швидше, але в деяких іграх нічого не може +Retain changed textures = Зберігати змінені текстури (іноді повільніше) +RetainChangedTextures Tip = Багато ігор робить повільніше, але деякі ігри набагато швидшими +Rotation = Орієнтація: +Safe = Безпечно +Screen layout = Screen layout +Screen Scaling Filter = Фільтр обчислення екрану +Show Debug Statistics = Відоброжати зневадження +Show FPS Counter = Показати FPS +Simulate Block Transfer = Симулювати ефекти від передачі блоків +SoftGPU Tip = В даний час ДУЖЕ повільно +Software Rendering = Програмний рендеринг (експериментально) +Software Skinning = Програмна заливка +SoftwareSkinning Tip = Комбінована модель розібраної моделі яка притягується до процесора, швидше в більшості ігор +Speed = Швидкість +Stretching = Розтягнення +Texture Filter = Фільтр текстур +Texture Filtering = Фільтрація текстур +Texture Scaling = Масштабування текстур +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Вимкніть "апаратна тесселляція": не підтримується +Unlimited = Необмежено +Up to 1 = До 1 +Up to 2 = До 2 +Upscale Level = Рівень масштабування +Upscale Type = Тип масштабування +UpscaleLevel Tip = Процесор завантажений - деяке масштабування може затягнутися, щоб уникнути заїкання +Use all displays = Використовувати всі екрани +Vertex Cache = Вершинний кеш +VertexCache Tip = Швидше, але може спричинити тимчасове мерехтіння +VSync = Вертикальна синхронізація +Vulkan = Vulkan +Window Size = Розмір вікна +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Видалити ZIP файл +Install = Встановити +Install game from ZIP file? = Встановити гру з ZIP-файлу? +Install textures from ZIP file? = Встановити текстури з ZIP-файлу? +Installed! = Встановлено! +Texture pack doesn't support install = Пакет текстур не підтримує встановлення +Zip archive corrupt = ZIP архів пошкоджено +Zip file does not contain PSP software = ZIP-файл не містить програмного забезпечення PSP + +[KeyMapping] +Autoconfigure = Авто конфіг +Autoconfigure for device = Авто конфіг для пристрою +Clear All = Очистити все +Default All = Скинути все +Map a new key for = Призначити кнопку для +Map Key = Карта кнопки +Map Mouse = Карта миші +Test Analogs = Тест аналогів +You can press ESC to cancel. = Ви можете натиснути Esc, щоб скасувати. + +[MainMenu] +Browse = Огляд ... +Buy PPSSPP Gold = PPSSPP Gold +Choose folder = Виберіть папку +Credits = Автори +PPSSPP Homebrew Store = магазину homebrew PPSSPP +Exit = Вихід +Game Settings = Налаштування гри +Games = Ігри +Give PPSSPP permission to access storage = Надати PPSSPP права на доступ до данних +Homebrew & Demos = Demo та Homebrew +How to get games = Як отримати ігри +How to get homebrew & demos = Як отримати homebrew та demo +Load = Запустити +Loading... = Завантаження... +PinPath = Закріпити +PPSSPP can't load games or save right now = PPSSPP не може зберегти чи завантажити гру зараз +Recent = Останні +SavesAreTemporary = PPSSPP зберігає на тимчасовому зберіганні +SavesAreTemporaryGuidance = Витягніть кудись PPSSPP, щоб назавжди зберегти +SavesAreTemporaryIgnore = Ігноруйте попередження +UnpinPath = Відкріпити +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Аудіо +Controls = Управління +Graphics = Графіка +Networking = Мережа +System = Система +Tools = Інструменти + +[MappableControls] +Alt speed 1 = Альтернативна шв. 1 +Alt speed 2 = Альтернативна шв. 2 +An.Down = Стік вниз +An.Left = Стік вліво +An.Right = Стік вправо +An.Up = Стік вгору +Analog limiter = Аналоговий обмежувач +Analog Stick = Аналоговий стік +Audio/Video Recording = Запис аудіо / відео +Auto Analog Rotation (CCW) = Авто обертання аналогу (CCW) +Auto Analog Rotation (CW) = Авто обертання аналогу (CW) +AxisSwap = Обмін осей +Circle = Коло +Cross = Хрестик +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = Меню розробника +Down = Вниз +Dpad = Хрестовина +Frame Advance = Завантаження кадру заздалегідь +Hold = Утримувати +Home = Додому +L = L +Left = Ліворуч +Load State = Завантажити +Mute toggle = Вимкнення звуку +Next Slot = Наст. слот +None = None +Note = Примітка +OpenChat = Відкритий чат +Pause = Пауза +R = R +RapidFire = Турбо кнопка +Remote hold = Віддалене утримання +Rewind = Повернення +Right = Вправо +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = П. стік вниз +RightAn.Left = П. стік вліво +RightAn.Right = П. стік вправо +RightAn.Up = П. стік вгору +Rotate Analog (CCW) = Обертання аналогу (CCW) +Rotate Analog (CW) = Обертання аналогу (CW) +Save State = Зберегти +Screen = Екран +Screenshot = Скріншот +Select = Select +SpeedToggle = Швидкість +Square = Квадрат +Start = Start +Texture Dumping = Демпінг текстури +Texture Replacement = Заміна текстури +Toggle Fullscreen = Повноекранний режим +Toggle mode = Режим перемикання +Triangle = Трикутник +Unthrottle = Необм. швидкість +Up = Вгору +Vol + = Гучність + +Vol - = Гучність - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Відвідайте спеціальний форум мультиплеєру +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Знизу центрально +Bottom Left = Знизу ліворуч +Bottom Right = Знизу праворуч +Center Left = Центр ліворуч +Center Right = Центр праворуч +Change Mac Address = Змінити Mac-адресу +Change proAdhocServer Address = Спеціальна адреса серверу (localhost = multiple instances) +Chat = Чат +Chat Button Position = Положення кнопки чату +Chat Here = Тут чат +Chat Screen Position = Положення екрана чату +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Використовувати вбудовану адресу серверу +Enable network chat = Увімкнути мережевий чат +Enable networking = Увімкнути мережу +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Увімкніть швидкий чат +Enter a new PSP nickname = Введіть нове прізвисько PSP +Enter Quick Chat 1 = Введіть швидкий чат 1 +Enter Quick Chat 2 = Введіть швидкий чат 2 +Enter Quick Chat 3 = Введіть швидкий чат 3 +Enter Quick Chat 4 = Введіть швидкий чат 4 +Enter Quick Chat 5 = Введіть швидкий чат 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Недійсне IP або ім'я хоста +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Мережа ініціалізована +Please change your Port Offset = Please change your port offset +Port offset = Зсув порту (0 = сумісність з PSP) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Швидкий чат 1 +Quick Chat 2 = Швидкий чат 2 +Quick Chat 3 = Швидкий чат 3 +Quick Chat 4 = Швидкий чат 4 +Quick Chat 5 = Швидкий чат 5 +QuickChat = Швидкий чат +Send = Надіслати +Send Discord Presence information = Відправляти інформацію про гру в Discord +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Підтвердження адреси... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = Ви перебуваєте в офлайн-режимі, переходите у лоббі чи онлайн-режим + +[Pause] +Cheats = Чит-коди +Continue = Продовжити +Create Game Config = Створити конфіг +Delete Game Config = Видалити конфіг +Exit to menu = Вийти в меню +Game Settings = Налаштування гри +Load State = Завантажити +Rewind = Повернення +Save State = Зберегти +Settings = Налаштування +Switch UMD = Перемикач UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Кольори +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Яскравість +Cartoon = Мультиплікація +ColorCorrection = Корекція кольорів +Contrast = Контраст +CRT = Кінескоп 1 +FXAA = FXAA згладжування +Gamma = Гамма +Grayscale = Відтінки сірого +Intensity = Інтенсивність +InverseColors = Зворотні кольори +Natural = Натуральні кольори +NaturalA = Натуральні кольори (без розмиття) +Off = Вимкнені +Power = Power +PSPColor = PSP color +Saturation = Насиченість +Scanlines = Кінескоп 2 +Sharpen = Різкість +SSAA(Gauss) = SSAA (Гаусс) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Високоякісний Spline36 +VideoSmoothingAA = Згладжування відео (VSAA) +Vignette = Віньєтка + +[PSPCredits] +all the forum mods = всім модераторам форуму +build server = сервер білдів +Buy Gold = Купити Gold +check = Також спробуйте Dolphin - кращий Wii/GC емулятор : +CheckOutPPSSPP = Перевірте PPSSPP, дивовижний емулятор PSP: https://www.ppsspp.org/ +contributors = При участі : +created = Створений +Discord = Discord +info1 = PPSSPP створений виключно в освітніх цілях . +info2 = Будь ласка, переконайтеся що ви маєте всі права на ігри +info3 = в які ви граєте - маєте UMD чи куплену гру в PSN +info4 = на вашій реальній PSP. +info5 = PSP - торгівельна марка Sony, Inc. +iOS builds = збірки для iOS +license = під ліцензією GPL 2.0+ +list = Списки сумісності, форум та інформація для розробника +PPSSPP Forums = Форум PPSSPP +Privacy Policy = Політика конфіденційності +Share PPSSPP = Поділитися +specialthanks = Окрема подяка : +specialthanksKeithGalocy = в NVIDIA (обладнання, поради) +specialthanksMaxim = за його дивовижну роботу з декодером Atrac3 + +testing = тестування +this translation by = Переклад українською : +title = Швидкий та багатоплатформенний емулятор РSP +tools = Використані безкоштовні інструменти : +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = Ser.Gutsalyuk +translators2 = +translators3 = Якщо у вас є пропозиції щодо перекладу +translators4 = або знайшли помилки, напишіть мені: +translators5 = ser.gutsalyuk@gmail.com +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Відвідайте наш веб-сайт : +written = Написаний на C++ для швидкості \nта підтримці декількох платформ. + +[RemoteISO] +Browse Games = Перегляд ігор +Local Server Port = Локальний порт сервера +Manual Mode Client = Клієнт в ручному режимі +Remote disc streaming = Віддалена трансляція диску +Remote Port = Віддалений порт +Remote Server = Віддалений сервер +Remote Subdirectory = Віддалений підкаталог +RemoteISODesc = Ви поділитеся іграми зі списку недавніх +RemoteISOLoading = Підключено, завантаження списку ігор... +RemoteISOScanning = Сканування ... Натисніть кнопку "поділитися іграми" на своєму пристрої-сервері +RemoteISOScanningTimeout = Сканування ... перевірте ваші параметри брандмауера +RemoteISOWifi = Примітка. Підключіть обидва пристрої до однієї мережі Wi-Fi +RemoteISOWinFirewall = УВАГА: Брандмауер Windows блокує спільний доступ +Settings = Налаштування +Share Games (Server) = Поділитися іграми (сервер) +Share on PPSSPP startup = Поділитися при запуску PPSSPP +Stop Sharing = Припинити ділитися +Stopping.. = Зупинка... + +[Reporting] +Bad = Погано +FeedbackDelayInfo = Ваші дані надсилаються у фоновому режимі. +FeedbackDesc = Як емулюється? Дайте знати нам і нашій спільноті! +FeedbackDisabled = Звіти на сервер сумісності повинні бути включені. +FeedbackIncludeCRC = Примітка: для відправки CRC диска буде використана батарея +FeedbackIncludeScreen = Додайте скріншот +FeedbackSubmitDone = Ваші дані надіслані. +FeedbackSubmitFail = Не вдалося надіслати дані на сервер. Спробуйте оновити PPSSPP. +FeedbackThanks = Дякуємо за ваш відгук! +Gameplay = Ігровий процес +Graphics = Графіка +Great = Чудово +In-game = Помилки +In-game Description = Ігровий процес працює, але занадто багато багів +Menu/Intro = Меню +Menu/Intro Description = Не вдалося потрапити в саму гру +Nothing = Не працює +Nothing Description = Повністю зламано +OK = OK +Open Browser = Відкрити сайт зі звітами +Overall = В цілому +Perfect = Ідеально +Perfect Description = Бездоганна емуляція гри від початку до кінця, круто! +Plays = Нормально +Plays Description = Повністю іграбельно з незначними глюками +ReportButton = Відправити відгук +Speed = Швидкість +Submit Feedback = Надіслати відгук +SuggestionConfig = Дивіться відгуки на веб-сайті, щоб отримати гарні налаштування +SuggestionCPUSpeed0 = Приберіть фіксовану частоту CPU в налаштуваннях. +SuggestionDowngrade = Перейдіть на старішу версію PPSSPP (і повідомте про цю помилку). +SuggestionsFound = Інші користувачі повідомили про кращі результати. Торкніться "Переглянути всі відгуки" для отримання більш детальної інформації +SuggestionsNone = Ця гра не працює і у інших користувачів. +SuggestionsWaiting = Надсилання відгуку та перевірка відгуків інших користувачів... +SuggestionUpgrade = Оновіть до новішої збірки PPSSPP. +SuggestionVerifyDisc = Перевірте, що ISO є коректною копією диска. +Unselected Overall Description = Наскільки добре емулюється ця гра? +View Feedback = Переглянути всі відгуки + +[Savedata] +Date = Дата +Filename = Ім'я файлу +No screenshot = Немає скріншоту +None yet. Things will appear here after you save. = Тут поки що нічого немає. З'явиться після вашого збереження. +Save Data = Збереження +Save States = Стан збереження +Savedata Manager = Управління збереженими даними +Size = Розмір + +[Screen] +Cardboard VR OFF = Cardboard VR вимкнено +Chainfire3DWarning = Увага: виявлений Chainfire3D, це може викликати проблеми +Failed to load state = Не вдалося завантажити стан +Failed to save state = Не вдалося зберегти стан +fixed = Альтернативна швидкість +GLToolsWarning = ПОПЕРЕДЖЕННЯ: виявлено GLTools, можуть бути проблеми. +In menu = В меню +Load savestate failed = Не вдалося завантажити збереження +Loaded State = Стан завантажено +Loaded. Save in game, restart, and load for less bugs. = Завантажено. Збережіться в грі, перезапустіть гру і завантажте для виправлення помилок. +LoadStateDoesntExist = Не вдається завантажити стан: файла не існує! +LoadStateWrongVersion = Не вдається завантажити стан: файл стану від старої версії PPSSPP! +norewind = Немає доступних збережень для повернення. +Playing = У грі +PressESC = Натисніть ESC для переходу в меню +replaceTextures_false = Текстури більше не будуть підмінятися. +replaceTextures_true = Ввімкнена заміна текстур. +Save State Failed = Не вдалось зберегти стан! +Saved State = Стан збережено +saveNewTextures_false = Збереження текстур вимкнено. +saveNewTextures_true = Текстури будуть зберігатися у вашому сховищі. +SpeedCustom2 = Швидкість: альтернативна 2 +standard = Швидкість: стандартна +Untitled PSP game = Безіменна гра для PSP + +[Store] +Already Installed = Вже встановлено +Connection Error = Помилка підключення +Install = Встановити +Launch Game = Запустити гри +Loading... = Завантаження... +MB = Мб +Size = Розмір +Uninstall = Видалити + +[SysInfo] +%d (%d per core, %d cores) = %d (%d на ядро, ядер: %d) +%d bytes = %d байт +(none detected) = (не виявлено) +3D API = 3D API +ABI = ABI +API Version = Версія API +Audio Information = Інформація про аудіо +Board = Плата +Build Config = Конфіг збірки +Build Configuration = Конфігурація збірки +Built by = Побудував +Core Context = Контекст ядра +Cores = Ядра +CPU Extensions = Розширення CPU +CPU Information = Інформація про CPU +CPU Name = Назва +D3DCompiler Version = Версія D3DCompiler +Debug = Налагодження +Debugger Present = Присутній налагоджувач +Device Info = Інформація про пристрій +Display Information = Інформація про дисплей +Driver Version = Версія драйвера +EGL Extensions = Розширення EGL +Frames per buffer = Кадрів на буфер +GPU Information = Інформація про GPU +High precision float range = High precision float range +High precision int range = Внутрішній діапазон високої точності +Lang/Region = Мова/Регіон +Memory Page Size = Розмір сторінки пам'яті +Native Resolution = Рідне розширення +OGL Extensions = Розширення OGL +OpenGL ES 2.0 Extensions = Розширення OpenGL ES 2.0 +OpenGL ES 3.0 Extensions = Розширення OpenGL ES 3.0 +OpenGL Extensions = Розширення OpenGL +Optimal frames per buffer = Оптимально кадрів на буфер +Optimal sample rate = Оптимальна частота вибірки +OS Information = Інформація про ОС +PPSSPP build = Збірка PPSSPP +Refresh rate = Частота оновлення +Release = Реліз +RW/RX exclusive = Ексклюзивний RW/RX +Sample rate = Норма вибірки +Shading Language = Мова шейдерів +Sustained perf mode = Режим тривалої роботи +System Information = Інформація про систему +System Name = Назва +System Version = Версія системи +Threads = Потоки +Vendor = Виробник +Vendor (detected) = Виробник (знайдений) +Version Information = Інформація про версію +Vulkan Extensions = Розширення Vulkan +Vulkan Features = Особливості Vulkan + +[System] +(broken) = (зламано) +12HR = 12 годин +24HR = 24 години +Auto = Авто +Auto Load Savestate = Автоматичне завантаження збережень +AVI Dump started. = Дамп AVI запущено +AVI Dump stopped. = Дамп AVI зупинено +Cache ISO in RAM = Кешувати ISO в оперативну пам'ять +Change CPU Clock = Змінити частоту CPU (нестабільно) +Change Memory Stick folder = Змінити папку для карти пам'яті +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Змінити ім'я +ChangingMemstickPath = Збереження, стан і інші дані НЕ будуть скопійовані в цю папку..\n\nЗмінити папку для карти пам'яті? +ChangingMemstickPathInvalid = Цей шлях неможливо використовувати для файлів карти пам'яті. +ChangingMemstickPathNotExists = Ця папка ще не існує.\n\nЗбереження ігор, збереження станів та інших даних не буде скопійовано у цю папку.\n\nСтворити нову папку для карти пам'яті? +Cheats = Чит-коди +Clear Recent = Очистити "Останні" +Clear Recent Games List = Очистити список останніх ігор +Clear UI background = Очистити фон інтерфейсу +Confirmation Button = Кнопка підтвердження +Date Format = Формат дати +Day Light Saving = Літній час +DDMMYYYY = ДДММРРРР +Decrease size = Зменшити розмір +Developer Tools = Інструменти розробника +Display Extra Info = Відобразити додаткову інформацію +Display Games on a grid = Відображати "Ігри" на сітці +Display Homebrew on a grid = Відображати "Homebrew && Demos" на сітці +Display Recent on a grid = Відображати "Останні" в сітці +Dynarec (JIT) = Динамічна рекомпіляція (JIT) +Emulation = Емуляція +Enable Cheats = Ввімкнути чит-коди +Enable Compatibility Server Reports = Відправляти дані про сумісність +Failed to load state. Error in the file system. = Не вдалося завантажити стан. Помилка файлової системи. +Failed to save state. Error in the file system. = Не вдалося зберегти стан. Помилка файлової системи. +Fast (lag on slow storage) = Швидко (лаги при повільній шв. карти пам'яті) +Fast Memory = Швидка пам'ять (нестабільно) +Force real clock sync (slower, less lag) = Синхронизація в реальному часі (повільніше, можливі лаги) +frames, 0:off = кадри, 0 = вимк. +Games list settings = Налаштування списку ігор +General = Загальні +Grid icon size = Розмір піктограми сітки +Help the PPSSPP team = Допомога Команді PPSSPP +Host (bugs, less lag) = Хост (повільніше, можливі лаги) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Збільшити розмір +Interpreter = Інтерпретатор +IO timing method = Метод таймінгу введення-виведення +IR Interpreter = Інтерпретатор з проміжним кодом +Memory Stick Folder = Папка карти пам'яті +Memory Stick inserted = Вставлена карта пам'яті +MHz, 0:default = МГц, 0 = за замовч. +MMDDYYYY = ММДДРРРР +Newest Save = Найновіші збереження +Not a PSP game = Не є грою для PSP +Off = Вимкнено +Oldest Save = Найстаріші збереження +PSP Model = Модель PSP +PSP Settings = Налаштування PSP +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Запис аудіо +Record Display = Запис відео +Reset Recording on Save/Load State = Скидати запис при збереженні / завантаженні +Restore Default Settings = Скинути налаштування +Rewind Snapshot Frequency = Змінити частоту кадрів (багато пам'яті) +Save path in installed.txt = Шлях до збережень в installed.txt +Save path in My Documents = Шлях до збережень в Моїх документах +Savestate Slot = Слот пам'яті +Savestate slot backups = Резервні копії слота стану +Screenshots as PNG = Скріншот в PNG +Set UI background... = Змінити фон інтерфейсу... +Show ID = Показати ID +Show region flag = Показати прапор регіону +Simulate UMD delays = Імітувати затримки UMD +Slot 1 = Слот 1 +Slot 2 = Слот 2 +Slot 3 = Слот 3 +Slot 4 = Слот 4 +Slot 5 = Слот 5 +Storage full = Пам'ять заповнено +Sustained performance mode = Режим тривалої роботи +Time Format = Формат часу +UI = Користувацький інтерфейс +UI Sound = UI sound +undo %c = резервна копія %c +Use Lossless Video Codec (FFV1) = Використовувати відеокодек без втрат (FFV1) +Use O to confirm = O для підтвердження +Use output buffer (with overlay) for recording = Використовувати вихідний буфер (з оверлеєм) для запису +Use system native keyboard = Використовати рідну клавіатуру системи +Use X to confirm = X для підтвердження +VersionCheck = Перевіряти наявність оновлень +WARNING: Android battery save mode is on = УВАГА: ввімкнено режим енергозбереження Android +WARNING: Battery save mode is on = УВАГА: включений режим енергозбереження +YYYYMMDD = РРРРММДД + +[Upgrade] +Details = Details +Dismiss = Відхилити +Download = Завантажити +New version of PPSSPP available = Доступна нова версія PPSSPP diff --git a/assets/lang/vi_VN.ini b/assets/lang/vi_VN.ini new file mode 100644 index 0000000000..1f057f83bf --- /dev/null +++ b/assets/lang/vi_VN.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = Alternate speed volume +Audio backend = Âm thanh backend (hãy khởi động lại.) +AudioBufferingForBluetooth = Bluetooth-friendly buffer (chậm) +Auto = Tự động +Device = Device +DSound (compatible) = Âm thanh (tương thích) +Enable Sound = Mở âm thanh +Global volume = Âm lượng +Microphone = Microphone +Microphone Device = Microphone device +Mute = Mute +Switch on new audio device = Switch on new audio device +Use global volume = Use global volume +WASAPI (fast) = WASAPI (nhanh) + +[Controls] +Analog auto-rotation speed = Analog auto-rotation speed +Analog Axis Sensitivity = Độ nhạy của Analog +Analog Limiter = Phạm vi của Analog +Analog Mapper High End = Analog high-end (rất nhạy) +Analog Mapper Low End = Analog low-end (ít nhạy) +Analog Mapper Mode = Chế độ sắp đặt Analog +Analog Stick = Cần Analog +AnalogLimiter Tip = Khi phạm vi của analog được chọn +Auto = Tự động +Auto-centering analog stick = Cần Analog auto định tâm +Auto-hide buttons after seconds = Thời gian Auto ẩn nút (giây) +Binds = Binds +Button Opacity = Độ trong suốt +Button style = Kiểu nút +Calibrate D-Pad = Chỉnh cân bằng D-Pad +Calibration = Đã chỉnh xong +Classic = Cổ điển +Combo Key Setting = Thiết lập phím combo +Combo Key Setup = Cài đặt phím combo +Confine Mouse = hiển thị chuột +Control Mapping = Chỉnh nút +Custom layout... = Chỉnh vị trí nút... +Customize tilt = Chỉnh độ nghiêng... +D-PAD = D-Pad +Deadzone Radius = Bán kính vùng chết +DInput Analog Settings = Cài đặt đầu vào analog +Disable D-Pad diagonals (4-way touch) = Tắt D-Pad chéo (chạm 4 hướng) +Glowing borders = Ánh sáng đường viền +HapticFeedback = Chế độ rung +Ignore gamepads when not focused = Bỏ qua gamepads khi "ko tập trung" +Ignore Windows Key = Bỏ qua phím Windows (ngăn menu Start hiện ra) +Invert Axes = Đảo ngược cần analog +Invert Tilt along X axis = Nghiêng đảo ngược theo chiều X +Invert Tilt along Y axis = nghiêng đảo ngược theo chiều Y +Keep this button pressed when right analog is pressed = Keep this button pressed when right analog is pressed +Keyboard = Thiết lập điều khiển bàn phím +L/R Trigger Buttons = Kích hoạt nút L/R +Landscape = Chiều ngang +Landscape Auto = Auto chiều ngang +Landscape Reversed = Chiều ngang đảo ngược +Mouse = Cài đặt chuột +Mouse sensitivity = Độ nhạy của chuột +Mouse smoothing = Chuột smoothing (mịn màng) +MouseControl Tip = Nhấn biểu tượng 'M' để thay đổi gì gì đó của chuột. +None (Disabled) = không (vô hiệu) +Off = Tắt +OnScreen = Hiện điều khiển cảm ứng trên màn hình +Portrait = Chiều dọc +Portrait Reversed = Chiều dọc đảo ngược +PSP Action Buttons = Nút hành động của PSP +Screen Rotation = Xoay màn hình +seconds, 0 : off = giây, 0 : tắt +Sensitivity = Độ nhạy +Show right analog = Show right analog +Show Touch Pause Menu Button = Hiện phím dừng +Thin borders = Viền mỏng +Tilt Base Radius = Tilt base radius +Tilt Input Type = Đầu vào kiểu nghiêng +Tilt Sensitivity along X axis = Độ nhạy nghiêng theo chiều x +Tilt Sensitivity along Y axis = Độ nhạy nghiêng theo chiều y +To Calibrate = Để chỉnh cân bằng, giữ thiết bị cân bằng và bấm "chỉnh cân bằng D-Pad". +Touch Control Visibility = Hiển thị điều khiển cảm ứng +Use custom right analog = Use custom right analog +Use Mouse Control = Sử dụng chuột điều khiển +Visibility = Hiển thị +X = X +X + Y = X + Y +XInput Analog Settings = Đặt đầu vào X của analog +Y = Y + +[CwCheats] +Cheats = Cheats +Edit Cheat File = Sửa mục cheat +Enable/Disable All = Bật/Tắt tất cả các mã cheat +Import Cheats = Nhập mã từ cheat.db +Options = Thiết lập +Refresh Rate = Tần số làm mới + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +#Font = Trebuchet MS +About PPSSPP... = Thông tin về PPSSPP... +Auto = Tự động +Backend = Kết xuất từ thư viện đồ họa (Khởi động lại PPSSPP) +Bicubic = Bicubic (mịn) +Break = Break +Break on Load = Hủy bỏ trong mục load +Buffered Rendering = Dựng hình có bộ nhớ đệm +Buy Gold = Mua PPSSPP Gold +Control Mapping... = Chỉnh nút... +Debugging = Debug +Deposterize = Chống Poster hóa +Direct3D9 = Direct3D9 +Direct3D11 = Direct3D11 +Disassembly = Disassembly (Tháo gỡ)... +Discord = Discord +Display Layout Editor = Hiện nút chỉnh sửa bố cục... +Display Rotation = Hiện nút xoay màn hình +Dump Next Frame to Log = Dump Next Frame to Log +Emulation = Giả lập +Enable Chat = Enable chat +Enable Cheats = kích hoạt cheat +Enable Sound = Mở âm thanh +Exit = Thoát +Extract File... = Giải nén tập tin... +File = Tập tin +Frame Skipping = Nhảy khung hình +Frame Skipping Type = Frame skipping type +Fullscreen = Toàn màn hình +Game Settings = Cấu hình trò chơi +GE Debugger... = GE Debugger... +GitHub = GitHub +Hardware Transform = Chuyển đổi phần cứng +Help = Giúp đỡ +Hybrid = Huybrid (hỗn hợp) +Hybrid + Bicubic = Hybrid + Bicubic +Ignore Illegal Reads/Writes = Bỏ qua đọc/viết trái phép +Ignore Windows Key = Bỏ qua phím Windows +Keep PPSSPP On Top = Giữ cửa sổ PPSSPP phía trên +Landscape = Chiều ngang +Landscape reversed = Chiều ngang đảo ngược +Language... = Ngôn ngữ... +Linear = Tuyến tính (nét dài) +Load = Tải... +Load .sym File... = Tải tập tin .sym... +Load Map File... = Tải tập tin bản đồ... +Load State = Load game +Load State File... = Tải tập tin save... +Log Console = Log Console +Memory View... = Xem bộ nhớ... +More Settings... = Các thiết lập khác... +Nearest = Gần nhất +Non-Buffered Rendering = Bỏ qua hiệu ứng đệm (Không bộ nhớ đệm, nhanh hơn) +Off = Tắt +Open Directory... = Mở thư mục... +Open from MS:/PSP/GAME... = Mở từ MS:/PSP/GAME... +Open Memory Stick = Mở Memory Stick +Open New Instance = Open new instance +OpenGL = OpenGL +Pause = Tạm dừng +Pause When Not Focused = Dừng trò chơi khi "ko tập trung" +Portrait = Chiều dọc +Portrait reversed = Chiều dọc đảo ngược +Postprocessing Shader = Xử lý hậu đổ bóng +PPSSPP Forums = Diễn đàn PPSSPP +Record = Ghi lại +Record Audio = Ghi âm thanh +Record Display = Ghi hình +Rendering Mode = Chế độ kết xuất +Rendering Resolution = Độ phân giải để kết xuất +Reset = Khởi động lại +Reset Symbol Table = Đặt lại bảng biểu tượng +Run = Chạy +Save .sym File... = Lưu tập tin .sym... +Save Map File... = Lưu tập tin bản đồ... +Save State = Lưu game +Save State File... = Lưu game vào tập tin... +Savestate Slot = Ô save +Screen Scaling Filter = Bộ lọc họa tiết rộng +Show Debug Statistics = Hiện thông số debug +Show FPS Counter = Hiện thông số FPS +Skip Number of Frames = Skip number of frames +Skip Percent of FPS = Skip percent of FPS +Stop = Dừng lại +Switch UMD = Chuyển sang UMD +Take Screenshot = Chụp ảnh màn hình +Texture Filtering = Bộ lọc texture +Texture Scaling = Scaling texture (thu nhỏ) +Use Lossless Video Codec (FFV1) = Sử dụng codec video lossless (FFV1) +Use output buffer for video = Use output buffer for video +Vertex Cache = Bộ đệm điểm +VSync = Đồng bộ +Vulkan = Vulkan +Window Size = Kích cỡ màn hình +www.ppsspp.org = www.ppsspp.org +xBRZ = xBRZ + +[Developer] +Allocator Viewer = Xem Allocator (Vulkan) +Allow remote debugger = Cho phép trình gỡ lỗi từ xa +Backspace = Backspace +Block address = Chặn địa chỉ +By Address = Theo địa chỉ +Copy savestates to memstick root = Copy save states to Memory Stick root +Create/Open textures.ini file for current game = Tạo/Mở tệp textures.ini cho game hiện tại +Current = Hiện tại +Dev Tools = Công cụ NPH +DevMenu = Menu NPH +Disabled JIT functionality = Disabled JIT functionality +Draw Frametimes Graph = Draw frametimes graph +Dump Decrypted Eboot = Đưa file vào EBOOT.BIN để khởi động trò chơi +Dump Frame GPU Commands = Đưa lệnh vào khung GPU +Enable driver bug workarounds = Enable driver bug workarounds +Enable Logging = Cho phép ghi nhật ký debug +Enter address = Nhập địa chỉ +FPU = FPU +Framedump tests = Framedump tests +Frame Profiler = Khung hồ sơ +GPU Driver Test = GPU driver test +GPU Profile = GPU profile +Jit Compare = So sánh Jit +JIT debug tools = JIT debug tools +Language = Ngôn ngữ +Load language ini = Tải file ngôn ngữ .ini +Log Dropped Frame Statistics = Khung nhật ký thống kê +Log Level = Cấp nhật ký +Log View = Xem nhật ký +Logging Channels = Kênh nhật ký +Next = Tiếp tục +No block = không chặn +Prev = Trở lại +Random = Ngẫu nhiên +Replace textures = Thay thế textures +Reset limited logging = Reset limited logging +RestoreDefaultSettings = Bạn có muốn khôi phục các thiết lập về mặc định không?\nThiết lập tay cầm (bên ngoài) sẽ không bị thay đổi.\n\n\n\nHãy thoát PPSSPP rồi mở lại. +RestoreGameDefaultSettings = Bạn có muốn khôi phục cài đặt trò chơi\nPPSSPP sẽ trở về mặc định? +Resume = Resume +Run CPU Tests = Chạy thử CPU +Save language ini = Lưu file ngôn ngữ .ini +Save new textures = Lưu file textures mới +Shader Viewer = Xem trước đỗ bóng +Show Developer Menu = Hiện menu NPH +Show on-screen messages = Show on-screen messages +Stats = Thống kê +System Information = Thông tin hệ thống +Texture Replacement = Thay thế Texture +Toggle Audio Debug = Chuyển qua chế độ debug âm thanh +Toggle Freeze = Chuyển qua chế độ đóng băng +Touchscreen Test = Touchscreen test +VFPU = VFPU + +[Dialog] +* PSP res = * PSP như thật +Active = Hoạt động +Back = Trở lại +Cancel = Hủy +Center = Trung tâm +ChangingGPUBackends = Đổi thư viện đồ họa cho GPU yêu cầu phải khởi động lại PPSSPP.\nBạn có muốn khởi động lại ngay không? +ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +Channel: = Channel: +Choose PPSSPP save folder = Chọn thư mục save của PPSSPP +Confirm Overwrite = Bạn có muốn ghi đè lên dữ liệu này không? +Confirm Save = Bạn có muốn save dữ liệu này không? +ConfirmLoad = Load dữ liệu này? +ConnectingAP = Connecting to the access point.\nPlease wait... +ConnectingPleaseWait = Connecting.\nPlease wait... +ConnectionName = Connection name +Corrupted Data = Corrupted data +Delete = Xóa +Delete all = Xóa tất cả +Delete completed = Đã xóa xong. +DeleteConfirm = File save này sẽ bị xóa.\nBạn có muốn tiếp tục? +DeleteConfirmAll = Bạn có muốn xóa tất cả\ndữ liệu save của trò này?? +DeleteConfirmGame = Bạn có muốn xóa trò này\nkhỏi thiết bị của bạn? +DeleteConfirmGameConfig = Bạn có muốn xóa thiết lập\nđối với game này? +DeleteFailed = Không thể xóa dữ liệu này. +Deleting = Đang xóa\nXin đợi... +Disable All = Vô hiệu hóa tất cả +Edit = Edit +Enable All = Cho phép tất cả +Enter = Enter +Finish = Hoàn thành +Grid = Grid +Inactive = Không hoạt động +InternalError = An internal error has occurred. +Load = Load +Load completed = Đã load xong. +Loading = Đang load\nXin đợi... +LoadingFailed = Không thể load dữ liệu này. +Move = Di chuyển +Network Connection = Kết nối mạng +NEW DATA = DỮ LIỆU MỚI +No = Không +ObtainingIP = Obtaining IP address.\nPlease wait... +OK = OK +Old savedata detected = Phát hiện dữ liệu cũ +Options = Tùy chọn +Reset = Mặc định +Resize = Thay đổi kích thước +Retry = Thử lại +Save = Lưu +Save completed = Đã lưu xong. +Saving = Đang lưu\nXin đợi một lúc... +SavingFailed = Không thể lưu dữ liệu này. +Select = Lựa chọn +Shift = Shift +Snap = Snap +Space = Space +SSID = SSID +Submit = Gửi đi +Supported = Được hỗ trợ +There is no data = Không có dữ liệu. +Toggle All = Tất cả +Toggle List = Toggle list +Unsupported = không hổ trợ +When you save, it will load on a PSP, but not an older PPSSPP = Khi bạn save, nó có thể load được trên máy PSP, nhưng lại không thể load được trên PPSSPP phiên bản cũ +When you save, it will not work on outdated PSP Firmware anymore = Khi bạn save, nó sẽ không hoạt động trên máy PSP đã lỗi thời. +Yes = Có +Zoom = Zoom + +[Error] +7z file detected (Require 7-Zip) = File đã bị nén (7z).\nYêu cầu giải nén trước (thử dùng 7-Zip và WinRAR). +A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc. +Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot. +Could not save screenshot file = Không thể lưu file ảnh chụp màn hình. +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = không thấy file D3DCompiler_47.dll hãy tải file đó về. Hoặc nhấn Yes để thử lại bằng Direct3D 9. +D3D11InitializationError = Direct3D 11 Khởi tạo bị lỗi. +D3D11Missing = Phiên bản hệ điều hành của bạn không hỗ trợ D3D11. Vui lòng chạy Windows Update.\n\nNhấn Yes để thử lại bằng Direct3D 9. +D3D11NotSupported = GPU của bạn không xuất hiện để hỗ trợ Direct3D 11.\n\nThay vào đó, bạn có muốn thử lại bằng Direct3D 9 không? +Disk full while writing data = Đĩa đã đầy dữ liệu. +ELF file truncated - can't load = ELF file truncated - can't load +Error loading file = Có lỗi khi load file: +Error reading file = có lỗi khi đọc file. +Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed to identify file = không nhận dạng được file. +Failed to load executable: = Failed to load executable: +File corrupt = File corrupt +Game disc read error - ISO corrupt = Lỗi đọc đĩa: ISO bị hỏng. +GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. +GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericDirect3D9Error = Khởi tạo đồ họa thất bại. Thử nâng cấp driver card đồ họa của bạn và chạy thử DirectX 9.\n\nBạn có muốn thử chuyển sang thư viện đồ họa OpenGL không?\n\nTin báo lỗi: +GenericGraphicsError = Lỗi đồ họa +GenericOpenGLError = Khởi tạo đồ họa thất bại. Thử nâng cấp driver card đồ họa của bạn.\n\nBạn có muốn thử chuyển sang thư viện đồ họa DirectX 9 không?\n\nTin báo lỗi: +GenericVulkanError = Khởi tạo đồ họa thất bại. Thử nâng cấp driver card đồ họa của bạn.\n\nBạn có muốn thử chuyển sang thư viện đồ họa OpenGL không?\n\nTin báo lỗi: +InsufficientOpenGLDriver = Máy bạn không hỗ trợ OpenGL này\n\nPPSSPP cần tối thiểu là OpenGL 2.0 để chạy.\n\nXin kiểm tra lại nếu card đồ họa của bạn có hỗ trợ OpenGL 2.0. Bạn cũng nên thử update driver.\n\nVào diễn đàn https://forums.ppsspp.org để biết thêm chi tiết. +Just a directory. = chỉ là một thư mục. +Missing key = Missing key +MsgErrorCode = Error code: +MsgErrorSavedataDataBroken = Save data was corrupt. +MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. +MsgErrorSavedataNoData = Warning: no save data was found. +MsgErrorSavedataNoMS = Memory Stick not inserted. +No EBOOT.PBP, misidentified game = không có EBOOT.PBP, trò chơi bị nhận dạng sai. +Not a valid disc image. = Not a valid disc image. +OpenGLDriverError = Lỗi driver OpenGL +PPSSPP doesn't support UMD Music. = PPSSPP doesn't support UMD Music. +PPSSPP doesn't support UMD Video. = PPSSPP doesn't support UMD Video. +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP plays PSP games, not PlayStation 1 or 2 games. +PPSSPPDoesNotSupportInternet = PPSSPP hiện tại chưa hỗ trợ kết nối Internet qua DLC, PSN, or game updates. +PS1 EBOOTs are not supported by PPSSPP. = PS1 EBOOTs không được hỗ trợ bởi PPSSPP. +PSX game image detected. = File là định dạng MODE2. PPSSPP không hỗ trợ trò chơi PS1. +RAR file detected (Require UnRAR) = đây là file nén (RAR).\nXin hãy giải nén trước (thử UnRAR). +RAR file detected (Require WINRAR) = đây là file nén (RAR).\nXin hãy giải nén trước (dùng WinRAR). +Running slow: try frameskip, sound is choppy when slow = Chạy chậm: thử nhảy khung hình, âm thanh bị lỗi khi chậm +Running slow: Try turning off Software Rendering = Chạy chậm: thử tắt "kết xuất phần mềm" +Save encryption failed. This save won't work on real PSP = Lưu file save mã hóa thất bại. File save này không thể hoạt động trên máy PSP thật +textures.ini filenames may not be cross-platform = "textures.ini" không phải nền tảng nào cũng hỗ trợ tên file này. +This is a saved state, not a game. = This is a saved state, not a game. +This is save data, not a game. = Đây là một trạng thái được lưu, không phải là một trò chơi. +Unable to create cheat file, disk may be full = Không thể tạo file cheat, ổ cứng của bạn có thể bị đầy. +Unable to initialize rendering engine. = Unable to initialize rendering engine. +Unable to write savedata, disk may be full = Không thể viết file lưu dữ liệu, ổ cứng của bạn có thể bị đầy. +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = Cảnh báo: bộ nhớ video FULL, giảm nâng cấp và chuyển sang chế độ bộ nhớ đệm chậm. +Warning: Video memory FULL, switching to slow caching mode = Cảnh báo: bộ nhớ video FULL, chuyển sang chế độ bộ nhớ đệm chậm. +ZIP file detected (Require UnRAR) = đây là file nén (ZIP).\nXin hãy giải nén trước (Thử dùng UnRAR). +ZIP file detected (Require WINRAR) = đây là file nén (ZIP).\nXin hãy giải nén trước (Thử dùng WinRAR). + +[Game] +Asia = Asia +ConfirmDelete = Xóa +Create Game Config = Tạo thiết lập cho game +Create Shortcut = Tạo lối tắt +Delete Game = Xóa trò chơi +Delete Game Config = Xóa thiết lập cho game +Delete Save Data = Xóa dữ liệu save +Europe = Europe +Game = Trò chơi +Game Settings = Cấu hình trò chơi +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = Cài đặt dữ liệu +Japan = Japan +Korea = Korea +MB = MB +One moment please... = Đợi một chút... +Play = Chơi +Remove From Recent = Xóa danh sách trò chơi gần đây +SaveData = Dữ liệu save +Setting Background = Cài đặt nền +Show In Folder = Hiện trong thư mục +USA = USA +Use UI background = Sử dụng nền UI + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = không giới hạn +(supersampling) = (siêu mẫu) +(upscaling) = (tăng tỉ lệ) +1x PSP = 1× PSP +2x = 2× +2x PSP = 2× PSP +3x = 3× +3x PSP = 3× PSP +4x = 4× +4x PSP = 4× PSP +5x = 5× +5x PSP = 5× PSP +6x PSP = 6× PSP +7x PSP = 7× PSP +8x = 8× +8x PSP = 8× PSP +9x PSP = 9× PSP +10x PSP = 10× PSP +16x = 16× +Aggressive = Xâm lược +Alternative Speed = Tốc độ luân phiên +Alternative Speed 2 = Tốc độ luân phiên 2 (trong %, 0 = không giới hạn) +Anisotropic Filtering = Lọc không cùng hướng +Auto = Tự động +Auto (1:1) = Tự động (1:1) +Auto (same as Rendering) = Tự động (cùng với kết xuất) +Auto FrameSkip = Tự động nhảy khung hình +Auto Scaling = Tự động nhân rộng +Backend = Thư viện đồ họa +Balanced = Cân bằng +Bicubic = Bicubic (mịn) +BlockTransfer Tip = Một số trò chơi yêu cầu đồ họa thích hợp. +BlockTransferRequired = Cảnh báo: Trò chơi này yêu cầu mở "simulate block transfer effects" +Both = Cả hai +Buffer graphics commands (faster, input lag) = Buffer graphics commands (faster, input lag) +Buffered Rendering = Dựng hình có bộ nhớ đệm +BufferedRenderingRequired = Cảnh báo: Trò chơi này yêu cầu "chế độ kết xuất" được đặt thành "được đệm". +Camera = Camera +Camera Device = Camera device +Cardboard Screen Size = Screen size (in % of the viewport) +Cardboard Screen X Shift = X shift (in % of the blank space) +Cardboard Screen Y Shift = Y shift (in % of the blank space) +Cardboard VR Settings = Google Cardboard VR settings +Cheats = Cheats +Clear Speedhack = Clear framebuffers on first use (speed hack) +ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +CPU Core = CPU core +Debugging = Debugging +DefaultCPUClockRequired = Cảnh báo: Trò chơi này yêu cầu đồng hồ CPU được đặt mặc định. +Deposterize = Chống poster hóa +Deposterize Tip = Sửa lỗi trục trặc hình ảnh trong textures +Device = Thiết bị +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = Tắt hiệu ứng làm chậm (tăng tốc) +Disabled = Vô hiệu hóa +Display layout editor = Chỉnh bố trí hiển thị +Display Resolution (HW scaler) = Độ phân giải màn hình (HW scaler) +Dump next frame to log = Đưa khung hình kế tiếp vào nhật ký +Enable Cardboard VR = Enable Cardboard VR +FPS = FPS (khung hình/giây) +Frame Rate Control = Điều khiển tốc độ khung hình +Frame Skipping = Nhảy khuôn hình +Frame Skipping Type = Frame skipping type +FullScreen = Toàn màn hình +Hack Settings = Thiết lập hack (sẽ bị lỗi) +Hardware Tessellation = Lót phần cứng +Hardware Transform = Chuyển đổi phần cứng +hardware transform error - falling back to software = Lỗi chuyển đổi phần cứng, bị về lại phần mềm +HardwareTessellation Tip = Sử dụng phần cứng để tạo đường cong, luôn sử dụng chất lượng cố định +High = Cao +Hybrid = Hybrid (hỗn hợp) +Hybrid + Bicubic = Hybrid + Bicubic +Ignore camera notch when centering = Ignore camera notch when centering +Internal Resolution = Độ phân giải bên trong +Lazy texture caching = Bộ nhớ đệm lazy texture (tăng tốc) +Linear = Tuyến tính +Low = Thấp +LowCurves = Đường cong Spline/bezier chất lượng thấp (tăng tốc) +LowCurves Tip = Chỉ được sử dụng bởi một số trò chơi, kiểm soát độ mượt của đường cong. +Lower resolution for effects (reduces artifacts) = Độ phân giải thấp cho các hiệu ứng (làm giảm vật thể) +Manual Scaling = Nhân rộng thủ công +Medium = Trung bình +Mode = Chế độ +Must Restart = Bạn cần khởi động lại PPSSPP để những thay đổi có hiệu lực. +Native device resolution = Độ phân giải tự nhiên. +Nearest = Gần nhất +No buffer = No buffer +Non-Buffered Rendering = Bỏ qua hiệu ứng đệm (không bộ nhớ đệm, nhanh hơn) +None = Không +Number of Frames = Number of frames +Off = Tắt +OpenGL = OpenGL +Overlay Information = Hiển thị thông tin trên màn hình +Partial Stretch = Từng phần dãn ra +Percent of FPS = Percent of FPS +Performance = Hiệu năng +Postprocessing effect = Postprocessing effects +Postprocessing Shader = Xử lý hậu đổ bóng +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = Render duplicate frames to 60 Hz +RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates +Rendering Mode = Chế độ kết xuất +Rendering Resolution = Độ phân giải kết xuất +RenderingMode NonBuffered Tip = Nhanh hơn, nhưng một số trò chơi thì bị lỗi +Retain changed textures = Giữ lại textures (thỉnh thoảng sẽ bị chậm) +RetainChangedTextures Tip = Làm cho một số trò chơi chậm hơn, nhưng cũng có một số trò chơi nhanh hơn. +Rotation = Xoay màn hình +Safe = An toàn +Screen layout = Screen layout +Screen Scaling Filter = Bộ lọc họa tiết rộng +Show Debug Statistics = Hiện thông số debug +Show FPS Counter = Hiện thông số FPS +Simulate Block Transfer = Mô phỏng truyền tải khối vật thể , hiệu ứng +SoftGPU Tip = Hiện tại RẤT chậm +Software Rendering = Dựng hình bằng phần mềm +Software Skinning = phủ lớp bằng phần mềm +SoftwareSkinning Tip = Mô hình kết hợp vẽ trên CPU, nhanh hơn trong hầu hết các trò chơi +Speed = Tốc độ +Stretching = Stretching +Texture Filter = Bộ lọc họa tiết +Texture Filtering = Lọc texture +Texture Scaling = Họa tiết rộng +Texture Shader = Texture shader +Turn off Hardware Tessellation - unsupported = Tắt "phần cứng tessellation": không hổ trợ +Unlimited = Không giới hạn +Up to 1 = Up to 1 +Up to 2 = Up to 2 +Upscale Level = Cấp cao +Upscale Type = Loại cao cấp +UpscaleLevel Tip = CPU nặng - một số tỷ lệ có thể bị hoãn để tránh lỗi. +Use all displays = Sử dụng tất cả các hiển thị +Vertex Cache = Bộ đệm điểm +VertexCache Tip = Nhanh hơn, nhưng có thể gây ra nhấp nháy +VSync = Đồng bộ +Vulkan = Vulkan +Window Size = Kích cỡ cửa sổ +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = Xóa file ZIP +Install = Cài đặt +Install game from ZIP file? = Cài đặt trò chơi từ file ZIP? +Install textures from ZIP file? = Install textures from ZIP file? +Installed! = Đã cài xong! +Texture pack doesn't support install = Texture pack doesn't support install +Zip archive corrupt = ZIP archive corrupt +Zip file does not contain PSP software = ZIP file does not contain PSP software + +[KeyMapping] +Autoconfigure = Tự động thiết lập +Autoconfigure for device = Tự động thiết lập với thiết bị này +Clear All = Xóa tất cả +Default All = Trả lại thiết lập gốc +Map a new key for = Nhập nút mới cho +Map Key = bản đồ nút +Map Mouse = bản đồ chuột +Test Analogs = Kiểm tra Analog +You can press ESC to cancel. = bạn có thể nhấp Esc để hủy. + +[MainMenu] +Browse = Trình duyệt +Buy PPSSPP Gold = Buy PPSSPP Gold +Choose folder = Chọn thư mục +Credits = Thông tin phần mềm +PPSSPP Homebrew Store = Tải từ cửa hàng PPSSPP +Exit = Thoát +Game Settings = Cấu hình trò chơi +Games = Trò chơi +Give PPSSPP permission to access storage = Nâng cấp premium PPSSPP để truy cập bộ nhớ +Homebrew & Demos = Homebrew và Demo +How to get games = Làm thế nào để có trò chơi? +How to get homebrew & demos = Làm thế nào để có homebrew và demo? +Load = Mở trò chơi +Loading... = Loading... +PinPath = Pin +PPSSPP can't load games or save right now = PPSSPP không thể tải trò chơi hoặc lưu ngay bây giờ +Recent = Gần đây +SavesAreTemporary = PPSSPP đang tiết kiệm trong bộ lưu trữ +SavesAreTemporaryGuidance = Giải nén PPSSPP ở thư mục nào đó để lưu vĩnh viễn +SavesAreTemporaryIgnore = Bỏ qua cảnh báo +UnpinPath = Unpin +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = Âm thanh +Controls = Điều khiển +Graphics = Đồ họa +Networking = Mạng +System = Hệ thống +Tools = Công cụ + +[MappableControls] +Alt speed 1 = Alt speed 1 +Alt speed 2 = Alt speed 2 +An.Down = Analog xuống +An.Left = Analog trái +An.Right = Analog phải +An.Up = Analog lên +Analog limiter = giới hạng Analog +Analog Stick = Cần Analog +Audio/Video Recording = Ghi Audio/Video +Auto Analog Rotation (CCW) = Auto analog rotation (CCW) +Auto Analog Rotation (CW) = Auto analog rotation (CW) +AxisSwap = Hoán đổi trục +Circle = Tròn +Cross = Cross (chéo) +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = Menu NPH +Down = Xuống +Dpad = Dpad +Frame Advance = Khung trước +Hold = Giữ +Home = Nhà +L = L +Left = Trái +Load State = Load game +Mute toggle = Mute toggle +Next Slot = Slot tiếp +None = None +Note = Chú ý +OpenChat = Open chat +Pause = Tạm dừng +R = R +RapidFire = Rapid-fire +Remote hold = Giữ điều khiển +Rewind = Tua nhanh +Right = Phải +Right Analog Stick (tap to customize) = Right analog stick (tap to customize) +RightAn.Down = RightAn.Down +RightAn.Left = RightAn.Left +RightAn.Right = RightAn.Right +RightAn.Up = RightAn.Up +Rotate Analog (CCW) = Rotate analog (CCW) +Rotate Analog (CW) = Rotate analog (CW) +Save State = Lưu game +Screen = Màn hình +Screenshot = Screenshot +Select = lựa chọn +SpeedToggle = Chuyển đổi tốc độ +Square = Vuông +Start = Bắt đầu +Texture Dumping = Texture dumping +Texture Replacement = Texture replacement +Toggle Fullscreen = Chuyển toàn màn hình +Toggle mode = Toggle mode +Triangle = Tam giác +Unthrottle = Unthrottle +Up = Lên +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = Thăm diễn đàn AdHoc +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +Auto = Auto +Bottom Center = Bottom center +Bottom Left = Bottom left +Bottom Right = Bottom right +Center Left = Center left +Center Right = Center right +Change Mac Address = Đổi địa chỉ MAC +Change proAdhocServer Address = Change PRO ad hoc server IP address (localhost = multiple instances) +Chat = Chat +Chat Button Position = Chat button position +Chat Here = Chat here +Chat Screen Position = Chat screen position +Disconnected from AdhocServer = Disconnected from ad hoc server +DNS Error Resolving = DNS error resolving +Enable built-in PRO Adhoc Server = Enable built-in PRO ad hoc server +Enable network chat = Enable network chat +Enable networking = Enable networking/WLAN (beta, may break games) +Enable UPnP = Enable UPnP (need a few seconds to detect) +EnableQuickChat = Enable quick chat +Enter a new PSP nickname = Enter a new PSP nickname +Enter Quick Chat 1 = Enter quick chat 1 +Enter Quick Chat 2 = Enter quick chat 2 +Enter Quick Chat 3 = Enter quick chat 3 +Enter Quick Chat 4 = Enter quick chat 4 +Enter Quick Chat 5 = Enter quick chat 5 +Error = Error +Failed to Bind Localhost IP = Failed to bind localhost IP +Failed to Bind Port = Failed to bind port +Failed to connect to Adhoc Server = Failed to connect to ad hoc server +Forced First Connect = Forced first connect (faster connect) +Invalid IP or hostname = Invalid IP or hostname +Minimum Timeout = Minimum timeout (override in ms, 0 = default) +Misc = Miscellaneous (default = PSP compatibility) +Network Initialized = Mạng đã được khởi tạo +Please change your Port Offset = Please change your port offset +Port offset = Port offset(0 = PSP compatibility) +proAdhocServer Address: = Ad hoc server address: +Quick Chat 1 = Quick chat 1 +Quick Chat 2 = Quick chat 2 +Quick Chat 3 = Quick chat 3 +Quick Chat 4 = Quick chat 4 +Quick Chat 5 = Quick chat 5 +QuickChat = Quick chat +Send = Send +Send Discord Presence information = Send Discord "Rich Presence" information +TCP No Delay = TCP No Delay (faster TCP) +Top Center = Top center +Top Left = Top left +Top Right = Top right +Unable to find UPnP device = Unable to find UPnP device +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) +Validating address... = Validating address... +WLAN Channel = WLAN channel +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = cheat +Continue = Tiếp tục +Create Game Config = Tạo thiết lập cho game +Delete Game Config = Xóa thiết lập cho game +Exit to menu = Về menu +Game Settings = Cấu hình trò chơi +Load State = Load trò chơi +Rewind = Tua lại +Save State = Lưu trò chơi +Settings = Cấu hình trò chơi +Switch UMD = Đổi UMD + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-màu +Amount = Amount +Black border = Black border +Bloom = Tăng độ nét +Brightness = Brightness +Cartoon = Hoạt họa +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT đường quét +FXAA = Chống răng cưa FXAA +Gamma = Gamma +Grayscale = Đen trắng +Intensity = Intensity +InverseColors = Màu âm bản +Natural = Màu tự nhiên (mờ) +NaturalA = Màu tự nhiên (không mờ) +Off = Tắt +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Đường nét (CRT) +Sharpen = Sắc nét +SSAA(Gauss) = Siêu mẫu AA (cốt) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 Cao cấp +VideoSmoothingAA = Video mịn AA +Vignette = Đen góc + +[PSPCredits] +all the forum mods = tất cả mod trong diễn đàn +build server = xây dựng server +Buy Gold = Mua PPSSPP Gold +check = Xin cũng xem qua Dolphin, giả lập Wii/GC tốt nhất hiện nay: +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = Đóng góp: +created = Được tạo ra bới +Discord = Discord +info1 = PPSSPP chỉ được dùng cho mục đích giáo dục. +info2 = Bạn cần biết chắc bạn có quyền +info3 = bạn chơi bằng cách sở hữu UMD hoặc mua kỹ thuật số +info4 = tải xuống từ cửa hàng PSN trên máy PSP của bạn. +info5 = PSP là thương hiệu của Sony, Inc. +iOS builds = iOS builds +license = Chương trình miễn phí dưới bản quyền GPL 2.0+ +list = danh sách trò chơi chơi, diễn đàn , và thông tin lập trình viên +PPSSPP Forums = Diễn đàn PPSSPP +Privacy Policy = Privacy policy +Share PPSSPP = Chia sẻ PPSSPP +specialthanks = Đặc biệt cảm ơn: +specialthanksKeithGalocy = at NVIDIA (phần cứng, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = Thử nghiệm +this translation by = được dịch bới: +title = Giả lập PSP nhanh và portable +tools = Công cụ miễn phí đã sử dụng: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = MrYadro, mgaver, VIRGINKLM, raven02 +translators2 = sum2012, vnctdj, unknownbrackets, ufdada +translators3 = The Dax, wuspring, hrydgard, adrian17 +translators4 = papel, chinhodado, xsacha , zminhquanz +translators5 = Huy Song Tử, +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = Xem trên website: +written = Được viết bằng C++ cho tốc độ và portability + +[RemoteISO] +Browse Games = Duyệt games +Local Server Port = Cổng sever nội bộ +Manual Mode Client = Chế độ khách thủ công +Remote disc streaming = Điều khiển đĩa từ xa +Remote Port = Cổng từ xa +Remote Server = server từ xa +Remote Subdirectory = Thư mục con từ xa +RemoteISODesc = Các trò chơi trong danh sách gần đây của bạn sẽ được chia sẻ +RemoteISOLoading = Đã kết nối, đang tải DS game... +RemoteISOScanning = Quét ... Nhấp "chia sẻ trò chơi" trên thiết bị của bạn +RemoteISOScanningTimeout = Scanning... check your desktop's firewall settings +RemoteISOWifi = Chú ý: Kết nối cả hai thiết bị với cùng một mạng Wi-Fi +RemoteISOWinFirewall = WARNING: Windows Firewall is blocking sharing +Settings = Cài đặt +Share Games (Server) = Chia sẻ (server) +Share on PPSSPP startup = Bắt đầu chia sẻ trong PPSSPP +Stop Sharing = Dừng chia sẻ +Stopping.. = Đang dừng... + +[Reporting] +Bad = Tệ +FeedbackDelayInfo = Dữ liệu của bạn đang được gửi trong nền. +FeedbackDesc = Đánh giá thế nào về giả lập này? Hãy để chúng tôi và cộng đồng biết! +FeedbackDisabled = Báo cáo sever tương thích phải được kích hoạt. +FeedbackIncludeCRC = Chú ý: sẽ tốn Pin để gửi đĩa CRC +FeedbackIncludeScreen = Bao gồm một ảnh chụp màn hình +FeedbackSubmitDone = Dữ liệu của bạn đã được gửi. +FeedbackSubmitFail = Không thể gửi dữ liệu đến máy chủ. Hãy thử cập nhật PPSSPP. +FeedbackThanks = Cảm ơn phản hồi của bạn! +Gameplay = Gameplay +Graphics = Đồ họa +Great = Tốt +In-game = In-game +In-game Description = Vào trò chơi, nhưng quá lỗi để hoàn thành +Menu/Intro = Menu/Intro +Menu/Intro Description = Không thể vào trò chơi +Nothing = Không có gì +Nothing Description = Bị hỏng hoàn toàn +OK = OK +Open Browser = Mở trình duyệt +Overall = Trên tất cã +Perfect = Hoàn hảo +Perfect Description = Ứng dụng hoàn hảo cho toàn bộ trò chơi - tuyệt vời! +Plays = Chơi +Plays Description = Hoàn toàn có thể chơi nhưng có thể bị trục trặc +ReportButton = Báo cáo phản hồi +Speed = Tốc độ +Submit Feedback = Báo cáo phản hồi +SuggestionConfig = Xem thông báo trên trang web để cài đặt tốt hơn. +SuggestionCPUSpeed0 = Không thể cài đặt tốc độ vì CPU bị khóa. +SuggestionDowngrade = Hạ cấp xuống phiên bản PPSSPP cũ hơn (vui lòng báo cáo lỗi này). +SuggestionsFound = Những người dùng khác đã báo cáo kết quả tốt hơn. Nhấn "Xem phản hồi" để biết thêm chi tiết. +SuggestionsNone = Trò chơi này không hoạt động cho người dùng khác. +SuggestionsWaiting = Gửi và kiểm tra phản hồi của người dùng khác ... +SuggestionUpgrade = Nâng cấp phiên bản PPSSPP mới hơn. +SuggestionVerifyDisc = Kiểm tra ISO rồi copy qua đĩa của bạn. +Unselected Overall Description = Ứng dụng giả lập này tốt như thế nào? +View Feedback = Xem tất cả phản hồi + +[Savedata] +Date = Date +Filename = Tên file +No screenshot = Không có screenshot +None yet. Things will appear here after you save. = Không có gì ở đây. Mọi thứ sẽ xuất hiện ở đây sau khi bạn lưu. +Save Data = Lưu dữ liệu +Save States = Lưu game +Savedata Manager = Quản lý lưu dữ liệu +Size = Kích cỡ + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = CẢNH BÁO: Phát hiện Chainfire3D, có thể gây ra vấn đề +Failed to load state = Thất bại trong việc load trò chơi +Failed to save state = Thất bại trong việc lưu trò chơi +fixed = Tốc độ: alternate +GLToolsWarning = WARNING: Phát hiện GLTools, có thể gây ra vấn đề. +In menu = In menu +Load savestate failed = Lưu trò chơi thất bại +Loaded State = Đã load xong +Loaded. Save in game, restart, and load for less bugs. = loaded. lưu trong game, khởi động lại và tải để ít lỗi hơn. +LoadStateDoesntExist = Không load được: không có file save! +LoadStateWrongVersion = Không load được: file save là của một phiên bản cũ của PPSSPP! +norewind = Không tua lại được, trạng thái không có sẵn.. +Playing = Playing +PressESC = Nhấn ESC để mở menu. +replaceTextures_false = Textures no longer are being replaced. +replaceTextures_true = Texture replacement is enabled. +Save State Failed = Không save được! +Saved State = Đã save xong +saveNewTextures_false = Texture saving was disabled. +saveNewTextures_true = Textures will now be saved to your storage. +SpeedCustom2 = Tốc độ: Luân phiên 2 +standard = Tốc độ: bình thường +Untitled PSP game = Trò chơi PSP không tên + +[Store] +Already Installed = Đã cài rồi +Connection Error = Lỗi kết nối +Install = Cài +Launch Game = Launch game +Loading... = Đang load... +MB = MB +Size = Kích cỡ +Uninstall = Gỡ + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d cores) +%d bytes = %d bytes +(none detected) = (không phát hiện) +3D API = 3D API +ABI = ABI +API Version = API version +Audio Information = Thông tin âm thanh +Board = Bảng +Build Config = Xây dựng +Build Configuration = Xây dựng cấu hình +Built by = Xây dựng bởi +Core Context = Bối cảnh cốt lõi +Cores = Cốt lõi +CPU Extensions = tiện ích CPU +CPU Information = thông tin CPU +CPU Name = Tên +D3DCompiler Version = D3DCompiler version +Debug = Debug +Debugger Present = Debugger present +Device Info = Thông tin thiết bị +Display Information = Hiện thông tin +Driver Version = Driver version +EGL Extensions = EGL extensions +Frames per buffer = Khung cho mỗi bộ đệm +GPU Information = Thông tin GPU +High precision float range = High precision float range +High precision int range = Phạm vi int chính xác cao +Lang/Region = ngôn ngữ/Vùng +Memory Page Size = Kích cỡ bộ nhớ +Native Resolution = Độ phân giải gốc +OGL Extensions = Tiện ích OGL +OpenGL ES 2.0 Extensions = Tiện ích OpenGL ES 2.0 +OpenGL ES 3.0 Extensions = Tiện ích OpenGL ES 3.0 +OpenGL Extensions = Tiện ích OpenGL +Optimal frames per buffer = Khung tối ưu cho mỗi bộ đệm +Optimal sample rate = Tỷ lệ mẫu tối ưu +OS Information = Tiện ích OS +PPSSPP build = Xây dựng PPSSPP +Refresh rate = Tần số làm mới +Release = Giải phóng +RW/RX exclusive = Độc quyền RW/RX +Sample rate = Tỷ lệ mẫu +Shading Language = Ngôn ngữ tô bóng +Sustained perf mode = Chế độ hoàn thiện bền vững +System Information = Thông tin hệ thống +System Name = Tên +System Version = System version +Threads = Chủ đề +Vendor = Nhà cung cấp +Vendor (detected) = Nhà cung cấp (phát hiện) +Version Information = Thông tin phiên bản +Vulkan Extensions = Tiên ích Vulkan +Vulkan Features = Tính năng Vulkan + +[System] +(broken) = (Bị hỏng) +12HR = 12H +24HR = 24H +Auto = Tự động +Auto Load Savestate = Auto load savestate +AVI Dump started. = Đưa AVI vào bắt đầu +AVI Dump stopped. = Đưa AVI vào dừng lại +Cache ISO in RAM = Cache full ISO in RAM +Change CPU Clock = Chỉnh đồng hồ CPU (không ổn định) +Change Memory Stick folder = Change Memory Stick folder +Change Memory Stick Size = Change Memory Stick size (GB) +Change Nickname = Đổi nickname +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = Cheat (đang thử nghiệm, xem trong diễn đàn) +Clear Recent = Clear "Recent" +Clear Recent Games List = Xóa danh sách trò chơi mới gần đây +Clear UI background = Xóa nền UI +Confirmation Button = Nút xác nhận +Date Format = Chỉnh định dạng ngày tháng năm +Day Light Saving = Giờ mùa hè/mùa đông +DDMMYYYY = NgayThangNam +Decrease size = Decrease size +Developer Tools = Công cụ NPH +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = Giả lập +Enable Cheats = mở cheat +Enable Compatibility Server Reports = Mở báo cáo tới sever tương thích +Failed to load state. Error in the file system. = Load thất bại. Lỗi nằm trong tập tin hệ thống. +Failed to save state. Error in the file system. = Save thất bại. Lỗi nằm trong tập tin hệ thống. +Fast (lag on slow storage) = Nhanh (lag trên bộ nhớ thấp) +Fast Memory = Bộ nhớ nhanh (không ổn định) +Force real clock sync (slower, less lag) = Buộc đồng bộ tốc độ xung nhịp (chậm hơn, giảm lag hơn) +frames, 0:off = Khung, 0 = tắt +Games list settings = Games list settings +General = Linh tinh +Grid icon size = Grid icon size +Help the PPSSPP team = Giúp nhóm PPSSPP +Host (bugs, less lag) = Host (lỗi, ít lag) +I/O on thread (experimental) = I/O on thread (experimental) +Ignore bad memory accesses = Ignore bad memory accesses +Increase size = Increase size +Interpreter = Thông dịch viên +IO timing method = I/O phương pháp thời gian +IR Interpreter = Thông dịch viên IR +Memory Stick Folder = Memory Stick folder +Memory Stick inserted = Thẻ nhớ được chèn +MHz, 0:default = MHz, 0 = mặc định +MMDDYYYY = ThangNgayNam +Newest Save = Save mới nhất +Not a PSP game = Đây Không phải là game PSP +Off = Tắt +Oldest Save = Save cũ nhất +PSP Model = PSP model +PSP Settings = Thiết lập PSP +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = Ghi audio +Record Display = Hiển thị ghi +Reset Recording on Save/Load State = Đặt lại ghi trên trạng thái Save/Load. +Restore Default Settings = Chỉnh các thiết lập về mặc định +Rewind Snapshot Frequency = Tần số Rewind snapshot +Save path in installed.txt = Save path in installed.txt +Save path in My Documents = Save path in My Documents +Savestate Slot = Ô save +Savestate slot backups = Savestate slot backups +Screenshots as PNG = Chụp ảnh màn hình bằng định dạng PNG +Set UI background... = Set UI background... +Show ID = Show ID +Show region flag = Show region flag +Simulate UMD delays = Simulate UMD delays +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = Bộ nhớ đầy +Sustained performance mode = Chế độ hiệu suất duy trì +Time Format = Chỉnh định dạng thời gian (12/24) +UI = Giao diện người dùng +UI Sound = UI sound +undo %c = backup %c +Use Lossless Video Codec (FFV1) = Sử dụng codec video lossless (FFV1) +Use O to confirm = Dùng O để chọn +Use output buffer (with overlay) for recording = Use output buffer (with overlay) for recording +Use system native keyboard = Use system native keyboard +Use X to confirm = Dùng X để chọn +VersionCheck = Kiểm tra phiên bản PPSSPP mới +WARNING: Android battery save mode is on = CẢNH BÁO: Chế độ tiết kiệm pin của Android được Bật +WARNING: Battery save mode is on = CẢNH BÁO: Chế độ tiết kiệm pin được bật +YYYYMMDD = NamThangNgay + +[Upgrade] +Details = Details +Dismiss = Bỏ qua +Download = Tải về +New version of PPSSPP available = Đã có phiên bản mới của PPSSPP diff --git a/assets/lang/zh_CN.ini b/assets/lang/zh_CN.ini new file mode 100644 index 0000000000..28c4cc6e9f --- /dev/null +++ b/assets/lang/zh_CN.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = 自定义速度下的音量 +Audio backend = 音频引擎 (需要重启) +AudioBufferingForBluetooth = 蓝牙友好缓冲区 (更慢) +Auto = 自动 +Device = 设备 +DSound (compatible) = DirectSound (兼容) +Enable Sound = 开启声音 +Global volume = 全局音量 +Microphone = 麦克风 +Microphone Device = 麦克风设备 +Mute = 静音 +Switch on new audio device = 启动新的音频设备 +Use global volume = 使用全局音量 +WASAPI (fast) = WASAPI (快) + +[Controls] +Analog auto-rotation speed = 模拟自动转速 +Analog Axis Sensitivity = 摇杆灵敏度 +Analog Limiter = 摇杆限制器 +Analog Mapper High End = 模拟映射器的高端 (轴灵敏度) +Analog Mapper Low End = 模拟映射器的低端 (反盲区) +Analog Mapper Mode = 模拟映射器模式 +Analog Stick = 摇杆 +AnalogLimiter Tip = 当按下摇杆限制器键时 +Auto = 自动 +Auto-centering analog stick = 摇杆自动跟手 +Auto-hide buttons after seconds = 自动隐藏按键时间 +Binds = 绑定 +Button Opacity = 按键透明度 +Button style = 按键样式 +Calibrate D-Pad = 校准方向键 +Calibration = 校准 +Classic = 传统 +Combo Key Setting = 组合键设置 +Combo Key Setup = 组合键设置 +Confine Mouse = 在窗口/显示区域内捕获鼠标 +Control Mapping = 按键映射 +Custom layout... = 编辑按键布局... +Customize tilt = 自定义重力感应... +D-PAD = 方向键 +Deadzone Radius = 死区半径 +DInput Analog Settings = DInput 模拟设置 +Disable D-Pad diagonals (4-way touch) = 禁用方向键对角线 (四方向触控) +Glowing borders = 细边框 (发光) +HapticFeedback = 按键反馈 (震动) +Ignore gamepads when not focused = 后台运行时忽略游戏手柄 +Ignore Windows Key = 忽略 Windows 键 +Invert Axes = 轴反转 +Invert Tilt along X axis = 沿 X 轴倾斜反转 +Invert Tilt along Y axis = 沿 Y 轴倾斜反转 +Keep this button pressed when right analog is pressed = 按下右摇杆时保持按下此按钮 +Keyboard = 键盘控制设定 +L/R Trigger Buttons = L/R 触发按钮 +Landscape = 横向 +Landscape Auto = 自动横向 +Landscape Reversed = 横向反转 +Mouse = 鼠标设置 +Mouse sensitivity = 鼠标灵敏度 +Mouse smoothing = 鼠标平滑 +MouseControl Tip = 您现在可以在按键映射界面按下 "M" 图标来映射鼠标按键。 +None (Disabled) = 无 (禁用) +Off = 关闭 +OnScreen = 屏幕虚拟按键 +Portrait = 纵向 +Portrait Reversed = 纵向反转 +PSP Action Buttons = PSP 功能键 +Screen Rotation = 屏幕旋转 +seconds, 0 : off = 秒, 0 = 不隐藏 +Sensitivity = 灵敏度 +Show right analog = 显示右摇杆 +Show Touch Pause Menu Button = 显示暂停菜单按键 +Thin borders = 细边框 +Tilt Base Radius = 最小摇杆半径 +Tilt Input Type = 重力感应替代按键类型 +Tilt Sensitivity along X axis = 沿 X 轴倾斜灵敏度 +Tilt Sensitivity along Y axis = 沿 Y 轴倾斜灵敏度 +To Calibrate = 如需校准, 请保证设备在一个平面上,然后按"校准" +Touch Control Visibility = 触摸按键可见性 +Use custom right analog = 自定义右摇杆用途 +Use Mouse Control = 使用鼠标控制 +Visibility = 可见设定 +X = X +X + Y = X + Y +XInput Analog Settings = XInput 模拟设置 +Y = Y + +[CwCheats] +Cheats = 金手指 +Edit Cheat File = 编辑金手指文件 +Enable/Disable All = 启用/禁用所有金手指 +Import Cheats = 从 cheat.db 导入 +Options = 选项 +Refresh Rate = 刷新率 + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +Font = 微软雅黑 +About PPSSPP... = 关于 PPSSPP (&A)... +Auto = 自动 (&A) +Backend = 渲染引擎 (需要 PPSSPP 重新启动) (&3) +Bicubic = &双三次 +Break = 停止 +Break on Load = 载入后停止 +Buffered Rendering = 缓冲渲染 (&B) +Buy Gold = 购买黄金版 (&G) +Control Mapping... = 按键映射 (&O)... +Debugging = 调试 (&D) +Deposterize = 色调融合 (&D) +Direct3D9 = Direct3D9 (&D) +Direct3D11 = Direct3D11 (&D) +Disassembly = 反汇编 (&D)... +Discord = Discord +Display Layout Editor = 显示布局编辑器... +Display Rotation = 显示旋转 +Dump Next Frame to Log = 转储下一帧到日志 (&U) +Emulation = 模拟 (&E) +Enable Chat = 启用聊天 +Enable Cheats = 启用金手指 (&C) +Enable Sound = 开启声音 (&O) +Exit = 退出 (X) +Extract File... = 提取文件... +File = 文件 (&F) +Frame Skipping = 跳帧 (&F) +Frame Skipping Type = 跳帧方式 +Fullscreen = 全屏幕 (&L) +Game Settings = 游戏设置 (&G) +GE Debugger... = GE 调试器 (&R)... +GitHub = Git&Hub +Hardware Transform = 硬件几何变换 (&H) +Help = 帮助 (&H) +Hybrid = &混合 +Hybrid + Bicubic = 混合 + 双三次 +Ignore Illegal Reads/Writes = 忽略读写错误 (&I) +Ignore Windows Key = 忽略 Windows 键 +Keep PPSSPP On Top = 窗口总在最前 (&K) +Landscape = 横向 +Landscape reversed = 横向反转 +Language... = 语言 (&L)... +Linear = 线性过滤 (&L) +Load = 载入 (&L)... +Load .sym File... = 载入 .sym 文件 (&a)... +Load Map File... = 载入内存镜像文件 (&M)... +Load State = 快速读档 +Load State File... = 载入即时存档 (&L)... +Log Console = 控制台日志 (&L) +Memory View... = 查看内存 (&M)... +More Settings... = 更多设置 (&M)... +Nearest = 邻近取样 (&N) +Non-Buffered Rendering = 跳过缓冲效果 (非缓冲, 更快) +Off = 关闭 (&O) +Open Directory... = 打开目录 (&D)... +Open from MS:/PSP/GAME... = 打开 MS:/PSP/GAME (P)... +Open Memory Stick = 打开记忆棒 (&M) +Open New Instance = 打开新的模拟器进程 +OpenGL = OpenGL (&O) +Pause = 暂停 (&P) +Pause When Not Focused = 后台运行时自动暂停 (&P) +Portrait = 纵向 +Portrait reversed = 纵向反转 +Postprocessing Shader = 后处理着色器 +PPSSPP Forums = PPSSPP 官方论坛 (&F) +Record = 录制 +Record Audio = 录制音频 +Record Display = 录制视频 +Rendering Mode = 渲染模式 (&O) +Rendering Resolution = 渲染分辨率 (&R) +Reset = 复位 (&E) +Reset Symbol Table = 重置符号表 (&R) +Run = 运行 (&R) +Save .sym File... = 保存 .sym 文件 (&e)... +Save Map File... = 保存内存镜像文件 (&S)... +Save State = 快速存档 +Save State File... = 保存即时存档 (&S)... +Savestate Slot = 即时存档插槽 (&T) +Screen Scaling Filter = 屏幕缩放滤镜 +Show Debug Statistics = 显示调试信息 (&G) +Show FPS Counter = 显示 &FPS 计数器 +Skip Number of Frames = 跳过帧的数量 +Skip Percent of FPS = 跳过帧率的百分比 +Stop = 停止 (&S) +Switch UMD = 切换 UMD 光盘 +Take Screenshot = 屏幕截图 (&T) +Texture Filtering = 纹理过滤方式 (&X) +Texture Scaling = 纹理缩放方式 (&T) +Use Lossless Video Codec (FFV1) = 使用无损视频编解码器 (FFV1) +Use output buffer for video = 录制时使用输出缓冲 +Vertex Cache = 顶点缓存 (&V) +VSync = 垂直同步 (&Y) +Vulkan = Vulkan +Window Size = 窗口大小 (&Z) +www.ppsspp.org = 访问官网 www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = Allocator 查看器 (Vulkan) +Allow remote debugger = 允许远程调试器 +Backspace = 退格键 +Block address = 内存块地址 +By Address = 通过地址定位 +Copy savestates to memstick root = 副本保存状态,以记忆棒根 +Create/Open textures.ini file for current game = 创建/打开当前游戏的 textures.ini 文件 +Current = 当前 +Dev Tools = 开发者工具 +DevMenu = 开发者菜单 +Disabled JIT functionality = 已禁用的 JIT 功能 +Draw Frametimes Graph = 显示帧时间统计图 +Dump Decrypted Eboot = 当载入游戏时转储已解密的 EBOOT.BIN +Dump Frame GPU Commands = 转储帧 GPU 命令 +Enable driver bug workarounds = 启用驱动程序错误解决方法 +Enable Logging = 启用调试日志 +Enter address = 输入地址 +FPU = FPU +Framedump tests = 帧转储测试 +Frame Profiler = 帧分析器 +GPU Driver Test = GPU 驱动程序测试 +GPU Profile = GPU 分析器 +Jit Compare = Jit 比较 +JIT debug tools = JIT 调试工具 +Language = 语言设置 +Load language ini = 载入语言配置 +Log Dropped Frame Statistics = 记录丢弃帧统计信息 +Log Level = 日志等级 +Log View = 日志视图 +Logging Channels = 日志源 +Next = 下一个 +No block = 没有内存块 +Prev = 之前 +Random = 随机 +Replace textures = 纹理替换 +Reset limited logging = 重置受限日志 +RestoreDefaultSettings = 您确定要将所有设置恢复到默认? (按键映射除外)\n该操作无法撤销。\n\n操作将在 PPSSPP 重新启动后生效。 +RestoreGameDefaultSettings = 您确定要将此游戏设置\n恢复为 PPSSPP 默认吗? +Resume = 恢复 +Run CPU Tests = 运行 CPU 测试 +Save language ini = 保存语言配置 +Save new textures = 保存新纹理 +Shader Viewer = 着色器查看器 +Show Developer Menu = 显示开发者菜单 +Show on-screen messages = 显示屏幕消息 +Stats = 统计数据 +System Information = 系统信息 +Texture Replacement = 纹理替换 +Toggle Audio Debug = 切换音频调试 +Toggle Freeze = 切换冻结 +Touchscreen Test = 触屏测试 +VFPU = VFPU + +[Dialog] +* PSP res = * PSP 分辨率 +Active = 激活 +Back = 返回 +Cancel = 取消 +Center = 中心 +ChangingGPUBackends = 更改引擎模式后需要重启 PPSSPP。立刻重启? +ChangingInflightFrames = 更改缓冲图形命令后需要重启 PPSSPP。立刻重启? +Channel: = 频道: +Choose PPSSPP save folder = 选择 PPSSPP 存档的文件夹 +Confirm Overwrite = 您要覆盖这个存档吗? +Confirm Save = 您要保存到这个存档吗? +ConfirmLoad = 您要载入这个存档吗? +ConnectingAP = 连接到接入点.\n请稍候... +ConnectingPleaseWait = 连接中.\n请稍候... +ConnectionName = 连接名称 +Corrupted Data = 数据损坏 +Delete = 删除 +Delete all = 全部删除 +Delete completed = 已删除。 +DeleteConfirm = 存档将被删除。\n您确定要继续吗? +DeleteConfirmAll = 将删除此游戏的所有存档。\n您确定要这样做吗? +DeleteConfirmGame = 将删除此游戏的文件, 且不能复原。\n您确定要这样做吗? +DeleteConfirmGameConfig = 您确定要删除此游戏的设置吗? +DeleteFailed = 无法删除存档。 +Deleting = 删除中\n请稍候... +Disable All = 全部禁用 +Edit = 编辑 +Enable All = 全部启用 +Enter = 确定 +Finish = 完成 +Grid = 网格尺寸 +Inactive = 未激活 +InternalError = 发生内部错误. +Load = 载入 +Load completed = 已载入。 +Loading = 载入中\n请稍候... +LoadingFailed = 无法载入存档。 +Move = 移动 +Network Connection = 网络连接 +NEW DATA = 新建存档 +No = 否 +ObtainingIP = 获取IP地址.\n请稍候... +OK = 确定 +Old savedata detected = 检测到旧版本的存档数据 +Options = 选项 +Reset = 重设 +Resize = 调整大小 +Retry = 重试 +Save = 保存 +Save completed = 保存完成。 +Saving = 保存中\n请稍候... +SavingFailed = 无法保存存档。 +Select = 选择 +Shift = 翻页 +Snap = 网格对齐 +Space = 空格键 +SSID = SSID +Submit = 提交 +Supported = 支持 +There is no data = 存档不存在。 +Toggle All = 全选 (全不选) +Toggle List = 切换列表 +Unsupported = 不支持 +When you save, it will load on a PSP, but not an older PPSSPP = 当您保存后, 它只会在 PSP 实机上载入, 而不是旧版本的 PPSSPP +When you save, it will not work on outdated PSP Firmware anymore = 当您保存后, 它无法在过时的 PSP 固件上运行 +Yes = 是 +Zoom = 放大 + +[Error] +7z file detected (Require 7-Zip) = 这是 7ZIP 压缩文件。\n请试着使用 7-zip 或 WinRAR 进行解压缩。 +A PSP game couldn't be found on the disc. = 光盘中找不到 PSP 游戏。 +Cannot boot ELF located outside mountRoot. = 无法启动位于 mountRoot 之外的 ELF 文件。 +Could not save screenshot file = 无法保存屏幕截图文件 +D3D9or11 = 使用 Direct3D 9? (或者 "否" 以使用 Direct3D 11) +D3D11CompilerMissing = 没有找到 D3DCompiler_47.dll, 请安装它或者按下 确认 键来尝试使用 Direct3D 9 代替它。 +D3D11InitializationError = Direct3D 11 初始化出错 +D3D11Missing = 您的操作系统没有包含 D3D11。请运行 Windows Update。\n\n按下 确认 键来尝试使用 Direct3D 9 代替它。 +D3D11NotSupported = 您的图形处理器似乎并不支持 Direct3D 11。\n\n您想尝试使用 Direct3D 9 来代替它吗? +Disk full while writing data = 写入数据时磁盘已满 +ELF file truncated - can't load = ELF 文件被截断 - 无法加载 +Error loading file = 无法加载游戏: +Error reading file = 读取文件时出错。 +Failed initializing CPU/Memory = 初始化CPU或内存失败 +Failed to identify file = 无法识别文件。 +Failed to load executable: = 无法加载可执行文件: +File corrupt = 文件损坏 +Game disc read error - ISO corrupt = 游戏光盘读取错误:ISO 损坏。 +GenericAllStartupError = PPSSPP无法使用任何图形后端启动。 尝试升级图形和其他驱动程序. +GenericBackendSwitchCrash = 启动时PPSSPP崩溃了.\n\n这通常意味着图形驱动程序问题。 尝试升级图形驱动程序.\n\n图形后端已切换: +GenericDirect3D9Error = 初始化图像失败。尝试更新您的显卡驱动程序和DirectX 9 运行库。\n\n是否尝试切换到 OpenGL 模式?\n\n错误信息: +GenericGraphicsError = 图像错误 +GenericOpenGLError = 初始化图像失败。尝试更新您的显卡驱动程序。\n\n是否尝试切换到 DirectX 9 模式?\n\n错误信息: +GenericVulkanError = 初始化图像失败。尝试更新您的显卡驱动程序。\n\n是否尝试切换到 OpenGL 模式?\n\n错误信息: +InsufficientOpenGLDriver = 检测到显卡驱动不支持 OpenGL 2.0!\n\n您想尝试使用 DirectX 吗?\n\nDirectX 目前只兼容较少游戏, 但在您的 GPU 也可能是唯一的选择。\n\n有关更多信息,请访问https://forums.ppsspp.org上的论坛。\n\n +Just a directory. = 这只是个文件夹。 +Missing key = 缺失密钥 +MsgErrorCode = 错误代码: +MsgErrorSavedataDataBroken = 保存数据已损坏. +MsgErrorSavedataMSFull = 记忆棒已满.检查您的存储空间. +MsgErrorSavedataNoData = 警告:未找到保存数据. +MsgErrorSavedataNoMS = 未插入记忆棒. +No EBOOT.PBP, misidentified game = 找不到 EBOOT.PBP, 无法正确识别游戏。 +Not a valid disc image. = 光盘镜像无效。 +OpenGLDriverError = OpenGL 驱动程序错误 +PPSSPP doesn't support UMD Music. = PPSSPP 不支持 UMD 音乐。 +PPSSPP doesn't support UMD Video. = PPSSPP 不支持 UMD 视频。 +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP 运行 PSP 游戏, PS1 或者2的游戏不能运行。 +PPSSPPDoesNotSupportInternet = PPSSPP 目前不支持连接互联网以获取 DLC、PSN 或游戏的更新。 +PS1 EBOOTs are not supported by PPSSPP. = PPSSPP 不支持由 PS1 EBOOT 生成的游戏镜像。 +PSX game image detected. = 这是 MODE2 镜像。PPSSPP 不支持 PS1 游戏。 +RAR file detected (Require UnRAR) = 这是 RAR 压缩文件。\n请尝试使用 UnRAR 进行解压缩。 +RAR file detected (Require WINRAR) = 这是 RAR 压缩文件。\n请尝试使用 WinRAR 进行解压缩。 +Running slow: try frameskip, sound is choppy when slow = 运行速度慢:尝试跳帧, 运行速度慢时声音不连贯 +Running slow: Try turning off Software Rendering = 运行速度慢:尝试关闭"软件渲染" +Save encryption failed. This save won't work on real PSP = 存档加密失败。此存档将无法在 PSP 实机使用 +textures.ini filenames may not be cross-platform = "textures.ini" 文件名可能不是多平台的。 +This is a saved state, not a game. = 这是一个即时存档, 不是游戏。 +This is save data, not a game. = 这是一个存档, 不是游戏。 +Unable to create cheat file, disk may be full = 无法创建金手指文件, 磁盘可能已满 +Unable to initialize rendering engine. = 无法初始化渲染引擎。 +Unable to write savedata, disk may be full = 无法写入存档数据, 磁盘可能已满 +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = 警告:显存已满, 减少分辨率提升并切换到慢速缓存模式。 +Warning: Video memory FULL, switching to slow caching mode = 警告:显存已满, 切换到慢速缓存模式。 +ZIP file detected (Require UnRAR) = 这是 ZIP 压缩文件。\n请尝试使用 UnRAR 进行解压缩。 +ZIP file detected (Require WINRAR) = 这是 ZIP 压缩文件。\n请尝试使用 WinRAR 进行解压缩。 + +[Game] +Asia = 亚洲 +ConfirmDelete = 确认删除 +Create Game Config = 建立游戏配置 +Create Shortcut = 创建快捷方式 +Delete Game = 删除游戏 +Delete Game Config = 删除游戏配置 +Delete Save Data = 删除存档 +Europe = 欧洲 +Game = 游戏 +Game Settings = 游戏设置 +Homebrew = 自制游戏 +Hong Kong = 香港 +InstallData = 安装数据 +Japan = 日本 +Korea = 韩国 +MB = MB +One moment please... = 请稍等... +Play = 启动游戏 +Remove From Recent = 从"最近的游戏"中删除 +SaveData = 存档 +Setting Background = 设置背景 +Show In Folder = 显示文件夹 +USA = 美国 +Use UI background = 使用界面背景 + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %, 0 = 无限制 +(supersampling) = (超级采样) +(upscaling) = (放大) +1x PSP = 1倍 PSP +2x = 2倍 +2x PSP = 2倍 PSP +3x = 3倍 +3x PSP = 3倍 PSP +4x = 4倍 +4x PSP = 4倍 PSP +5x = 5倍 +5x PSP = 5倍 PSP +6x PSP = 6倍 PSP +7x PSP = 7倍 PSP +8x = 8倍 +8x PSP = 8倍 PSP +9x PSP = 9倍 PSP +10x PSP = 10倍 PSP +16x = 16倍 +Aggressive = 激进 +Alternative Speed = 自定义速度 +Alternative Speed 2 = 自定义速度 2 +Anisotropic Filtering = 各向异性过滤 +Auto = 自动 +Auto (1:1) = 自动 (1:1) +Auto (same as Rendering) = 自动 (同渲染分辨率) +Auto FrameSkip = 自动跳帧 +Auto Scaling = 自动缩放 +Backend = 渲染引擎 +Balanced = 均衡 +Bicubic = 双三次 +BlockTransfer Tip = 有些游戏需要将此选项设置为开以显示正确的图形 +BlockTransferRequired = 警告:此游戏需要将"模拟块传输模式"设置为开。 +Both = 全部显示 +Buffer graphics commands (faster, input lag) = 缓冲图形命令 (更快, 有输入延迟) +Buffered Rendering = 缓冲渲染 +BufferedRenderingRequired = 警告:此游戏需要将"渲染模式"设置为"缓冲渲染"。 +Camera = 摄像头 +Camera Device = 摄像头设备 +Cardboard Screen Size = 屏幕大小 (视区%) +Cardboard Screen X Shift = 水平 % +Cardboard Screen Y Shift = 垂直 % +Cardboard VR Settings = Google Cardboard VR 设置 +Cheats = 金手指 +Clear Speedhack = 立即清除帧缓冲区 (提速修改) +ClearSpeedhack Tip = 有时速度更快(通常在移动设备上), 可能会导致图形故障 +CPU Core = CPU 核心模式 +Debugging = 调试设置 +DefaultCPUClockRequired = 警告:此游戏需要将 CPU 频率设置为默认。 +Deposterize = 色调融合 +Deposterize Tip = 修复纹理被放大时可见的带状错误 +Device = 设备 +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = 停用较慢的渲染效果 (提升速度) +Disabled = 禁用 +Display layout editor = 显示布局编辑器 +Display Resolution (HW scaler) = 显示分辨率 (硬件缩放) +Dump next frame to log = 转储下一帧到日志 +Enable Cardboard VR = 启用 Cardboard VR +FPS = 每秒帧数 (FPS) +Frame Rate Control = 帧率控制 +Frame Skipping = 跳帧 +Frame Skipping Type = 跳帧方式 +FullScreen = 全屏幕 +Hack Settings = 渲染修正 (可能引发故障) +Hardware Tessellation = 硬件曲面细分 +Hardware Transform = 硬件几何变换 +hardware transform error - falling back to software = 硬件几何变换错误, 改回软件模式 +HardwareTessellation Tip = 使用硬件绘制曲线, 使用固定的质量 +High = 高 +Hybrid = 混合 +Hybrid + Bicubic = 混合 + 双三次 +Ignore camera notch when centering = 居中时忽略摄像头缺口 +Internal Resolution = 内部分辨率 +Lazy texture caching = 减少缓存存取 (提升速度) +Linear = 线性过滤 +Low = 低 +LowCurves = 低品质样条函数/贝塞尔曲线 (提升速度) +LowCurves Tip = 仅用于某些游戏, 控制曲线的平滑度 +Lower resolution for effects (reduces artifacts) = 降低特效分辨率 (减少伪像) +Manual Scaling = 手动缩放 +Medium = 中 +Mode = 渲染模式 +Must Restart = 重启 PPSSPP 才能使这项设置生效。 +Native device resolution = 本机原生的分辨率 +Nearest = 邻近取样 +No buffer = 不缓冲 +Non-Buffered Rendering = 跳过缓冲效果 (非缓冲, 更快) +None = 不显示 +Number of Frames = 帧的数量 +Off = 关闭 +OpenGL = OpenGL +Overlay Information = 叠加信息 +Partial Stretch = 部分拉伸 +Percent of FPS = 帧率的百分比 +Performance = 性能 +Postprocessing effect = 后处理效果 +Postprocessing Shader = 后处理着色器 +Recreate Activity = Recreate activity +Render duplicate frames to 60hz = 渲染重复帧至60 Hz +RenderDuplicateFrames Tip = 在以较低帧速率运行的游戏中可以使帧速率更平滑 +Rendering Mode = 渲染模式 +Rendering Resolution = 渲染分辨率 +RenderingMode NonBuffered Tip = 更快, 但可能在某些游戏中没有图像渲染 +Retain changed textures = 保留已更改的纹理 (有时更慢) +RetainChangedTextures Tip = 使较多游戏速度变慢, 但有些游戏变得快了很多 +Rotation = 旋转 +Safe = 安全 +Screen layout = 屏幕布局 +Screen Scaling Filter = 屏幕缩放滤镜 +Show Debug Statistics = 显示调试信息 +Show FPS Counter = 显示 FPS 计数器 +Simulate Block Transfer = 模拟数据块传输效果 +SoftGPU Tip = 目前非常慢 +Software Rendering = 软件渲染 (慢) +Software Skinning = 软件蒙皮 +SoftwareSkinning Tip = 合并 CPU 中已经蒙皮的模型绘制, 在较多游戏中更快 +Speed = 运行速度 +Stretching = 拉伸 +Texture Filter = 纹理过滤方式 +Texture Filtering = 纹理过滤 +Texture Scaling = 纹理缩放 +Texture Shader = 纹理着色器 +Turn off Hardware Tessellation - unsupported = 关闭"硬件曲面细分":不支持 +Unlimited = 无限制 +Up to 1 = 最高为 1 +Up to 2 = 最高为 2 +Upscale Level = 纹理缩放级别 +Upscale Type = 纹理缩放方式 +UpscaleLevel Tip = CPU 重负载 - 为避免卡顿, 某些缩放可能会延迟 +Use all displays = 使用全部显示器 +Vertex Cache = 顶点缓存 +VertexCache Tip = 更快, 但可能会造成暂时性的闪屏 +VSync = 垂直同步 +Vulkan = Vulkan +Window Size = 窗口大小 +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = 删除 ZIP 文件 +Install = 安装 +Install game from ZIP file? = 从 ZIP 文件安装游戏? +Install textures from ZIP file? = 从 ZIP 文件安装纹理包? +Installed! = 安装完成! +Texture pack doesn't support install = 此纹理包不支持安装 +Zip archive corrupt = ZIP 文档损坏 +Zip file does not contain PSP software = ZIP 文件不包含 PSP 软件 + +[KeyMapping] +Autoconfigure = 自动配置 +Autoconfigure for device = 自动根据设备配置 +Clear All = 全部清除 +Default All = 恢复默认 +Map a new key for = 映射该键的新按键 +Map Key = 按键映射 +Map Mouse = 鼠标映射 +Test Analogs = 测试摇杆 +You can press ESC to cancel. = 您可以按下 ESC 键取消 + +[MainMenu] +Browse = 浏览... +Buy PPSSPP Gold = 购买黄金版 +Choose folder = 选择文件夹 +Credits = 开发团队 +PPSSPP Homebrew Store = 从 PPSSPP 自制软件商店下载 +Exit = 退出程序 +Game Settings = 游戏设置 +Games = 载入新游戏 +Give PPSSPP permission to access storage = 给予 PPSSPP 访问存储器的权限 +Homebrew & Demos = 自制游戏与试玩 +How to get games = 如何获得游戏? +How to get homebrew & demos = 如何获得自制游戏与试玩? +Load = 载入游戏... +Loading... = 载入中... +PinPath = 固定 +PPSSPP can't load games or save right now = PPSSPP 现在不能载入游戏或存档 +Recent = 最近的游戏 +SavesAreTemporary = PPSSPP 正在临时空间内存档 +SavesAreTemporaryGuidance = 请将 PPSSPP 解压出来以使存档永久保留 +SavesAreTemporaryIgnore = 忽略警告 +UnpinPath = 取消固定 +www.ppsspp.org = 访问官网 + +[MainSettings] +Audio = 声音设置 +Controls = 控制设置 +Graphics = 图像设置 +Networking = 网络设置 +System = 系统设置 +Tools = 工具 + +[MappableControls] +Alt speed 1 = 自定义速度 +Alt speed 2 = 自定义速度 2 +An.Down = 左摇杆:下 +An.Left = 左摇杆:左 +An.Right = 左摇杆:右 +An.Up = 左摇杆:上 +Analog limiter = 摇杆限制器 +Analog Stick = 左摇杆 +Audio/Video Recording = 音频/视频录制 +Auto Analog Rotation (CCW) = 自动旋转摇杆(逆时针) +Auto Analog Rotation (CW) = 自动旋转摇杆(顺时针) +AxisSwap = 摇杆互换 +Circle = 圈 +Cross = 叉 +D-pad down = 方向键:下 +D-pad left = 方向键:左 +D-pad right = 方向键:右 +D-pad up = 方向键:上 +DevMenu = 开发者菜单 +Down = 方向键:下 +Dpad = 方向键 +Frame Advance = 逐帧播放 +Hold = Hold +Home = Home +L = L +Left = 方向键:左 +Load State = 载入即时存档 +Mute toggle = 静音按钮 +Next Slot = 下个即时存档插槽 +None = 没有 +Note = Note +OpenChat = 打开聊天 +Pause = 暂停按钮 +R = R +RapidFire = 连射按钮 +Remote hold = Remote hold +Rewind = 倒带 +Right = 方向键:右 +Right Analog Stick (tap to customize) = 右模拟摇杆(点按以自定义) +RightAn.Down = 右摇杆:下 +RightAn.Left = 右摇杆:左 +RightAn.Right = 右摇杆:右 +RightAn.Up = 右摇杆:上 +Rotate Analog (CCW) = 旋转摇杆 (逆时针) +Rotate Analog (CW) = 旋转摇杆 (顺时针) +Save State = 保存即时存档 +Screen = Screen +Screenshot = 屏幕截图 +Select = Select +SpeedToggle = 加速按钮 +Square = 方形 +Start = Start +Texture Dumping = 纹理转储 +Texture Replacement = 纹理替换 +Toggle Fullscreen = 切换全屏 +Toggle mode = Toggle mode +Triangle = 三角 +Unthrottle = 解除限速 +Up = 方向键:上 +Vol + = 音量 + +Vol - = 音量 - +Wlan = 无线网络 + +[Networking] +Adhoc Multiplayer forum = 访问官方 Ad Hoc 联机论坛 (英文) +AdHoc Server = Ad Hoc 服务器 +AdhocServer Failed to Bind Port = 无法绑定Adhoc服务器端口 +Auto = 自动 +Bottom Center = 正下方 +Bottom Left = 左下方 +Bottom Right = 右下方 +Center Left = 左中间 +Center Right = 右中间 +Change Mac Address = 更改 MAC 地址 +Change proAdhocServer Address = 更改 PRO Ad Hoc 服务器 IP 地址 (localhost = 多个实例) +Chat = 聊天 +Chat Button Position = 聊天按钮位置 +Chat Here = 在这里聊天 +Chat Screen Position = 聊天屏幕位置 +Disconnected from AdhocServer = 与Adhoc服务器断开连接 +DNS Error Resolving = DNS错误解析 +Enable built-in PRO Adhoc Server = 启用内置 PRO Ad Hoc 服务器 +Enable network chat = 启用聊天 +Enable networking = 启用联网/无线网络 (测试) +Enable UPnP = 启用UPnP(需要几秒钟来检测) +EnableQuickChat = 启用快速聊天 +Enter a new PSP nickname = 输入新的PSP昵称 +Enter Quick Chat 1 = 输入快速聊天1 +Enter Quick Chat 2 = 输入快速聊天2 +Enter Quick Chat 3 = 输入快速聊天3 +Enter Quick Chat 4 = 输入快速聊天4 +Enter Quick Chat 5 = 输入快速聊天5 +Error = 错误 +Failed to Bind Localhost IP = 无法绑定本地主机IP +Failed to Bind Port = 无法绑定端口 +Failed to connect to Adhoc Server = 无法连接Adhoc服务器 +Forced First Connect = 强制首次连接(更快的连接) +Invalid IP or hostname = IP 或主机名是无效的 +Minimum Timeout = 最小超时(以毫秒为单位,0 =默认值) +Misc = 其他(默认= PSP兼容性) +Network Initialized = 网络已初始化 +Please change your Port Offset = 请更改您的端口偏移 +Port offset = 端口偏移 (0 = PSP 实机兼容) +proAdhocServer Address: = Ad hoc 服务器地址: +Quick Chat 1 = 快速聊天1 +Quick Chat 2 = 快速聊天2 +Quick Chat 3 = 快速聊天3 +Quick Chat 4 = 快速聊天4 +Quick Chat 5 = 快速聊天5 +QuickChat = 快速聊天 +Send = 发送 +Send Discord Presence information = 发送 Discord "Rich Presence" 信息 +TCP No Delay = TCP无延迟(更快的TCP) +Top Center = 正上方 +Top Left = 左上方 +Top Right = 右上方 +Unable to find UPnP device = 找不到UPnP设备 +UPnP (port-forwarding) = UPnP(端口转发) +UPnP need to be reinitialized = UPnP需要重新初始化 +UPnP use original port = UPnP使用原始端口(已启用= PSP兼容性) +Validating address... = 正在验证地址... +WLAN Channel = WLAN 频道 +You're in Offline Mode, go to lobby or online hall = 您现在是离线模式, 请进入房间或着在线大厅 + +[Pause] +Cheats = 金手指 +Continue = 继续游戏 +Create Game Config = 建立游戏配置 +Delete Game Config = 删除游戏配置 +Exit to menu = 返回主菜单 +Game Settings = 游戏设置 +Load State = 载入即时存档 +Rewind = 倒带 +Save State = 保存即时存档 +Settings = 设置 +Switch UMD = 切换 UMD 光盘 + +[PostShaders] +(duplicated setting, previous slider will be used) = (设置重复, 将使用上面滑块的值) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Color +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Cartoon +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT 扫描线 +FXAA = FXAA (快速近似抗锯齿) +Gamma = Gamma +Grayscale = Grayscale (灰度图) +Intensity = Intensity +InverseColors = 反色 +Natural = 自然色 +NaturalA = 自然色 (无模糊) +Off = 关闭 +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = 扫描线 (CRT) +Sharpen = 锐化 +SSAA(Gauss) = SuperSamplingAA (超级采样抗锯齿:高斯) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 Upscaler +VideoSmoothingAA = VideoSmoothingAA (视频平滑抗锯齿) +Vignette = Vignette (暗角) + +[PSPCredits] +all the forum mods = 所有的论坛管理员 +build server = 编译服务器 +Buy Gold = 购买黄金版 +check = 同时请查阅海豚模拟器, 最好用的 Wii/GC 模拟器 +CheckOutPPSSPP = 查阅 PPSSPP, 一款超级棒的 PSP 模拟器:https://www.ppsspp.org/ +contributors = 参与者: +created = 作者: +Discord = Discord +info1 = PPSSPP 只用于教学研究, 不应被用于商业用途。 +info2 = 请确认您持有游戏镜像的正版拷贝: +info3 = 这可以是您购买了游戏的 UMD 光盘, +info4 = 或者通过 PSP 在 PSN 商店购买的数字版游戏。 +info5 = PSP™ 是索尼公司的注册商标。 +iOS builds = 负责 iOS 编译 +license = 遵循 GPL 2.0+ 许可协议的自由软件 +list = 以了解兼容性列表、官方论坛以及开发动态 +PPSSPP Forums = PPSSPP 官方论坛 +Privacy Policy = 隐私政策 +Share PPSSPP = 分享 PPSSPP +specialthanks = 鸣谢: +specialthanksKeithGalocy = 的硬件工作和指导, 他来自 NVIDIA +specialthanksMaxim = 的出色的 Atrac3 + 解码器工作 +testing = 负责测试 +this translation by = 界面汉化: +title = 效率高、移植性好的 PSP 模拟器 +tools = 使用的第三方开源库: +# 在这里添加PPSSPP界面汉化人员的名单 +# translators1-6这6行用于添加汉化人员名单 for up to 6 lines of translator credits. +# 不需要的行留空,一行4个人这样的排版看起来比较合适. +translators1 = sum2012, kaienfr, raven02, aquanull, xiwo4525 +translators2 = wuspring, zzq920817, W-MS, xzapk, Arthur200000 +translators3 = Playhi, PeaceShi, Nargacuga, driver1998 +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = 请查阅官方网站 +written = 使用 C++ 编写以保证速度与移植性 + +[RemoteISO] +Browse Games = 浏览游戏 +Local Server Port = 本地服务器端口 +Manual Mode Client = 手动配置客户端 +Remote disc streaming = 远程游戏串流 +Remote Port = 远程端口 +Remote Server = 远程服务器 +Remote Subdirectory = 远程子目录 +RemoteISODesc = 您最近列表中的游戏将被共享 +RemoteISOLoading = 已连接, 正在载入游戏列表... +RemoteISOScanning = 扫描中...在您的服务器设备上点击"共享游戏" +RemoteISOScanningTimeout = 扫描中...请检查您防火墙的设置 +RemoteISOWifi = 说明: 请将设备连接到同一 Wi-Fi 网络下 +RemoteISOWinFirewall = 警告: Windows 防火墙正在阻挡游戏共享 +Settings = 设置 +Share Games (Server) = 共享游戏 (服务器) +Share on PPSSPP startup = PPSSPP 启动时共享 +Stop Sharing = 停止共享 +Stopping.. = 正在停止... + +[Reporting] +Bad = 很差 +FeedbackDelayInfo = 您的数据正在后台提交。 +FeedbackDesc = 模拟兼容性怎样?请告诉我们和社区! +FeedbackDisabled = 必须启用"向服务器报告兼容性问题"选项 +FeedbackIncludeCRC = 注意:将使用部分电量发送 CRC 校验 +FeedbackIncludeScreen = 包含一张截图 +FeedbackSubmitDone = 您的数据已提交。 +FeedbackSubmitFail = 无法向服务器提交数据。尝试更新 PPSSPP。 +FeedbackThanks = 感谢您的反馈! +Gameplay = 游戏过程 +Graphics = 图像 +Great = 很好 +In-game = 在游戏中 +In-game Description = 可以进入游戏, 但是 bug 太多无法完成游戏 +Menu/Intro = 菜单/开头 +Menu/Intro Description = 无法进入游戏 +Nothing = 没画面 +Nothing Description = 彻底损坏 +OK = 好 +Open Browser = 打开报告网站 +Overall = 总体 +Perfect = 完美 +Perfect Description = 完美模拟整个游戏 - 太棒了! +Plays = 可玩 +Plays Description = 完全可玩, 但有时会出现故障 +ReportButton = 报告反馈 +Speed = 速度 +Submit Feedback = 提交反馈 +SuggestionConfig = 请参阅网站上的报告以了解最佳设置。 +SuggestionCPUSpeed0 = 请禁用锁定 CPU 速度设置。 +SuggestionDowngrade = 请降级到较旧的 PPSSPP 版本 (请报告这个错误)。 +SuggestionsFound = 其他用户报告了更佳的结果。点击"查看所有反馈"了解更多详情。 +SuggestionsNone = 其他用户也不能运行该游戏。 +SuggestionsWaiting = 提交中, 并检查其他用户的反馈... +SuggestionUpgrade = 请更新到较新版本的 PPSSPP +SuggestionVerifyDisc = 请检查您的 ISO 是否为光盘的正确拷贝。 +Unselected Overall Description = 这款游戏模拟的怎样? +View Feedback = 查看所有反馈 + +[Savedata] +Date = 日期 +Filename = 文件名 +No screenshot = 没有截图 +None yet. Things will appear here after you save. = 暂无。在你保存后将会在此出现存档。 +Save Data = 保存的存档 +Save States = 保存的即时存档 +Savedata Manager = 存档数据管理器 +Size = 大小 + +[Screen] +Cardboard VR OFF = Cardboard VR 关闭 +Chainfire3DWarning = 警告:检测到 Chainfire3D (3D 神器), 可能会导致问题。 +Failed to load state = 无法载入即时存档 +Failed to save state = 无法保存即时存档 +fixed = 速度:自定义 +GLToolsWarning = 警告:检测到 GLTools, 可能会导致问题。 +In menu = 在菜单中 +Load savestate failed = 无法载入即时存档 +Loaded State = 已载入即时存档 +Loaded. Save in game, restart, and load for less bugs. = 已载入。请在游戏中存档, 重开, 再次读档以减少 bug。 +LoadStateDoesntExist = 即时存档载入失败:存档不存在 +LoadStateWrongVersion = 即时存档载入失败:存档是旧版本 PPSSPP 的 +norewind = 没有可用的倒带自动即时存档。 +Playing = 游戏中 +PressESC = 按下 ESC 键打开暂停菜单。 +replaceTextures_false = 纹理替换已关闭。 +replaceTextures_true = 纹理替换已启用。 +Save State Failed = 无法保存即时存档 +Saved State = 已保存即时存档 +saveNewTextures_false = 纹理转储已停止。 +saveNewTextures_true = 开始转储新纹理。 +SpeedCustom2 = 速度:自定义 2 +standard = 速度:标准 +Untitled PSP game = 无标题的 PSP 游戏 + +[Store] +Already Installed = 已安装 +Connection Error = 网络错误 +Install = 安装 +Launch Game = 开始游戏 +Loading... = 载入中... +MB = MB +Size = 大小 +Uninstall = 卸载 + +[SysInfo] +%d (%d per core, %d cores) = %d (每核心 %d 线程, %d 核心) +%d bytes = %d 字节 +(none detected) = (未检测到) +3D API = 3D API +ABI = ABI +API Version = API 版本 +Audio Information = 音频信息 +Board = 主板 +Build Config = 编译配置 +Build Configuration = 编译配置 +Built by = 编译者 +Core Context = 核心上下文 +Cores = 核心数 +CPU Extensions = CPU 扩展 +CPU Information = CPU 信息 +CPU Name = 名称 +D3DCompiler Version = D3DCompiler 版本 +Debug = 调试 +Debugger Present = 调试器已连接 +Device Info = 设备信息 +Display Information = 显示信息 +Driver Version = 驱动程序版本 +EGL Extensions = EGL 扩展 +Frames per buffer = 每缓冲区帧数 +GPU Information = GPU 信息 +High precision float range = 高精度浮点范围 +High precision int range = 高精度整数范围 +Lang/Region = 语言/区域 +Memory Page Size = 内存页大小 +Native Resolution = 原生分辨率 +OGL Extensions = OGL 扩展 +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 扩展 +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 扩展 +OpenGL Extensions = OpenGL 扩展 +Optimal frames per buffer = 最佳每缓冲区帧数 +Optimal sample rate = 最佳采样率 +OS Information = OS 信息 +PPSSPP build = PPSSPP 编译版本 +Refresh rate = 刷新率 +Release = 发布 +RW/RX exclusive = RW/RX 独占 +Sample rate = 采样率 +Shading Language = 着色语言 +Sustained perf mode = 持久性能模式 +System Information = 系统信息 +System Name = 名称 +System Version = 系统版本 +Threads = 线程数 +Vendor = 供应商 +Vendor (detected) = 供应商 (检测到的) +Version Information = 版本信息 +Vulkan Extensions = Vulkan 扩展 +Vulkan Features = Vulkan 特性 + +[System] +(broken) = (损坏) +12HR = 12 小时制 +24HR = 24 小时制 +Auto = 自动 +Auto Load Savestate = 自动载入即时存档 +AVI Dump started. = AVI 转储开始 +AVI Dump stopped. = AVI 转储停止 +Cache ISO in RAM = 在内存中缓存完整 ISO +Change CPU Clock = 修改模拟的 PSP 的 CPU 频率 (不稳定) +Change Memory Stick folder = 修改记忆棒文件夹 +Change Memory Stick Size = 更改记忆棒的大小(GB) +Change Nickname = 修改昵称 +ChangingMemstickPath = 游戏存档、即时存档及其它数据不会复制到新路径。\n\n确定要修改记忆棒文件夹吗? +ChangingMemstickPathInvalid = 目标路径不能用于保存记忆棒数据。 +ChangingMemstickPathNotExists = 目标文件夹不存在。\n\n游戏存档、即时存档及其它数据不会复制到新路径。\n\n确定要创建新的记忆棒文件夹吗? +Cheats = 作弊设置 (实验性, 见论坛) +Clear Recent = 清除"最近的游戏" +Clear Recent Games List = 清除"最近的游戏"列表 +Clear UI background = 清除界面背景 +Confirmation Button = 确认按钮 +Date Format = 日期格式 +Day Light Saving = 夏令时 +DDMMYYYY = 日/月/年 +Decrease size = 减小尺寸 +Developer Tools = 开发者工具 +Display Extra Info = 显示附加信息 +Display Games on a grid = 以方格显示"载入新游戏" +Display Homebrew on a grid = 以方格显示"自制与试玩" +Display Recent on a grid = 以方格显示"最近的游戏" +Dynarec (JIT) = 动态重编译 (JIT) +Emulation = 模拟设置 +Enable Cheats = 开启金手指 +Enable Compatibility Server Reports = 向服务器报告兼容性问题 +Failed to load state. Error in the file system. = 无法载入即时存档。文件系统出错。 +Failed to save state. Error in the file system. = 无法保存即时存档。文件系统出错。 +Fast (lag on slow storage) = 快速 (在慢速存储上会延迟) +Fast Memory = 快速内存 (不稳定) +Force real clock sync (slower, less lag) = 强制同步实际时钟频率 (更慢,但是更少延迟) +frames, 0:off = 每几帧, 0 = 关 +Games list settings = 游戏列表设置 +General = 常规设置 +Grid icon size = 方格图标的尺寸 +Help the PPSSPP team = 帮助 PPSSPP 团队 +Host (bugs, less lag) = 主机 (有错误, 更少滞后) +I/O on thread (experimental) = 线程上的 I/O (实验性) +Ignore bad memory accesses = 忽略错误的内存访问 +Increase size = 增大尺寸 +Interpreter = 解释器 +IO timing method = I/O 计时方法 +IR Interpreter = IR 解释器 +Memory Stick Folder = 记忆棒文件夹 +Memory Stick inserted = 记忆棒已插入 +MHz, 0:default = MHz, 默认为 0 +MMDDYYYY = 月/日/年 +Newest Save = 最新的即时存档 +Not a PSP game = 这不是一个 PSP 游戏 +Off = 关闭 +Oldest Save = 最旧的即时存档 +PSP Model = PSP 机型 +PSP Settings = PSP 设置 +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = 录制音频 +Record Display = 录制视频 +Reset Recording on Save/Load State = 保存/载入存档时重置录制 +Restore Default Settings = 恢复默认 PPSSPP 设置 +Rewind Snapshot Frequency = 倒带自动即时存档频率 (mem hog) +Save path in installed.txt = 存档路径在 installed.txt +Save path in My Documents = 存档路径在我的文档 +Savestate Slot = 即时存档插槽 +Savestate slot backups = 即时存档插槽备份 +Screenshots as PNG = 将截图保存为 PNG 格式 +Set UI background... = 设置界面背景... +Show ID = 显示游戏 ID +Show region flag = 显示游戏区域标识 +Simulate UMD delays = 模拟 UMD 延迟 +Slot 1 = 插槽 1 +Slot 2 = 插槽 2 +Slot 3 = 插槽 3 +Slot 4 = 插槽 4 +Slot 5 = 插槽 5 +Storage full = 存储空间已满 +Sustained performance mode = 持久性能模式 (使长时间运行的应用运行更流畅) +Time Format = 时间格式 +UI = 用户界面 +UI Sound = 界面声音 +undo %c = 备份 %c +Use Lossless Video Codec (FFV1) = 使用无损视频编解码器 (FFV1) +Use O to confirm = 使用按钮 O 确认 +Use output buffer (with overlay) for recording = 录制时使用输出缓冲 (包括叠加信息) +Use system native keyboard = 使用系统本机键盘 +Use X to confirm = 使用按钮 X 确认 +VersionCheck = 检查 PPSSPP 新版本 +WARNING: Android battery save mode is on = 警告:安卓省电模式已开启 +WARNING: Battery save mode is on = 警告:省电模式已开启 +YYYYMMDD = 年/月/日 + +[Upgrade] +Details = 详细内容 +Dismiss = 忽略 +Download = 下载 +New version of PPSSPP available = 新版本 PPSSPP 可用 diff --git a/assets/lang/zh_TW.ini b/assets/lang/zh_TW.ini new file mode 100644 index 0000000000..16b9196266 --- /dev/null +++ b/assets/lang/zh_TW.ini @@ -0,0 +1,1072 @@ +[Audio] +Alternate speed volume = 自定義速度下的音量 +Audio backend = 音訊引擎 (需要重新啟動) +AudioBufferingForBluetooth = 藍牙友好緩衝區(較慢) +Auto = 自動 +Device = Device +DSound (compatible) = DirectSound (兼容) +Enable Sound = 啟用音效 +Global volume = 全局音量 +Microphone = Microphone +Microphone Device = 麥克風裝置 +Mute = Mute +Switch on new audio device = 開啟新的音頻設備 +Use global volume = 使用全局量 +WASAPI (fast) = WASAPI (快) + +[Controls] +Analog auto-rotation speed = 模擬自動轉速 +Analog Axis Sensitivity = 搖桿靈敏度 +Analog Limiter = 搖桿限制器 +Analog Mapper High End = 模擬映射器的高端 (軸靈敏度) +Analog Mapper Low End = 模擬映射器的低端 (反盲區) +Analog Mapper Mode = 模擬映射模式 +Analog Stick = 類比搖桿 +AnalogLimiter Tip = 按下模擬限制器按鈕時 +Auto = 自動 +Auto-centering analog stick = 自動定心搖桿 +Auto-hide buttons after seconds = 數秒後自動隱藏按鈕 +Binds = Binds +Button Opacity = 按鈕透明度 +Button style = 按鍵樣式 +Calibrate D-Pad = 校正方向鍵 +Calibration = 校正 +Classic = 傳統 +Combo Key Setting = 組合鍵設置 +Combo Key Setup = 組合鍵設置 +Confine Mouse = 在窗口/顯示區域內捕獲鼠標 +Control Mapping = 按鍵對應 +Custom layout... = 自訂佈局 +Customize tilt = 自訂傾斜 +D-PAD = 方向鍵 +Deadzone Radius = 死區半徑 +DInput Analog Settings = DInput 模擬設置 +Disable D-Pad diagonals (4-way touch) = 停用方向鍵對角線 (四方向觸控) +Glowing borders = Glowing borders +HapticFeedback = 按鍵反饋 (震動) +Ignore gamepads when not focused = 非作用時忽略遊戲手把 +Ignore Windows Key = 忽略 Windows 鍵 +Invert Axes = 軸反轉 +Invert Tilt along X axis = 沿 X 軸傾斜反轉 +Invert Tilt along Y axis = 沿 Y 軸傾斜反轉 +Keep this button pressed when right analog is pressed = 點擊右模擬鍵時保持點擊此按鈕 +Keyboard = 鍵盤控制設定 +L/R Trigger Buttons = L/R 觸發按鈕 +Landscape = 橫向 +Landscape Auto = 自動橫向 +Landscape Reversed = 橫向反轉 +Mouse = Mouse settings +Mouse sensitivity = 鼠標靈敏度 +Mouse smoothing = 鼠標平滑 +MouseControl Tip = 您現在可以在按鍵映射界面上按“ M”圖標來映射鼠標按鍵。 +None (Disabled) = 無 (停用) +Off = 關閉 +OnScreen = 顯示虛擬控制器 +Portrait = 縱向 +Portrait Reversed = 縱向反轉 +PSP Action Buttons = PSP 的功能鍵 +Screen Rotation = 螢幕旋轉 +seconds, 0 : off = 秒,0 = 關閉 +Sensitivity = 靈敏度 +Show right analog = 顯示右模擬 +Show Touch Pause Menu Button = 顯示觸控暫停選單鍵 +Thin borders = 薄邊框 +Tilt Base Radius = Tilt base radius +Tilt Input Type = 傾斜輸入類型 +Tilt Sensitivity along X axis = 沿 X 軸傾斜靈敏度 +Tilt Sensitivity along Y axis = 沿 Y 軸傾斜靈敏度 +To Calibrate = 請將裝置放在平面上,然後按「校正」。 +Touch Control Visibility = 觸控可視性 +Use custom right analog = 使用自定義右模擬 +Use Mouse Control = 使用鼠標控制 +Visibility = 可視設定 +X = X +X + Y = X + Y +XInput Analog Settings = XInput 模擬設置 +Y = Y + +[CwCheats] +Cheats = 金手指 +Edit Cheat File = 編輯金手指文件 +Enable/Disable All = 全部啟用/停用 +Import Cheats = 由 cheat.db 匯入 +Options = 選項 +Refresh Rate = 刷新率 + +[DesktopUI] +# If your language does not show well with the default font, you can use Font to specify a different one. +# Just add it to your language's ini file and uncomment it (remove the # by Font). +Font = Microsoft JhengHei +About PPSSPP... = 關於 PPSSPP... +Auto = 自動 +Backend = 繪圖引擎 (需要重新啟動) +Bicubic = 雙立方 +Break = Break +Break on Load = Break on load +Buffered Rendering = 緩衝渲染 +Buy Gold = 購買黃金版 +Control Mapping... = 按鍵對應... +Debugging = 除錯 +Deposterize = 色調混合 +Direct3D9 = Direct3D9 +Direct3D11 = Direct3D &11 +Disassembly = 反彙編 +Discord = Discord +Display Layout Editor = 自訂版面 +Display Rotation = 旋轉畫面 +Dump Next Frame to Log = 轉儲下一幀到除錯日誌 +Emulation = 模擬 +Enable Chat = Enable chat +Enable Cheats = 啓用金手指 +Enable Sound = 開啟聲音 +Exit = 離開 +Extract File... = 提取檔案... +File = 檔案 +Frame Skipping = 跳幀 +Frame Skipping Type = 跳幀類型 +Fullscreen = 全螢幕 +Game Settings = 遊戲設定 +GE Debugger... = GE 除錯器 +GitHub = Git&Hub +Hardware Transform = 硬體幾何轉換 +Help = 幫助 +Hybrid = 混合 +Hybrid + Bicubic = 混合 + 雙立方 +Ignore Illegal Reads/Writes = 忽略非法存取 +Ignore Windows Key = 忽略 Windows 鍵 +Keep PPSSPP On Top = 保持 PPSSPP 視窗在最上層 +Landscape = 横向 +Landscape reversed = 橫向反轉 +Language... = 語言設定 +Linear = 線性 +Load = 載入遊戲... +Load .sym File... = 載入 .sym 檔案... +Load Map File... = 載入 Map 檔案... +Load State = 載入即時存檔 +Load State File... = 載入即時存檔檔案... +Log Console = 控制台日誌 +Memory View... = 查看記憶體... +More Settings... = 更多設定 +Nearest = &Nearest +Non-Buffered Rendering = 跳過緩衝效果 (不緩衝,速度更快) +Off = 關閉 +Open Directory... = 打開目錄... +Open from MS:/PSP/GAME... = 打開 MS:/PSP/GAME... +Open Memory Stick = 打開記憶卡 +Open New Instance = 打開新實例 +OpenGL = OpenGL +Pause = 暫停 +Pause When Not Focused = 非使用中時暫停 +Portrait = 縱向 +Portrait reversed = 縱向反轉 +Postprocessing Shader = 後處理著色器 +PPSSPP Forums = PPSSPP 官方論壇 +Record = 錄製 +Record Audio = 錄音 +Record Display = 錄製畫面 +Rendering Mode = 渲染模式 +Rendering Resolution = 渲染解析度 +Reset = 重置 +Reset Symbol Table = 重置符號表 +Run = 執行 +Save .sym File... = 保存 .sym 檔案... +Save Map File... = 保存 Map 檔案... +Save State = 即時存檔 +Save State File... = 保存即時存檔檔案... +Savestate Slot = 即時存檔插槽 +Screen Scaling Filter = 螢幕縮放濾鏡 +Show Debug Statistics = 顯示除錯數據 +Show FPS Counter = 顯示 FPS 計數器 +Skip Number of Frames = 跳過幀數 +Skip Percent of FPS = 跳過FPS的百分比 +Stop = 停止 +Switch UMD = 切換光碟 +Take Screenshot = 截圖 +Texture Filtering = 紋理過濾 +Texture Scaling = 紋理縮放 +Use Lossless Video Codec (FFV1) = 使用無損視訊轉碼器 (FFV1) +Use output buffer for video = 將輸出緩衝區用於視頻 +Vertex Cache = 頂點快取 +VSync = 垂直同步 +Vulkan = Vulkan +Window Size = 視窗大小 +www.ppsspp.org = 拜訪 www.&ppsspp.org +xBRZ = &xBRZ + +[Developer] +Allocator Viewer = 分配器查看器(Vulkan) +Allow remote debugger = 允許遠程調試器 +Backspace = 向前刪除 +Block address = 區塊位址 +By Address = 由位址 +Copy savestates to memstick root = 副本保存狀態,以記憶棒根目錄 +Create/Open textures.ini file for current game = 創建/打開當前游戲的textures.ini文件 +Current = 目前 +Dev Tools = 開發工具 +DevMenu = 開發菜單 +Disabled JIT functionality = 禁用JIT功能 +Draw Frametimes Graph = 繪製幀時間圖 +Dump Decrypted Eboot = 載入遊戲時,轉儲已解密的 EBOOT.BIN +Dump Frame GPU Commands = 轉儲幀 GPU 指令 +Enable driver bug workarounds = 啟用驅動程序錯誤解決方法 +Enable Logging = 啟用日誌 +Enter address = 輸入位址 +FPU = FPU +Framedump tests = 幀轉儲測試 +Frame Profiler = 幀分析器 +GPU Driver Test = GPU 驅動程序測試 +GPU Profile = GPU 配置文件 +Jit Compare = Jit 比較 +JIT debug tools = JIT調試工具 +Language = 語言設定 +Load language ini = 載入語言設定 +Log Dropped Frame Statistics = 日志丟棄幀統計信息 +Log Level = 日誌級別 +Log View = 查看日誌 +Logging Channels = 記錄頻道 +Next = 下一個 +No block = 沒有記憶體區塊 +Prev = 上一個 +Random = 隨機 +Replace textures = 紋理更換 +Reset limited logging = 重置受限日誌 +RestoreDefaultSettings = 你確定要所有設定還原到預設值 (除了按鍵配置)?\n此動作無法恢復。\n需要重新啟動 PPSSPP,變更才會生效。 +RestoreGameDefaultSettings = 你確定要恢復特定遊戲的設置,\n回到 PPSSPP 的預設值? +Resume = Resume +Run CPU Tests = 執行 CPU 測試 +Save language ini = 儲存語言設定 +Save new textures = 保存新纹理 +Shader Viewer = 著色器查看器 +Show Developer Menu = 顯示開發者選單 +Show on-screen messages = 顯示屏幕消息 +Stats = 統計 +System Information = 系統資料 +Texture Replacement = 纹理更换 +Toggle Audio Debug = 切換音訊除錯 +Toggle Freeze = 切換凍結 +Touchscreen Test = 觸摸屏測試 +VFPU = VFPU + +[Dialog] +* PSP res = * PSP 解析度 +Active = Active +Back = 返回 +Cancel = 取消 +Center = 中間 +ChangingGPUBackends = 改變渲染引擎之後需要重新啟動 PPSSPP。現在重新啟動嗎? +ChangingInflightFrames = 更改圖形命令緩衝要求PPSSPP重新啟動。 現在重啟? +Channel: = Channel: +Choose PPSSPP save folder = 選擇 PPSSPP 的存檔資料夾 +Confirm Overwrite = 你要覆蓋這份檔案嗎? +Confirm Save = 你要儲存這份檔案嗎? +ConfirmLoad = 你要載入這份檔案嗎? +ConnectingAP = 連接到接入點\n請稍候... +ConnectingPleaseWait = 連接中.\n請稍候... +ConnectionName = 連接名稱 +Corrupted Data = 數據損壞 +Delete = 刪除 +Delete all = 全部刪除 +Delete completed = 檔案已刪除。 +DeleteConfirm = 這份檔案將被刪除。\n你確定要繼續嗎? +DeleteConfirmAll = 你確定要刪除此遊戲的所有檔案? +DeleteConfirmGame = 你確定要刪除此遊戲?\n此動作無法還原。 +DeleteConfirmGameConfig = 你確定要刪除這個遊戲的設置? +DeleteFailed = 無法刪除資料。 +Deleting = 刪除中\n請稍候... +Disable All = 禁用所有 +Edit = Edit +Enable All = 全部啟用 +Enter = 決定 +Finish = 完成 +Grid = 格 +Inactive = 不活躍 +InternalError = 發生了一個內部錯誤. +Load = 載入 +Load completed = 檔案已載入。 +Loading = 載入中\n請稍候... +LoadingFailed = 無法載入資料。 +Move = 位置設定 +Network Connection = 網路連線 +NEW DATA = 建立新檔案 +No = 否 +ObtainingIP = 獲取IP地址.\n請稍候... +OK = 確定 +Old savedata detected = 偵測到舊版的存檔資料 +Options = 選項 +Reset = 重設 +Resize = 大小設定 +Retry = 重新嘗試 +Save = 儲存 +Save completed = 檔案已儲存。 +Saving = 儲存中\n請稍候... +SavingFailed = 無法儲存資料。 +Select = 選擇 +Shift = 翻頁 +Snap = Snap +Space = 空格鍵 +SSID = SSID +Submit = 提交 +Supported = Supported +There is no data = 沒有檔案。 +Toggle All = 切換全部 +Toggle List = Toggle list +Unsupported = Unsupported +When you save, it will load on a PSP, but not an older PPSSPP = 當您保存,它會加載一個真正的PSP,但不是舊版本PPSSPP +When you save, it will not work on outdated PSP Firmware anymore = 保存後,它將不再適用於過時的PSP固件 +Yes = 是 +Zoom = 放大 + +[Error] +7z file detected (Require 7-Zip) = 檔案是 7z 壓縮檔。\n請先解壓縮 (使用 7-zip 或 WinRAR)。 +A PSP game couldn't be found on the disc. = 光盤上找不到PSP遊戲. +Cannot boot ELF located outside mountRoot. = 無法引導位於裝載根外部的ELF. +Could not save screenshot file = 無法保存截圖檔案 +D3D9or11 = Direct3D 9? (or "no" for Direct3D 11) +D3D11CompilerMissing = D3DCompiler_47.dll 未找到。 請安裝。 或者按“是”,再次嘗試使用Direct3D 9。 +D3D11InitializationError = Direct3D 11 初始化錯誤 +D3D11Missing = 您的操作系統版本不包括D3D11。 請運行Windows Update.\n\n按是,嘗試使用Direct3D 9. +D3D11NotSupported = 您的GPU似乎不支持Direct3D 11.\n\n您是否想改用Direct3D 9? +Disk full while writing data = 寫入數據時硬碟空間不足 +ELF file truncated - can't load = ELF文件被截斷-無法加載 +Error loading file = 檔案載入錯誤 +Error reading file = 讀取檔案錯誤 +Failed initializing CPU/Memory = 初始化CPU或內存失敗 +Failed to identify file = 未能識別檔案 +Failed to load executable: = 無法加載可執行文件: +File corrupt = File corrupt +Game disc read error - ISO corrupt = 遊戲光盤讀取錯誤:ISO損壞. +GenericAllStartupError = PPSSPP無法使用任何圖形後端啟動。 嘗試升級圖形和其他驅動程序. +GenericBackendSwitchCrash = 啟動時PPSSPP崩潰了.\n\n這通常意味著圖形驅動程序問題。 嘗試升級圖形驅動程序.\n\n圖形後端已切換: +GenericDirect3D9Error = 圖形初始化失敗,請試著更新你的圖形驅動程式與 DirectX 9 runtime。\n\n你要切換到 OpenGL 試試看嗎?\n\n錯誤訊息: +GenericGraphicsError = 圖形錯誤 +GenericOpenGLError = 圖形初始化失敗,請試著更新你的圖形驅動程式。\n\n你要切換到 DirectX 9 試試看嗎?\n\n錯誤訊息: +GenericVulkanError = 初始化圖形失敗。 嘗試升級圖形驅動程序.\n\n您想嘗試切換到OpenGL嗎?\n\n錯誤信息: +InsufficientOpenGLDriver = 偵測到 OpenGL 驅動程式的支援不足\n\n你想嘗試​​ DirectX 嗎?\n\n目前兼容 DirectX 的遊戲較少,但對你的 GPU 而言可能是唯一的選擇。 +Just a directory. = 只是一個目錄。 +Missing key = Missing key +MsgErrorCode = 錯誤代碼: +MsgErrorSavedataDataBroken = 保存數據已損壞. +MsgErrorSavedataMSFull = 記憶棒已滿. 檢查您的存儲空間. +MsgErrorSavedataNoData = 警告:未找到保存數據. +MsgErrorSavedataNoMS = 未插入記憶棒. +No EBOOT.PBP, misidentified game = 沒有 EBOOT.PBP,錯誤識別遊戲。 +Not a valid disc image. = 無效的光盤映像. +OpenGLDriverError = OpenGL 驅動程式錯誤 +PPSSPP doesn't support UMD Music. = PPSSPP不支持UMD音樂 +PPSSPP doesn't support UMD Video. = PPSSPP不支持UMD視頻 +PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP玩PSP遊戲,而不是PlayStation 1或2遊戲. +PPSSPPDoesNotSupportInternet = PPSSPP 目前不支援透過網路進行 DLC、PSN 或更新遊戲 +PS1 EBOOTs are not supported by PPSSPP. = PPSSPP 不支援 PS1 EBOOTS +PSX game image detected. = 抱歉,不支援 PSX 遊戲 +RAR file detected (Require UnRAR) = 檔案是 RAR 壓縮檔。\ n請先解壓縮 (需使用 UnRAR)。 +RAR file detected (Require WINRAR) = 檔案是 RAR 壓縮檔。\ n請先解壓縮 (需使用 WinRAR)。 +Running slow: try frameskip, sound is choppy when slow = 運行速度慢:嘗試跳幀,聲音不連貫時慢 +Running slow: Try turning off Software Rendering = 運行緩慢:嘗試關閉“軟件渲染” +Save encryption failed. This save won't work on real PSP = 存檔加密失敗。真正的 PSP 將無法讀取這份存檔 +textures.ini filenames may not be cross-platform = "textures.ini" 文件名可能不是跨平台的。 +This is a saved state, not a game. = 這是保存狀態,而不是遊戲。 +This is save data, not a game. = 這是保存數據,而不是遊戲。 +Unable to create cheat file, disk may be full = 無法建立金手指文件,硬碟可能已滿 +Unable to initialize rendering engine. = 無法初始化渲染引擎。 +Unable to write savedata, disk may be full = 無法記錄,硬碟可能已滿 +Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = 警告:視訊記憶體已滿,降低像素提升並切換到慢速快取模式。 +Warning: Video memory FULL, switching to slow caching mode = 警告:視訊記憶體已滿,切換到慢速快取模式。 +ZIP file detected (Require UnRAR) = 檔案是 ZIP 壓縮檔。\ n請先解壓縮 (需使用 UnRAR)。 +ZIP file detected (Require WINRAR) = 檔案是 ZIP 壓縮檔。\ n請先解壓縮 (需使用 WinRAR)。 + +[Game] +Asia = Asia +ConfirmDelete = 確定 +Create Game Config = 建立遊戲配置 +Create Shortcut = 建立捷徑 +Delete Game = 刪除遊戲 +Delete Game Config = 刪除遊戲配置 +Delete Save Data = 刪除存檔 +Europe = Europe +Game = 遊戲 +Game Settings = 遊戲設定 +Homebrew = Homebrew +Hong Kong = Hong Kong +InstallData = 安裝數據 +Japan = Japan +Korea = Korea +MB = MB +One moment please... = 稍等一會兒... +Play = 開始遊戲 +Remove From Recent = 刪除此記錄 +SaveData = 存檔 +Setting Background = 設置背景 +Show In Folder = 顯示資料夾 +USA = USA +Use UI background = 使用UI背景 + +[Graphics] +% of the void = % of the void +% of viewport = % of viewport +%, 0:unlimited = %,0 = 無限 +(supersampling) = (supersampling) +(upscaling) = (倍增) +1x PSP = 1倍PSP +2x = 2倍 +2x PSP = 2倍PSP +3x = 3倍 +3x PSP = 3倍PSP +4x = 4倍 +4x PSP = 4倍PSP +5x = 5倍 +5x PSP = 5倍PSP +6x PSP = 6倍PSP +7x PSP = 7倍PSP +8x = 8倍 +8x PSP = 8倍PSP +9x PSP = 9倍PSP +10x PSP = 10倍PSP +16x = 16倍 +Aggressive = 激進 +Alternative Speed = 速度控制 (%,0 = 無限) +Alternative Speed 2 = 替代速度 2 (in %, 0 = 無限) +Anisotropic Filtering = 非等方性過濾 +Auto = 自動 +Auto (1:1) = 自動 (1:1) +Auto (same as Rendering) = 自動 (同渲染) +Auto FrameSkip = 自動跳幀 +Auto Scaling = 自動縮放 +Backend = 後端 +Balanced = 均衡 +Bicubic = 雙立方 +BlockTransfer Tip = 有些遊戲需要這樣才能開啟正確的圖形 +BlockTransferRequired = 警告:此遊戲需要將模擬塊傳輸模式設置為開。 +Both = 兩者 +Buffer graphics commands (faster, input lag) = 緩衝區圖形命令(更快,輸入延遲) +Buffered Rendering = 緩衝渲染 +BufferedRenderingRequired = 警告:此遊戲需要將“渲染模式”設置為“緩衝”。 +Camera = 相機 +Camera Device = 攝像頭設備 +Cardboard Screen Size = 螢幕大小 (視區%) +Cardboard Screen X Shift = 水平% +Cardboard Screen Y Shift = 垂直% +Cardboard VR Settings = Google Cardboard VR 設定 +Cheats = Cheats +Clear Speedhack = 初次使用時清除幀緩衝區(速度破解) +ClearSpeedhack Tip = 有時速度更快(通常在移動設備上),可能會導致圖形故障 +CPU Core = CPU core +Debugging = 除錯 +DefaultCPUClockRequired = 警告:此遊戲需要將CPU時鐘設置為默認值。 +Deposterize = 色調混合 +Deposterize Tip = 修復在紋理被放大時可能發生的小紋理內部毛刺 +Device = Device +Direct3D 9 = Direct3D 9 +Direct3D 11 = Direct3D 11 +Disable slower effects (speedup) = 停用較慢的效果 (提升速度) +Disabled = 已禁用 +Display layout editor = 自訂版面 +Display Resolution (HW scaler) = 顯示解析度 (硬體縮放) +Dump next frame to log = 將下一幀儲存到日誌 +Enable Cardboard VR = 啟用Cardboard VR +FPS = FPS +Frame Rate Control = 幀速率控制 +Frame Skipping = 跳幀 +Frame Skipping Type = 跳幀類型 +FullScreen = 全螢幕 +Hack Settings = 修正設定 +Hardware Tessellation = 硬件曲面細分 +Hardware Transform = 硬體幾何轉換 +hardware transform error - falling back to software = 硬體轉換錯誤,改用軟體轉換 +HardwareTessellation Tip = Uses hardware to make curves +High = 高 +Hybrid = 混合 +Hybrid + Bicubic = 混合 + 雙立方 +Ignore camera notch when centering = 居中時忽略攝像頭缺口 +Internal Resolution = 內部分辨率 +Lazy texture caching = 緩慢紋理快取 (提升速度) +Linear = 線性 +Low = 低 +LowCurves = 樣條函數/貝茲曲線品質 +LowCurves Tip = 此選項將顯著提高/降低渲染樣條和貝塞爾曲線的質量 +Lower resolution for effects (reduces artifacts) = 降低效果的解析度 (減少失真) +Manual Scaling = 手動縮放 +Medium = 中 +Mode = 模式 +Must Restart = 你必須重新啟動 PPSSPP,此更改才會生效 +Native device resolution = 原生裝置的解析度 +Nearest = 鄰近取樣 +No buffer = No buffer +Non-Buffered Rendering = 非緩衝渲染 (跳過緩衝效果,較快速) +None = 關閉 +Number of Frames = 幀數 +Off = 關閉 +OpenGL = OpenGL +Overlay Information = 覆蓋訊息 +Partial Stretch = 局部拉伸 +Percent of FPS = FPS百分比 +Performance = 性能 +Postprocessing effect = 後處理效果 +Postprocessing Shader = 後期處理著色器 +Recreate Activity = 重新創建活動 +Render duplicate frames to 60hz = 渲染重複幀至60 Hz +RenderDuplicateFrames Tip = 在以較低幀速率運行的遊戲中可以使幀速率更平滑 +Rendering Mode = 渲染模式 +Rendering Resolution = 渲染解析度 +RenderingMode NonBuffered Tip = 較快速,但在某些遊戲中可能什麼都不會顯示 +Retain changed textures = 保留更改紋理 (有時更慢) +RetainChangedTextures Tip = 許多遊戲的速度變慢,但某些遊戲則變快許多 +Rotation = 旋轉 +Safe = 安全 +Screen layout = 屏幕佈局 +Screen Scaling Filter = 螢幕縮放濾鏡 +Show Debug Statistics = 顯示除錯數據 +Show FPS Counter = 顯示 FPS 計數器 +Simulate Block Transfer = 模擬塊傳送的影響 +SoftGPU Tip = 目前非常緩慢 +Software Rendering = 軟體渲染 +Software Skinning = 減少繪圖調用 (提升速度) +SoftwareSkinning Tip = 在使用高級皮膚技術的遊戲中減少繪圖和更快,但有些遊戲更慢 +Speed = 速度 +Stretching = 拉伸 +Texture Filter = 紋理過濾 +Texture Filtering = 紋理過濾 +Texture Scaling = 紋理縮放 +Texture Shader = 紋理著色器 +Turn off Hardware Tessellation - unsupported = 關閉“硬件曲面細分”:不支持 +Unlimited = 無限 +Up to 1 = 上到1 +Up to 2 = 上到2 +Upscale Level = 縮放倍率 +Upscale Type = 縮放類型 +UpscaleLevel Tip = CPU 的負擔大,某些縮放可能會延遲,以免遊戲不流暢 +Use all displays = 使用所有顯示 +Vertex Cache = 頂點快取 +VertexCache Tip = 速度更快,但可能會造成螢幕暫時閃爍 +VSync = 垂直同步 +Vulkan = Vulkan +Window Size = 視窗大小 +xBRZ = xBRZ + +[InstallZip] +Delete ZIP file = 刪除 ZIP 檔案 +Install = 安裝 +Install game from ZIP file? = 從 ZIP 檔案安裝遊戲? +Install textures from ZIP file? = 從ZIP文件安裝紋理? +Installed! = 安裝完成! +Texture pack doesn't support install = 紋理包不支持安裝 +Zip archive corrupt = ZIP檔案損壞 +Zip file does not contain PSP software = ZIP文件不包含PSP軟件 + +[KeyMapping] +Autoconfigure = 自動配置 +Autoconfigure for device = 設備自動配置 +Clear All = 全部清除 +Default All = 全部恢復預設 +Map a new key for = 你按下的按鈕將會對應到此功能: +Map Key = 按鍵映射 +Map Mouse = 鼠標映射 +Test Analogs = 測試搖桿 +You can press ESC to cancel. = 您可以按Esc取消。 + +[MainMenu] +Browse = 瀏覽... +Buy PPSSPP Gold = 購買PPSSPP黃金版 +Choose folder = 選擇文件夾 +Credits = 製作團隊 +PPSSPP Homebrew Store = 從 PPSSPP 自製軟體商店下載 +Exit = 離開 +Game Settings = 遊戲設定 +Games = 遊戲 +Give PPSSPP permission to access storage = 給予 PPSSPP 存取權限 +Homebrew & Demos = 自製遊戲和試玩 +How to get games = 如何獲得遊戲 +How to get homebrew & demos = 如何獲得自製遊戲和試玩 +Load = 載入遊戲... +Loading... = Loading... +PinPath = 標記 +PPSSPP can't load games or save right now = PPSSPP 現在無法載入遊戲或存檔 +Recent = 最近執行的遊戲 +SavesAreTemporary = PPSSPP正在保存在臨時存儲中 +SavesAreTemporaryGuidance = 將PPSSPP提取到某個地方以永久保存 +SavesAreTemporaryIgnore = 忽略警告 +UnpinPath = 取消標記 +www.ppsspp.org = www.ppsspp.org + +[MainSettings] +Audio = 聲音設定 +Controls = 控制器設定 +Graphics = 圖形設定 +Networking = 網路連線 +System = 系統設定 +Tools = 工具 + +[MappableControls] +Alt speed 1 = Alt speed 1 +Alt speed 2 = Alt speed 2 +An.Down = 左搖桿:下 +An.Left = 左搖桿:左 +An.Right = 左搖桿:右 +An.Up = 左搖桿:上 +Analog limiter = 搖桿限制器 +Analog Stick = 搖桿 +Audio/Video Recording = 音頻/視頻錄製 +Auto Analog Rotation (CCW) = 自動模擬旋轉(CCW) +Auto Analog Rotation (CW) = 自動模擬旋轉(CW) +AxisSwap = 軸交換 +Circle = 圈 +Cross = 叉 +D-pad down = D-pad down +D-pad left = D-pad left +D-pad right = D-pad right +D-pad up = D-pad up +DevMenu = DevMenu +Down = 方向鍵:下 +Dpad = 方向鍵 +Frame Advance = Frame advance +Hold = Hold +Home = Home +L = L +Left = 方向鍵:左 +Load State = 載入即時存檔 +Mute toggle = Mute toggle +Next Slot = 下一槽 +None = None +Note = Note +OpenChat = Open chat +Pause = 暫停 +R = R +RapidFire = 連射 +Remote hold = Remote hold +Rewind = 倒回 +Right = 方向鍵:右 +Right Analog Stick (tap to customize) = 右搖桿(輕按即可定制) +RightAn.Down = 右搖桿:下 +RightAn.Left = 右搖桿:左 +RightAn.Right = 右搖桿:右 +RightAn.Up = 右搖桿:上 +Rotate Analog (CCW) = 旋轉模擬(CCW) +Rotate Analog (CW) = 旋轉模擬(CW) +Save State = 即時存檔 +Screen = 屏幕 +Screenshot = 屏幕截圖 +Select = 選擇 +SpeedToggle = 速度切換 +Square = 正方 +Start = 開始 +Texture Dumping = 紋理轉儲 +Texture Replacement = 紋理替換 +Toggle Fullscreen = 切換全屏 +Toggle mode = 切換模式 +Triangle = 三角形 +Unthrottle = 解除速限 +Up = 方向鍵:上 +Vol + = Vol + +Vol - = Vol - +Wlan = WLAN + +[Networking] +Adhoc Multiplayer forum = 連線的問題請至官方論壇 (英文) +AdHoc Server = Ad hoc server +AdhocServer Failed to Bind Port = 無法綁定Adhoc服務器端口 +Auto = Auto +Bottom Center = 中間下面 +Bottom Left = 下左面 +Bottom Right = 右下面 +Center Left = 中間左面 +Center Right = 中間右面 +Change Mac Address = 改變 Mac 網路位址 +Change proAdhocServer Address = 改變 PRO Adhoc 網路位址 (localhost = 多個實例) +Chat = 聊天 +Chat Button Position = 聊天按鈕位置 +Chat Here = 在這裡聊天 +Chat Screen Position = 聊天畫面位置 +Disconnected from AdhocServer = 與Adhoc服務器斷開連接 +DNS Error Resolving = DNS錯誤解決 +Enable built-in PRO Adhoc Server = 啟用內建 PRO Adhoc 伺服器 +Enable network chat = 啟用網絡聊天 +Enable networking = 啟用網路連線/無線區域網路 (測試) +Enable UPnP = 啟用UPnP(需要幾秒鐘來檢測) +EnableQuickChat = 啟用快速聊天 +Enter a new PSP nickname = 輸入新的PSP暱稱 +Enter Quick Chat 1 = 輸入快速聊天1 +Enter Quick Chat 2 = 輸入快速聊天2 +Enter Quick Chat 3 = 輸入快速聊天3 +Enter Quick Chat 4 = 輸入快速聊天4 +Enter Quick Chat 5 = 輸入快速聊天5 +Error = Error +Failed to Bind Localhost IP = 無法綁定本地主機IP +Failed to Bind Port = 無法綁定端口 +Failed to connect to Adhoc Server = 無法連接Adhoc服務器 +Forced First Connect = 強制首次連接(更快的連接) +Invalid IP or hostname = 無效的IP或主機名 +Minimum Timeout = 最小超時(以毫秒為單位,0 =默認) +Misc = 其他(默認= PSP兼容性) +Network Initialized = 網路已初始化 +Please change your Port Offset = 請更改您的端口偏移 +Port offset = 端口偏移 (0 = PSP 實機兼容) +proAdhocServer Address: = Ad hoc 服務器地址: +Quick Chat 1 = 快速聊天1 +Quick Chat 2 = 快速聊天2 +Quick Chat 3 = 快速聊天3 +Quick Chat 4 = 快速聊天4 +Quick Chat 5 = 快速聊天5 +QuickChat = 快速聊天 +Send = 發送 +Send Discord Presence information = 發送 Discord "Rich Presence" information +TCP No Delay = TCP無延遲(更快的TCP) +Top Center = 中間上面 +Top Left = 左上面 +Top Right = 右上面 +Unable to find UPnP device = 找不到UPnP設備 +UPnP (port-forwarding) = UPnP(端口轉發) +UPnP need to be reinitialized = UPnP需要重新初始化 +UPnP use original port = UPnP使用原始端口(已啟用= PSP兼容性) +Validating address... = 驗證地址... +WLAN Channel = WLAN 頻道 +You're in Offline Mode, go to lobby or online hall = You're in offline mode, go to lobby or online hall + +[Pause] +Cheats = 金手指 +Continue = 繼續 +Create Game Config = 建立遊戲配置 +Delete Game Config = 刪除遊戲配置 +Exit to menu = 返回主選單 +Game Settings = 遊戲設定 +Load State = 載入存檔 +Rewind = 倒回 +Save State = 即時存檔 +Settings = 設定 +Switch UMD = 切換光碟 + +[PostShaders] +(duplicated setting, previous slider will be used) = (duplicated setting, previous slider will be used) +4xHqGLSL = 4×HQ GLSL +5xBR = 5xBR +5xBR-lv2 = 5xBR-lv2 +AAColor = AA-Color +Amount = Amount +Black border = Black border +Bloom = Bloom +Brightness = Brightness +Cartoon = Cartoon +ColorCorrection = Color correction +Contrast = Contrast +CRT = CRT scanlines +FXAA = FXAA Antialiasing +Gamma = Gamma +Grayscale = Grayscale +Intensity = Intensity +InverseColors = Inverse Colors +Natural = Natural Colors +NaturalA = Natural Colors (no blur) +Off = 關閉 +Power = Power +PSPColor = PSP color +Saturation = Saturation +Scanlines = Scanlines (CRT) +Sharpen = Sharpen +SSAA(Gauss) = Supersampling AA (Gauss) +Tex4xBRZ = 4xBRZ +UpscaleSpline36 = Spline36 Upscaler +VideoSmoothingAA = VideoSmoothingAA +Vignette = Vignette + +[PSPCredits] +all the forum mods = all the forum mods +build server = build server +Buy Gold = 購買黃金版 +check = 也歡迎你試用海豚模擬器,最好用的 Wii/GC 模擬器 +CheckOutPPSSPP = Check out PPSSPP, the awesome PSP emulator: https://www.ppsspp.org/ +contributors = 參與者: +created = 作者: +Discord = Discord +info1 = PPSSPP 僅限教學用途 +info2 = 請確認你有權使用該遊戲, +info3 = 例如持有該遊戲的正版光碟, +info4 = 或是透過 PSP 於 PSN 商店購買數位版。 +info5 = PSP® 是索尼公司的註冊商標。 +iOS builds = iOS builds +license = PPSSPP 是遵循 GPL 2.0+ 授權條款的自由軟體 +list = 網站上有相容性列表、官方論壇以及開發動態 +PPSSPP Forums = PPSSPP 官方論壇 +Privacy Policy = Privacy policy +Share PPSSPP = 分享 PPSSPP +specialthanks = 特別感謝: +specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksMaxim = for his amazing Atrac3+ decoder work +testing = testing +this translation by = 譯者: +title = 快速、方便攜帶的 PSP 模擬器 +tools = 使用自由工具: +# Add translators or contributors who translated PPSSPP into your language here. +# Add translators1-6 for up to 6 lines of translator credits. +# Leave extra lines blank. 4 contributors per line seems to look best. +translators1 = sum2012 +translators2 = +translators3 = +translators4 = +translators5 = +translators6 = +Twitter @PPSSPP_emu = Twitter @PPSSPP_emu +website = 歡迎參觀我們的網站: +written = Written in C++ for speed and portability + +[RemoteISO] +Browse Games = 瀏覽遊戲 +Local Server Port = 本地服務器端口 +Manual Mode Client = 手動模式客戶端 +Remote disc streaming = 遠程光盤流 +Remote Port = 遠端埠 +Remote Server = 遠端伺服器 +Remote Subdirectory = 遠程子目錄 +RemoteISODesc = 您最近列表中的遊戲將被共享 +RemoteISOLoading = 已連接,正在加載遊戲列表... +RemoteISOScanning = 掃描...單擊服務器設備上的“共享遊戲” +RemoteISOScanningTimeout = 正在掃描...檢查您桌面的防火牆設置 +RemoteISOWifi = 注意:將兩個設備都連接到同一Wi-Fi網絡 +RemoteISOWinFirewall = 警告:Windows防火牆阻止共享 +Settings = 設定值 +Share Games (Server) = 分享遊戲(服務器) +Share on PPSSPP startup = 分享PPSSPP啟動 +Stop Sharing = 停止分享 +Stopping.. = 正在停止... + +[Reporting] +Bad = 壞 +FeedbackDelayInfo = 您的數據正在後台提交. +FeedbackDesc = 模擬的效果怎麼樣?說給我們聽聽! +FeedbackDisabled = 兼容性服務器報告必須啟用. +FeedbackIncludeCRC = 注意:電池將用於發送光盤CRC +FeedbackIncludeScreen = 包括屏幕截圖 +FeedbackSubmitDone = 您的數據已提交. +FeedbackSubmitFail = 無法將數據提交到服務器。 嘗試更新PPSSPP。 +FeedbackThanks = 感謝您的反饋意見! +Gameplay = 遊戲過程 +Graphics = 圖形 +Great = 很好 +In-game = 在遊戲中 +In-game Description = 能進入遊戲玩,但太多問題 +Menu/Intro = 選單/簡介 +Menu/Intro Description = 無法進入遊戲本身 +Nothing = 沒畫面 +Nothing Description = 完全壞了 +OK = 好 +Open Browser = 打開瀏覽器 +Overall = 整體 +Perfect = 完美 +Perfect Description = Flawless emulation for the entire game - great! +Plays = 可玩 +Plays Description = Fully playable but might be with glitches +ReportButton = 報告反饋 +Speed = 速度 +Submit Feedback = 提交反饋 +SuggestionConfig = 請參閱網站上的報告以了解正確的設置。 +SuggestionCPUSpeed0 = 禁用鎖定的CPU速度設置。 +SuggestionDowngrade = 降級到較舊的PPSSPP版本(請報告此錯誤)。 +SuggestionsFound = 其他用戶報告了更好的結果。 點擊“查看反饋”以獲取更多詳細信息。 +SuggestionsNone = This game isn't working for other users too. +SuggestionsWaiting = 提交並檢查其他用戶的反饋... +SuggestionUpgrade = 升級到更新的PPSSPP版本。 +SuggestionVerifyDisc = 檢查您的ISO是否是光盤的良好副本。 +Unselected Overall Description = 這個遊戲的模擬效果如何? +View Feedback = 查看所有反饋 + +[Savedata] +Date = Date +Filename = Filename +No screenshot = 沒有截圖 +None yet. Things will appear here after you save. = 暫無。在你存檔之後這裡才會出現數據。 +Save Data = 存檔資料 +Save States = 即時存檔資料 +Savedata Manager = 管理存檔資料 +Size = Size + +[Screen] +Cardboard VR OFF = Cardboard VR off +Chainfire3DWarning = 警告:偵測到 Chainfire3D,可能造成問題 +Failed to load state = 無法載入快速存檔 +Failed to save state = 無法儲存快速存檔 +fixed = 速度:固定 +GLToolsWarning = 警告:偵測到 GLTools,可能造成問題 +In menu = In menu +Load savestate failed = 無法載入快速存檔 +Loaded State = 已載入即時存檔 +Loaded. Save in game, restart, and load for less bugs. = 已加載。 保存在遊戲中,重新啟動並加載,以減少錯誤。 +LoadStateDoesntExist = 無法載入:存檔不存在! +LoadStateWrongVersion = 無法載入:存檔為舊版的 PPSSPP 的! +norewind = 倒带即時存檔不可用 +Playing = Playing +PressESC = 按下 ESC 鍵以暫停遊戲 +replaceTextures_false = 不再替換紋理. +replaceTextures_true = 啟用紋理替換. +Save State Failed = 即時存檔失敗! +Saved State = 即時存檔完成 +saveNewTextures_false = 紋理保存已禁用. +saveNewTextures_true = 紋理現在將保存到您的存儲中. +SpeedCustom2 = 速度:備用2 +standard = 速度:標準 +Untitled PSP game = 無標題的PSP遊戲 + +[Store] +Already Installed = 已安裝完成 +Connection Error = 連線錯誤 +Install = 安裝 +Launch Game = 開始遊戲 +Loading... = 載入中... +MB = MB +Size = 大小 +Uninstall = 解除安裝 + +[SysInfo] +%d (%d per core, %d cores) = %d (%d per core, %d cores) +%d bytes = %d bytes +(none detected) = (none detected) +3D API = 3D API +ABI = ABI +API Version = API version +Audio Information = Audio information +Board = Board +Build Config = Build config +Build Configuration = Build Configuration +Built by = Built by +Core Context = Core context +Cores = Cores +CPU Extensions = CPU extensions +CPU Information = CPU information +CPU Name = Name +D3DCompiler Version = D3DCompiler version +Debug = Debug +Debugger Present = Debugger present +Device Info = Device info +Display Information = Display information +Driver Version = Driver version +EGL Extensions = EGL extensions +Frames per buffer = Frames per buffer +GPU Information = GPU information +High precision float range = High precision float range +High precision int range = High precision int range +Lang/Region = Lang/Region +Memory Page Size = Memory page size +Native Resolution = Native resolution +OGL Extensions = OGL extensions +OpenGL ES 2.0 Extensions = OpenGL ES 2.0 extensions +OpenGL ES 3.0 Extensions = OpenGL ES 3.0 extensions +OpenGL Extensions = OpenGL extensions +Optimal frames per buffer = Optimal frames per buffer +Optimal sample rate = Optimal sample rate +OS Information = OS information +PPSSPP build = PPSSPP build +Refresh rate = Refresh rate +Release = Release +RW/RX exclusive = RW/RX exclusive +Sample rate = Sample rate +Shading Language = Shading language +Sustained perf mode = Sustained perf mode +System Information = System information +System Name = Name +System Version = System version +Threads = Threads +Vendor = Vendor +Vendor (detected) = Vendor (detected) +Version Information = Version information +Vulkan Extensions = Vulkan extensions +Vulkan Features = Vulkan features + +[System] +(broken) = (壞了) +12HR = 12小時 +24HR = 24小時 +Auto = 自動 +Auto Load Savestate = 自動加載保存狀態 +AVI Dump started. = AVI dump started +AVI Dump stopped. = AVI dump stopped +Cache ISO in RAM = 將整個 ISO 檔暫存於記憶體中 +Change CPU Clock = 調整 CPU 時鐘 (不穩定) +Change Memory Stick folder = 更改記憶棒文件夾 +Change Memory Stick Size = 更改記憶棒大小 (GB) +Change Nickname = 更改別名 +ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? +ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. +ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? +Cheats = 金手指 (實驗性功能,請見官方論壇) +Clear Recent = Clear "Recent" +Clear Recent Games List = 清除最近遊戲清單 +Clear UI background = 清除背景 +Confirmation Button = 確認鍵 +Date Format = 日期格式 +Day Light Saving = 日光節約時間 +DDMMYYYY = DDMMYYYY +Decrease size = Decrease size +Developer Tools = 開發者工具 +Display Extra Info = Display extra info +Display Games on a grid = Display "Games" on a grid +Display Homebrew on a grid = Display "Homebrew && Demos" on a grid +Display Recent on a grid = Display "Recent" on a grid +Dynarec (JIT) = Dynarec (JIT) +Emulation = 模擬 +Enable Cheats = 啓用金手指 +Enable Compatibility Server Reports = 向伺服器回報相容性問題 +Failed to load state. Error in the file system. = 無法讀取即時存檔。檔案系統錯誤。 +Failed to save state. Error in the file system. = Failed to save state. Error in the file system. +Fast (lag on slow storage) = 快速 (存取較慢的系統仍會延遲) +Fast Memory = 快速記憶體存取 (不穩定) +Force real clock sync (slower, less lag) = 強制實際時鐘同步 (速度較慢,但較少延遲) +frames, 0:off = 幀,0 = 關閉 +Games list settings = Games list settings +General = 一般 +Grid icon size = Grid icon size +Help the PPSSPP team = 幫助 PPSSPP 團隊 +Host (bugs, less lag) = 主機 (較少延遲,但可能造成問題;有助於魔法少女小圓) +I/O on thread (experimental) = 線程上的I / O(實驗性) +Ignore bad memory accesses = 忽略錯誤的內存訪問 +Increase size = 增加大小 +Interpreter = 解釋器 +IO timing method = I/O 計時方法 +IR Interpreter = IR 解釋器 +Memory Stick Folder = 記憶棒文件夾 +Memory Stick inserted = 插入記憶棒 +MHz, 0:default = MHz,預設為 0 +MMDDYYYY = MMDDYYYY +Newest Save = 最新存礑 +Not a PSP game = 不是 PSP 遊戲 +Off = Off +Oldest Save = 最早存礑 +PSP Model = PSP 機型 +PSP Settings = PSP 設定 +PSP-1000 = PSP-1000 +PSP-2000/3000 = PSP-2000/3000 +Record Audio = 錄音 +Record Display = 錄製畫面 +Reset Recording on Save/Load State = 在保存/加載狀態下重置記錄 +Restore Default Settings = 還原出廠設定 +Rewind Snapshot Frequency = 快照倒回頻率 +Save path in installed.txt = 存檔路徑在installed.txt +Save path in My Documents = 存檔路徑在我的文件 +Savestate Slot = 即時存檔插槽 +Savestate slot backups = 即時存檔插槽備份 +Screenshots as PNG = PNG 格式截圖 +Set UI background... = 設置UI背景... +Show ID = Show ID +Show region flag = 顯示區域標誌 +Simulate UMD delays = 模擬 UMD 延遲 (修正紙箱戰機W) +Slot 1 = Slot 1 +Slot 2 = Slot 2 +Slot 3 = Slot 3 +Slot 4 = Slot 4 +Slot 5 = Slot 5 +Storage full = 存儲容量已滿 +Sustained performance mode = 持續性能模式 +Time Format = 時間格式 +UI = 用戶界面 +UI Sound = 介面聲音 +undo %c = 備用 %c +Use Lossless Video Codec (FFV1) = 使用無損視訊轉碼器 (FFV1) +Use O to confirm = 使用 O 確認 +Use output buffer (with overlay) for recording =使用輸出緩衝區(帶有覆蓋)進行記錄 +Use system native keyboard = 使用系統本機鍵盤 +Use X to confirm = 使用 X 確認 +VersionCheck = 檢查 PPSSPP 新版本 +WARNING: Android battery save mode is on = 警告:Android省電模式已開啟 +WARNING: Battery save mode is on = 警告:省電模式已開啟 +YYYYMMDD = YYYYMMDD + +[Upgrade] +Details = Details +Dismiss = 忽略 +Download = 下載 +New version of PPSSPP available = 已有新版的 PPSSPP From e03c51fff211cb7e852bce82b0eb2725a18d8eb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 17 Jul 2021 20:31:41 +0200 Subject: [PATCH 016/336] BlockTransferAllowCreateFB: Remove Ys Seven (thanks LunaMoo). This will slow it down a bit again, but fix the graphical glitches. See #13529 --- assets/compat.ini | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/assets/compat.ini b/assets/compat.ini index 7378c8fa08..bab7fb84fe 100644 --- a/assets/compat.ini +++ b/assets/compat.ini @@ -623,12 +623,12 @@ UCES00373 = true ULJS00078 = true UCAS40104 = true -# Ys Seven -ULUS10551 = true -ULJM05475 = true -ULJM05475 = true -NPEH00065 = true -NPJH50350 = true +# Ys Seven disabled (caused glitches, see #13529) +# ULUS10551 = true +# ULJM05475 = true +# ULJM05475 = true +# NPEH00065 = true +# NPJH50350 = true # Burnout Legends ULES00125 = true From 15f32693388f2201118912f03439728fc337d4f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 18 Jul 2021 00:07:05 +0200 Subject: [PATCH 017/336] Implement the option for auto audio devices switching for Windows too (previously SDL-only) --- UI/GameSettingsScreen.cpp | 8 ++++++-- Windows/WASAPIStream.cpp | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index ba5851c96d..a4f69ffd1f 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -634,16 +634,20 @@ void GameSettingsScreen::CreateViews() { MicChoice->OnChoice.Handle(this, &GameSettingsScreen::OnMicDeviceChange); } + bool sdlAudio = false; #if defined(SDL) std::vector audioDeviceList; SplitString(System_GetProperty(SYSPROP_AUDIO_DEVICE_LIST), '\0', audioDeviceList); audioDeviceList.insert(audioDeviceList.begin(), a->T("Auto")); PopupMultiChoiceDynamic *audioDevice = audioSettings->Add(new PopupMultiChoiceDynamic(&g_Config.sAudioDevice, a->T("Device"), audioDeviceList, nullptr, screenManager())); audioDevice->OnChoice.Handle(this, &GameSettingsScreen::OnAudioDevice); - - audioSettings->Add(new CheckBox(&g_Config.bAutoAudioDevice, a->T("Switch on new audio device"))); + sdlAudio = true; #endif + if (sdlAudio || g_Config.iAudioBackend == AUDIO_BACKEND_WASAPI) { + audioSettings->Add(new CheckBox(&g_Config.bAutoAudioDevice, a->T("Use new audio devices automatically"))); + } + #if defined(__ANDROID__) CheckBox *extraAudio = audioSettings->Add(new CheckBox(&g_Config.bExtraAudioBuffering, a->T("AudioBufferingForBluetooth", "Bluetooth-friendly buffer (slower)"))); extraAudio->SetEnabledPtr(&g_Config.bEnableSound); diff --git a/Windows/WASAPIStream.cpp b/Windows/WASAPIStream.cpp index 3a7b6565b2..f88b6c10e9 100644 --- a/Windows/WASAPIStream.cpp +++ b/Windows/WASAPIStream.cpp @@ -59,7 +59,7 @@ public: deviceChanged_ = false; } - bool HasDeviceChanged() { + bool HasDefaultDeviceChanged() const { return deviceChanged_; } @@ -529,7 +529,7 @@ void WASAPIAudioThread::Run() { } // Check if we should use a new device. - if (notificationClient_ && notificationClient_->HasDeviceChanged()) { + if (notificationClient_ && notificationClient_->HasDefaultDeviceChanged() && g_Config.bAutoAudioDevice) { hresult = audioInterface_->Stop(); ShutdownAudioDevice(); From 254c25692b290151c5f4248b0d0667058f41cc85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 18 Jul 2021 00:09:01 +0200 Subject: [PATCH 018/336] Audio settings: Move microphone list to the bottom. --- UI/GameSettingsScreen.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index a4f69ffd1f..996638b294 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -627,13 +627,6 @@ void GameSettingsScreen::CreateViews() { } #endif - std::vector micList = Microphone::getDeviceList(); - if (!micList.empty()) { - audioSettings->Add(new ItemHeader(a->T("Microphone"))); - PopupMultiChoiceDynamic *MicChoice = audioSettings->Add(new PopupMultiChoiceDynamic(&g_Config.sMicDevice, a->T("Microphone Device"), micList, nullptr, screenManager())); - MicChoice->OnChoice.Handle(this, &GameSettingsScreen::OnMicDeviceChange); - } - bool sdlAudio = false; #if defined(SDL) std::vector audioDeviceList; @@ -659,6 +652,13 @@ void GameSettingsScreen::CreateViews() { } #endif + std::vector micList = Microphone::getDeviceList(); + if (!micList.empty()) { + audioSettings->Add(new ItemHeader(a->T("Microphone"))); + PopupMultiChoiceDynamic *MicChoice = audioSettings->Add(new PopupMultiChoiceDynamic(&g_Config.sMicDevice, a->T("Microphone Device"), micList, nullptr, screenManager())); + MicChoice->OnChoice.Handle(this, &GameSettingsScreen::OnMicDeviceChange); + } + // Control ViewGroup *controlsSettingsScroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, FILL_PARENT)); controlsSettingsScroll->SetTag("GameSettingsControls"); From 19721a0a5f2cf3bede5b0a323a681cccd4894a77 Mon Sep 17 00:00:00 2001 From: opa Date: Sun, 18 Jul 2021 14:59:21 +0900 Subject: [PATCH 019/336] Add i18n inifile load on libretro startup --- libretro/libretro.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index 35e3f0b86a..e6f7ed6f9f 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -21,6 +21,7 @@ #include "Common/Thread/ThreadManager.h" #include "Common/File/VFS/VFS.h" #include "Common/File/VFS/AssetReader.h" +#include "Common/Data/Text/I18n.h" #include "Core/Config.h" #include "Core/ConfigValues.h" @@ -347,6 +348,15 @@ static void check_variables(CoreParameter &coreParam) if (g_Config.iLanguage < 0) g_Config.iLanguage = get_language_auto(); + g_Config.sLanguageIni = "en_US"; + auto langValuesMapping = GetLangValuesMapping(); + for(auto i = langValuesMapping.begin(); i != langValuesMapping.end(); ++i){ + if(i->second.second == g_Config.iLanguage){ + g_Config.sLanguageIni = i->first; + } + } + i18nrepo.LoadIni(g_Config.sLanguageIni); + if (!PSP_IsInited() && ppsspp_internal_resolution.Update(&g_Config.iInternalResolution)) { coreParam.pixelWidth = coreParam.renderWidth = g_Config.iInternalResolution * 480; From 6f73dd4b74d695d9f2775ad2de8a0e65deefed9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 18 Jul 2021 10:02:08 +0200 Subject: [PATCH 020/336] Need strtoull for 64-bit ulongs. --- Common/Data/Text/Parsers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Common/Data/Text/Parsers.cpp b/Common/Data/Text/Parsers.cpp index 5342b6fbcd..427fb74316 100644 --- a/Common/Data/Text/Parsers.cpp +++ b/Common/Data/Text/Parsers.cpp @@ -79,7 +79,7 @@ bool TryParse(const std::string &str, uint64_t *const output) { // Reset errno to a value other than ERANGE errno = 0; - uint64_t value = strtoul(str.c_str(), &endptr, 0); + uint64_t value = strtoull(str.c_str(), &endptr, 0); if (!endptr || *endptr) return false; From 9d3caecc3f5fa22542b2d072f8dc081a58380cd0 Mon Sep 17 00:00:00 2001 From: opa Date: Sun, 18 Jul 2021 21:16:09 +0900 Subject: [PATCH 021/336] better formatting --- libretro/libretro.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index e6f7ed6f9f..e70af303b1 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -350,10 +350,12 @@ static void check_variables(CoreParameter &coreParam) g_Config.sLanguageIni = "en_US"; auto langValuesMapping = GetLangValuesMapping(); - for(auto i = langValuesMapping.begin(); i != langValuesMapping.end(); ++i){ - if(i->second.second == g_Config.iLanguage){ + for (auto i = langValuesMapping.begin(); i != langValuesMapping.end(); ++i) + { + if (i->second.second == g_Config.iLanguage) + { g_Config.sLanguageIni = i->first; - } + } } i18nrepo.LoadIni(g_Config.sLanguageIni); From 58ecab849eede8b6905fb05262e0f8ab60e29948 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 18 Jul 2021 16:00:07 +0200 Subject: [PATCH 022/336] Just some variable initialization --- Common/File/DirListing.h | 8 ++++---- Core/FileSystems/DirectoryFileSystem.h | 2 +- Core/FileSystems/ISOFileSystem.h | 17 ++++++++--------- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/Common/File/DirListing.h b/Common/File/DirListing.h index cea0fbb37a..4d4cf7d10d 100644 --- a/Common/File/DirListing.h +++ b/Common/File/DirListing.h @@ -19,10 +19,10 @@ struct FileInfo { bool isWritable = false; uint64_t size = 0; - uint64_t atime; - uint64_t mtime; - uint64_t ctime; - uint32_t access; // st_mode & 0x1ff + uint64_t atime = 0; + uint64_t mtime = 0; + uint64_t ctime = 0; + uint32_t access = 0; // st_mode & 0x1ff // Currently only supported for Android storage files. // Other places use different methods to get this. diff --git a/Core/FileSystems/DirectoryFileSystem.h b/Core/FileSystems/DirectoryFileSystem.h index 2c7a2ca709..0bcd3f8bfc 100644 --- a/Core/FileSystems/DirectoryFileSystem.h +++ b/Core/FileSystems/DirectoryFileSystem.h @@ -116,7 +116,7 @@ private: struct OpenFileEntry { DirectoryFileHandle hFile = DirectoryFileHandle::NORMAL; std::string guestFilename; - FileAccess access; + FileAccess access = FILEACCESS_NONE; }; typedef std::map EntryMap; diff --git a/Core/FileSystems/ISOFileSystem.h b/Core/FileSystems/ISOFileSystem.h index 1941cc998c..676964f079 100644 --- a/Core/FileSystems/ISOFileSystem.h +++ b/Core/FileSystems/ISOFileSystem.h @@ -55,21 +55,20 @@ public: private: struct TreeEntry { - TreeEntry() : flags(0), valid(false) {} ~TreeEntry(); std::string name; - u32 flags; - u32 startingPosition; - s64 size; - bool isDirectory; + u32 flags = 0; + u32 startingPosition = 0; + s64 size = 0; + bool isDirectory = false; - u32 startsector; - u32 dirsize; + u32 startsector = 0; + u32 dirsize = 0; - TreeEntry *parent; + TreeEntry *parent = nullptr; - bool valid; + bool valid = false; std::vector children; }; From c6ad871865e7ce856943ee6dfce5d009ec54862e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 19 Jul 2021 10:31:28 +0200 Subject: [PATCH 023/336] Warning fix --- UI/GamepadEmu.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UI/GamepadEmu.cpp b/UI/GamepadEmu.cpp index 8394a3faa2..f36ccfee42 100644 --- a/UI/GamepadEmu.cpp +++ b/UI/GamepadEmu.cpp @@ -187,7 +187,7 @@ void ComboKey::Touch(const TouchInput &input) { if (g_Config.bHapticFeedback) Vibrate(HAPTIC_VIRTUAL_KEY); for (int i = 0; i < ARRAY_SIZE(comboKeyList); i++) { - if (pspButtonBit_ & (1UL << i)) { + if (pspButtonBit_ & (1ULL << i)) { controllMapper_->pspKey(comboKeyList[i].c, (on_ && toggle_) ? KEY_UP : KEY_DOWN); } } @@ -195,7 +195,7 @@ void ComboKey::Touch(const TouchInput &input) { on_ = !on_; } else if (!toggle_ && lastDown && !down) { for (int i = 0; i < ARRAY_SIZE(comboKeyList); i++) { - if (pspButtonBit_ & (1UL << i)) { + if (pspButtonBit_ & (1ULL << i)) { controllMapper_->pspKey(comboKeyList[i].c, KEY_UP); } } From 7c3bc0126805d42d7534859e05bab529367927c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 19 Jul 2021 10:31:48 +0200 Subject: [PATCH 024/336] Make GetFilesInDir fully-featured enough to use in DirectoryFileSystem To later reduce code duplication in #14619 --- Common/File/DirListing.cpp | 146 +++++++++++++++++++----------------- Common/File/DirListing.h | 3 +- Common/File/PathBrowser.cpp | 3 +- 3 files changed, 79 insertions(+), 73 deletions(-) diff --git a/Common/File/DirListing.cpp b/Common/File/DirListing.cpp index ea1f3a3040..4580cc533f 100644 --- a/Common/File/DirListing.cpp +++ b/Common/File/DirListing.cpp @@ -38,6 +38,15 @@ namespace File { +#if PPSSPP_PLATFORM(WINDOWS) +static uint64_t FiletimeToStatTime(FILETIME ft) { + const int windowsTickResolution = 10000000; + const int64_t secToUnixEpoch = 11644473600LL; + int64_t ticks = ((uint64_t)ft.dwHighDateTime << 32) | ft.dwLowDateTime; + return (int64_t)(ticks / windowsTickResolution - secToUnixEpoch); +}; +#endif + bool GetFileInfo(const Path &path, FileInfo * fileInfo) { switch (path.Type()) { case PathType::NATIVE: @@ -51,14 +60,7 @@ bool GetFileInfo(const Path &path, FileInfo * fileInfo) { // TODO: Expand relative paths? fileInfo->fullName = path; -#ifdef _WIN32 - auto FiletimeToStatTime = [](FILETIME ft) { - const int windowsTickResolution = 10000000; - const int64_t secToUnixEpoch = 11644473600LL; - int64_t ticks = ((uint64_t)ft.dwHighDateTime << 32) | ft.dwLowDateTime; - return (int64_t)(ticks / windowsTickResolution - secToUnixEpoch); - }; - +#if PPSSPP_PLATFORM(WINDOWS) WIN32_FILE_ATTRIBUTE_DATA attrs; if (!GetFileAttributesExW(path.ToWString().c_str(), GetFileExInfoStandard, &attrs)) { fileInfo->size = 0; @@ -160,7 +162,7 @@ std::vector ApplyFilter(std::vector files, const return files; } -size_t GetFilesInDir(const Path &directory, std::vector * files, const char *filter, int flags) { +bool GetFilesInDir(const Path &directory, std::vector *files, const char *filter, int flags) { if (directory.Type() == PathType::CONTENT_URI) { std::vector fileList = Android_ListContentUri(directory.ToString()); *files = ApplyFilter(fileList, filter); @@ -168,6 +170,22 @@ size_t GetFilesInDir(const Path &directory, std::vector * files, const return true; } + std::set filters; + if (filter) { + std::string tmp; + while (*filter) { + if (*filter == ':') { + filters.insert(std::move(tmp)); + tmp.clear(); + } else { + tmp.push_back(*filter); + } + filter++; + } + if (!tmp.empty()) + filters.insert(std::move(tmp)); + } + #if PPSSPP_PLATFORM(WINDOWS) if (directory.IsRoot()) { // Special path that means root of file system. @@ -186,74 +204,33 @@ size_t GetFilesInDir(const Path &directory, std::vector * files, const } return files->size(); } -#endif - - size_t foundEntries = 0; - std::set filters; - if (filter) { - std::string tmp; - while (*filter) { - if (*filter == ':') { - filters.insert(std::move(tmp)); - tmp.clear(); - } else { - tmp.push_back(*filter); - } - filter++; - } - if (!tmp.empty()) - filters.insert(std::move(tmp)); - } -#ifdef _WIN32 // Find the first file in the directory. WIN32_FIND_DATA ffd; HANDLE hFind = FindFirstFileEx((directory.ToWString() + L"\\*").c_str(), FindExInfoStandard, &ffd, FindExSearchNameMatch, NULL, 0); if (hFind == INVALID_HANDLE_VALUE) { return 0; } - // windows loop - do - { + do { const std::string virtualName = ConvertWStringToUTF8(ffd.cFileName); -#else - struct dirent *result = NULL; - - //std::string directoryWithSlash = directory; - //if (directoryWithSlash.back() != '/') - // directoryWithSlash += "/"; - - DIR *dirp = opendir(directory.c_str()); - if (!dirp) - return 0; - // non windows loop - while ((result = readdir(dirp))) - { - const std::string virtualName(result->d_name); -#endif // check for "." and ".." - if (virtualName == "." || virtualName == "..") + if (!(flags & GETFILES_GET_NAVIGATION_ENTRIES) && (virtualName == "." || virtualName == "..")) continue; - // Remove dotfiles (optional with flag.) - if (!(flags & GETFILES_GETHIDDEN)) - { -#ifdef _WIN32 + if (!(flags & GETFILES_GETHIDDEN)) { if ((ffd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) != 0) continue; -#else - if (virtualName[0] == '.') - continue; -#endif } FileInfo info; info.name = virtualName; - info.fullName = directory / virtualName; - info.isDirectory = IsDirectory(info.fullName); info.exists = true; - info.size = 0; - info.isWritable = false; // TODO - implement some kind of check + info.size = ((uint64_t)ffd.nFileSizeHigh << 32) | ffd.nFileSizeLow; + info.isDirectory = (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; + info.isWritable = (ffd.dwFileAttributes & FILE_ATTRIBUTE_READONLY) == 0; + info.atime = FiletimeToStatTime(ffd.ftLastAccessTime); + info.mtime = FiletimeToStatTime(ffd.ftLastWriteTime); + info.ctime = FiletimeToStatTime(ffd.ftCreationTime); if (!info.isDirectory) { std::string ext = info.fullName.GetFileExtension(); if (!ext.empty()) { @@ -263,20 +240,49 @@ size_t GetFilesInDir(const Path &directory, std::vector * files, const } } } - - if (files) - files->push_back(std::move(info)); - foundEntries++; -#ifdef _WIN32 + files->push_back(info); } while (FindNextFile(hFind, &ffd) != 0); FindClose(hFind); #else + struct dirent *result = NULL; + DIR *dirp = opendir(directory.c_str()); + if (!dirp) + return 0; + while ((result = readdir(dirp))) { + const std::string virtualName(result->d_name); + // check for "." and ".." + if (!(flags & GETFILES_GET_NAVIGATION_ENTRIES) && (virtualName == "." || virtualName == "..")) + continue; + + // Remove dotfiles (optional with flag.) + if (!(flags & GETFILES_GETHIDDEN)) { + if (virtualName[0] == '.') + continue; + } + + // Let's just reuse GetFileInfo. We're calling stat anyway to get isDirectory information. + Path fullName = directory / virtualName; + + FileInfo info; + if (!GetFileInfo(fullName, &info)) { + WARN_LOG(COMMON, "GetFileInfo failed in GetFilesInDir: '%s'", fullName.c_str()); + continue; + } + if (!info.isDirectory) { + std::string ext = info.fullName.GetFileExtension(); + if (!ext.empty()) { + ext = ext.substr(1); // Remove the dot. + if (filter && filters.find(ext) == filters.end()) { + continue; + } + } + } + files->push_back(info); } closedir(dirp); #endif - if (files) - std::sort(files->begin(), files->end()); - return foundEntries; + std::sort(files->begin(), files->end()); + return true; } int64_t GetDirectoryRecursiveSize(const Path &path, const char *filter, int flags) { @@ -295,7 +301,7 @@ int64_t GetDirectoryRecursiveSize(const Path &path, const char *filter, int flag return sizeSum; } -#ifdef _WIN32 +#if PPSSPP_PLATFORM(WINDOWS) // Returns a vector with the device names std::vector GetWindowsDrives() { @@ -321,8 +327,8 @@ std::vector GetWindowsDrives() } } return drives; -#endif +#endif // PPSSPP_PLATFORM(UWP) } -#endif +#endif // PPSSPP_PLATFORM(WINDOWS) } // namespace File diff --git a/Common/File/DirListing.h b/Common/File/DirListing.h index 4d4cf7d10d..baac6649c3 100644 --- a/Common/File/DirListing.h +++ b/Common/File/DirListing.h @@ -35,9 +35,10 @@ bool GetFileInfo(const Path &path, FileInfo *fileInfo); enum { GETFILES_GETHIDDEN = 1, + GETFILES_GET_NAVIGATION_ENTRIES = 2, // If you don't set this, "." and ".." will be skipped. }; -size_t GetFilesInDir(const Path &directory, std::vector *files, const char *filter = nullptr, int flags = 0); +bool GetFilesInDir(const Path &directory, std::vector *files, const char *filter = nullptr, int flags = 0); int64_t GetDirectoryRecursiveSize(const Path &path, const char *filter = nullptr, int flags = 0); std::vector ApplyFilter(std::vector files, const char *filter); diff --git a/Common/File/PathBrowser.cpp b/Common/File/PathBrowser.cpp index f7f426544a..ab85e2422b 100644 --- a/Common/File/PathBrowser.cpp +++ b/Common/File/PathBrowser.cpp @@ -159,8 +159,7 @@ void PathBrowser::HandlePath() { } else { guard.unlock(); results.clear(); - File::GetFilesInDir(lastPath, &results, nullptr); - success = true; + success = File::GetFilesInDir(lastPath, &results, nullptr); guard.lock(); } From 0c765c2c28feef9ef0ead3160e1dcb3df3e462ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 19 Jul 2021 10:42:44 +0200 Subject: [PATCH 025/336] Buildfix --- Common/File/DirListing.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Common/File/DirListing.cpp b/Common/File/DirListing.cpp index 4580cc533f..b1f71c8023 100644 --- a/Common/File/DirListing.cpp +++ b/Common/File/DirListing.cpp @@ -1,6 +1,6 @@ #include "ppsspp_config.h" -#ifdef _WIN32 +#if PPSSPP_PLATFORM(WINDOWS) #define WIN32_LEAN_AND_MEAN #include #include @@ -265,7 +265,6 @@ bool GetFilesInDir(const Path &directory, std::vector *files, const ch FileInfo info; if (!GetFileInfo(fullName, &info)) { - WARN_LOG(COMMON, "GetFileInfo failed in GetFilesInDir: '%s'", fullName.c_str()); continue; } if (!info.isDirectory) { From 6daa18cca0ba412a3c511f5a358aa15e67bb9264 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 19 Jul 2021 17:09:26 +0200 Subject: [PATCH 026/336] Hack around #14628. The icon is distorted but at least no crash. Seems like a clear bug in libpng. --- ext/libpng17/pngread.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/libpng17/pngread.c b/ext/libpng17/pngread.c index 96a5a1b4b4..71ddc01fe1 100644 --- a/ext/libpng17/pngread.c +++ b/ext/libpng17/pngread.c @@ -3997,7 +3997,8 @@ png_image_read_direct(png_voidp argument) # endif /* This is actually an internal error. */ - affirm(out_format == format /* else unimplemented transformations */); + // HACK to prevent crash: See issue #14628 + // affirm(out_format == format /* else unimplemented transformations */); } /* Now read the rows. If do_local_compose is set then it is necessary to use From fff3850096a6fcd7a97d8e7283af980514653ce1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 18 Jul 2021 22:28:30 +0200 Subject: [PATCH 027/336] Add ability to rename content URI files, fixing saving save states. buildfix --- Common/File/AndroidStorage.cpp | 13 ++++++++++++ Common/File/AndroidStorage.h | 2 ++ Common/File/FileUtil.cpp | 20 +++++++++++++------ Common/File/Path.h | 1 + .../src/org/ppsspp/ppsspp/PpssppActivity.java | 17 ++++++++++++++++ 5 files changed, 47 insertions(+), 6 deletions(-) diff --git a/Common/File/AndroidStorage.cpp b/Common/File/AndroidStorage.cpp index 6ea6983f5e..8321b4c50f 100644 --- a/Common/File/AndroidStorage.cpp +++ b/Common/File/AndroidStorage.cpp @@ -12,6 +12,7 @@ static jmethodID listContentUriDir; static jmethodID contentUriCreateFile; static jmethodID contentUriCreateDirectory; static jmethodID contentUriRemoveFile; +static jmethodID contentUriRenameFileTo; static jmethodID contentUriGetFileInfo; static jmethodID contentUriGetFreeStorageSpace; static jmethodID filePathGetFreeStorageSpace; @@ -33,6 +34,8 @@ void Android_RegisterStorageCallbacks(JNIEnv * env, jobject obj) { _dbg_assert_(contentUriCreateFile); contentUriRemoveFile = env->GetMethodID(env->GetObjectClass(obj), "contentUriRemoveFile", "(Ljava/lang/String;)Z"); _dbg_assert_(contentUriRemoveFile); + contentUriRenameFileTo = env->GetMethodID(env->GetObjectClass(obj), "contentUriRenameFileTo", "(Ljava/lang/String;Ljava/lang/String;)Z"); + _dbg_assert_(contentUriRenameFileTo); contentUriGetFileInfo = env->GetMethodID(env->GetObjectClass(obj), "contentUriGetFileInfo", "(Ljava/lang/String;)Ljava/lang/String;"); _dbg_assert_(contentUriGetFileInfo); contentUriGetFreeStorageSpace = env->GetMethodID(env->GetObjectClass(obj), "contentUriGetFreeStorageSpace", "(Ljava/lang/String;)J"); @@ -98,6 +101,16 @@ bool Android_RemoveFile(const std::string &fileUri) { return env->CallBooleanMethod(g_nativeActivity, contentUriRemoveFile, paramFileName); } +bool Android_RenameFileTo(const std::string &fileUri, const std::string &newName) { + if (!g_nativeActivity) { + return false; + } + auto env = getEnv(); + jstring paramFileUri = env->NewStringUTF(fileUri.c_str()); + jstring paramNewName = env->NewStringUTF(newName.c_str()); + return env->CallBooleanMethod(g_nativeActivity, contentUriRenameFileTo, paramFileUri, paramNewName); +} + static bool ParseFileInfo(const std::string &line, File::FileInfo *fileInfo) { std::vector parts; SplitString(line, '|', parts); diff --git a/Common/File/AndroidStorage.h b/Common/File/AndroidStorage.h index 71211824df..89c4442bf8 100644 --- a/Common/File/AndroidStorage.h +++ b/Common/File/AndroidStorage.h @@ -26,6 +26,7 @@ int Android_OpenContentUriFd(const std::string &uri, const Android_OpenContentUr bool Android_CreateDirectory(const std::string &parentTreeUri, const std::string &dirName); bool Android_CreateFile(const std::string &parentTreeUri, const std::string &fileName); bool Android_RemoveFile(const std::string &fileUri); +bool Android_RenameFileTo(const std::string &fileUri, const std::string &newName); bool Android_GetFileInfo(const std::string &fileUri, File::FileInfo *info); int64_t Android_GetFreeSpaceByContentUri(const std::string &uri); int64_t Android_GetFreeSpaceByFilePath(const std::string &filePath); @@ -44,6 +45,7 @@ inline bool Android_CreateDirectory(const std::string &parentTreeUri, const std: inline bool Android_CreateFile(const std::string &parentTreeUri, const std::string &fileName) { return false; } inline bool Android_RemoveFile(const std::string &fileUri) { return false; } inline bool Android_GetFileInfo(const std::string &fileUri, File::FileInfo *info) { return false; } +inline bool Android_RenameFileTo(const std::string &fileUri, const std::string &newName) { return false; } inline int64_t Android_GetFreeSpaceByContentUri(const std::string &uri) { return -1; } inline int64_t Android_GetFreeSpaceByFilePath(const std::string &filePath) { return -1; } inline std::vector Android_ListContentUri(const std::string &uri) { diff --git a/Common/File/FileUtil.cpp b/Common/File/FileUtil.cpp index bdd64d96c5..c2328c914a 100644 --- a/Common/File/FileUtil.cpp +++ b/Common/File/FileUtil.cpp @@ -513,19 +513,27 @@ bool DeleteDir(const Path &path) { } // renames file srcFilename to destFilename, returns true on success -bool Rename(const Path &srcFilename, const Path &destFilename) -{ +bool Rename(const Path &srcFilename, const Path &destFilename) { if (srcFilename.Type() != destFilename.Type()) { - // Impossible. + // Impossible. You're gonna need to make a copy, and delete the original. Not the responsibility + // of Rename. return false; } + // We've already asserted that they're the same Type, so only need to check either src or dest. switch (srcFilename.Type()) { case PathType::NATIVE: - break; // OK + // OK, proceed with the regular code. + break; case PathType::CONTENT_URI: - ERROR_LOG_REPORT_ONCE(renameUriNotSupported, COMMON, "Moving files by Android URI is not yet supported"); - return false; + // Content URI: Can only rename if in the same folder. + if (srcFilename.GetDirectory() != destFilename.GetDirectory()) { + INFO_LOG(COMMON, "Content URI rename: Directories not matching, failing. %s --> %s", srcFilename.c_str(), destFilename.c_str()); + return false; + } + INFO_LOG(COMMON, "Content URI rename: %s --> %s", srcFilename.c_str(), destFilename.c_str()); + + return Android_RenameFileTo(srcFilename.ToString(), destFilename.GetFilename()); default: return false; } diff --git a/Common/File/Path.h b/Common/File/Path.h index 53fc8745e2..3b0c911203 100644 --- a/Common/File/Path.h +++ b/Common/File/Path.h @@ -79,6 +79,7 @@ public: // Navigates as far up as possible from this path. If not possible to navigate upwards, returns the same path. // Not actually always the root of the volume, especially on systems like Mac and Linux where things are often mounted. + // For Android directory trees, navigates to the root of the tree. Path GetRootVolume() const; std::string PathTo(const Path &child); diff --git a/android/src/org/ppsspp/ppsspp/PpssppActivity.java b/android/src/org/ppsspp/ppsspp/PpssppActivity.java index a09a5e759a..c5cc646d53 100644 --- a/android/src/org/ppsspp/ppsspp/PpssppActivity.java +++ b/android/src/org/ppsspp/ppsspp/PpssppActivity.java @@ -9,6 +9,7 @@ import android.os.Looper; import android.os.ParcelFileDescriptor; import android.util.Log; import android.os.storage.StorageManager; +import android.provider.DocumentsContract; import androidx.documentfile.provider.DocumentFile; import java.util.ArrayList; import java.util.UUID; @@ -217,6 +218,22 @@ public class PpssppActivity extends NativeActivity { } } + public boolean contentUriRenameFileTo(String fileUri, String newName) { + try { + Uri uri = Uri.parse(fileUri); + + // Due to a design flaw, we can't use DocumentFile.renameTo(). + // Instead we use the DocumentsContract API directly. + // See https://stackoverflow.com/questions/37168200/android-5-0-new-sd-card-access-api-documentfile-renameto-unsupportedoperation. + Uri newUri = DocumentsContract.renameDocument(getContentResolver(), uri, newName); + // Log.i(TAG, "New uri: " + newUri.toString()); + return true; + } catch (Exception e) { + Log.e(TAG, "contentUriRenameFile exception: " + e.toString()); + return false; + } + } + public String contentUriGetFileInfo(String fileName) { try { Uri uri = Uri.parse(fileName); From b0558b2174951c525e455996ce3bd03a7ff2ff27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 18 Jul 2021 22:28:59 +0200 Subject: [PATCH 028/336] Assorted directory fixes --- Common/File/FileUtil.cpp | 4 ++-- Common/File/PathBrowser.h | 3 ++- Core/HLE/sceIo.cpp | 2 +- Core/System.cpp | 5 +++++ Core/System.h | 2 ++ GPU/Common/PostShader.cpp | 5 +++-- UI/MainScreen.cpp | 10 ++++++++++ 7 files changed, 25 insertions(+), 6 deletions(-) diff --git a/Common/File/FileUtil.cpp b/Common/File/FileUtil.cpp index c2328c914a..8917763b1e 100644 --- a/Common/File/FileUtil.cpp +++ b/Common/File/FileUtil.cpp @@ -115,7 +115,7 @@ FILE *OpenCFile(const Path &path, const char *mode) { // Need to be able to create the file here if it doesn't exist. // Not exactly sure which abstractions are best, let's start simple. if (!File::Exists(path)) { - INFO_LOG(COMMON, "Opening content file '%s' for write. Doesn't exist, creating empty and reopening.", path.c_str()); + INFO_LOG(COMMON, "OpenCFile(%s): Opening content file for write. Doesn't exist, creating empty and reopening.", path.c_str()); std::string name = path.GetFilename(); if (path.CanNavigateUp()) { Path parent = path.NavigateUp(); @@ -128,7 +128,7 @@ FILE *OpenCFile(const Path &path, const char *mode) { return nullptr; } } else { - INFO_LOG(COMMON, "Opening file by fd for write"); + INFO_LOG(COMMON, "OpenCFile(%s): Opening existing content file for write (truncating). Requested mode: '%s'", path.c_str(), mode); } // TODO: Support append modes and stuff... For now let's go with the most common one. diff --git a/Common/File/PathBrowser.h b/Common/File/PathBrowser.h index 66227990b0..dd8cdeebb2 100644 --- a/Common/File/PathBrowser.h +++ b/Common/File/PathBrowser.h @@ -27,9 +27,10 @@ public: bool CanNavigateUp(); void NavigateUp(); + void Navigate(const std::string &subdir); - Path GetPath() const { + const Path &GetPath() const { return path_; } std::string GetFriendlyPath() const; diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index 7ffd58f324..73702ae4e3 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -645,7 +645,7 @@ void __IoInit() { if (g_RemasterMode) { const std::string gameId = g_paramSFO.GetDiscID(); - const Path exdataPath = g_Config.memStickDirectory / "exdata" / gameId; + const Path exdataPath = GetSysDirectory(DIRECTORY_EXDATA) / gameId; if (File::Exists(exdataPath)) { exdataSystem = new DirectoryFileSystem(&pspFileSystem, exdataPath, FileSystemFlags::SIMULATE_FAT32 | FileSystemFlags::CARD); pspFileSystem.Mount("exdata0:", exdataSystem); diff --git a/Core/System.cpp b/Core/System.cpp index 808e39ff76..aace6ccfa7 100644 --- a/Core/System.cpp +++ b/Core/System.cpp @@ -603,6 +603,8 @@ Path GetSysDirectory(PSPDirectories directoryType) { 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: @@ -622,6 +624,9 @@ Path GetSysDirectory(PSPDirectories directoryType) { return pspDirectory / "VIDEO"; case DIRECTORY_AUDIO: return pspDirectory / "AUDIO"; + case DIRECTORY_CUSTOM_SHADERS: + return pspDirectory / "shaders"; + case DIRECTORY_MEMSTICK_ROOT: return g_Config.memStickDirectory; // Just return the memory stick root if we run into some sort of problem. diff --git a/Core/System.h b/Core/System.h index d9e3cdb3a1..29b95bb7a4 100644 --- a/Core/System.h +++ b/Core/System.h @@ -52,6 +52,8 @@ enum PSPDirectories { DIRECTORY_VIDEO, DIRECTORY_AUDIO, DIRECTORY_MEMSTICK_ROOT, + DIRECTORY_EXDATA, + DIRECTORY_CUSTOM_SHADERS, }; class GraphicsContext; diff --git a/GPU/Common/PostShader.cpp b/GPU/Common/PostShader.cpp index 96e4405b36..ff106531b7 100644 --- a/GPU/Common/PostShader.cpp +++ b/GPU/Common/PostShader.cpp @@ -28,9 +28,10 @@ #include "Common/File/DirListing.h" #include "Common/File/VFS/VFS.h" #include "Common/GPU/OpenGL/GLFeatures.h" - #include "Common/StringUtils.h" + #include "Core/Config.h" +#include "Core/System.h" #include "GPU/Common/PostShader.h" static std::vector shaderInfo; @@ -186,7 +187,7 @@ void LoadPostShaderInfo(const std::vector &directories) { void ReloadAllPostShaderInfo() { std::vector directories; directories.push_back(Path("shaders")); // For VFS - directories.push_back(g_Config.memStickDirectory / "PSP" / "shaders"); + directories.push_back(GetSysDirectory(DIRECTORY_CUSTOM_SHADERS)); LoadPostShaderInfo(directories); } diff --git a/UI/MainScreen.cpp b/UI/MainScreen.cpp index 1f82b654a8..8872fdd716 100644 --- a/UI/MainScreen.cpp +++ b/UI/MainScreen.cpp @@ -541,10 +541,20 @@ UI::EventReturn GameBrowser::StorageClick(UI::EventParams &e) { } UI::EventReturn GameBrowser::HomeClick(UI::EventParams &e) { + if (System_GetPropertyBool(SYSPROP_ANDROID_SCOPED_STORAGE)) { + if (path_.GetPath().Type() == PathType::CONTENT_URI) { + path_.SetPath(path_.GetPath().GetRootVolume()); + return UI::EVENT_DONE; + } + } + SetPath(HomePath()); return UI::EVENT_DONE; } +// TODO: This doesn't make that much sense for Android, especially after scoped storage.. +// Maybe we should have no home directory in this case. Or it should just navigate to the root +// of the current folder tree. Path GameBrowser::HomePath() { #if PPSSPP_PLATFORM(ANDROID) || PPSSPP_PLATFORM(SWITCH) || defined(USING_WIN_UI) || PPSSPP_PLATFORM(UWP) return g_Config.memStickDirectory; From e1b4a9175a65f07c676129f5a4e790f2944b11c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 18 Jul 2021 22:34:37 +0200 Subject: [PATCH 029/336] Add handling for Android content URIs to VFSReadFile, fixing savestate thumbnails. --- Common/Data/Format/JSONReader.cpp | 3 ++- Common/File/FileUtil.cpp | 6 ++---- Common/File/FileUtil.h | 2 +- Common/File/VFS/AssetReader.cpp | 2 +- Common/File/VFS/VFS.cpp | 6 ++++-- Common/GPU/OpenGL/GLSLProgram.cpp | 4 ++-- 6 files changed, 12 insertions(+), 11 deletions(-) diff --git a/Common/Data/Format/JSONReader.cpp b/Common/Data/Format/JSONReader.cpp index 331c54be64..86c18df54c 100644 --- a/Common/Data/Format/JSONReader.cpp +++ b/Common/Data/Format/JSONReader.cpp @@ -1,4 +1,5 @@ #include "Common/File/VFS/VFS.h" +#include "Common/File/Path.h" #include "Common/File/FileUtil.h" #include "Common/Data/Format/JSONReader.h" @@ -11,7 +12,7 @@ JsonReader::JsonReader(const std::string &filename) { parse(); } else { // Okay, try to read on the local file system - buffer_ = (char *)File::ReadLocalFile(filename.c_str(), &buf_size); + buffer_ = (char *)File::ReadLocalFile(Path(filename), &buf_size); if (buffer_) { parse(); } else { diff --git a/Common/File/FileUtil.cpp b/Common/File/FileUtil.cpp index 8917763b1e..7a35ded386 100644 --- a/Common/File/FileUtil.cpp +++ b/Common/File/FileUtil.cpp @@ -987,10 +987,8 @@ bool ReadFileToString(bool text_file, const Path &filename, std::string &str) { return success; } -// This is an odd one, mainly used for asset reading, so doesn't really -// need to support Path. -uint8_t *ReadLocalFile(const char *filename, size_t * size) { - FILE *file = File::OpenCFile(Path(filename), "rb"); +uint8_t *ReadLocalFile(const Path &filename, size_t *size) { + FILE *file = File::OpenCFile(filename, "rb"); if (!file) { *size = 0; return nullptr; diff --git a/Common/File/FileUtil.h b/Common/File/FileUtil.h index ab0782fb22..ed0581b66c 100644 --- a/Common/File/FileUtil.h +++ b/Common/File/FileUtil.h @@ -201,6 +201,6 @@ bool WriteDataToFile(bool text_file, const void* data, const unsigned int size, bool ReadFileToString(bool text_file, const Path &filename, std::string &str); // Return value must be delete[]-d. -uint8_t *ReadLocalFile(const char *filename, size_t *size); +uint8_t *ReadLocalFile(const Path &filename, size_t *size); } // namespace diff --git a/Common/File/VFS/AssetReader.cpp b/Common/File/VFS/AssetReader.cpp index 77bd76df22..6bc96773f7 100644 --- a/Common/File/VFS/AssetReader.cpp +++ b/Common/File/VFS/AssetReader.cpp @@ -172,7 +172,7 @@ DirectoryAssetReader::DirectoryAssetReader(const Path &path) { uint8_t *DirectoryAssetReader::ReadAsset(const char *path, size_t *size) { Path new_path = Path(path).StartsWith(path_) ? Path(path) : path_ / path; - return File::ReadLocalFile(new_path.c_str(), size); + return File::ReadLocalFile(new_path, size); } bool DirectoryAssetReader::GetFileListing(const char *path, std::vector *listing, const char *filter = nullptr) { diff --git a/Common/File/VFS/VFS.cpp b/Common/File/VFS/VFS.cpp index ff6dd37430..cf347dcf44 100644 --- a/Common/File/VFS/VFS.cpp +++ b/Common/File/VFS/VFS.cpp @@ -1,6 +1,7 @@ #include "Common/Log.h" #include "Common/File/VFS/VFS.h" #include "Common/File/VFS/AssetReader.h" +#include "Common/File/AndroidStorage.h" struct VFSEntry { const char *prefix; @@ -32,7 +33,8 @@ static bool IsLocalAbsolutePath(const char *path) { #else bool isWindowsLocal = false; #endif - return isUnixLocal || isWindowsLocal; + bool isContentURI = Android_IsContentUri(path); + return isUnixLocal || isWindowsLocal || isContentURI; } // The returned data should be free'd with delete[]. @@ -40,7 +42,7 @@ uint8_t *VFSReadFile(const char *filename, size_t *size) { if (IsLocalAbsolutePath(filename)) { // Local path, not VFS. // INFO_LOG(IO, "Not a VFS path: %s . Reading local file.", filename); - return File::ReadLocalFile(filename, size); + return File::ReadLocalFile(Path(filename), size); } int fn_len = (int)strlen(filename); diff --git a/Common/GPU/OpenGL/GLSLProgram.cpp b/Common/GPU/OpenGL/GLSLProgram.cpp index 0bca65c6f3..0782593c35 100644 --- a/Common/GPU/OpenGL/GLSLProgram.cpp +++ b/Common/GPU/OpenGL/GLSLProgram.cpp @@ -104,7 +104,7 @@ bool glsl_recompile(GLSLProgram *program, std::string *error_message) { program->vshader_mtime = vs.st_mtime; if (!program->vshader_source) { size_t sz; - vsh_src.reset((char *)File::ReadLocalFile(program->vshader_filename, &sz)); + vsh_src.reset((char *)File::ReadLocalFile(Path(program->vshader_filename), &sz)); } } else { program->vshader_mtime = 0; @@ -114,7 +114,7 @@ bool glsl_recompile(GLSLProgram *program, std::string *error_message) { program->fshader_mtime = fs.st_mtime; if (!program->fshader_source) { size_t sz; - fsh_src.reset((char *)File::ReadLocalFile(program->fshader_filename, &sz)); + fsh_src.reset((char *)File::ReadLocalFile(Path(program->fshader_filename), &sz)); } } else { program->fshader_mtime = 0; From 15fafe54153e1d9266f04d2d782216beb2a60a69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 18 Jul 2021 22:44:54 +0200 Subject: [PATCH 030/336] Fix date/time display for savestates --- Common/File/AndroidStorage.cpp | 13 ++++++++++++- Common/File/DirListing.h | 4 ---- android/src/org/ppsspp/ppsspp/PpssppActivity.java | 1 + 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Common/File/AndroidStorage.cpp b/Common/File/AndroidStorage.cpp index 8321b4c50f..6c4cbbd60d 100644 --- a/Common/File/AndroidStorage.cpp +++ b/Common/File/AndroidStorage.cpp @@ -124,7 +124,18 @@ static bool ParseFileInfo(const std::string &line, File::FileInfo *fileInfo) { sscanf(parts[1].c_str(), "%" PRIu64, &fileInfo->size); fileInfo->fullName = Path(parts[3]); fileInfo->isWritable = true; // TODO: Should be passed as part of the string. - sscanf(parts[4].c_str(), "%" PRIu64, &fileInfo->lastModified); + fileInfo->access = 0777; // TODO: For read-only mappings, reflect that here, similarly as with isWritable. + + uint64_t lastModifiedMs = 0; + sscanf(parts[4].c_str(), "%" PRIu64, &lastModifiedMs); + + // Convert from milliseconds + uint32_t lastModified = lastModifiedMs / 1000; + + // We don't have better information, so let's just spam lastModified into all the date/time fields. + fileInfo->mtime = lastModified; + fileInfo->ctime = lastModified; + fileInfo->atime = lastModified; return true; } diff --git a/Common/File/DirListing.h b/Common/File/DirListing.h index baac6649c3..99c938630e 100644 --- a/Common/File/DirListing.h +++ b/Common/File/DirListing.h @@ -24,10 +24,6 @@ struct FileInfo { uint64_t ctime = 0; uint32_t access = 0; // st_mode & 0x1ff - // Currently only supported for Android storage files. - // Other places use different methods to get this. - uint64_t lastModified = 0; - bool operator <(const FileInfo &other) const; }; diff --git a/android/src/org/ppsspp/ppsspp/PpssppActivity.java b/android/src/org/ppsspp/ppsspp/PpssppActivity.java index c5cc646d53..a35da130e8 100644 --- a/android/src/org/ppsspp/ppsspp/PpssppActivity.java +++ b/android/src/org/ppsspp/ppsspp/PpssppActivity.java @@ -148,6 +148,7 @@ public class PpssppActivity extends NativeActivity { return str; } + // TODO: Maybe add a cheaper version that doesn't extract all the file information? public String[] listContentUriDir(String uriString) { try { Uri uri = Uri.parse(uriString); From 4f10ff9d31c672afcb1911b4f827b30bfb3ccd33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 18 Jul 2021 23:06:14 +0200 Subject: [PATCH 031/336] Add quick method to check file existence by content URI. Seems to speed up bringing up the pause screen slightly (checking for save state files). --- Common/File/AndroidStorage.cpp | 13 +++++++++++ Common/File/AndroidStorage.h | 4 +++- Common/File/FileUtil.cpp | 6 +---- .../src/org/ppsspp/ppsspp/PpssppActivity.java | 22 +++++++++++++++++++ 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/Common/File/AndroidStorage.cpp b/Common/File/AndroidStorage.cpp index 6c4cbbd60d..63a3438ed3 100644 --- a/Common/File/AndroidStorage.cpp +++ b/Common/File/AndroidStorage.cpp @@ -14,6 +14,7 @@ static jmethodID contentUriCreateDirectory; static jmethodID contentUriRemoveFile; static jmethodID contentUriRenameFileTo; static jmethodID contentUriGetFileInfo; +static jmethodID contentUriFileExists; static jmethodID contentUriGetFreeStorageSpace; static jmethodID filePathGetFreeStorageSpace; @@ -38,6 +39,8 @@ void Android_RegisterStorageCallbacks(JNIEnv * env, jobject obj) { _dbg_assert_(contentUriRenameFileTo); contentUriGetFileInfo = env->GetMethodID(env->GetObjectClass(obj), "contentUriGetFileInfo", "(Ljava/lang/String;)Ljava/lang/String;"); _dbg_assert_(contentUriGetFileInfo); + contentUriFileExists = env->GetMethodID(env->GetObjectClass(obj), "contentUriFileExists", "(Ljava/lang/String;)Z"); + _dbg_assert_(contentUriFileExists); contentUriGetFreeStorageSpace = env->GetMethodID(env->GetObjectClass(obj), "contentUriGetFreeStorageSpace", "(Ljava/lang/String;)J"); _dbg_assert_(contentUriGetFreeStorageSpace); filePathGetFreeStorageSpace = env->GetMethodID(env->GetObjectClass(obj), "filePathGetFreeStorageSpace", "(Ljava/lang/String;)J"); @@ -156,6 +159,16 @@ bool Android_GetFileInfo(const std::string &fileUri, File::FileInfo *fileInfo) { return retval && fileInfo->exists; } +bool Android_FileExists(const std::string &fileUri) { + if (!g_nativeActivity) { + return false; + } + auto env = getEnv(); + jstring paramFileUri = env->NewStringUTF(fileUri.c_str()); + bool exists = env->CallBooleanMethod(g_nativeActivity, contentUriFileExists, paramFileUri); + return exists; +} + std::vector Android_ListContentUri(const std::string &path) { if (!g_nativeActivity) { return std::vector(); diff --git a/Common/File/AndroidStorage.h b/Common/File/AndroidStorage.h index 89c4442bf8..5370cb2be2 100644 --- a/Common/File/AndroidStorage.h +++ b/Common/File/AndroidStorage.h @@ -28,6 +28,7 @@ bool Android_CreateFile(const std::string &parentTreeUri, const std::string &fil bool Android_RemoveFile(const std::string &fileUri); bool Android_RenameFileTo(const std::string &fileUri, const std::string &newName); bool Android_GetFileInfo(const std::string &fileUri, File::FileInfo *info); +bool Android_FileExists(const std::string &fileUri); int64_t Android_GetFreeSpaceByContentUri(const std::string &uri); int64_t Android_GetFreeSpaceByFilePath(const std::string &filePath); @@ -44,8 +45,9 @@ inline int Android_OpenContentUriFd(const std::string &uri, const Android_OpenCo inline bool Android_CreateDirectory(const std::string &parentTreeUri, const std::string &dirName) { return false; } inline bool Android_CreateFile(const std::string &parentTreeUri, const std::string &fileName) { return false; } inline bool Android_RemoveFile(const std::string &fileUri) { return false; } -inline bool Android_GetFileInfo(const std::string &fileUri, File::FileInfo *info) { return false; } inline bool Android_RenameFileTo(const std::string &fileUri, const std::string &newName) { return false; } +inline bool Android_GetFileInfo(const std::string &fileUri, File::FileInfo *info) { return false; } +inline bool Android_FileExists(const std::string &fileUri) { return false; } inline int64_t Android_GetFreeSpaceByContentUri(const std::string &uri) { return -1; } inline int64_t Android_GetFreeSpaceByFilePath(const std::string &filePath) { return -1; } inline std::vector Android_ListContentUri(const std::string &uri) { diff --git a/Common/File/FileUtil.cpp b/Common/File/FileUtil.cpp index 7a35ded386..88db815f7f 100644 --- a/Common/File/FileUtil.cpp +++ b/Common/File/FileUtil.cpp @@ -278,11 +278,7 @@ bool ExistsInDir(const Path &path, const std::string &filename) { bool Exists(const Path &path) { if (path.Type() == PathType::CONTENT_URI) { - FileInfo info; - if (!Android_GetFileInfo(path.c_str(), &info)) { - return false; - } - return info.exists; + return Android_FileExists(path.c_str()); } #if defined(_WIN32) diff --git a/android/src/org/ppsspp/ppsspp/PpssppActivity.java b/android/src/org/ppsspp/ppsspp/PpssppActivity.java index a35da130e8..7d7ad42489 100644 --- a/android/src/org/ppsspp/ppsspp/PpssppActivity.java +++ b/android/src/org/ppsspp/ppsspp/PpssppActivity.java @@ -149,6 +149,8 @@ public class PpssppActivity extends NativeActivity { } // TODO: Maybe add a cheaper version that doesn't extract all the file information? + // TODO: Replace with a proper query: + // * https://stackoverflow.com/questions/42186820/documentfile-is-very-slow public String[] listContentUriDir(String uriString) { try { Uri uri = Uri.parse(uriString); @@ -235,6 +237,26 @@ public class PpssppActivity extends NativeActivity { } } + // Possibly faster than contentUriGetFileInfo. + public boolean contentUriFileExists(String fileUri) { + try { + Uri uri = Uri.parse(fileUri); + DocumentFile documentFile = DocumentFile.fromSingleUri(this, uri); + if (documentFile != null) { + if (documentFile.exists()) { + return true; + } else { + return false; + } + } else { + return false; + } + } catch (Exception e) { + Log.e(TAG, "contentUriFileExists exception: " + e.toString()); + return false; + } + } + public String contentUriGetFileInfo(String fileName) { try { Uri uri = Uri.parse(fileName); From a341eb6c32a29a9f2876de5d02f4eb6803ab9a3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 19 Jul 2021 09:21:24 +0200 Subject: [PATCH 032/336] Remove unnecessary slash conversion --- Core/FileSystems/DirectoryFileSystem.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/Core/FileSystems/DirectoryFileSystem.cpp b/Core/FileSystems/DirectoryFileSystem.cpp index f2d106b5b0..031f43add3 100644 --- a/Core/FileSystems/DirectoryFileSystem.cpp +++ b/Core/FileSystems/DirectoryFileSystem.cpp @@ -509,13 +509,7 @@ Path DirectoryFileSystem::GetLocalPath(std::string internalPath) { if (internalPath[0] == '/') internalPath.erase(0, 1); - //Convert slashes -#ifdef _WIN32 - for (size_t i = 0; i < internalPath.size(); i++) { - if (internalPath[i] == '/') - internalPath[i] = '\\'; - } -#endif + return basePath / internalPath; } From bea9f67c0281aaf31f1aa56ab82a46a7ff1ee538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 19 Jul 2021 09:38:04 +0200 Subject: [PATCH 033/336] Fix assorted path issues --- Common/File/DiskFree.cpp | 17 ++++++-- Common/File/DiskFree.h | 5 ++- Core/Debugger/SymbolMap.cpp | 5 ++- Core/FileLoaders/DiskCachingFileLoader.cpp | 3 +- Core/FileSystems/DirectoryFileSystem.cpp | 50 +++++++--------------- Core/SaveState.cpp | 1 - GPU/Common/PresentationCommon.cpp | 1 - UI/MainScreen.cpp | 1 - 8 files changed, 36 insertions(+), 47 deletions(-) diff --git a/Common/File/DiskFree.cpp b/Common/File/DiskFree.cpp index 7c571d4a3d..3a5fb9e722 100644 --- a/Common/File/DiskFree.cpp +++ b/Common/File/DiskFree.cpp @@ -16,20 +16,29 @@ #include #include #endif +#include +#include "Common/Log.h" +#include "Common/File/Path.h" +#include "Common/File/AndroidStorage.h" #include "Common/Data/Encoding/Utf8.h" -bool free_disk_space(const std::string &dir, uint64_t &space) { +bool free_disk_space(const Path &path, uint64_t &space) { #ifdef _WIN32 - const std::wstring w32path = ConvertUTF8ToWString(dir); ULARGE_INTEGER free; - if (GetDiskFreeSpaceExW(w32path.c_str(), &free, nullptr, nullptr)) { + if (GetDiskFreeSpaceExW(path.ToWString().c_str(), &free, nullptr, nullptr)) { space = free.QuadPart; return true; } #else + if (path.Type() == PathType::CONTENT_URI) { + space = Android_GetFreeSpaceByContentUri(path.ToString()); + INFO_LOG(COMMON, "Free space at '%s': %" PRIu64, path.c_str(), space); + return space >= 0; + } + struct statvfs diskstat; - int res = statvfs(dir.c_str(), &diskstat); + int res = statvfs(path.c_str(), &diskstat); if (res == 0) { #ifndef __ANDROID__ diff --git a/Common/File/DiskFree.h b/Common/File/DiskFree.h index df671fa3ed..5405fc4dc4 100644 --- a/Common/File/DiskFree.h +++ b/Common/File/DiskFree.h @@ -1,6 +1,7 @@ #pragma once -#include #include -bool free_disk_space(const std::string &dir, uint64_t &space); +#include "Common/File/Path.h" + +bool free_disk_space(const Path &path, uint64_t &space); diff --git a/Core/Debugger/SymbolMap.cpp b/Core/Debugger/SymbolMap.cpp index 5b9fb0a818..16bd9a6715 100644 --- a/Core/Debugger/SymbolMap.cpp +++ b/Core/Debugger/SymbolMap.cpp @@ -70,7 +70,8 @@ bool SymbolMap::LoadSymbolMap(const Path &filename) { std::lock_guard guard(lock_); - // TODO(scoped): We're screwed here + // TODO(scoped): Use gzdopen instead. + #if defined(_WIN32) && defined(UNICODE) gzFile f = gzopen_w(filename.ToWString().c_str(), "r"); #else @@ -195,10 +196,10 @@ void SymbolMap::SaveSymbolMap(const Path &filename) const { return; } + // TODO(scoped): Use gzdopen #if defined(_WIN32) && defined(UNICODE) gzFile f = gzopen_w(filename.ToWString().c_str(), "w9"); #else - // TODO(scoped): Use gzdopen? If we care, otherwise just compress into a buffer. gzFile f = gzopen(filename.c_str(), "w9"); #endif diff --git a/Core/FileLoaders/DiskCachingFileLoader.cpp b/Core/FileLoaders/DiskCachingFileLoader.cpp index 275ce11cb6..06b140e0e5 100644 --- a/Core/FileLoaders/DiskCachingFileLoader.cpp +++ b/Core/FileLoaders/DiskCachingFileLoader.cpp @@ -754,9 +754,8 @@ u64 DiskCachingFileLoaderCache::FreeDiskSpace() { dir = GetSysDirectory(DIRECTORY_CACHE); } - // TODO(scoped): uint64_t result = 0; - if (free_disk_space(dir.ToString(), result)) { + if (free_disk_space(dir, result)) { return result; } diff --git a/Core/FileSystems/DirectoryFileSystem.cpp b/Core/FileSystems/DirectoryFileSystem.cpp index 031f43add3..f8c1841b1c 100644 --- a/Core/FileSystems/DirectoryFileSystem.cpp +++ b/Core/FileSystems/DirectoryFileSystem.cpp @@ -546,11 +546,6 @@ bool DirectoryFileSystem::RmDir(const std::string &dirname) { fullName = GetLocalPath(fullPath); #endif -/*#ifdef _WIN32 - return RemoveDirectory(fullName.c_str()) == TRUE; -#else - return 0 == rmdir(fullName.c_str()); -#endif*/ bool result = File::DeleteDirRecursively(fullName); return ReplayApplyDisk(ReplayAction::RMDIR, result, CoreTiming::GetGlobalTimeUs()) != 0; } @@ -582,14 +577,10 @@ int DirectoryFileSystem::RenameFile(const std::string &from, const std::string & Path fullToPath = GetLocalPath(fullTo); -#ifdef _WIN32 - bool retValue = (MoveFileEx(fullFrom.ToWString().c_str(), fullToPath.ToWString().c_str(), 0) == TRUE); -#else - bool retValue = (0 == rename(fullFrom.c_str(), fullToPath.c_str())); -#endif + bool retValue = File::Rename(fullFrom, fullToPath); #if HOST_IS_CASE_SENSITIVE - if (! retValue) + if (!retValue) { // May have failed due to case sensitivity on FROM, so try again. Check error code? std::string fullFromPath = from; @@ -597,11 +588,7 @@ int DirectoryFileSystem::RenameFile(const std::string &from, const std::string & return ReplayApplyDisk(ReplayAction::FILE_RENAME, -1, CoreTiming::GetGlobalTimeUs()); fullFrom = GetLocalPath(fullFromPath); -#ifdef _WIN32 - retValue = (MoveFile(fullFrom.c_str(), fullToPath.c_str()) == TRUE); -#else - retValue = (0 == rename(fullFrom.c_str(), fullToPath.c_str())); -#endif + retValue = File::Rename(fullFrom, fullToPath); } #endif @@ -611,27 +598,20 @@ int DirectoryFileSystem::RenameFile(const std::string &from, const std::string & } bool DirectoryFileSystem::RemoveFile(const std::string &filename) { - Path fullName = GetLocalPath(filename); -#ifdef _WIN32 - bool retValue = (::DeleteFileA(fullName.c_str()) == TRUE); -#else - bool retValue = (0 == unlink(fullName.c_str())); -#endif + Path localPath = GetLocalPath(filename); + + bool retValue = File::Delete(localPath); #if HOST_IS_CASE_SENSITIVE - if (! retValue) + if (!retValue) { // May have failed due to case sensitivity, so try again. Try even if it fails? std::string fullNamePath = filename; if (!FixPathCase(basePath.ToString(), fullNamePath, FPC_FILE_MUST_EXIST)) return (bool)ReplayApplyDisk(ReplayAction::FILE_REMOVE, false, CoreTiming::GetGlobalTimeUs()); - fullName = GetLocalPath(fullNamePath); + localPath = GetLocalPath(fullNamePath); -#ifdef _WIN32 - retValue = (::DeleteFileA(fullName.c_str()) == TRUE); -#else - retValue = (0 == unlink(fullName.c_str())); -#endif + retValue = File::Delete(localPath); } #endif @@ -657,7 +637,7 @@ int DirectoryFileSystem::OpenFile(std::string filename, FileAccess access, const #else logError = (int)errno; #endif - ERROR_LOG(FILESYS, "DirectoryFileSystem::OpenFile(%s): FAILED, %i - access = %d '%s'", filename.c_str(), logError, (int)access, errorString.c_str()); + ERROR_LOG(FILESYS, "DirectoryFileSystem::OpenFile('%s'): FAILED, %d - access = %d '%s'", filename.c_str(), logError, (int)access, errorString.c_str()); return err; } else { #ifdef _WIN32 @@ -718,7 +698,7 @@ size_t DirectoryFileSystem::ReadFile(u32 handle, u8 *pointer, s64 size, int &use size_t bytesRead = iter->second.hFile.Read(pointer,size); return bytesRead; } else { - //This shouldn't happen... + // This shouldn't happen... ERROR_LOG(FILESYS,"Cannot read file that hasn't been opened: %08x", handle); return 0; } @@ -731,8 +711,7 @@ size_t DirectoryFileSystem::WriteFile(u32 handle, const u8 *pointer, s64 size) { size_t DirectoryFileSystem::WriteFile(u32 handle, const u8 *pointer, s64 size, int &usec) { EntryMap::iterator iter = entries.find(handle); - if (iter != entries.end()) - { + if (iter != entries.end()) { size_t bytesWritten = iter->second.hFile.Write(pointer,size); return bytesWritten; } else { @@ -770,6 +749,9 @@ PSPFileInfo DirectoryFileSystem::GetFileInfo(std::string filename) { return ReplayApplyDiskFileInfo(x, CoreTiming::GetGlobalTimeUs()); #endif } + + // TODO: Consolidate to just a File::GetFileInfo call. + x.type = File::IsDirectory(fullName) ? FILETYPE_DIRECTORY : FILETYPE_NORMAL; x.exists = true; @@ -973,7 +955,7 @@ std::vector DirectoryFileSystem::GetDirListing(std::string path) { u64 DirectoryFileSystem::FreeSpace(const std::string &path) { uint64_t result = 0; - if (free_disk_space(GetLocalPath(path).ToString(), result)) { + if (free_disk_space(GetLocalPath(path), result)) { return ReplayApplyDisk64(ReplayAction::FREESPACE, result, CoreTiming::GetGlobalTimeUs()); } diff --git a/Core/SaveState.cpp b/Core/SaveState.cpp index 9db711e466..6dbea6ac77 100644 --- a/Core/SaveState.cpp +++ b/Core/SaveState.cpp @@ -863,7 +863,6 @@ namespace SaveState case SAVESTATE_SAVE_SCREENSHOT: { int maxRes = g_Config.iInternalResolution > 2 ? 2 : -1; - // TODO(scoped): Pass the path properly into TakeGameScreenshot. tempResult = TakeGameScreenshot(op.filename, ScreenshotFormat::JPG, SCREENSHOT_DISPLAY, nullptr, nullptr, maxRes); callbackResult = tempResult ? Status::SUCCESS : Status::FAILURE; if (!tempResult) { diff --git a/GPU/Common/PresentationCommon.cpp b/GPU/Common/PresentationCommon.cpp index b6e9ecbdfc..3384302ea6 100644 --- a/GPU/Common/PresentationCommon.cpp +++ b/GPU/Common/PresentationCommon.cpp @@ -203,7 +203,6 @@ void PresentationCommon::CalculatePostShaderUniforms(int bufferWidth, int buffer static std::string ReadShaderSrc(const Path &filename) { size_t sz = 0; - // TODO(scoped): VFS paths not handled well. char *data = (char *)VFSReadFile(filename.c_str(), &sz); if (!data) { return ""; diff --git a/UI/MainScreen.cpp b/UI/MainScreen.cpp index 8872fdd716..8596294209 100644 --- a/UI/MainScreen.cpp +++ b/UI/MainScreen.cpp @@ -786,7 +786,6 @@ void GameBrowser::Refresh() { // Add any pinned paths before other directories. auto pinnedPaths = GetPinnedPaths(); for (auto it = pinnedPaths.begin(), end = pinnedPaths.end(); it != end; ++it) { - // TODO(scoped): Hmm gameList_->Add(new DirButton(*it, GetBaseName((*it).ToString()), *gridStyle_, new UI::LinearLayoutParams(UI::FILL_PARENT, UI::FILL_PARENT)))-> OnClick.Handle(this, &GameBrowser::NavigateClick); } From 2f04fc1c00c671bee8aac3d6f2bb9d6832a01ee5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 19 Jul 2021 10:14:11 +0200 Subject: [PATCH 034/336] Refactor DirectoryFileSystem::GetDirListing to use GetFilesInDir. Lets us remove some platform specific code, fixing the content URI case. --- Common/File/AndroidStorage.cpp | 2 +- Core/FileSystems/DirectoryFileSystem.cpp | 124 +++++++---------------- 2 files changed, 38 insertions(+), 88 deletions(-) diff --git a/Common/File/AndroidStorage.cpp b/Common/File/AndroidStorage.cpp index 63a3438ed3..277498ab50 100644 --- a/Common/File/AndroidStorage.cpp +++ b/Common/File/AndroidStorage.cpp @@ -127,7 +127,7 @@ static bool ParseFileInfo(const std::string &line, File::FileInfo *fileInfo) { sscanf(parts[1].c_str(), "%" PRIu64, &fileInfo->size); fileInfo->fullName = Path(parts[3]); fileInfo->isWritable = true; // TODO: Should be passed as part of the string. - fileInfo->access = 0777; // TODO: For read-only mappings, reflect that here, similarly as with isWritable. + fileInfo->access = fileInfo->isDirectory ? 0666 : 0777; // TODO: For read-only mappings, reflect that here, similarly as with isWritable. uint64_t lastModifiedMs = 0; sscanf(parts[4].c_str(), "%" PRIu64, &lastModifiedMs); diff --git a/Core/FileSystems/DirectoryFileSystem.cpp b/Core/FileSystems/DirectoryFileSystem.cpp index f8c1841b1c..c9d2c22add 100644 --- a/Core/FileSystems/DirectoryFileSystem.cpp +++ b/Core/FileSystems/DirectoryFileSystem.cpp @@ -850,105 +850,55 @@ static std::string SimulateVFATBug(std::string filename) { std::vector DirectoryFileSystem::GetDirListing(std::string path) { std::vector myVector; - bool listingRoot = path == "/" || path == "\\"; - -#ifdef _WIN32 - WIN32_FIND_DATA findData; - HANDLE hFind; - - std::wstring w32path = GetLocalPath(path).ToWString() + L"\\*.*"; - - hFind = FindFirstFileEx(w32path.c_str(), FindExInfoStandard, &findData, FindExSearchNameMatch, NULL, 0); - - if (hFind == INVALID_HANDLE_VALUE) { - // Just return the empty array. - return ReplayApplyDiskListing(myVector, CoreTiming::GetGlobalTimeUs()); - } - - bool hideISOFiles = PSP_CoreParameter().compat.flags().HideISOFiles; - while (true) { - PSPFileInfo entry; - if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - entry.type = FILETYPE_DIRECTORY; - else - entry.type = FILETYPE_NORMAL; - - // TODO: Make this more correct? - entry.access = entry.type == FILETYPE_NORMAL ? 0666 : 0777; - // TODO: is this just for .. or all subdirectories? Need to add a directory to the test - // to find out. Also why so different than the old test results? - if (!wcscmp(findData.cFileName, L"..")) - entry.size = 4096; - else - entry.size = findData.nFileSizeLow | ((u64)findData.nFileSizeHigh<<32); - entry.name = ConvertWStringToUTF8(findData.cFileName); - if (Flags() & FileSystemFlags::SIMULATE_FAT32) - entry.name = SimulateVFATBug(entry.name); - - bool hideFile = false; - if (hideISOFiles && (endsWithNoCase(entry.name, ".cso") || endsWithNoCase(entry.name, ".iso"))) { - // Workaround for DJ Max Portable, see compat.ini. - hideFile = true; - } - tmFromFiletime(entry.atime, findData.ftLastAccessTime); - tmFromFiletime(entry.ctime, findData.ftCreationTime); - tmFromFiletime(entry.mtime, findData.ftLastWriteTime); - if (!hideFile && (!listingRoot || (wcscmp(findData.cFileName, L"..") && wcscmp(findData.cFileName, L".")))) - myVector.push_back(entry); - - int retval = FindNextFile(hFind, &findData); - if (!retval) - break; - } - FindClose(hFind); -#else - dirent *dirp; - Path localPath = GetLocalPath(path); - DIR *dp = opendir(localPath.c_str()); + std::vector files; + if (!File::GetFilesInDir(GetLocalPath(path), &files, nullptr, 0)) { + // TODO: Case sensitivity should be checked on a file system basis, right? #if HOST_IS_CASE_SENSITIVE - if (dp == NULL && FixPathCase(basePath.ToString(), path, FPC_FILE_MUST_EXIST)) { - // May have failed due to case sensitivity, try again - localPath = GetLocalPath(path); - dp = opendir(localPath.c_str()); - } -#endif - - if (dp == NULL) { - ERROR_LOG(FILESYS,"Error opening directory %s\n",path.c_str()); + if (FixPathCase(basePath.ToString(), path, FPC_FILE_MUST_EXIST)) { + // May have failed due to case sensitivity, try again + localPath = GetLocalPath(path); + if (!File::GetFilesInDir(GetLocalPath(path), &files, nullptr, 0)) { + return ReplayApplyDiskListing(myVector, CoreTiming::GetGlobalTimeUs()); + } + } +#else return ReplayApplyDiskListing(myVector, CoreTiming::GetGlobalTimeUs()); +#endif } bool hideISOFiles = PSP_CoreParameter().compat.flags().HideISOFiles; - while ((dirp = readdir(dp)) != NULL) { - PSPFileInfo entry; - struct stat s; - Path fullName = GetLocalPath(path) / std::string(dirp->d_name); - stat(fullName.c_str(), &s); - if (S_ISDIR(s.st_mode)) - entry.type = FILETYPE_DIRECTORY; - else - entry.type = FILETYPE_NORMAL; - entry.access = s.st_mode & 0x1FF; - entry.name = dirp->d_name; - if (Flags() & FileSystemFlags::SIMULATE_FAT32) - entry.name = SimulateVFATBug(entry.name); - entry.size = s.st_size; - bool hideFile = false; + // Then apply transforms to match PSP idiosynchrasies, as we convert the entries. + for (auto &file : files) { + PSPFileInfo entry; + if (Flags() & FileSystemFlags::SIMULATE_FAT32) { + entry.name = SimulateVFATBug(file.name); + } else { + entry.name = file.name; + } if (hideISOFiles && (endsWithNoCase(entry.name, ".cso") || endsWithNoCase(entry.name, ".iso"))) { // Workaround for DJ Max Portable, see compat.ini. - hideFile = true; + continue; } + if (file.name == "..") { + entry.size = 4096; + } else { + entry.size = file.size; + } + if (file.isDirectory) { + entry.type = FILETYPE_DIRECTORY; + } else { + entry.type = FILETYPE_NORMAL; + } + entry.access = file.access; - localtime_r((time_t*)&s.st_atime,&entry.atime); - localtime_r((time_t*)&s.st_ctime,&entry.ctime); - localtime_r((time_t*)&s.st_mtime,&entry.mtime); - if (!hideFile && (!listingRoot || (strcmp(dirp->d_name, "..") && strcmp(dirp->d_name, ".")))) - myVector.push_back(entry); + localtime_r((time_t*)&file.atime, &entry.atime); + localtime_r((time_t*)&file.ctime, &entry.ctime); + localtime_r((time_t*)&file.mtime, &entry.mtime); + + myVector.push_back(entry); } - closedir(dp); -#endif return ReplayApplyDiskListing(myVector, CoreTiming::GetGlobalTimeUs()); } From e73e0dc0bebdbf63a1f8ba67764fc0c8fb57a843 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 19 Jul 2021 12:44:56 +0200 Subject: [PATCH 035/336] Fix multiple issues preventing in-game saves from working. --- Common/File/FileUtil.cpp | 50 ++++++++++++++++++++-- Core/Dialog/SavedataParam.cpp | 4 +- Core/FileSystems/DirectoryFileSystem.cpp | 47 ++++++++++++-------- Core/FileSystems/DirectoryFileSystem.h | 2 +- Core/FileSystems/VirtualDiscFileSystem.cpp | 9 ++-- 5 files changed, 83 insertions(+), 29 deletions(-) diff --git a/Common/File/FileUtil.cpp b/Common/File/FileUtil.cpp index 88db815f7f..5468386096 100644 --- a/Common/File/FileUtil.cpp +++ b/Common/File/FileUtil.cpp @@ -155,32 +155,74 @@ FILE *OpenCFile(const Path &path, const char *mode) { #endif } +static std::string OpenFlagToString(OpenFlag flags) { + std::string s; + if (flags & OPEN_READ) + s += "READ|"; + if (flags & OPEN_WRITE) + s += "WRITE|"; + if (flags & OPEN_APPEND) + s += "APPEND|"; + if (flags & OPEN_CREATE) + s += "CREATE|"; + if (flags & OPEN_TRUNCATE) + s += "TRUNCATE|"; + if (!s.empty()) { + s.pop_back(); // Remove trailing separator. + } + return s; +} + int OpenFD(const Path &path, OpenFlag flags) { switch (path.Type()) { case PathType::CONTENT_URI: break; default: - // Not yet supported. + ERROR_LOG(COMMON, "OpenFD: Only supports Content URI paths. Not '%s' (%s)!", path.c_str(), OpenFlagToString(flags).c_str()); + // Not yet supported - use other paths. return -1; } + if (flags & OPEN_CREATE) { + if (!File::Exists(path)) { + INFO_LOG(COMMON, "OpenFD(%s): Creating file.", path.c_str()); + std::string name = path.GetFilename(); + if (path.CanNavigateUp()) { + Path parent = path.NavigateUp(); + if (!Android_CreateFile(parent.ToString(), name)) { + WARN_LOG(COMMON, "OpenFD: Failed to create file '%s' in '%s'", name.c_str(), parent.c_str()); + return -1; + } + } else { + INFO_LOG(COMMON, "Failed to navigate up to create file: %s", path.c_str()); + return -1; + } + } else { + INFO_LOG(COMMON, "OpenCFile(%s): Opening existing content file ('%s')", path.c_str(), OpenFlagToString(flags).c_str()); + } + } + Android_OpenContentUriMode mode; if (flags == OPEN_READ) { mode = Android_OpenContentUriMode::READ; } else if (flags & OPEN_WRITE) { if (flags & OPEN_TRUNCATE) { - mode = Android_OpenContentUriMode::READ_WRITE; - } else { mode = Android_OpenContentUriMode::READ_WRITE_TRUNCATE; + } else { + mode = Android_OpenContentUriMode::READ_WRITE; } // TODO: Maybe better checking of additional flags here. } else { // TODO: Add support for more modes if possible. - ERROR_LOG_REPORT_ONCE(openFlagNotSupported, COMMON, "OpenFlag 0x%x not yet supported", flags); + ERROR_LOG_REPORT_ONCE(openFlagNotSupported, COMMON, "OpenFlag %s not yet supported", OpenFlagToString(flags).c_str()); return -1; } + INFO_LOG(COMMON, "Android_OpenContentUriFd: %s (%s)", path.c_str(), OpenFlagToString(flags).c_str()); int descriptor = Android_OpenContentUriFd(path.ToString(), mode); + if (descriptor < 0) { + ERROR_LOG(COMMON, "Android_OpenContentUriFd failed: '%s'", path.c_str()); + } return descriptor; } diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index 3da8a05947..1e26486e2c 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -208,12 +208,12 @@ void SavedataParam::Init() pspFileSystem.MkDir(savePath); } // Create a nomedia file to hide save icons form Android image viewer -#ifdef __ANDROID__ +#if PPSSPP_PLATFORM(ANDROID) int handle = pspFileSystem.OpenFile(savePath + ".nomedia", (FileAccess)(FILEACCESS_CREATE | FILEACCESS_WRITE), 0); if (handle >= 0) { pspFileSystem.CloseFile(handle); } else { - ERROR_LOG(IO, "Failed to create .nomedia file"); + INFO_LOG(IO, "Failed to create .nomedia file (might be ok if it already exists)"); } #endif } diff --git a/Core/FileSystems/DirectoryFileSystem.cpp b/Core/FileSystems/DirectoryFileSystem.cpp index c9d2c22add..6e14d903e0 100644 --- a/Core/FileSystems/DirectoryFileSystem.cpp +++ b/Core/FileSystems/DirectoryFileSystem.cpp @@ -67,8 +67,7 @@ #endif #if HOST_IS_CASE_SENSITIVE -static bool FixFilenameCase(const std::string &path, std::string &filename) -{ +static bool FixFilenameCase(const std::string &path, std::string &filename) { // Are we lucky? if (File::Exists(Path(path + filename))) return true; @@ -112,8 +111,14 @@ static bool FixFilenameCase(const std::string &path, std::string &filename) return retValue; } -bool FixPathCase(const std::string &basePath, std::string &path, FixPathCaseBehavior behavior) -{ +bool FixPathCase(const Path &realBasePath, std::string &path, FixPathCaseBehavior behavior) { + if (realBasePath.Type() == PathType::CONTENT_URI) { + // Nothing to do. These are already case insensitive, I think. + return true; + } + + std::string basePath = realBasePath.ToString(); + size_t len = path.size(); if (len == 0) @@ -189,7 +194,7 @@ bool DirectoryFileHandle::Open(const Path &basePath, std::string &fileName, File #if HOST_IS_CASE_SENSITIVE if (access & (FILEACCESS_APPEND | FILEACCESS_CREATE | FILEACCESS_WRITE)) { DEBUG_LOG(FILESYS, "Checking case for path %s", fileName.c_str()); - if (!FixPathCase(basePath.ToString(), fileName, FPC_PATH_MUST_EXIST)) { + if (!FixPathCase(basePath, fileName, FPC_PATH_MUST_EXIST)) { error = SCE_KERNEL_ERROR_ERRNO_FILE_NOT_FOUND; return false; // or go on and attempt (for a better error code than just 0?) } @@ -198,7 +203,7 @@ bool DirectoryFileHandle::Open(const Path &basePath, std::string &fileName, File #endif Path fullName = GetLocalPath(basePath, fileName); - VERBOSE_LOG(FILESYS, "Actually opening %s", fullName.c_str()); + INFO_LOG(FILESYS, "Actually opening %s", fullName.c_str()); // On the PSP, truncating doesn't lose data. If you seek later, you'll recover it. // This is abnormal, so we deviate from the PSP's behavior and truncate on write/close. @@ -289,6 +294,7 @@ bool DirectoryFileHandle::Open(const Path &basePath, std::string &fileName, File // Success return true; } else { + ERROR_LOG(FILESYS, "File::OpenFD returned an error"); // TODO: Need better error codes from OpenFD so we can distinguish // disk full. Just set not found for now. error = SCE_KERNEL_ERROR_ERRNO_FILE_NOT_FOUND; @@ -296,6 +302,8 @@ bool DirectoryFileHandle::Open(const Path &basePath, std::string &fileName, File } } + INFO_LOG(FILESYS, "Opening '%s' straight", fullName.c_str()); + int flags = 0; if (access & FILEACCESS_APPEND) { flags |= O_APPEND; @@ -320,7 +328,7 @@ bool DirectoryFileHandle::Open(const Path &basePath, std::string &fileName, File #if HOST_IS_CASE_SENSITIVE if (!success && !(access & FILEACCESS_CREATE)) { - if (!FixPathCase(basePath.ToString(), fileName, FPC_PATH_MUST_EXIST)) { + if (!FixPathCase(basePath, fileName, FPC_PATH_MUST_EXIST)) { error = SCE_KERNEL_ERROR_ERRNO_FILE_NOT_FOUND; return false; } @@ -520,7 +528,7 @@ bool DirectoryFileSystem::MkDir(const std::string &dirname) { // duplicate (different case) directories std::string fixedCase = dirname; - if (!FixPathCase(basePath.ToString(), fixedCase, FPC_PARTIAL_ALLOWED)) + if (!FixPathCase(basePath, fixedCase, FPC_PARTIAL_ALLOWED)) result = false; else result = File::CreateFullPath(GetLocalPath(fixedCase)); @@ -540,7 +548,7 @@ bool DirectoryFileSystem::RmDir(const std::string &dirname) { // Nope, fix case and try again. Should we try again? std::string fullPath = dirname; - if (!FixPathCase(basePath.ToString(), fullPath, FPC_FILE_MUST_EXIST)) + if (!FixPathCase(basePath, fullPath, FPC_FILE_MUST_EXIST)) return (bool)ReplayApplyDisk(ReplayAction::RMDIR, false, CoreTiming::GetGlobalTimeUs()); fullName = GetLocalPath(fullPath); @@ -571,7 +579,7 @@ int DirectoryFileSystem::RenameFile(const std::string &from, const std::string & #if HOST_IS_CASE_SENSITIVE // In case TO should overwrite a file with different case. Check error code? - if (!FixPathCase(basePath.ToString(), fullTo, FPC_PATH_MUST_EXIST)) + if (!FixPathCase(basePath, fullTo, FPC_PATH_MUST_EXIST)) return ReplayApplyDisk(ReplayAction::FILE_RENAME, -1, CoreTiming::GetGlobalTimeUs()); #endif @@ -584,7 +592,7 @@ int DirectoryFileSystem::RenameFile(const std::string &from, const std::string & { // May have failed due to case sensitivity on FROM, so try again. Check error code? std::string fullFromPath = from; - if (!FixPathCase(basePath.ToString(), fullFromPath, FPC_FILE_MUST_EXIST)) + if (!FixPathCase(basePath, fullFromPath, FPC_FILE_MUST_EXIST)) return ReplayApplyDisk(ReplayAction::FILE_RENAME, -1, CoreTiming::GetGlobalTimeUs()); fullFrom = GetLocalPath(fullFromPath); @@ -607,7 +615,7 @@ bool DirectoryFileSystem::RemoveFile(const std::string &filename) { { // May have failed due to case sensitivity, so try again. Try even if it fails? std::string fullNamePath = filename; - if (!FixPathCase(basePath.ToString(), fullNamePath, FPC_FILE_MUST_EXIST)) + if (!FixPathCase(basePath, fullNamePath, FPC_FILE_MUST_EXIST)) return (bool)ReplayApplyDisk(ReplayAction::FILE_REMOVE, false, CoreTiming::GetGlobalTimeUs()); localPath = GetLocalPath(fullNamePath); @@ -739,7 +747,7 @@ PSPFileInfo DirectoryFileSystem::GetFileInfo(std::string filename) { Path fullName = GetLocalPath(filename); if (!File::Exists(fullName)) { #if HOST_IS_CASE_SENSITIVE - if (! FixPathCase(basePath.ToString(), filename, FPC_FILE_MUST_EXIST)) + if (! FixPathCase(basePath, filename, FPC_FILE_MUST_EXIST)) return ReplayApplyDiskFileInfo(x, CoreTiming::GetGlobalTimeUs()); fullName = GetLocalPath(filename); @@ -852,13 +860,14 @@ std::vector DirectoryFileSystem::GetDirListing(std::string path) { std::vector myVector; std::vector files; - if (!File::GetFilesInDir(GetLocalPath(path), &files, nullptr, 0)) { + Path localPath = GetLocalPath(path); + if (!File::GetFilesInDir(localPath, &files, nullptr, 0)) { // TODO: Case sensitivity should be checked on a file system basis, right? #if HOST_IS_CASE_SENSITIVE - if (FixPathCase(basePath.ToString(), path, FPC_FILE_MUST_EXIST)) { + if (FixPathCase(basePath, path, FPC_FILE_MUST_EXIST)) { // May have failed due to case sensitivity, try again localPath = GetLocalPath(path); - if (!File::GetFilesInDir(GetLocalPath(path), &files, nullptr, 0)) { + if (!File::GetFilesInDir(localPath, &files, nullptr, 0)) { return ReplayApplyDiskListing(myVector, CoreTiming::GetGlobalTimeUs()); } } @@ -911,9 +920,9 @@ u64 DirectoryFileSystem::FreeSpace(const std::string &path) { #if HOST_IS_CASE_SENSITIVE std::string fixedCase = path; - if (FixPathCase(basePath.ToString(), fixedCase, FPC_FILE_MUST_EXIST)) { + if (FixPathCase(basePath, fixedCase, FPC_FILE_MUST_EXIST)) { // May have failed due to case sensitivity, try again. - if (free_disk_space(GetLocalPath(fixedCase).ToString(), result)) { + if (free_disk_space(GetLocalPath(fixedCase), result)) { return ReplayApplyDisk64(ReplayAction::FREESPACE, result, CoreTiming::GetGlobalTimeUs()); } } @@ -1022,7 +1031,7 @@ int VFSFileSystem::OpenFile(std::string filename, FileAccess access, const char std::string fullName = GetLocalPath(filename); const char *fullNameC = fullName.c_str(); - VERBOSE_LOG(FILESYS,"VFSFileSystem actually opening %s (%s)", fullNameC, filename.c_str()); + VERBOSE_LOG(FILESYS, "VFSFileSystem actually opening %s (%s)", fullNameC, filename.c_str()); size_t size; u8 *data = VFSReadFile(fullNameC, &size); diff --git a/Core/FileSystems/DirectoryFileSystem.h b/Core/FileSystems/DirectoryFileSystem.h index 0bcd3f8bfc..b7b71c7c34 100644 --- a/Core/FileSystems/DirectoryFileSystem.h +++ b/Core/FileSystems/DirectoryFileSystem.h @@ -55,7 +55,7 @@ enum FixPathCaseBehavior { FPC_PARTIAL_ALLOWED, // don't care how many exist (mkdir recursive) }; -bool FixPathCase(const std::string &basePath, std::string &path, FixPathCaseBehavior behavior); +bool FixPathCase(const Path &basePath, std::string &path, FixPathCaseBehavior behavior); #endif struct DirectoryFileHandle { diff --git a/Core/FileSystems/VirtualDiscFileSystem.cpp b/Core/FileSystems/VirtualDiscFileSystem.cpp index 6cc202e229..276a89f1be 100644 --- a/Core/FileSystems/VirtualDiscFileSystem.cpp +++ b/Core/FileSystems/VirtualDiscFileSystem.cpp @@ -274,7 +274,7 @@ int VirtualDiscFileSystem::getFileListIndex(std::string &fileName) Path fullName = GetLocalPath(fileName); if (! File::Exists(fullName)) { #if HOST_IS_CASE_SENSITIVE - if (! FixPathCase(basePath.ToString(), fileName, FPC_FILE_MUST_EXIST)) + if (! FixPathCase(basePath, fileName, FPC_FILE_MUST_EXIST)) return -1; fullName = GetLocalPath(fileName); @@ -602,7 +602,7 @@ PSPFileInfo VirtualDiscFileSystem::GetFileInfo(std::string filename) { Path fullName = GetLocalPath(filename); if (!File::Exists(fullName)) { #if HOST_IS_CASE_SENSITIVE - if (! FixPathCase(basePath.ToString(), filename, FPC_FILE_MUST_EXIST)) + if (! FixPathCase(basePath, filename, FPC_FILE_MUST_EXIST)) return x; fullName = GetLocalPath(filename); @@ -661,6 +661,9 @@ static void tmFromFiletime(tm &dest, FILETIME &src) std::vector VirtualDiscFileSystem::GetDirListing(std::string path) { std::vector myVector; + + // TODO(scoped): Switch this over to GetFilesInDir! + #ifdef _WIN32 WIN32_FIND_DATA findData; HANDLE hFind; @@ -708,7 +711,7 @@ std::vector VirtualDiscFileSystem::GetDirListing(std::string path) DIR *dp = opendir(localPath.c_str()); #if HOST_IS_CASE_SENSITIVE - if(dp == NULL && FixPathCase(basePath.ToString(), path, FPC_FILE_MUST_EXIST)) { + if(dp == NULL && FixPathCase(basePath, path, FPC_FILE_MUST_EXIST)) { // May have failed due to case sensitivity, try again localPath = GetLocalPath(path); dp = opendir(localPath.c_str()); From f0f2506dcc898c8d615bc248c310bd06b514e92d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 19 Jul 2021 17:38:01 +0200 Subject: [PATCH 036/336] Forgot to pass the flags to GetFilesInDir to mimic the old behavior --- Core/FileSystems/DirectoryFileSystem.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Core/FileSystems/DirectoryFileSystem.cpp b/Core/FileSystems/DirectoryFileSystem.cpp index 6e14d903e0..645ef15df6 100644 --- a/Core/FileSystems/DirectoryFileSystem.cpp +++ b/Core/FileSystems/DirectoryFileSystem.cpp @@ -861,7 +861,8 @@ std::vector DirectoryFileSystem::GetDirListing(std::string path) { std::vector files; Path localPath = GetLocalPath(path); - if (!File::GetFilesInDir(localPath, &files, nullptr, 0)) { + const int flags = File::GETFILES_GETHIDDEN | File::GETFILES_GET_NAVIGATION_ENTRIES; + if (!File::GetFilesInDir(localPath, &files, nullptr, flags)) { // TODO: Case sensitivity should be checked on a file system basis, right? #if HOST_IS_CASE_SENSITIVE if (FixPathCase(basePath, path, FPC_FILE_MUST_EXIST)) { From 96406364cab5c1872dd3848a76225c493cbbf24c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 19 Jul 2021 20:43:10 +0200 Subject: [PATCH 037/336] Fix for new bug in GetDirListing, oops --- Common/File/DirListing.cpp | 1 + Core/FileSystems/MetaFileSystem.cpp | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Common/File/DirListing.cpp b/Common/File/DirListing.cpp index b1f71c8023..f41009f176 100644 --- a/Common/File/DirListing.cpp +++ b/Common/File/DirListing.cpp @@ -264,6 +264,7 @@ bool GetFilesInDir(const Path &directory, std::vector *files, const ch Path fullName = directory / virtualName; FileInfo info; + info.name = virtualName; if (!GetFileInfo(fullName, &info)) { continue; } diff --git a/Core/FileSystems/MetaFileSystem.cpp b/Core/FileSystems/MetaFileSystem.cpp index 58ed10f31e..662d99bad8 100644 --- a/Core/FileSystems/MetaFileSystem.cpp +++ b/Core/FileSystems/MetaFileSystem.cpp @@ -662,8 +662,9 @@ u64 MetaFileSystem::getDirSize(const std::string &dirPath) { for (auto file : allFiles) { if (file.name == "." || file.name == "..") continue; + _assert_(!file.name.empty()); if (file.type == FILETYPE_DIRECTORY) { - result += getDirSize(dirPath + file.name + "/"); + result += getDirSize(dirPath + file.name); } else { result += file.size; } From e3c748cc97218f75ba6a3b1be79d2a821fa24788 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 22 Jul 2021 08:59:48 +0200 Subject: [PATCH 038/336] OpenGL: Accept "AMD" as a vendor string for, well, AMD. Seen with the open source driver by archanox --- Common/GPU/OpenGL/GLFeatures.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Common/GPU/OpenGL/GLFeatures.cpp b/Common/GPU/OpenGL/GLFeatures.cpp index 8628697766..9395892e63 100644 --- a/Common/GPU/OpenGL/GLFeatures.cpp +++ b/Common/GPU/OpenGL/GLFeatures.cpp @@ -162,7 +162,8 @@ void CheckGLExtensions() { || vendor == "nouveau") { gl_extensions.gpuVendor = GPU_VENDOR_NVIDIA; } else if (vendor == "Advanced Micro Devices, Inc." - || vendor == "ATI Technologies Inc.") { + || vendor == "ATI Technologies Inc." + || vendor == "AMD") { gl_extensions.gpuVendor = GPU_VENDOR_AMD; } else if (vendor == "Intel" || vendor == "Intel Inc." From 4ac7e2872694192e1a4a14d96168ed798f4a2dec Mon Sep 17 00:00:00 2001 From: iota97 Date: Thu, 22 Jul 2021 11:31:03 +0200 Subject: [PATCH 039/336] log fix --- Common/GPU/OpenGL/GLFeatures.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Common/GPU/OpenGL/GLFeatures.cpp b/Common/GPU/OpenGL/GLFeatures.cpp index 9395892e63..ef78271525 100644 --- a/Common/GPU/OpenGL/GLFeatures.cpp +++ b/Common/GPU/OpenGL/GLFeatures.cpp @@ -192,7 +192,7 @@ void CheckGLExtensions() { gl_extensions.gpuVendor = GPU_VENDOR_UNKNOWN; } - INFO_LOG(G3D, "GPU Vendor : %s ; renderer: %s version str: %s ; GLSL version str: %s", cvendor, renderer ? renderer : "N/A", versionStr ? versionStr : "N/A", glslVersionStr ? glslVersionStr : "N/A"); + INFO_LOG(G3D, "GPU Vendor : %s ; renderer: %s version str: %s ; GLSL version str: %s", cvendor ? cvendor : "N/A", renderer ? renderer : "N/A", versionStr ? versionStr : "N/A", glslVersionStr ? glslVersionStr : "N/A"); if (renderer) { strncpy(gl_extensions.model, renderer, sizeof(gl_extensions.model)); From bd99e4a287686ccbe8e2ff6140aa515ac50468ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 20 Jul 2021 00:33:40 +0200 Subject: [PATCH 040/336] Greatly speed up content URI file listings by using DocumentContract queries. --- Common/File/AndroidStorage.cpp | 8 ++- .../src/org/ppsspp/ppsspp/PpssppActivity.java | 52 ++++++++++++++++--- 2 files changed, 50 insertions(+), 10 deletions(-) diff --git a/Common/File/AndroidStorage.cpp b/Common/File/AndroidStorage.cpp index 277498ab50..73de8b7b27 100644 --- a/Common/File/AndroidStorage.cpp +++ b/Common/File/AndroidStorage.cpp @@ -114,10 +114,11 @@ bool Android_RenameFileTo(const std::string &fileUri, const std::string &newName return env->CallBooleanMethod(g_nativeActivity, contentUriRenameFileTo, paramFileUri, paramNewName); } +// NOTE: Does not set fullName - you're supposed to already know it. static bool ParseFileInfo(const std::string &line, File::FileInfo *fileInfo) { std::vector parts; SplitString(line, '|', parts); - if (parts.size() != 5) { + if (parts.size() != 4) { ERROR_LOG(FILESYS, "Bad format: %s", line.c_str()); return false; } @@ -125,7 +126,6 @@ static bool ParseFileInfo(const std::string &line, File::FileInfo *fileInfo) { fileInfo->isDirectory = parts[0][0] == 'D'; fileInfo->exists = true; sscanf(parts[1].c_str(), "%" PRIu64, &fileInfo->size); - fileInfo->fullName = Path(parts[3]); fileInfo->isWritable = true; // TODO: Should be passed as part of the string. fileInfo->access = fileInfo->isDirectory ? 0666 : 0777; // TODO: For read-only mappings, reflect that here, similarly as with isWritable. @@ -155,6 +155,8 @@ bool Android_GetFileInfo(const std::string &fileUri, File::FileInfo *fileInfo) { } const char *charArray = env->GetStringUTFChars(str, 0); bool retval = ParseFileInfo(std::string(charArray), fileInfo); + fileInfo->fullName = Path(fileUri); + env->DeleteLocalRef(str); return retval && fileInfo->exists; } @@ -189,6 +191,8 @@ std::vector Android_ListContentUri(const std::string &path) { if (charArray) { // paranoia File::FileInfo info; if (ParseFileInfo(std::string(charArray), &info)) { + // We can just reconstruct the URI. + info.fullName = Path(path) / info.name; items.push_back(info); } } diff --git a/android/src/org/ppsspp/ppsspp/PpssppActivity.java b/android/src/org/ppsspp/ppsspp/PpssppActivity.java index 7d7ad42489..d80a05cd38 100644 --- a/android/src/org/ppsspp/ppsspp/PpssppActivity.java +++ b/android/src/org/ppsspp/ppsspp/PpssppActivity.java @@ -9,6 +9,8 @@ import android.os.Looper; import android.os.ParcelFileDescriptor; import android.util.Log; import android.os.storage.StorageManager; +import android.content.ContentResolver; +import android.database.Cursor; import android.provider.DocumentsContract; import androidx.documentfile.provider.DocumentFile; import java.util.ArrayList; @@ -136,6 +138,7 @@ public class PpssppActivity extends NativeActivity { } private static String fileInfoToString(DocumentFile file) { + // TODO: Replace with a DocumentsContract query. String str = "F|"; if (file.isVirtual()) { // This we don't want to see. @@ -144,7 +147,7 @@ public class PpssppActivity extends NativeActivity { } else if (file.isDirectory()) { str = "D|"; } - str += file.length() + "|" + file.getName() + "|" + file.getUri() + "|" + file.lastModified(); + str += file.length() + "|" + file.getName() + "|" + file.lastModified(); return str; } @@ -154,13 +157,46 @@ public class PpssppActivity extends NativeActivity { public String[] listContentUriDir(String uriString) { try { Uri uri = Uri.parse(uriString); - DocumentFile documentFile = DocumentFile.fromTreeUri(this, uri); - DocumentFile[] children = documentFile.listFiles(); - ArrayList listing = new ArrayList(); - // Encode entries into strings for JNI simplicity. - for (DocumentFile file : children) { - String str = fileInfoToString(file); - listing.add(str); + + final ContentResolver resolver = getContentResolver(); + final Uri childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree(uri, + DocumentsContract.getDocumentId(uri)); + final ArrayList listing = new ArrayList<>(); + Cursor c = null; + try { + c = resolver.query(childrenUri, new String[] { + DocumentsContract.Document.COLUMN_DISPLAY_NAME, + DocumentsContract.Document.COLUMN_SIZE, + DocumentsContract.Document.COLUMN_FLAGS, + DocumentsContract.Document.COLUMN_MIME_TYPE, // check for MIME_TYPE_DIR + DocumentsContract.Document.COLUMN_LAST_MODIFIED + }, null, null, null); + while (c.moveToNext()) { + final String documentName = c.getString(0); + final long size = c.getLong(1); + final int flags = c.getInt(2); + final String mimeType = c.getString(3); + final long lastModified = c.getLong(4); + + final boolean isDirectory = mimeType.equals(DocumentsContract.Document.MIME_TYPE_DIR); + + // Filter out any nonsense. + if ((flags & (DocumentsContract.Document.FLAG_PARTIAL | DocumentsContract.Document.FLAG_VIRTUAL_DOCUMENT)) != 0) { + continue; + } + + String str = "F|"; + if (isDirectory) { + str = "D|"; + } + str += size + "|" + documentName + "|" + lastModified; + + listing.add(str); + } + } catch (Exception e) { + Log.w(TAG, "Failed query: " + e); + } finally { + c.close(); } // Is ArrayList weird or what? String[] strings = new String[listing.size()]; From 14e24b28adb757a4e19e2ac79dbb5da306e394b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 20 Jul 2021 00:51:17 +0200 Subject: [PATCH 041/336] Use a DocumentsContract query for single-file GetFileInfo too. --- .../src/org/ppsspp/ppsspp/PpssppActivity.java | 86 +++++++++---------- 1 file changed, 42 insertions(+), 44 deletions(-) diff --git a/android/src/org/ppsspp/ppsspp/PpssppActivity.java b/android/src/org/ppsspp/ppsspp/PpssppActivity.java index d80a05cd38..3d9e48aa83 100644 --- a/android/src/org/ppsspp/ppsspp/PpssppActivity.java +++ b/android/src/org/ppsspp/ppsspp/PpssppActivity.java @@ -137,18 +137,34 @@ public class PpssppActivity extends NativeActivity { } } - private static String fileInfoToString(DocumentFile file) { - // TODO: Replace with a DocumentsContract query. + private static final String[] columns = new String[] { + DocumentsContract.Document.COLUMN_DISPLAY_NAME, + DocumentsContract.Document.COLUMN_SIZE, + DocumentsContract.Document.COLUMN_FLAGS, + DocumentsContract.Document.COLUMN_MIME_TYPE, // check for MIME_TYPE_DIR + DocumentsContract.Document.COLUMN_LAST_MODIFIED + }; + + private String cursorToString(Cursor c) { + final int flags = c.getInt(2); + // Filter out any virtual or partial nonsense. + // There's a bunch of potentially-interesting flags here btw, + // to figure out how to set access flags better, etc. + if ((flags & (DocumentsContract.Document.FLAG_PARTIAL | DocumentsContract.Document.FLAG_VIRTUAL_DOCUMENT)) != 0) { + return null; + } + + final String mimeType = c.getString(3); + final boolean isDirectory = mimeType.equals(DocumentsContract.Document.MIME_TYPE_DIR); + final String documentName = c.getString(0); + final long size = c.getLong(1); + final long lastModified = c.getLong(4); + String str = "F|"; - if (file.isVirtual()) { - // This we don't want to see. - str = "V|"; - Log.e(TAG, "Got virtual file: " + file.getUri()); - } else if (file.isDirectory()) { + if (isDirectory) { str = "D|"; } - str += file.length() + "|" + file.getName() + "|" + file.lastModified(); - return str; + return str + size + "|" + documentName + "|" + lastModified; } // TODO: Maybe add a cheaper version that doesn't extract all the file information? @@ -164,39 +180,19 @@ public class PpssppActivity extends NativeActivity { final ArrayList listing = new ArrayList<>(); Cursor c = null; try { - c = resolver.query(childrenUri, new String[] { - DocumentsContract.Document.COLUMN_DISPLAY_NAME, - DocumentsContract.Document.COLUMN_SIZE, - DocumentsContract.Document.COLUMN_FLAGS, - DocumentsContract.Document.COLUMN_MIME_TYPE, // check for MIME_TYPE_DIR - DocumentsContract.Document.COLUMN_LAST_MODIFIED - }, null, null, null); + c = resolver.query(childrenUri, columns, null, null, null); while (c.moveToNext()) { - final String documentName = c.getString(0); - final long size = c.getLong(1); - final int flags = c.getInt(2); - final String mimeType = c.getString(3); - final long lastModified = c.getLong(4); - - final boolean isDirectory = mimeType.equals(DocumentsContract.Document.MIME_TYPE_DIR); - - // Filter out any nonsense. - if ((flags & (DocumentsContract.Document.FLAG_PARTIAL | DocumentsContract.Document.FLAG_VIRTUAL_DOCUMENT)) != 0) { - continue; + String str = cursorToString(c); + if (str != null) { + listing.add(str); } - - String str = "F|"; - if (isDirectory) { - str = "D|"; - } - str += size + "|" + documentName + "|" + lastModified; - - listing.add(str); } } catch (Exception e) { Log.w(TAG, "Failed query: " + e); } finally { - c.close(); + if (c != null) { + c.close(); + } } // Is ArrayList weird or what? String[] strings = new String[listing.size()]; @@ -294,22 +290,24 @@ public class PpssppActivity extends NativeActivity { } public String contentUriGetFileInfo(String fileName) { + Cursor c = null; try { Uri uri = Uri.parse(fileName); - DocumentFile documentFile = DocumentFile.fromSingleUri(this, uri); - if (documentFile != null) { - if (documentFile.exists()) { - String str = fileInfoToString(documentFile); - return str; - } else { - return null; - } + final ContentResolver resolver = getContentResolver(); + c = resolver.query(uri, columns, null, null, null); + if (c.moveToNext()) { + String str = cursorToString(c); + return str; } else { return null; } } catch (Exception e) { Log.e(TAG, "contentUriGetFileInfo exception: " + e.toString()); return null; + } finally { + if (c != null) { + c.close(); + } } } From 6b0851cb739893e1dbc92a3923ef33b20e63c65c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 20 Jul 2021 11:57:19 +0200 Subject: [PATCH 042/336] Use a simpler method that actually works to get free storage space from content URI. --- Core/FileSystems/DirectoryFileSystem.cpp | 3 --- .../src/org/ppsspp/ppsspp/PpssppActivity.java | 27 ++++++++++--------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Core/FileSystems/DirectoryFileSystem.cpp b/Core/FileSystems/DirectoryFileSystem.cpp index 645ef15df6..06fea1f5a9 100644 --- a/Core/FileSystems/DirectoryFileSystem.cpp +++ b/Core/FileSystems/DirectoryFileSystem.cpp @@ -203,7 +203,6 @@ bool DirectoryFileHandle::Open(const Path &basePath, std::string &fileName, File #endif Path fullName = GetLocalPath(basePath, fileName); - INFO_LOG(FILESYS, "Actually opening %s", fullName.c_str()); // On the PSP, truncating doesn't lose data. If you seek later, you'll recover it. // This is abnormal, so we deviate from the PSP's behavior and truncate on write/close. @@ -302,8 +301,6 @@ bool DirectoryFileHandle::Open(const Path &basePath, std::string &fileName, File } } - INFO_LOG(FILESYS, "Opening '%s' straight", fullName.c_str()); - int flags = 0; if (access & FILEACCESS_APPEND) { flags |= O_APPEND; diff --git a/android/src/org/ppsspp/ppsspp/PpssppActivity.java b/android/src/org/ppsspp/ppsspp/PpssppActivity.java index 3d9e48aa83..9db14467c1 100644 --- a/android/src/org/ppsspp/ppsspp/PpssppActivity.java +++ b/android/src/org/ppsspp/ppsspp/PpssppActivity.java @@ -8,6 +8,8 @@ import android.os.Bundle; import android.os.Looper; import android.os.ParcelFileDescriptor; import android.util.Log; +import android.system.StructStatVfs; +import android.system.Os; import android.os.storage.StorageManager; import android.content.ContentResolver; import android.database.Cursor; @@ -314,22 +316,23 @@ public class PpssppActivity extends NativeActivity { // The example in Android documentation uses this.getFilesDir for path. // There's also a way to beg the OS for more space, which might clear caches, but // let's just not bother with that for now. - public long contentUriGetFreeStorageSpace(String uriString) { + public long contentUriGetFreeStorageSpace(String fileName) { try { + Uri uri = Uri.parse(fileName); StorageManager storageManager = getApplicationContext().getSystemService(StorageManager.class); - // In 29 and later, we can directly get the UUID for the storage volume - // through the URI. - UUID volumeUUID; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - Uri uri = Uri.parse(uriString); - volumeUUID = UUID.fromString(storageManager.getStorageVolume(uri).getUuid()); - } else { - volumeUUID = storageManager.getUuidForPath(this.getFilesDir()); + ParcelFileDescriptor pfd = getContentResolver().openFileDescriptor(uri, "r"); + if (pfd == null) { + Log.w(TAG, "Failed to get free storage space from URI: " + fileName); + return -1; } - long availableBytes = storageManager.getAllocatableBytes(volumeUUID); - return availableBytes; - } catch (Exception e) { + StructStatVfs stats = Os.fstatvfs(pfd.getFileDescriptor()); + long freeSpace = stats.f_bavail * stats.f_bsize; + pfd.close(); + return freeSpace; + } catch (Exception e) { + // FileNotFoundException | ErrnoException e + // Log.getStackTraceString(e) Log.e(TAG, "contentUriGetFreeStorageSpace exception: " + e.toString()); return -1; } From d5781824eb7635a03450d35a4b3e5e51c1b6bfde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 20 Jul 2021 12:32:08 +0200 Subject: [PATCH 043/336] Fix lastModified, speed up Android_FileExists. Add Android_CopyFile (unused) --- Common/File/AndroidStorage.cpp | 15 +++- Common/File/AndroidStorage.h | 2 + .../src/org/ppsspp/ppsspp/PpssppActivity.java | 84 ++++++++++++------- 3 files changed, 68 insertions(+), 33 deletions(-) diff --git a/Common/File/AndroidStorage.cpp b/Common/File/AndroidStorage.cpp index 73de8b7b27..35cfcee09c 100644 --- a/Common/File/AndroidStorage.cpp +++ b/Common/File/AndroidStorage.cpp @@ -11,6 +11,7 @@ static jmethodID openContentUri; static jmethodID listContentUriDir; static jmethodID contentUriCreateFile; static jmethodID contentUriCreateDirectory; +static jmethodID contentUriCopyFile; static jmethodID contentUriRemoveFile; static jmethodID contentUriRenameFileTo; static jmethodID contentUriGetFileInfo; @@ -33,6 +34,8 @@ void Android_RegisterStorageCallbacks(JNIEnv * env, jobject obj) { _dbg_assert_(contentUriCreateDirectory); contentUriCreateFile = env->GetMethodID(env->GetObjectClass(obj), "contentUriCreateFile", "(Ljava/lang/String;Ljava/lang/String;)Z"); _dbg_assert_(contentUriCreateFile); + contentUriCopyFile = env->GetMethodID(env->GetObjectClass(obj), "contentUriCopyFile", "(Ljava/lang/String;Ljava/lang/String;)Z"); + _dbg_assert_(contentUriCopyFile); contentUriRemoveFile = env->GetMethodID(env->GetObjectClass(obj), "contentUriRemoveFile", "(Ljava/lang/String;)Z"); _dbg_assert_(contentUriRemoveFile); contentUriRenameFileTo = env->GetMethodID(env->GetObjectClass(obj), "contentUriRenameFileTo", "(Ljava/lang/String;Ljava/lang/String;)Z"); @@ -95,6 +98,16 @@ bool Android_CreateFile(const std::string &parentTreeUri, const std::string &fil return env->CallBooleanMethod(g_nativeActivity, contentUriCreateFile, paramRoot, paramFileName); } +bool Android_CopyFile(const std::string &fileUri, const std::string &destParentUri) { + if (!g_nativeActivity) { + return false; + } + auto env = getEnv(); + jstring paramFileName = env->NewStringUTF(fileUri.c_str()); + jstring paramDestParentUri = env->NewStringUTF(destParentUri.c_str()); + return env->CallBooleanMethod(g_nativeActivity, contentUriCopyFile, paramFileName, paramDestParentUri); +} + bool Android_RemoveFile(const std::string &fileUri) { if (!g_nativeActivity) { return false; @@ -130,7 +143,7 @@ static bool ParseFileInfo(const std::string &line, File::FileInfo *fileInfo) { fileInfo->access = fileInfo->isDirectory ? 0666 : 0777; // TODO: For read-only mappings, reflect that here, similarly as with isWritable. uint64_t lastModifiedMs = 0; - sscanf(parts[4].c_str(), "%" PRIu64, &lastModifiedMs); + sscanf(parts[3].c_str(), "%" PRIu64, &lastModifiedMs); // Convert from milliseconds uint32_t lastModified = lastModifiedMs / 1000; diff --git a/Common/File/AndroidStorage.h b/Common/File/AndroidStorage.h index 5370cb2be2..a217b3d4e0 100644 --- a/Common/File/AndroidStorage.h +++ b/Common/File/AndroidStorage.h @@ -25,6 +25,7 @@ bool Android_IsContentUri(const std::string &uri); int Android_OpenContentUriFd(const std::string &uri, const Android_OpenContentUriMode mode); bool Android_CreateDirectory(const std::string &parentTreeUri, const std::string &dirName); bool Android_CreateFile(const std::string &parentTreeUri, const std::string &fileName); +bool Android_CopyFile(const std::string &fileUri, const std::string &destParentUri); bool Android_RemoveFile(const std::string &fileUri); bool Android_RenameFileTo(const std::string &fileUri, const std::string &newName); bool Android_GetFileInfo(const std::string &fileUri, File::FileInfo *info); @@ -44,6 +45,7 @@ inline bool Android_IsContentUri(const std::string &uri) { return false; } inline int Android_OpenContentUriFd(const std::string &uri, const Android_OpenContentUriMode mode) { return -1; } inline bool Android_CreateDirectory(const std::string &parentTreeUri, const std::string &dirName) { return false; } inline bool Android_CreateFile(const std::string &parentTreeUri, const std::string &fileName) { return false; } +inline bool Android_CopyFile(const std::string &fileUri, const std::string &destParentUri) { return false; } inline bool Android_RemoveFile(const std::string &fileUri) { return false; } inline bool Android_RenameFileTo(const std::string &fileUri, const std::string &newName) { return false; } inline bool Android_GetFileInfo(const std::string &fileUri, File::FileInfo *info) { return false; } diff --git a/android/src/org/ppsspp/ppsspp/PpssppActivity.java b/android/src/org/ppsspp/ppsspp/PpssppActivity.java index 9db14467c1..aba075a2f7 100644 --- a/android/src/org/ppsspp/ppsspp/PpssppActivity.java +++ b/android/src/org/ppsspp/ppsspp/PpssppActivity.java @@ -173,35 +173,36 @@ public class PpssppActivity extends NativeActivity { // TODO: Replace with a proper query: // * https://stackoverflow.com/questions/42186820/documentfile-is-very-slow public String[] listContentUriDir(String uriString) { + Cursor c = null; try { Uri uri = Uri.parse(uriString); - final ContentResolver resolver = getContentResolver(); - final Uri childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree(uri, - DocumentsContract.getDocumentId(uri)); + final Uri childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree( + uri, DocumentsContract.getDocumentId(uri)); final ArrayList listing = new ArrayList<>(); - Cursor c = null; - try { - c = resolver.query(childrenUri, columns, null, null, null); - while (c.moveToNext()) { - String str = cursorToString(c); - if (str != null) { - listing.add(str); - } - } - } catch (Exception e) { - Log.w(TAG, "Failed query: " + e); - } finally { - if (c != null) { - c.close(); + c = resolver.query(childrenUri, columns, null, null, null); + while (c.moveToNext()) { + String str = cursorToString(c); + if (str != null) { + listing.add(str); } } // Is ArrayList weird or what? String[] strings = new String[listing.size()]; return listing.toArray(strings); - } catch (Exception e) { + } + catch (IllegalArgumentException e) { + // Due to sloppy exception handling in resolver.query, we get this wrapping + // a FileNotFoundException if the directory doesn't exist. + return new String[]{}; + } + catch (Exception e) { Log.e(TAG, "listContentUriDir exception: " + e.toString()); return new String[]{}; + } finally { + if (c != null) { + c.close(); + } } } @@ -255,15 +256,27 @@ public class PpssppActivity extends NativeActivity { } } + // NOTE: The destination is the parent directory! This means that contentUriCopyFile + // cannot rename things as part of the operation. + public boolean contentUriCopyFile(String srcFileUri, String dstParentDirUri) { + try { + Uri srcUri = Uri.parse(srcFileUri); + Uri dstParentUri = Uri.parse(dstParentDirUri); + DocumentsContract.copyDocument(getContentResolver(), srcUri, dstParentUri); + return true; + } catch (Exception e) { + Log.e(TAG, "contentUriCopyFile exception: " + e.toString()); + return false; + } + } + public boolean contentUriRenameFileTo(String fileUri, String newName) { try { Uri uri = Uri.parse(fileUri); - // Due to a design flaw, we can't use DocumentFile.renameTo(). // Instead we use the DocumentsContract API directly. // See https://stackoverflow.com/questions/37168200/android-5-0-new-sd-card-access-api-documentfile-renameto-unsupportedoperation. Uri newUri = DocumentsContract.renameDocument(getContentResolver(), uri, newName); - // Log.i(TAG, "New uri: " + newUri.toString()); return true; } catch (Exception e) { Log.e(TAG, "contentUriRenameFile exception: " + e.toString()); @@ -271,23 +284,30 @@ public class PpssppActivity extends NativeActivity { } } - // Possibly faster than contentUriGetFileInfo. + private static void closeQuietly(AutoCloseable closeable) { + if (closeable != null) { + try { + closeable.close(); + } catch (RuntimeException rethrown) { + throw rethrown; + } catch (Exception ignored) { + } + } + } + + // Probably slightly faster than contentUriGetFileInfo. + // Smaller difference now than before I changed that one to a query... public boolean contentUriFileExists(String fileUri) { + Cursor c = null; try { Uri uri = Uri.parse(fileUri); - DocumentFile documentFile = DocumentFile.fromSingleUri(this, uri); - if (documentFile != null) { - if (documentFile.exists()) { - return true; - } else { - return false; - } - } else { - return false; - } + c = getContentResolver().query(uri, new String[] { DocumentsContract.Document.COLUMN_DOCUMENT_ID }, null, null, null); + return c.getCount() > 0; } catch (Exception e) { - Log.e(TAG, "contentUriFileExists exception: " + e.toString()); + // Log.w(TAG, "Failed query: " + e); return false; + } finally { + closeQuietly(c); } } From 9ae00b80b1d6214e936457dbdf126d62761dd115 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 24 Jul 2021 10:31:15 +0200 Subject: [PATCH 044/336] Cleanup the ownership model in MetaFileSystem. The old one was error-prone spaghetti. --- Core/FileSystems/ISOFileSystem.h | 5 ++- Core/FileSystems/MetaFileSystem.cpp | 69 +++++++++++------------------ Core/FileSystems/MetaFileSystem.h | 27 +++++++---- Core/HLE/sceIo.cpp | 31 +++++-------- Core/PSPLoaders.cpp | 29 ++++++------ Core/System.cpp | 1 + 6 files changed, 73 insertions(+), 89 deletions(-) diff --git a/Core/FileSystems/ISOFileSystem.h b/Core/FileSystems/ISOFileSystem.h index 676964f079..0b8c00512a 100644 --- a/Core/FileSystems/ISOFileSystem.h +++ b/Core/FileSystems/ISOFileSystem.h @@ -19,6 +19,7 @@ #include #include +#include #include "FileSystem.h" @@ -100,7 +101,7 @@ private: // the filenames to "", to achieve this. class ISOBlockSystem : public IFileSystem { public: - ISOBlockSystem(ISOFileSystem *isoFileSystem) : isoFileSystem_(isoFileSystem) {} + ISOBlockSystem(std::shared_ptr isoFileSystem) : isoFileSystem_(isoFileSystem) {} void DoState(PointerWrap &p) override { // This is a bit iffy, as block device savestates already are iffy (loads/saves multiple times for multiple mounts..) @@ -150,5 +151,5 @@ public: bool RemoveFile(const std::string &filename) override { return false; } private: - ISOFileSystem *isoFileSystem_; + std::shared_ptr isoFileSystem_; }; diff --git a/Core/FileSystems/MetaFileSystem.cpp b/Core/FileSystems/MetaFileSystem.cpp index 662d99bad8..b8ebc9238e 100644 --- a/Core/FileSystems/MetaFileSystem.cpp +++ b/Core/FileSystems/MetaFileSystem.cpp @@ -172,10 +172,11 @@ IFileSystem *MetaFileSystem::GetHandleOwner(u32 handle) for (size_t i = 0; i < fileSystems.size(); i++) { if (fileSystems[i].system->OwnsHandle(handle)) - return fileSystems[i].system; //got it! + return fileSystems[i].system.get(); } - //none found? - return 0; + + // Not found + return nullptr; } int MetaFileSystem::MapFilePath(const std::string &_inpath, std::string &outpath, MountPoint **system) @@ -274,41 +275,38 @@ std::string MetaFileSystem::NormalizePrefix(std::string prefix) const { return prefix; } -void MetaFileSystem::Mount(std::string prefix, IFileSystem *system) { +void MetaFileSystem::Mount(std::string prefix, std::shared_ptr system) { std::lock_guard guard(lock); + MountPoint x; x.prefix = prefix; x.system = system; + for (auto &it : fileSystems) { + if (it.prefix == prefix) { + // Overwrite the old mount. Don't create a new one. + it = x; + return; + } + } + + // Prefix not yet mounted, do so. fileSystems.push_back(x); } -void MetaFileSystem::Unmount(std::string prefix, IFileSystem *system) { - std::lock_guard guard(lock); - MountPoint x; - x.prefix = prefix; - x.system = system; - fileSystems.erase(std::remove(fileSystems.begin(), fileSystems.end(), x), fileSystems.end()); +void MetaFileSystem::UnmountAll() { + fileSystems.clear(); + currentDir.clear(); } -void MetaFileSystem::Remount(std::string prefix, IFileSystem *newSystem) { +bool MetaFileSystem::Remount(std::string prefix, std::shared_ptr system) { std::lock_guard guard(lock); - IFileSystem *oldSystem = nullptr; for (auto &it : fileSystems) { if (it.prefix == prefix) { - oldSystem = it.system; - it.system = newSystem; + it.system = system; + return true; } } - - bool delOldSystem = true; - for (auto &it : fileSystems) { - if (it.system == oldSystem) { - delOldSystem = false; - } - } - - if (delOldSystem) - delete oldSystem; + return false; } IFileSystem *MetaFileSystem::GetSystemFromFilename(const std::string &filename) { @@ -321,31 +319,16 @@ IFileSystem *MetaFileSystem::GetSystemFromFilename(const std::string &filename) IFileSystem *MetaFileSystem::GetSystem(const std::string &prefix) { for (auto it = fileSystems.begin(); it != fileSystems.end(); ++it) { if (it->prefix == NormalizePrefix(prefix)) - return it->system; + return it->system.get(); } return NULL; } -void MetaFileSystem::Shutdown() -{ +void MetaFileSystem::Shutdown() { std::lock_guard guard(lock); - current = 6; - // Ownership is a bit convoluted. Let's just delete everything once. - - std::set toDelete; - for (size_t i = 0; i < fileSystems.size(); i++) { - toDelete.insert(fileSystems[i].system); - } - - for (auto iter = toDelete.begin(); iter != toDelete.end(); ++iter) - { - delete *iter; - } - - fileSystems.clear(); - currentDir.clear(); - startingDirectory = ""; + UnmountAll(); + Reset(); } int MetaFileSystem::OpenFile(std::string filename, FileAccess access, const char *devicename) diff --git a/Core/FileSystems/MetaFileSystem.h b/Core/FileSystems/MetaFileSystem.h index a1152e1abd..84ea60a44a 100644 --- a/Core/FileSystems/MetaFileSystem.h +++ b/Core/FileSystems/MetaFileSystem.h @@ -20,6 +20,7 @@ #include #include #include +#include #include "Core/FileSystems/FileSystem.h" @@ -28,13 +29,14 @@ private: s32 current; struct MountPoint { std::string prefix; - IFileSystem *system; + std::shared_ptr system; bool operator == (const MountPoint &other) const { return prefix == other.prefix && system == other.system; } }; + // The order of this vector is meaningful - lookups are always a linear search from the start. std::vector fileSystems; typedef std::map currentDir_t; @@ -43,26 +45,34 @@ private: std::string startingDirectory; std::recursive_mutex lock; // must be recursive -public: - MetaFileSystem() { + void Reset() { // This used to be 6, probably an attempt to replicate PSP handles. // However, that's an artifact of using psplink anyway... current = 1; + startingDirectory.clear(); } - void Mount(std::string prefix, IFileSystem *system); - void Unmount(std::string prefix, IFileSystem *system); - void Remount(std::string prefix, IFileSystem *newSystem); +public: + MetaFileSystem() { + Reset(); + } + void Mount(std::string prefix, std::shared_ptr system); + // Fails if there's not already a file system at prefix. + bool Remount(std::string prefix, std::shared_ptr system); + + void UnmountAll(); + + // The pointer returned from these are for temporary usage only. Do not store. IFileSystem *GetSystem(const std::string &prefix); IFileSystem *GetSystemFromFilename(const std::string &filename); + IFileSystem *GetHandleOwner(u32 handle); FileSystemFlags FlagsFromFilename(const std::string &filename) { IFileSystem *sys = GetSystemFromFilename(filename); return sys ? sys->Flags() : FileSystemFlags::NONE; } void ThreadEnded(int threadID); - void Shutdown(); u32 GetNewHandle() override { @@ -77,14 +87,13 @@ public: void DoState(PointerWrap &p) override; - IFileSystem *GetHandleOwner(u32 handle); int MapFilePath(const std::string &inpath, std::string &outpath, MountPoint **system); inline int MapFilePath(const std::string &_inpath, std::string &outpath, IFileSystem **system) { MountPoint *mountPoint; int error = MapFilePath(_inpath, outpath, &mountPoint); if (error == 0) { - *system = mountPoint->system; + *system = mountPoint->system.get(); return error; } diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index 73702ae4e3..7128bfa73d 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include "Common/Thread/ThreadUtil.h" #include "Common/Profiler/Profiler.h" @@ -557,7 +558,6 @@ static void __IoAsyncEndCallback(SceUID threadID, SceUID prevCallbackId) { } } -static DirectoryFileSystem *memstickSystem = nullptr; static DirectoryFileSystem *exdataSystem = nullptr; #if defined(USING_WIN_UI) || defined(APPLE) static DirectoryFileSystem *flash0System = nullptr; @@ -631,12 +631,15 @@ void __IoInit() { asyncNotifyEvent = CoreTiming::RegisterEvent("IoAsyncNotify", __IoAsyncNotify); syncNotifyEvent = CoreTiming::RegisterEvent("IoSyncNotify", __IoSyncNotify); - memstickSystem = new DirectoryFileSystem(&pspFileSystem, g_Config.memStickDirectory, FileSystemFlags::SIMULATE_FAT32 | FileSystemFlags::CARD); + auto memstickSystem = std::shared_ptr(new DirectoryFileSystem(&pspFileSystem, g_Config.memStickDirectory, FileSystemFlags::SIMULATE_FAT32 | FileSystemFlags::CARD)); #if defined(USING_WIN_UI) || defined(APPLE) - flash0System = new DirectoryFileSystem(&pspFileSystem, g_Config.flash0Directory, FileSystemFlags::FLASH); + auto flash0System = std::shared_ptr(new DirectoryFileSystem(&pspFileSystem, g_Config.flash0Directory, FileSystemFlags::FLASH)); #else - flash0System = new VFSFileSystem(&pspFileSystem, "flash0"); + auto flash0System = std::shared_ptr(new VFSFileSystem(&pspFileSystem, "flash0")); #endif + + // TODO(scoped): This won't work if memStickDirectory points at the contents of /PSP... + // Will fix later with dual mounts (first mount ms0:/PSP/ at memstickSystem), then also mount ms0:/ on it) pspFileSystem.Mount("ms0:", memstickSystem); pspFileSystem.Mount("fatms0:", memstickSystem); pspFileSystem.Mount("fatms:", memstickSystem); @@ -647,7 +650,7 @@ void __IoInit() { const std::string gameId = g_paramSFO.GetDiscID(); const Path exdataPath = GetSysDirectory(DIRECTORY_EXDATA) / gameId; if (File::Exists(exdataPath)) { - exdataSystem = new DirectoryFileSystem(&pspFileSystem, exdataPath, FileSystemFlags::SIMULATE_FAT32 | FileSystemFlags::CARD); + auto exdataSystem = std::shared_ptr(new DirectoryFileSystem(&pspFileSystem, exdataPath, FileSystemFlags::SIMULATE_FAT32 | FileSystemFlags::CARD)); pspFileSystem.Mount("exdata0:", exdataSystem); INFO_LOG(SCEIO, "Mounted exdata/%s/ under memstick for exdata0:/", gameId.c_str()); } else { @@ -763,23 +766,9 @@ void __IoShutdown() { } asyncDefaultPriority = -1; - pspFileSystem.Unmount("ms0:", memstickSystem); - pspFileSystem.Unmount("fatms0:", memstickSystem); - pspFileSystem.Unmount("fatms:", memstickSystem); - pspFileSystem.Unmount("pfat0:", memstickSystem); - pspFileSystem.Unmount("flash0:", flash0System); - - if (g_RemasterMode && exdataSystem) { - pspFileSystem.Unmount("exdata0:", exdataSystem); - delete exdataSystem; - exdataSystem = nullptr; - } - - delete memstickSystem; - memstickSystem = nullptr; - delete flash0System; - flash0System = nullptr; + pspFileSystem.UnmountAll(); + // All the file systems will be removed when we shut down pspFileSystem later. MemoryStick_Shutdown(); memStickCallbacks.clear(); memStickFatCallbacks.clear(); diff --git a/Core/PSPLoaders.cpp b/Core/PSPLoaders.cpp index 869c6f8492..73a6a8e746 100644 --- a/Core/PSPLoaders.cpp +++ b/Core/PSPLoaders.cpp @@ -80,11 +80,11 @@ void InitMemoryForGameISO(FileLoader *fileLoader) { return; } - IFileSystem *fileSystem = nullptr; - IFileSystem *blockSystem = nullptr; + std::shared_ptr fileSystem; + std::shared_ptr blockSystem; if (fileLoader->IsDirectory()) { - fileSystem = new VirtualDiscFileSystem(&pspFileSystem, fileLoader->GetPath()); + fileSystem = std::shared_ptr(new VirtualDiscFileSystem(&pspFileSystem, fileLoader->GetPath())); blockSystem = fileSystem; } else { auto bd = constructBlockDevice(fileLoader); @@ -92,9 +92,9 @@ void InitMemoryForGameISO(FileLoader *fileLoader) { if (!bd) return; - ISOFileSystem *iso = new ISOFileSystem(&pspFileSystem, bd); + std::shared_ptr iso = std::shared_ptr(new ISOFileSystem(&pspFileSystem, bd)); fileSystem = iso; - blockSystem = new ISOBlockSystem(iso); + blockSystem = std::shared_ptr(new ISOBlockSystem(iso)); } pspFileSystem.Mount("umd0:", blockSystem); @@ -148,20 +148,20 @@ bool ReInitMemoryForGameISO(FileLoader *fileLoader) { return false; } - IFileSystem *fileSystem = nullptr; - IFileSystem *blockSystem = nullptr; + std::shared_ptr fileSystem; + std::shared_ptr blockSystem; if (fileLoader->IsDirectory()) { - fileSystem = new VirtualDiscFileSystem(&pspFileSystem, fileLoader->GetPath()); + fileSystem = std::shared_ptr(new VirtualDiscFileSystem(&pspFileSystem, fileLoader->GetPath())); blockSystem = fileSystem; } else { auto bd = constructBlockDevice(fileLoader); if (!bd) return false; - ISOFileSystem *iso = new ISOFileSystem(&pspFileSystem, bd); + std::shared_ptr iso = std::shared_ptr(new ISOFileSystem(&pspFileSystem, bd)); fileSystem = iso; - blockSystem = new ISOBlockSystem(iso); + blockSystem = std::shared_ptr(new ISOBlockSystem(iso)); } pspFileSystem.Remount("umd0:", blockSystem); @@ -367,14 +367,15 @@ bool Load_PSP_ELF_PBP(FileLoader *fileLoader, std::string *error_string) { if (PSP_CoreParameter().mountIsoLoader != nullptr) { auto bd = constructBlockDevice(PSP_CoreParameter().mountIsoLoader); if (bd != NULL) { - ISOFileSystem *umd2 = new ISOFileSystem(&pspFileSystem, bd); - ISOBlockSystem *blockSystem = new ISOBlockSystem(umd2); + std::shared_ptr umd2 = std::shared_ptr(new ISOFileSystem(&pspFileSystem, bd)); + std::shared_ptr blockSystem = std::shared_ptr(new ISOBlockSystem(umd2)); pspFileSystem.Mount("umd1:", blockSystem); pspFileSystem.Mount("disc0:", umd2); pspFileSystem.Mount("umd:", blockSystem); } } + Path full_path = fileLoader->GetPath(); std::string path = full_path.GetDirectory(); std::string extension = full_path.GetFileExtension(); @@ -411,7 +412,7 @@ bool Load_PSP_ELF_PBP(FileLoader *fileLoader, std::string *error_string) { pspFileSystem.SetStartingDirectory(ms_path); } - DirectoryFileSystem *fs = new DirectoryFileSystem(&pspFileSystem, Path(path), FileSystemFlags::SIMULATE_FAT32 | FileSystemFlags::CARD); + std::shared_ptr fs = std::shared_ptr(new DirectoryFileSystem(&pspFileSystem, Path(path), FileSystemFlags::SIMULATE_FAT32 | FileSystemFlags::CARD)); pspFileSystem.Mount("umd0:", fs); std::string finalName = ms_path + file; @@ -469,7 +470,7 @@ bool Load_PSP_ELF_PBP(FileLoader *fileLoader, std::string *error_string) { } bool Load_PSP_GE_Dump(FileLoader *fileLoader, std::string *error_string) { - BlobFileSystem *umd = new BlobFileSystem(&pspFileSystem, fileLoader, "data.ppdmp"); + std::shared_ptr umd = std::shared_ptr(new BlobFileSystem(&pspFileSystem, fileLoader, "data.ppdmp")); pspFileSystem.Mount("disc0:", umd); PSPLoaders_Shutdown(); diff --git a/Core/System.cpp b/Core/System.cpp index aace6ccfa7..b9f2ccf0e8 100644 --- a/Core/System.cpp +++ b/Core/System.cpp @@ -351,6 +351,7 @@ void CPU_Shutdown() { if (coreParameter.enableSound) { Audio_Shutdown(); } + pspFileSystem.Shutdown(); mipsr4k.Shutdown(); Memory::Shutdown(); From 156ae2e81f58dd1d401ad0c3f41663ec0772485a Mon Sep 17 00:00:00 2001 From: Stuart Kenny Date: Sat, 24 Jul 2021 18:59:58 +0100 Subject: [PATCH 045/336] Fix English language mapping after recent i18n additions. --- libretro/libretro.cpp | 42 +++++++++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index e70af303b1..52a23330ba 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -307,6 +307,38 @@ static int get_language_auto(void) } } +static std::string map_psp_language_to_i18n_locale(int val) +{ + switch (val) + { + default: + case PSP_SYSTEMPARAM_LANGUAGE_ENGLISH: + return "en_US"; + case PSP_SYSTEMPARAM_LANGUAGE_JAPANESE: + return "ja_JP"; + case PSP_SYSTEMPARAM_LANGUAGE_FRENCH: + return "fr_FR"; + case PSP_SYSTEMPARAM_LANGUAGE_GERMAN: + return "de_DE"; + case PSP_SYSTEMPARAM_LANGUAGE_SPANISH: + return "es_ES"; + case PSP_SYSTEMPARAM_LANGUAGE_ITALIAN: + return "it_IT"; + case PSP_SYSTEMPARAM_LANGUAGE_PORTUGUESE: + return "pt_PT"; + case PSP_SYSTEMPARAM_LANGUAGE_RUSSIAN: + return "ru_RU"; + case PSP_SYSTEMPARAM_LANGUAGE_DUTCH: + return "nl_NL"; + case PSP_SYSTEMPARAM_LANGUAGE_KOREAN: + return "ko_KR"; + case PSP_SYSTEMPARAM_LANGUAGE_CHINESE_TRADITIONAL: + return "zh_TW"; + case PSP_SYSTEMPARAM_LANGUAGE_CHINESE_SIMPLIFIED: + return "zh_CN"; + } +} + static void check_variables(CoreParameter &coreParam) { bool updated = false; @@ -348,15 +380,7 @@ static void check_variables(CoreParameter &coreParam) if (g_Config.iLanguage < 0) g_Config.iLanguage = get_language_auto(); - g_Config.sLanguageIni = "en_US"; - auto langValuesMapping = GetLangValuesMapping(); - for (auto i = langValuesMapping.begin(); i != langValuesMapping.end(); ++i) - { - if (i->second.second == g_Config.iLanguage) - { - g_Config.sLanguageIni = i->first; - } - } + g_Config.sLanguageIni = map_psp_language_to_i18n_locale(g_Config.iLanguage); i18nrepo.LoadIni(g_Config.sLanguageIni); if (!PSP_IsInited() && ppsspp_internal_resolution.Update(&g_Config.iInternalResolution)) From 76e8e899258151ee7c87fce05996ae533454c2fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 25 Jul 2021 14:55:56 +0200 Subject: [PATCH 046/336] Add support for FILE_APPEND. --- Common/File/FileUtil.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Common/File/FileUtil.cpp b/Common/File/FileUtil.cpp index 5468386096..14ffec9aa4 100644 --- a/Common/File/FileUtil.cpp +++ b/Common/File/FileUtil.cpp @@ -223,6 +223,12 @@ int OpenFD(const Path &path, OpenFlag flags) { if (descriptor < 0) { ERROR_LOG(COMMON, "Android_OpenContentUriFd failed: '%s'", path.c_str()); } + + if (flags & OPEN_APPEND) { + // Simply seek to the end of the file to simulate append mode. + lseek(descriptor, 0, SEEK_END); + } + return descriptor; } From c6c5a93bf457bd9a4bd33fe846a9e5235b93198b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 24 Jul 2021 18:10:38 +0200 Subject: [PATCH 047/336] Couple of minor things, crashfix on deserialization failure --- Common/File/Path.cpp | 2 +- Common/File/Path.h | 2 +- Common/Serialize/Serializer.h | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Common/File/Path.cpp b/Common/File/Path.cpp index a45112599e..96110fc2d3 100644 --- a/Common/File/Path.cpp +++ b/Common/File/Path.cpp @@ -301,7 +301,7 @@ bool Path::IsAbsolute() const { return false; } -std::string Path::PathTo(const Path &other) { +std::string Path::PathTo(const Path &other) const { if (!other.StartsWith(*this)) { // Can't do this. Should return an error. return std::string(); diff --git a/Common/File/Path.h b/Common/File/Path.h index 3b0c911203..afec18ac7e 100644 --- a/Common/File/Path.h +++ b/Common/File/Path.h @@ -82,7 +82,7 @@ public: // For Android directory trees, navigates to the root of the tree. Path GetRootVolume() const; - std::string PathTo(const Path &child); + std::string PathTo(const Path &child) const; bool operator ==(const Path &other) const { return path_ == other.path_ && type_ == other.type_; diff --git a/Common/Serialize/Serializer.h b/Common/Serialize/Serializer.h index cfe14f01d8..77f024975c 100644 --- a/Common/Serialize/Serializer.h +++ b/Common/Serialize/Serializer.h @@ -143,7 +143,8 @@ public: if (p.error != p.ERROR_FAILURE) { return ERROR_NONE; } else { - *errorString = std::string("Failure at ") + p.GetBadSectionTitle(); + std::string badSectionTitle = p.GetBadSectionTitle() ? p.GetBadSectionTitle() : "(unknown bad section)"; + *errorString = std::string("Failure at ") + badSectionTitle; return ERROR_BROKEN_STATE; } } From 729496b60a3152266fea4281d76a0938d66136a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 20 Jul 2021 12:55:33 +0200 Subject: [PATCH 048/336] Error code support preparations --- Common/File/AndroidStorage.cpp | 21 +++++++++++++++++++ Common/File/AndroidStorage.h | 20 ++++++++++++++++++ Common/File/FileUtil.cpp | 4 ++-- Core/FileLoaders/LocalFileLoader.cpp | 2 +- .../src/org/ppsspp/ppsspp/PpssppActivity.java | 6 ++++++ 5 files changed, 50 insertions(+), 3 deletions(-) diff --git a/Common/File/AndroidStorage.cpp b/Common/File/AndroidStorage.cpp index 35cfcee09c..980bfaa9e2 100644 --- a/Common/File/AndroidStorage.cpp +++ b/Common/File/AndroidStorage.cpp @@ -18,6 +18,7 @@ static jmethodID contentUriGetFileInfo; static jmethodID contentUriFileExists; static jmethodID contentUriGetFreeStorageSpace; static jmethodID filePathGetFreeStorageSpace; +static jmethodID isExternalStoragePreservedLegacy; static jobject g_nativeActivity; @@ -48,6 +49,8 @@ void Android_RegisterStorageCallbacks(JNIEnv * env, jobject obj) { _dbg_assert_(contentUriGetFreeStorageSpace); filePathGetFreeStorageSpace = env->GetMethodID(env->GetObjectClass(obj), "filePathGetFreeStorageSpace", "(Ljava/lang/String;)J"); _dbg_assert_(filePathGetFreeStorageSpace); + isExternalStoragePreservedLegacy = env->GetMethodID(env->GetObjectClass(obj), "isExternalStoragePreservedLegacy", "()Z"); + _dbg_assert_(isExternalStoragePreservedLegacy); } bool Android_IsContentUri(const std::string &filename) { @@ -241,4 +244,22 @@ int64_t Android_GetFreeSpaceByFilePath(const std::string &filePath) { return env->CallLongMethod(g_nativeActivity, filePathGetFreeStorageSpace, param); } +bool Android_IsExternalStoragePreservedLegacy() { + if (!g_nativeActivity) { + return false; + } + auto env = getEnv(); + return env->CallBooleanMethod(g_nativeActivity, isExternalStoragePreservedLegacy); +} + +const char *Android_ErrorToString(ContentError error) { + switch (error) { + case ContentError::SUCCESS: return "SUCCESS"; + case ContentError::OTHER: return "OTHER"; + case ContentError::NOT_FOUND: return "NOT_FOUND"; + case ContentError::DISK_FULL: return "DISK_FULL"; + default: return "(UNKNOWN)"; + } +} + #endif diff --git a/Common/File/AndroidStorage.h b/Common/File/AndroidStorage.h index a217b3d4e0..55d49da478 100644 --- a/Common/File/AndroidStorage.h +++ b/Common/File/AndroidStorage.h @@ -13,6 +13,22 @@ enum class Android_OpenContentUriMode { READ_WRITE_TRUNCATE = 2, // "rwt" }; +// Matches the constants in PpssppActivity.java. +enum class ContentError { + SUCCESS = 0, + OTHER = -1, + NOT_FOUND = -2, + DISK_FULL = -3, +}; + +inline ContentError ContentErrorFromInt(int ival) { + if (ival >= 0) { + return ContentError::SUCCESS; + } else { + return (ContentError)ival; + } +} + #if PPSSPP_PLATFORM(ANDROID) && !defined(__LIBRETRO__) #include @@ -32,6 +48,8 @@ bool Android_GetFileInfo(const std::string &fileUri, File::FileInfo *info); bool Android_FileExists(const std::string &fileUri); int64_t Android_GetFreeSpaceByContentUri(const std::string &uri); int64_t Android_GetFreeSpaceByFilePath(const std::string &filePath); +bool Android_IsExternalStoragePreservedLegacy(); +const char *Android_ErrorToString(ContentError error); std::vector Android_ListContentUri(const std::string &uri); @@ -52,6 +70,8 @@ inline bool Android_GetFileInfo(const std::string &fileUri, File::FileInfo *info inline bool Android_FileExists(const std::string &fileUri) { return false; } inline int64_t Android_GetFreeSpaceByContentUri(const std::string &uri) { return -1; } inline int64_t Android_GetFreeSpaceByFilePath(const std::string &filePath) { return -1; } +inline bool Android_IsExternalStoragePreservedLegacy() { return false; } +inline const char *Android_ErrorToString(ContentError error) { return ""; } inline std::vector Android_ListContentUri(const std::string &uri) { return std::vector(); } diff --git a/Common/File/FileUtil.cpp b/Common/File/FileUtil.cpp index 14ffec9aa4..f43e443c21 100644 --- a/Common/File/FileUtil.cpp +++ b/Common/File/FileUtil.cpp @@ -107,7 +107,7 @@ FILE *OpenCFile(const Path &path, const char *mode) { INFO_LOG(COMMON, "Opening content file for read: '%s'", path.c_str()); // Read, let's support this - easy one. int descriptor = Android_OpenContentUriFd(path.ToString(), Android_OpenContentUriMode::READ); - if (descriptor == -1) { + if (descriptor < 0) { return nullptr; } return fdopen(descriptor, "rb"); @@ -133,7 +133,7 @@ FILE *OpenCFile(const Path &path, const char *mode) { // TODO: Support append modes and stuff... For now let's go with the most common one. int descriptor = Android_OpenContentUriFd(path.ToString(), Android_OpenContentUriMode::READ_WRITE_TRUNCATE); - if (descriptor == -1) { + if (descriptor < 0) { INFO_LOG(COMMON, "Opening '%s' for write failed", path.ToString().c_str()); return nullptr; } diff --git a/Core/FileLoaders/LocalFileLoader.cpp b/Core/FileLoaders/LocalFileLoader.cpp index d0c4c6828c..96d3412cf6 100644 --- a/Core/FileLoaders/LocalFileLoader.cpp +++ b/Core/FileLoaders/LocalFileLoader.cpp @@ -61,7 +61,7 @@ LocalFileLoader::LocalFileLoader(const Path &filename) if (filename.Type() == PathType::CONTENT_URI) { int fd = Android_OpenContentUriFd(filename.ToString(), Android_OpenContentUriMode::READ); INFO_LOG(SYSTEM, "Fd %d for content URI: '%s'", fd, filename.c_str()); - if (fd == -1) { + if (fd < 0) { ERROR_LOG(FILESYS, "LoadFileLoader failed to open content URI: '%s'", filename.c_str()); return; } diff --git a/android/src/org/ppsspp/ppsspp/PpssppActivity.java b/android/src/org/ppsspp/ppsspp/PpssppActivity.java index aba075a2f7..02c733ec5c 100644 --- a/android/src/org/ppsspp/ppsspp/PpssppActivity.java +++ b/android/src/org/ppsspp/ppsspp/PpssppActivity.java @@ -31,6 +31,12 @@ public class PpssppActivity extends NativeActivity { public static boolean libraryLoaded = false; + // Matches the enum in AndroidStorage.h. + private static final int CONTENT_ERROR_SUCCESS = 0; + private static final int CONTENT_ERROR_OTHER = -1; + private static final int CONTENT_ERROR_NOT_FOUND = -2; + private static final int CONTENT_ERROR_DISK_FULL = -3; + @SuppressWarnings("deprecation") public static void CheckABIAndLoadLibrary() { if (Build.CPU_ABI.equals("armeabi")) { From ab69b896c3b2bd383990056ec0bca88424f90555 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 25 Jul 2021 15:32:15 +0200 Subject: [PATCH 049/336] Add and hook up Android_MoveFile --- Common/File/AndroidStorage.cpp | 19 ++++++++++ Common/File/AndroidStorage.h | 4 ++ Common/File/FileUtil.cpp | 37 ++++++++++++------- UWP/CommonUWP/CommonUWP.vcxproj | 4 +- UWP/CommonUWP/CommonUWP.vcxproj.filters | 8 +++- .../src/org/ppsspp/ppsspp/PpssppActivity.java | 17 ++++++++- 6 files changed, 72 insertions(+), 17 deletions(-) diff --git a/Common/File/AndroidStorage.cpp b/Common/File/AndroidStorage.cpp index 980bfaa9e2..d7de92c64e 100644 --- a/Common/File/AndroidStorage.cpp +++ b/Common/File/AndroidStorage.cpp @@ -12,6 +12,7 @@ static jmethodID listContentUriDir; static jmethodID contentUriCreateFile; static jmethodID contentUriCreateDirectory; static jmethodID contentUriCopyFile; +static jmethodID contentUriMoveFile; static jmethodID contentUriRemoveFile; static jmethodID contentUriRenameFileTo; static jmethodID contentUriGetFileInfo; @@ -39,6 +40,8 @@ void Android_RegisterStorageCallbacks(JNIEnv * env, jobject obj) { _dbg_assert_(contentUriCopyFile); contentUriRemoveFile = env->GetMethodID(env->GetObjectClass(obj), "contentUriRemoveFile", "(Ljava/lang/String;)Z"); _dbg_assert_(contentUriRemoveFile); + contentUriMoveFile = env->GetMethodID(env->GetObjectClass(obj), "contentUriMoveFile", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z"); + _dbg_assert_(contentUriMoveFile); contentUriRenameFileTo = env->GetMethodID(env->GetObjectClass(obj), "contentUriRenameFileTo", "(Ljava/lang/String;Ljava/lang/String;)Z"); _dbg_assert_(contentUriRenameFileTo); contentUriGetFileInfo = env->GetMethodID(env->GetObjectClass(obj), "contentUriGetFileInfo", "(Ljava/lang/String;)Ljava/lang/String;"); @@ -111,6 +114,17 @@ bool Android_CopyFile(const std::string &fileUri, const std::string &destParentU return env->CallBooleanMethod(g_nativeActivity, contentUriCopyFile, paramFileName, paramDestParentUri); } +bool Android_MoveFile(const std::string &fileUri, const std::string &srcParentUri, const std::string &destParentUri) { + if (!g_nativeActivity) { + return false; + } + auto env = getEnv(); + jstring paramFileName = env->NewStringUTF(fileUri.c_str()); + jstring paramSrcParentUri = env->NewStringUTF(srcParentUri.c_str()); + jstring paramDestParentUri = env->NewStringUTF(destParentUri.c_str()); + return env->CallBooleanMethod(g_nativeActivity, contentUriMoveFile, paramFileName, paramSrcParentUri, paramDestParentUri); +} + bool Android_RemoveFile(const std::string &fileUri) { if (!g_nativeActivity) { return false; @@ -262,4 +276,9 @@ const char *Android_ErrorToString(ContentError error) { } } +#else + +// This string should never appear except on Android. +std::string g_extFilesDir = "(IF YOU SEE THIS THERE'S A BUG)"; + #endif diff --git a/Common/File/AndroidStorage.h b/Common/File/AndroidStorage.h index 55d49da478..9decabaf48 100644 --- a/Common/File/AndroidStorage.h +++ b/Common/File/AndroidStorage.h @@ -41,6 +41,7 @@ bool Android_IsContentUri(const std::string &uri); int Android_OpenContentUriFd(const std::string &uri, const Android_OpenContentUriMode mode); bool Android_CreateDirectory(const std::string &parentTreeUri, const std::string &dirName); bool Android_CreateFile(const std::string &parentTreeUri, const std::string &fileName); +bool Android_MoveFile(const std::string &fileUri, const std::string &srcParentUri, const std::string &destParentUri); bool Android_CopyFile(const std::string &fileUri, const std::string &destParentUri); bool Android_RemoveFile(const std::string &fileUri); bool Android_RenameFileTo(const std::string &fileUri, const std::string &newName); @@ -57,12 +58,15 @@ void Android_RegisterStorageCallbacks(JNIEnv * env, jobject obj); #else +extern std::string g_extFilesDir; + // Stub out the Android Storage wrappers, so that we can avoid ifdefs everywhere. inline bool Android_IsContentUri(const std::string &uri) { return false; } inline int Android_OpenContentUriFd(const std::string &uri, const Android_OpenContentUriMode mode) { return -1; } inline bool Android_CreateDirectory(const std::string &parentTreeUri, const std::string &dirName) { return false; } inline bool Android_CreateFile(const std::string &parentTreeUri, const std::string &fileName) { return false; } +inline bool Android_MoveFile(const std::string &fileUri, const std::string &srcParentUri, const std::string &destParentUri) { return false; } inline bool Android_CopyFile(const std::string &fileUri, const std::string &destParentUri) { return false; } inline bool Android_RemoveFile(const std::string &fileUri) { return false; } inline bool Android_RenameFileTo(const std::string &fileUri, const std::string &newName) { return false; } diff --git a/Common/File/FileUtil.cpp b/Common/File/FileUtil.cpp index f43e443c21..8560694a48 100644 --- a/Common/File/FileUtil.cpp +++ b/Common/File/FileUtil.cpp @@ -571,6 +571,7 @@ bool Rename(const Path &srcFilename, const Path &destFilename) { break; case PathType::CONTENT_URI: // Content URI: Can only rename if in the same folder. + // TODO: Fallback to move + rename? Or do we even care about that use case? if (srcFilename.GetDirectory() != destFilename.GetDirectory()) { INFO_LOG(COMMON, "Content URI rename: Directories not matching, failing. %s --> %s", srcFilename.c_str(), destFilename.c_str()); return false; @@ -600,26 +601,23 @@ bool Rename(const Path &srcFilename, const Path &destFilename) { } // copies file srcFilename to destFilename, returns true on success -bool Copy(const Path &srcFilename, const Path &destFilename) -{ +bool Copy(const Path &srcFilename, const Path &destFilename) { switch (srcFilename.Type()) { case PathType::NATIVE: break; // OK case PathType::CONTENT_URI: - ERROR_LOG_REPORT_ONCE(copyUriNotSupported, COMMON, "Copying files by Android URI is not yet supported"); + if (destFilename.Type() == PathType::CONTENT_URI && destFilename.CanNavigateUp()) { + Path destParent = destFilename.NavigateUp(); + // Use native file copy. + if (Android_CopyFile(srcFilename.ToString(), destParent.ToString())) { + return true; + } + // Else fall through, and try using file I/O. + } break; default: return false; } - switch (destFilename.Type()) { - case PathType::NATIVE: - break; // OK - case PathType::CONTENT_URI: - ERROR_LOG_REPORT_ONCE(copyUriNotSupported, COMMON, "Copying files by Android URI is not yet supported"); - return false; - default: - return false; - } INFO_LOG(COMMON, "Copy: %s --> %s", srcFilename.c_str(), destFilename.c_str()); #ifdef _WIN32 @@ -637,7 +635,7 @@ bool Copy(const Path &srcFilename, const Path &destFilename) #else // buffer size -#define BSIZE 4096 +#define BSIZE 16384 char buffer[BSIZE]; @@ -692,6 +690,19 @@ bool Copy(const Path &srcFilename, const Path &destFilename) } bool Move(const Path &srcFilename, const Path &destFilename) { + // Try a shortcut in Android Storage scenarios. + if (srcFilename.Type() == PathType::CONTENT_URI && destFilename.Type() == PathType::CONTENT_URI && srcFilename.CanNavigateUp() && destFilename.CanNavigateUp()) { + // We do not handle simultaneous renames here. + if (srcFilename.GetFilename() == destFilename.GetFilename()) { + Path srcParent = srcFilename.NavigateUp(); + Path dstParent = destFilename.NavigateUp(); + if (Android_MoveFile(srcFilename.ToString(), srcParent.ToString(), dstParent.ToString())) { + return true; + } + // If failed, fall through and try other ways. + } + } + if (Rename(srcFilename, destFilename)) { return true; } else if (Copy(srcFilename, destFilename)) { diff --git a/UWP/CommonUWP/CommonUWP.vcxproj b/UWP/CommonUWP/CommonUWP.vcxproj index e91ec0d58b..3349afd9e6 100644 --- a/UWP/CommonUWP/CommonUWP.vcxproj +++ b/UWP/CommonUWP/CommonUWP.vcxproj @@ -386,6 +386,7 @@ + @@ -518,6 +519,7 @@ + @@ -640,4 +642,4 @@ - + \ No newline at end of file diff --git a/UWP/CommonUWP/CommonUWP.vcxproj.filters b/UWP/CommonUWP/CommonUWP.vcxproj.filters index a72807393e..740747dfd4 100644 --- a/UWP/CommonUWP/CommonUWP.vcxproj.filters +++ b/UWP/CommonUWP/CommonUWP.vcxproj.filters @@ -375,6 +375,9 @@ GPU + + File + @@ -691,6 +694,9 @@ GPU + + File + @@ -705,4 +711,4 @@ Math\lin - + \ No newline at end of file diff --git a/android/src/org/ppsspp/ppsspp/PpssppActivity.java b/android/src/org/ppsspp/ppsspp/PpssppActivity.java index 02c733ec5c..89e02699c9 100644 --- a/android/src/org/ppsspp/ppsspp/PpssppActivity.java +++ b/android/src/org/ppsspp/ppsspp/PpssppActivity.java @@ -268,14 +268,27 @@ public class PpssppActivity extends NativeActivity { try { Uri srcUri = Uri.parse(srcFileUri); Uri dstParentUri = Uri.parse(dstParentDirUri); - DocumentsContract.copyDocument(getContentResolver(), srcUri, dstParentUri); - return true; + return DocumentsContract.copyDocument(getContentResolver(), srcUri, dstParentUri) != null; } catch (Exception e) { Log.e(TAG, "contentUriCopyFile exception: " + e.toString()); return false; } } + // NOTE: The destination is the parent directory! This means that contentUriCopyFile + // cannot rename things as part of the operation. + public boolean contentUriMoveFile(String srcFileUri, String srcParentDirUri, String dstParentDirUri) { + try { + Uri srcUri = Uri.parse(srcFileUri); + Uri srcParentUri = Uri.parse(srcParentDirUri); + Uri dstParentUri = Uri.parse(dstParentDirUri); + return DocumentsContract.moveDocument(getContentResolver(), srcUri, srcParentUri, dstParentUri) != null; + } catch (Exception e) { + Log.e(TAG, "contentUriMoveFile exception: " + e.toString()); + return false; + } + } + public boolean contentUriRenameFileTo(String fileUri, String newName) { try { Uri uri = Uri.parse(fileUri); From 8ab627d6e981d299bc1ffe2d446bfa97fa1e576d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 24 Jul 2021 18:16:12 +0200 Subject: [PATCH 050/336] Workaround for the /PSP path thing. Needs testing. --- Core/FileSystems/DirectoryFileSystem.cpp | 37 +++++++++++++++------- Core/FileSystems/DirectoryFileSystem.h | 15 +++++---- Core/FileSystems/FileSystem.h | 1 + Core/FileSystems/VirtualDiscFileSystem.cpp | 7 ++-- Core/FileSystems/VirtualDiscFileSystem.h | 28 +++++++++------- Core/HLE/sceIo.cpp | 16 +++++++--- Core/System.cpp | 2 ++ Core/System.h | 1 + 8 files changed, 70 insertions(+), 37 deletions(-) diff --git a/Core/FileSystems/DirectoryFileSystem.cpp b/Core/FileSystems/DirectoryFileSystem.cpp index 06fea1f5a9..4a7bde8f8b 100644 --- a/Core/FileSystems/DirectoryFileSystem.cpp +++ b/Core/FileSystems/DirectoryFileSystem.cpp @@ -177,17 +177,40 @@ DirectoryFileSystem::~DirectoryFileSystem() { CloseAll(); } -Path DirectoryFileHandle::GetLocalPath(const Path &basePath, std::string localpath) -{ +// TODO(scoped): Merge the two below functions somehow. + +Path DirectoryFileHandle::GetLocalPath(const Path &basePath, std::string localpath) const { if (localpath.empty()) return basePath; if (localpath[0] == '/') localpath.erase(0, 1); + if (fileSystemFlags_ & FileSystemFlags::STRIP_PSP) { + if (startsWith(localpath, "/PSP")) { + localpath = localpath.substr(4); + } + } + return basePath / localpath; } +Path DirectoryFileSystem::GetLocalPath(std::string internalPath) const { + if (internalPath.empty()) + return basePath; + + if (internalPath[0] == '/') + internalPath.erase(0, 1); + + if (flags & FileSystemFlags::STRIP_PSP) { + if (startsWith(internalPath, "/PSP")) { + internalPath = internalPath.substr(4); + } + } + + return basePath / internalPath; +} + bool DirectoryFileHandle::Open(const Path &basePath, std::string &fileName, FileAccess access, u32 &error) { error = 0; @@ -508,16 +531,6 @@ void DirectoryFileSystem::CloseAll() { entries.clear(); } -Path DirectoryFileSystem::GetLocalPath(std::string internalPath) { - if (internalPath.empty()) - return basePath; - - if (internalPath[0] == '/') - internalPath.erase(0, 1); - - return basePath / internalPath; -} - bool DirectoryFileSystem::MkDir(const std::string &dirname) { bool result; #if HOST_IS_CASE_SENSITIVE diff --git a/Core/FileSystems/DirectoryFileSystem.h b/Core/FileSystems/DirectoryFileSystem.h index b7b71c7c34..9d8478d691 100644 --- a/Core/FileSystems/DirectoryFileSystem.h +++ b/Core/FileSystems/DirectoryFileSystem.h @@ -72,11 +72,14 @@ struct DirectoryFileHandle { s64 needsTrunc_ = -1; bool replay_ = true; bool inGameDir_ = false; + FileSystemFlags fileSystemFlags_ = (FileSystemFlags)0; - DirectoryFileHandle(Flags flags) : replay_(flags != SKIP_REPLAY) { - } + DirectoryFileHandle() {} - Path GetLocalPath(const Path &basePath, std::string localpath); + DirectoryFileHandle(Flags flags, FileSystemFlags fileSystemFlags) + : replay_(flags != SKIP_REPLAY), fileSystemFlags_(fileSystemFlags) {} + + Path GetLocalPath(const Path &basePath, std::string localpath) const; bool Open(const Path &basePath, std::string &fileName, FileAccess access, u32 &err); size_t Read(u8* pointer, s64 size); size_t Write(const u8* pointer, s64 size); @@ -114,7 +117,7 @@ public: private: struct OpenFileEntry { - DirectoryFileHandle hFile = DirectoryFileHandle::NORMAL; + DirectoryFileHandle hFile; std::string guestFilename; FileAccess access = FILEACCESS_NONE; }; @@ -124,8 +127,8 @@ private: Path basePath; IHandleAllocator *hAlloc; FileSystemFlags flags; - // In case of Windows: Translate slashes, etc. - Path GetLocalPath(std::string internalPath); + + Path GetLocalPath(std::string internalPath) const; }; // VFSFileSystem: Ability to map in Android APK paths as well! Does not support all features, only meant for fonts. diff --git a/Core/FileSystems/FileSystem.h b/Core/FileSystems/FileSystem.h index 87e8c92e07..5df227dd1f 100644 --- a/Core/FileSystems/FileSystem.h +++ b/Core/FileSystems/FileSystem.h @@ -63,6 +63,7 @@ enum class FileSystemFlags { UMD = 2, CARD = 4, FLASH = 8, + STRIP_PSP = 16, }; ENUM_CLASS_BITOPS(FileSystemFlags); diff --git a/Core/FileSystems/VirtualDiscFileSystem.cpp b/Core/FileSystems/VirtualDiscFileSystem.cpp index 276a89f1be..889bc506fc 100644 --- a/Core/FileSystems/VirtualDiscFileSystem.cpp +++ b/Core/FileSystems/VirtualDiscFileSystem.cpp @@ -187,7 +187,7 @@ void VirtualDiscFileSystem::DoState(PointerWrap &p) for (int i = 0; i < entryCount; i++) { u32 fd = 0; - OpenFileEntry of; + OpenFileEntry of(Flags()); Do(p, fd); Do(p, of.fileIndex); @@ -214,6 +214,7 @@ void VirtualDiscFileSystem::DoState(PointerWrap &p) } } + // TODO: I think we only need to write to the map on load? entries[fd] = of; } } else { @@ -321,7 +322,7 @@ int VirtualDiscFileSystem::getFileListIndex(u32 accessBlock, u32 accessSize, boo int VirtualDiscFileSystem::OpenFile(std::string filename, FileAccess access, const char *devicename) { - OpenFileEntry entry; + OpenFileEntry entry(Flags()); entry.curOffset = 0; entry.size = 0; entry.startOffset = 0; @@ -471,7 +472,7 @@ size_t VirtualDiscFileSystem::ReadFile(u32 handle, u8 *pointer, s64 size, int &u return 0; } - OpenFileEntry temp; + OpenFileEntry temp(Flags()); if (fileList[fileIndex].handler != NULL) { temp.handler = fileList[fileIndex].handler; } diff --git a/Core/FileSystems/VirtualDiscFileSystem.h b/Core/FileSystems/VirtualDiscFileSystem.h index bd8604ae3d..6c76d6b6fb 100644 --- a/Core/FileSystems/VirtualDiscFileSystem.h +++ b/Core/FileSystems/VirtualDiscFileSystem.h @@ -87,17 +87,15 @@ private: ReadFunc Read; CloseFunc Close; - bool IsValid() const { return library != NULL; } + bool IsValid() const { return library != nullptr; } }; struct HandlerFileHandle { Handler *handler; HandlerHandle handle; - HandlerFileHandle() : handler(NULL), handle(0) { - } - HandlerFileHandle(Handler *handler_) : handler(handler_), handle(-1) { - } + HandlerFileHandle() : handler(nullptr), handle(0) {} + HandlerFileHandle(Handler *handler_) : handler(handler_), handle(-1) {} bool Open(const std::string& basePath, const std::string& fileName, FileAccess access) { // Ignore access, read only. @@ -115,7 +113,7 @@ private: } bool IsValid() { - return handler != NULL && handler->IsValid(); + return handler != nullptr && handler->IsValid(); } HandlerFileHandle &operator =(Handler *_handler) { @@ -127,13 +125,18 @@ private: typedef enum { VFILETYPE_NORMAL, VFILETYPE_LBN, VFILETYPE_ISO } VirtualFileType; struct OpenFileEntry { - DirectoryFileHandle hFile = DirectoryFileHandle::SKIP_REPLAY; + OpenFileEntry() {} + OpenFileEntry(FileSystemFlags fileSystemFlags) { + hFile = DirectoryFileHandle(DirectoryFileHandle::SKIP_REPLAY, fileSystemFlags); + } + + DirectoryFileHandle hFile; HandlerFileHandle handler; - VirtualFileType type; - u32 fileIndex; - u64 curOffset; - u64 startOffset; // only used by lbn files - u64 size; // only used by lbn files + VirtualFileType type = VFILETYPE_NORMAL; + u32 fileIndex = 0; + u64 curOffset = 0; + u64 startOffset = 0; // only used by lbn files + u64 size = 0; // only used by lbn files bool Open(const Path &basePath, std::string& fileName, FileAccess access) { // Ignored, we're read only. @@ -168,6 +171,7 @@ private: }; typedef std::map EntryMap; + EntryMap entries; IHandleAllocator *hAlloc; Path basePath; diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index 7128bfa73d..3b99c2d2d3 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -631,19 +631,28 @@ void __IoInit() { asyncNotifyEvent = CoreTiming::RegisterEvent("IoAsyncNotify", __IoAsyncNotify); syncNotifyEvent = CoreTiming::RegisterEvent("IoSyncNotify", __IoSyncNotify); - auto memstickSystem = std::shared_ptr(new DirectoryFileSystem(&pspFileSystem, g_Config.memStickDirectory, FileSystemFlags::SIMULATE_FAT32 | FileSystemFlags::CARD)); + // TODO(scoped): This won't work if memStickDirectory points at the contents of /PSP... #if defined(USING_WIN_UI) || defined(APPLE) auto flash0System = std::shared_ptr(new DirectoryFileSystem(&pspFileSystem, g_Config.flash0Directory, FileSystemFlags::FLASH)); #else auto flash0System = std::shared_ptr(new VFSFileSystem(&pspFileSystem, "flash0")); #endif + FileSystemFlags memstickFlags = FileSystemFlags::SIMULATE_FAT32 | FileSystemFlags::CARD; + + Path pspDir = GetSysDirectory(DIRECTORY_PSP); + if (pspDir == g_Config.memStickDirectory) { + // Initially tried to do this with dual mounts, but failed due to save state compatibility issues. + INFO_LOG(SCEIO, "Enabling /PSP compatibility mode"); + memstickFlags |= FileSystemFlags::STRIP_PSP; + } + + auto memstickSystem = std::shared_ptr(new DirectoryFileSystem(&pspFileSystem, g_Config.memStickDirectory, memstickFlags)); - // TODO(scoped): This won't work if memStickDirectory points at the contents of /PSP... - // Will fix later with dual mounts (first mount ms0:/PSP/ at memstickSystem), then also mount ms0:/ on it) pspFileSystem.Mount("ms0:", memstickSystem); pspFileSystem.Mount("fatms0:", memstickSystem); pspFileSystem.Mount("fatms:", memstickSystem); pspFileSystem.Mount("pfat0:", memstickSystem); + pspFileSystem.Mount("flash0:", flash0System); if (g_RemasterMode) { @@ -768,7 +777,6 @@ void __IoShutdown() { pspFileSystem.UnmountAll(); - // All the file systems will be removed when we shut down pspFileSystem later. MemoryStick_Shutdown(); memStickCallbacks.clear(); memStickFatCallbacks.clear(); diff --git a/Core/System.cpp b/Core/System.cpp index b9f2ccf0e8..d2427d43fd 100644 --- a/Core/System.cpp +++ b/Core/System.cpp @@ -592,6 +592,8 @@ Path GetSysDirectory(PSPDirectories directoryType) { } switch (directoryType) { + case DIRECTORY_PSP: + return pspDirectory; case DIRECTORY_CHEATS: return pspDirectory / "Cheats"; case DIRECTORY_GAME: diff --git a/Core/System.h b/Core/System.h index 29b95bb7a4..13423a0167 100644 --- a/Core/System.h +++ b/Core/System.h @@ -37,6 +37,7 @@ enum GlobalUIState { // Use these in conjunction with GetSysDirectory. enum PSPDirectories { + DIRECTORY_PSP, DIRECTORY_CHEATS, DIRECTORY_SCREENSHOT, DIRECTORY_SYSTEM, From 2333239514361b8fa2fec03168ef0079c0b1254c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 25 Jul 2021 14:12:57 +0200 Subject: [PATCH 051/336] Change one storage function to use an error code. --- Common/File/AndroidStorage.cpp | 19 ++++++++++--------- Common/File/AndroidStorage.h | 19 ++++++++++--------- Common/File/FileUtil.cpp | 2 +- .../src/org/ppsspp/ppsspp/PpssppActivity.java | 16 +++++++++------- 4 files changed, 30 insertions(+), 26 deletions(-) diff --git a/Common/File/AndroidStorage.cpp b/Common/File/AndroidStorage.cpp index d7de92c64e..552be7686d 100644 --- a/Common/File/AndroidStorage.cpp +++ b/Common/File/AndroidStorage.cpp @@ -42,7 +42,7 @@ void Android_RegisterStorageCallbacks(JNIEnv * env, jobject obj) { _dbg_assert_(contentUriRemoveFile); contentUriMoveFile = env->GetMethodID(env->GetObjectClass(obj), "contentUriMoveFile", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z"); _dbg_assert_(contentUriMoveFile); - contentUriRenameFileTo = env->GetMethodID(env->GetObjectClass(obj), "contentUriRenameFileTo", "(Ljava/lang/String;Ljava/lang/String;)Z"); + contentUriRenameFileTo = env->GetMethodID(env->GetObjectClass(obj), "contentUriRenameFileTo", "(Ljava/lang/String;Ljava/lang/String;)I"); _dbg_assert_(contentUriRenameFileTo); contentUriGetFileInfo = env->GetMethodID(env->GetObjectClass(obj), "contentUriGetFileInfo", "(Ljava/lang/String;)Ljava/lang/String;"); _dbg_assert_(contentUriGetFileInfo); @@ -134,14 +134,14 @@ bool Android_RemoveFile(const std::string &fileUri) { return env->CallBooleanMethod(g_nativeActivity, contentUriRemoveFile, paramFileName); } -bool Android_RenameFileTo(const std::string &fileUri, const std::string &newName) { +StorageError Android_RenameFileTo(const std::string &fileUri, const std::string &newName) { if (!g_nativeActivity) { - return false; + return StorageError::UNKNOWN; } auto env = getEnv(); jstring paramFileUri = env->NewStringUTF(fileUri.c_str()); jstring paramNewName = env->NewStringUTF(newName.c_str()); - return env->CallBooleanMethod(g_nativeActivity, contentUriRenameFileTo, paramFileUri, paramNewName); + return StorageErrorFromInt(env->CallIntMethod(g_nativeActivity, contentUriRenameFileTo, paramFileUri, paramNewName)); } // NOTE: Does not set fullName - you're supposed to already know it. @@ -266,12 +266,13 @@ bool Android_IsExternalStoragePreservedLegacy() { return env->CallBooleanMethod(g_nativeActivity, isExternalStoragePreservedLegacy); } -const char *Android_ErrorToString(ContentError error) { +const char *Android_ErrorToString(StorageError error) { switch (error) { - case ContentError::SUCCESS: return "SUCCESS"; - case ContentError::OTHER: return "OTHER"; - case ContentError::NOT_FOUND: return "NOT_FOUND"; - case ContentError::DISK_FULL: return "DISK_FULL"; + case StorageError::SUCCESS: return "SUCCESS"; + case StorageError::UNKNOWN: return "UNKNOWN"; + case StorageError::NOT_FOUND: return "NOT_FOUND"; + case StorageError::DISK_FULL: return "DISK_FULL"; + case StorageError::ALREADY_EXISTS: return "ALREADY_EXISTS"; default: return "(UNKNOWN)"; } } diff --git a/Common/File/AndroidStorage.h b/Common/File/AndroidStorage.h index 9decabaf48..6510f16985 100644 --- a/Common/File/AndroidStorage.h +++ b/Common/File/AndroidStorage.h @@ -14,18 +14,19 @@ enum class Android_OpenContentUriMode { }; // Matches the constants in PpssppActivity.java. -enum class ContentError { +enum class StorageError { SUCCESS = 0, - OTHER = -1, + UNKNOWN = -1, NOT_FOUND = -2, DISK_FULL = -3, + ALREADY_EXISTS = -4, }; -inline ContentError ContentErrorFromInt(int ival) { +inline StorageError StorageErrorFromInt(int ival) { if (ival >= 0) { - return ContentError::SUCCESS; + return StorageError::SUCCESS; } else { - return (ContentError)ival; + return (StorageError)ival; } } @@ -44,13 +45,13 @@ bool Android_CreateFile(const std::string &parentTreeUri, const std::string &fil bool Android_MoveFile(const std::string &fileUri, const std::string &srcParentUri, const std::string &destParentUri); bool Android_CopyFile(const std::string &fileUri, const std::string &destParentUri); bool Android_RemoveFile(const std::string &fileUri); -bool Android_RenameFileTo(const std::string &fileUri, const std::string &newName); +StorageError Android_RenameFileTo(const std::string &fileUri, const std::string &newName); bool Android_GetFileInfo(const std::string &fileUri, File::FileInfo *info); bool Android_FileExists(const std::string &fileUri); int64_t Android_GetFreeSpaceByContentUri(const std::string &uri); int64_t Android_GetFreeSpaceByFilePath(const std::string &filePath); bool Android_IsExternalStoragePreservedLegacy(); -const char *Android_ErrorToString(ContentError error); +const char *Android_ErrorToString(StorageError error); std::vector Android_ListContentUri(const std::string &uri); @@ -69,13 +70,13 @@ inline bool Android_CreateFile(const std::string &parentTreeUri, const std::stri inline bool Android_MoveFile(const std::string &fileUri, const std::string &srcParentUri, const std::string &destParentUri) { return false; } inline bool Android_CopyFile(const std::string &fileUri, const std::string &destParentUri) { return false; } inline bool Android_RemoveFile(const std::string &fileUri) { return false; } -inline bool Android_RenameFileTo(const std::string &fileUri, const std::string &newName) { return false; } +inline StorageError Android_RenameFileTo(const std::string &fileUri, const std::string &newName) { return StorageError::UNKNOWN; } inline bool Android_GetFileInfo(const std::string &fileUri, File::FileInfo *info) { return false; } inline bool Android_FileExists(const std::string &fileUri) { return false; } inline int64_t Android_GetFreeSpaceByContentUri(const std::string &uri) { return -1; } inline int64_t Android_GetFreeSpaceByFilePath(const std::string &filePath) { return -1; } inline bool Android_IsExternalStoragePreservedLegacy() { return false; } -inline const char *Android_ErrorToString(ContentError error) { return ""; } +inline const char *Android_ErrorToString(StorageError error) { return ""; } inline std::vector Android_ListContentUri(const std::string &uri) { return std::vector(); } diff --git a/Common/File/FileUtil.cpp b/Common/File/FileUtil.cpp index 8560694a48..7c58f83f9b 100644 --- a/Common/File/FileUtil.cpp +++ b/Common/File/FileUtil.cpp @@ -578,7 +578,7 @@ bool Rename(const Path &srcFilename, const Path &destFilename) { } INFO_LOG(COMMON, "Content URI rename: %s --> %s", srcFilename.c_str(), destFilename.c_str()); - return Android_RenameFileTo(srcFilename.ToString(), destFilename.GetFilename()); + return Android_RenameFileTo(srcFilename.ToString(), destFilename.GetFilename()) == StorageError::SUCCESS; default: return false; } diff --git a/android/src/org/ppsspp/ppsspp/PpssppActivity.java b/android/src/org/ppsspp/ppsspp/PpssppActivity.java index 89e02699c9..dedd1d549a 100644 --- a/android/src/org/ppsspp/ppsspp/PpssppActivity.java +++ b/android/src/org/ppsspp/ppsspp/PpssppActivity.java @@ -32,10 +32,11 @@ public class PpssppActivity extends NativeActivity { public static boolean libraryLoaded = false; // Matches the enum in AndroidStorage.h. - private static final int CONTENT_ERROR_SUCCESS = 0; - private static final int CONTENT_ERROR_OTHER = -1; - private static final int CONTENT_ERROR_NOT_FOUND = -2; - private static final int CONTENT_ERROR_DISK_FULL = -3; + private static final int STORAGE_ERROR_SUCCESS = 0; + private static final int STORAGE_ERROR_UNKNOWN = -1; + private static final int STORAGE_ERROR_NOT_FOUND = -2; + private static final int STORAGE_ERROR_DISK_FULL = -3; + private static final int STORAGE_ERROR_ALREADY_EXISTS = -4; @SuppressWarnings("deprecation") public static void CheckABIAndLoadLibrary() { @@ -289,17 +290,18 @@ public class PpssppActivity extends NativeActivity { } } - public boolean contentUriRenameFileTo(String fileUri, String newName) { + public int contentUriRenameFileTo(String fileUri, String newName) { try { Uri uri = Uri.parse(fileUri); // Due to a design flaw, we can't use DocumentFile.renameTo(). // Instead we use the DocumentsContract API directly. // See https://stackoverflow.com/questions/37168200/android-5-0-new-sd-card-access-api-documentfile-renameto-unsupportedoperation. Uri newUri = DocumentsContract.renameDocument(getContentResolver(), uri, newName); - return true; + return STORAGE_ERROR_SUCCESS; } catch (Exception e) { + // TODO: More detailed exception processing. Log.e(TAG, "contentUriRenameFile exception: " + e.toString()); - return false; + return STORAGE_ERROR_UNKNOWN; } } From 0997b8500c03e916e7b392f993ff305fde39af2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 25 Jul 2021 14:46:29 +0200 Subject: [PATCH 052/336] Convert four more functions to allow for error codes. Note that they still don't actually use them... --- Common/File/AndroidStorage.cpp | 24 +++++++++---------- Common/File/AndroidStorage.h | 12 +++++----- Common/File/FileUtil.cpp | 15 ++++++++---- .../src/org/ppsspp/ppsspp/PpssppActivity.java | 20 ++++++++-------- 4 files changed, 39 insertions(+), 32 deletions(-) diff --git a/Common/File/AndroidStorage.cpp b/Common/File/AndroidStorage.cpp index 552be7686d..4eb11b20e7 100644 --- a/Common/File/AndroidStorage.cpp +++ b/Common/File/AndroidStorage.cpp @@ -36,11 +36,11 @@ void Android_RegisterStorageCallbacks(JNIEnv * env, jobject obj) { _dbg_assert_(contentUriCreateDirectory); contentUriCreateFile = env->GetMethodID(env->GetObjectClass(obj), "contentUriCreateFile", "(Ljava/lang/String;Ljava/lang/String;)Z"); _dbg_assert_(contentUriCreateFile); - contentUriCopyFile = env->GetMethodID(env->GetObjectClass(obj), "contentUriCopyFile", "(Ljava/lang/String;Ljava/lang/String;)Z"); + contentUriCopyFile = env->GetMethodID(env->GetObjectClass(obj), "contentUriCopyFile", "(Ljava/lang/String;Ljava/lang/String;)I"); _dbg_assert_(contentUriCopyFile); - contentUriRemoveFile = env->GetMethodID(env->GetObjectClass(obj), "contentUriRemoveFile", "(Ljava/lang/String;)Z"); + contentUriRemoveFile = env->GetMethodID(env->GetObjectClass(obj), "contentUriRemoveFile", "(Ljava/lang/String;)I"); _dbg_assert_(contentUriRemoveFile); - contentUriMoveFile = env->GetMethodID(env->GetObjectClass(obj), "contentUriMoveFile", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z"); + contentUriMoveFile = env->GetMethodID(env->GetObjectClass(obj), "contentUriMoveFile", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I"); _dbg_assert_(contentUriMoveFile); contentUriRenameFileTo = env->GetMethodID(env->GetObjectClass(obj), "contentUriRenameFileTo", "(Ljava/lang/String;Ljava/lang/String;)I"); _dbg_assert_(contentUriRenameFileTo); @@ -104,34 +104,34 @@ bool Android_CreateFile(const std::string &parentTreeUri, const std::string &fil return env->CallBooleanMethod(g_nativeActivity, contentUriCreateFile, paramRoot, paramFileName); } -bool Android_CopyFile(const std::string &fileUri, const std::string &destParentUri) { +StorageError Android_CopyFile(const std::string &fileUri, const std::string &destParentUri) { if (!g_nativeActivity) { - return false; + return StorageError::UNKNOWN; } auto env = getEnv(); jstring paramFileName = env->NewStringUTF(fileUri.c_str()); jstring paramDestParentUri = env->NewStringUTF(destParentUri.c_str()); - return env->CallBooleanMethod(g_nativeActivity, contentUriCopyFile, paramFileName, paramDestParentUri); + return StorageErrorFromInt(env->CallIntMethod(g_nativeActivity, contentUriCopyFile, paramFileName, paramDestParentUri)); } -bool Android_MoveFile(const std::string &fileUri, const std::string &srcParentUri, const std::string &destParentUri) { +StorageError Android_MoveFile(const std::string &fileUri, const std::string &srcParentUri, const std::string &destParentUri) { if (!g_nativeActivity) { - return false; + return StorageError::UNKNOWN; } auto env = getEnv(); jstring paramFileName = env->NewStringUTF(fileUri.c_str()); jstring paramSrcParentUri = env->NewStringUTF(srcParentUri.c_str()); jstring paramDestParentUri = env->NewStringUTF(destParentUri.c_str()); - return env->CallBooleanMethod(g_nativeActivity, contentUriMoveFile, paramFileName, paramSrcParentUri, paramDestParentUri); + return StorageErrorFromInt(env->CallIntMethod(g_nativeActivity, contentUriMoveFile, paramFileName, paramSrcParentUri, paramDestParentUri)); } -bool Android_RemoveFile(const std::string &fileUri) { +StorageError Android_RemoveFile(const std::string &fileUri) { if (!g_nativeActivity) { - return false; + return StorageError::UNKNOWN; } auto env = getEnv(); jstring paramFileName = env->NewStringUTF(fileUri.c_str()); - return env->CallBooleanMethod(g_nativeActivity, contentUriRemoveFile, paramFileName); + return StorageErrorFromInt(env->CallIntMethod(g_nativeActivity, contentUriRemoveFile, paramFileName)); } StorageError Android_RenameFileTo(const std::string &fileUri, const std::string &newName) { diff --git a/Common/File/AndroidStorage.h b/Common/File/AndroidStorage.h index 6510f16985..be766fb97e 100644 --- a/Common/File/AndroidStorage.h +++ b/Common/File/AndroidStorage.h @@ -42,9 +42,9 @@ bool Android_IsContentUri(const std::string &uri); int Android_OpenContentUriFd(const std::string &uri, const Android_OpenContentUriMode mode); bool Android_CreateDirectory(const std::string &parentTreeUri, const std::string &dirName); bool Android_CreateFile(const std::string &parentTreeUri, const std::string &fileName); -bool Android_MoveFile(const std::string &fileUri, const std::string &srcParentUri, const std::string &destParentUri); -bool Android_CopyFile(const std::string &fileUri, const std::string &destParentUri); -bool Android_RemoveFile(const std::string &fileUri); +StorageError Android_MoveFile(const std::string &fileUri, const std::string &srcParentUri, const std::string &destParentUri); +StorageError Android_CopyFile(const std::string &fileUri, const std::string &destParentUri); +StorageError Android_RemoveFile(const std::string &fileUri); StorageError Android_RenameFileTo(const std::string &fileUri, const std::string &newName); bool Android_GetFileInfo(const std::string &fileUri, File::FileInfo *info); bool Android_FileExists(const std::string &fileUri); @@ -67,9 +67,9 @@ inline bool Android_IsContentUri(const std::string &uri) { return false; } inline int Android_OpenContentUriFd(const std::string &uri, const Android_OpenContentUriMode mode) { return -1; } inline bool Android_CreateDirectory(const std::string &parentTreeUri, const std::string &dirName) { return false; } inline bool Android_CreateFile(const std::string &parentTreeUri, const std::string &fileName) { return false; } -inline bool Android_MoveFile(const std::string &fileUri, const std::string &srcParentUri, const std::string &destParentUri) { return false; } -inline bool Android_CopyFile(const std::string &fileUri, const std::string &destParentUri) { return false; } -inline bool Android_RemoveFile(const std::string &fileUri) { return false; } +inline StorageError Android_MoveFile(const std::string &fileUri, const std::string &srcParentUri, const std::string &destParentUri) { return StorageError::UNKNOWN; } +inline StorageError Android_CopyFile(const std::string &fileUri, const std::string &destParentUri) { return StorageError::UNKNOWN; } +inline StorageError Android_RemoveFile(const std::string &fileUri) { return StorageError::UNKNOWN; } inline StorageError Android_RenameFileTo(const std::string &fileUri, const std::string &newName) { return StorageError::UNKNOWN; } inline bool Android_GetFileInfo(const std::string &fileUri, File::FileInfo *info) { return false; } inline bool Android_FileExists(const std::string &fileUri) { return false; } diff --git a/Common/File/FileUtil.cpp b/Common/File/FileUtil.cpp index 7c58f83f9b..9684b3b26c 100644 --- a/Common/File/FileUtil.cpp +++ b/Common/File/FileUtil.cpp @@ -396,7 +396,7 @@ bool Delete(const Path &filename) { case PathType::NATIVE: break; // OK case PathType::CONTENT_URI: - return Android_RemoveFile(filename.ToString()); + return Android_RemoveFile(filename.ToString()) == StorageError::SUCCESS; default: return false; } @@ -439,6 +439,12 @@ bool CreateDir(const Path &path) { break; // OK case PathType::CONTENT_URI: { + // NOTE: The Android storage API will simply create a renamed directory (append a number) if it already exists. + // We want to avoid that, so let's just return true if the directory already is there. + if (File::Exists(path)) { + return true; + } + // Convert it to a "CreateDirIn" call, if possible, since that's // what we can do with the storage API. AndroidContentURI uri(path.ToString()); @@ -532,7 +538,7 @@ bool DeleteDir(const Path &path) { case PathType::NATIVE: break; // OK case PathType::CONTENT_URI: - return Android_RemoveFile(path.ToString()); + return Android_RemoveFile(path.ToString()) == StorageError::SUCCESS; default: return false; } @@ -609,7 +615,7 @@ bool Copy(const Path &srcFilename, const Path &destFilename) { if (destFilename.Type() == PathType::CONTENT_URI && destFilename.CanNavigateUp()) { Path destParent = destFilename.NavigateUp(); // Use native file copy. - if (Android_CopyFile(srcFilename.ToString(), destParent.ToString())) { + if (Android_CopyFile(srcFilename.ToString(), destParent.ToString()) == StorageError::SUCCESS) { return true; } // Else fall through, and try using file I/O. @@ -689,6 +695,7 @@ bool Copy(const Path &srcFilename, const Path &destFilename) { #endif } +// Will overwrite the target. bool Move(const Path &srcFilename, const Path &destFilename) { // Try a shortcut in Android Storage scenarios. if (srcFilename.Type() == PathType::CONTENT_URI && destFilename.Type() == PathType::CONTENT_URI && srcFilename.CanNavigateUp() && destFilename.CanNavigateUp()) { @@ -696,7 +703,7 @@ bool Move(const Path &srcFilename, const Path &destFilename) { if (srcFilename.GetFilename() == destFilename.GetFilename()) { Path srcParent = srcFilename.NavigateUp(); Path dstParent = destFilename.NavigateUp(); - if (Android_MoveFile(srcFilename.ToString(), srcParent.ToString(), dstParent.ToString())) { + if (Android_MoveFile(srcFilename.ToString(), srcParent.ToString(), dstParent.ToString()) == StorageError::SUCCESS) { return true; } // If failed, fall through and try other ways. diff --git a/android/src/org/ppsspp/ppsspp/PpssppActivity.java b/android/src/org/ppsspp/ppsspp/PpssppActivity.java index dedd1d549a..dc1869d7b2 100644 --- a/android/src/org/ppsspp/ppsspp/PpssppActivity.java +++ b/android/src/org/ppsspp/ppsspp/PpssppActivity.java @@ -248,45 +248,45 @@ public class PpssppActivity extends NativeActivity { } } - public boolean contentUriRemoveFile(String fileName) { + public int contentUriRemoveFile(String fileName) { try { Uri uri = Uri.parse(fileName); DocumentFile documentFile = DocumentFile.fromSingleUri(this, uri); if (documentFile != null) { - return documentFile.delete(); + return documentFile.delete() ? STORAGE_ERROR_SUCCESS : STORAGE_ERROR_UNKNOWN; } else { - return false; + return STORAGE_ERROR_UNKNOWN; } } catch (Exception e) { Log.e(TAG, "contentUriRemoveFile exception: " + e.toString()); - return false; + return STORAGE_ERROR_UNKNOWN; } } // NOTE: The destination is the parent directory! This means that contentUriCopyFile // cannot rename things as part of the operation. - public boolean contentUriCopyFile(String srcFileUri, String dstParentDirUri) { + public int contentUriCopyFile(String srcFileUri, String dstParentDirUri) { try { Uri srcUri = Uri.parse(srcFileUri); Uri dstParentUri = Uri.parse(dstParentDirUri); - return DocumentsContract.copyDocument(getContentResolver(), srcUri, dstParentUri) != null; + return DocumentsContract.copyDocument(getContentResolver(), srcUri, dstParentUri) != null ? STORAGE_ERROR_SUCCESS : STORAGE_ERROR_UNKNOWN; } catch (Exception e) { Log.e(TAG, "contentUriCopyFile exception: " + e.toString()); - return false; + return STORAGE_ERROR_UNKNOWN; } } // NOTE: The destination is the parent directory! This means that contentUriCopyFile // cannot rename things as part of the operation. - public boolean contentUriMoveFile(String srcFileUri, String srcParentDirUri, String dstParentDirUri) { + public int contentUriMoveFile(String srcFileUri, String srcParentDirUri, String dstParentDirUri) { try { Uri srcUri = Uri.parse(srcFileUri); Uri srcParentUri = Uri.parse(srcParentDirUri); Uri dstParentUri = Uri.parse(dstParentDirUri); - return DocumentsContract.moveDocument(getContentResolver(), srcUri, srcParentUri, dstParentUri) != null; + return DocumentsContract.moveDocument(getContentResolver(), srcUri, srcParentUri, dstParentUri) != null ? STORAGE_ERROR_SUCCESS : STORAGE_ERROR_UNKNOWN; } catch (Exception e) { Log.e(TAG, "contentUriMoveFile exception: " + e.toString()); - return false; + return STORAGE_ERROR_UNKNOWN; } } From 3ec13b844021c78368f74800c14ca00d49dd0218 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 25 Jul 2021 14:52:52 +0200 Subject: [PATCH 053/336] Two more functions --- Common/File/AndroidStorage.cpp | 16 ++++++++-------- Common/File/AndroidStorage.h | 8 ++++---- Common/File/FileUtil.cpp | 6 +++--- .../src/org/ppsspp/ppsspp/PpssppActivity.java | 16 ++++++++-------- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/Common/File/AndroidStorage.cpp b/Common/File/AndroidStorage.cpp index 4eb11b20e7..d8d6468b91 100644 --- a/Common/File/AndroidStorage.cpp +++ b/Common/File/AndroidStorage.cpp @@ -32,9 +32,9 @@ void Android_RegisterStorageCallbacks(JNIEnv * env, jobject obj) { _dbg_assert_(openContentUri); listContentUriDir = env->GetMethodID(env->GetObjectClass(obj), "listContentUriDir", "(Ljava/lang/String;)[Ljava/lang/String;"); _dbg_assert_(listContentUriDir); - contentUriCreateDirectory = env->GetMethodID(env->GetObjectClass(obj), "contentUriCreateDirectory", "(Ljava/lang/String;Ljava/lang/String;)Z"); + contentUriCreateDirectory = env->GetMethodID(env->GetObjectClass(obj), "contentUriCreateDirectory", "(Ljava/lang/String;Ljava/lang/String;)I"); _dbg_assert_(contentUriCreateDirectory); - contentUriCreateFile = env->GetMethodID(env->GetObjectClass(obj), "contentUriCreateFile", "(Ljava/lang/String;Ljava/lang/String;)Z"); + contentUriCreateFile = env->GetMethodID(env->GetObjectClass(obj), "contentUriCreateFile", "(Ljava/lang/String;Ljava/lang/String;)I"); _dbg_assert_(contentUriCreateFile); contentUriCopyFile = env->GetMethodID(env->GetObjectClass(obj), "contentUriCopyFile", "(Ljava/lang/String;Ljava/lang/String;)I"); _dbg_assert_(contentUriCopyFile); @@ -84,24 +84,24 @@ int Android_OpenContentUriFd(const std::string &filename, Android_OpenContentUri return fd; } -bool Android_CreateDirectory(const std::string &rootTreeUri, const std::string &dirName) { +StorageError Android_CreateDirectory(const std::string &rootTreeUri, const std::string &dirName) { if (!g_nativeActivity) { - return false; + return StorageError::UNKNOWN; } auto env = getEnv(); jstring paramRoot = env->NewStringUTF(rootTreeUri.c_str()); jstring paramDirName = env->NewStringUTF(dirName.c_str()); - return env->CallBooleanMethod(g_nativeActivity, contentUriCreateDirectory, paramRoot, paramDirName); + return StorageErrorFromInt(env->CallIntMethod(g_nativeActivity, contentUriCreateDirectory, paramRoot, paramDirName)); } -bool Android_CreateFile(const std::string &parentTreeUri, const std::string &fileName) { +StorageError Android_CreateFile(const std::string &parentTreeUri, const std::string &fileName) { if (!g_nativeActivity) { - return false; + return StorageError::UNKNOWN; } auto env = getEnv(); jstring paramRoot = env->NewStringUTF(parentTreeUri.c_str()); jstring paramFileName = env->NewStringUTF(fileName.c_str()); - return env->CallBooleanMethod(g_nativeActivity, contentUriCreateFile, paramRoot, paramFileName); + return StorageErrorFromInt(env->CallIntMethod(g_nativeActivity, contentUriCreateFile, paramRoot, paramFileName)); } StorageError Android_CopyFile(const std::string &fileUri, const std::string &destParentUri) { diff --git a/Common/File/AndroidStorage.h b/Common/File/AndroidStorage.h index be766fb97e..131c0125d2 100644 --- a/Common/File/AndroidStorage.h +++ b/Common/File/AndroidStorage.h @@ -40,8 +40,8 @@ void Android_StorageSetNativeActivity(jobject nativeActivity); bool Android_IsContentUri(const std::string &uri); int Android_OpenContentUriFd(const std::string &uri, const Android_OpenContentUriMode mode); -bool Android_CreateDirectory(const std::string &parentTreeUri, const std::string &dirName); -bool Android_CreateFile(const std::string &parentTreeUri, const std::string &fileName); +StorageError Android_CreateDirectory(const std::string &parentTreeUri, const std::string &dirName); +StorageError Android_CreateFile(const std::string &parentTreeUri, const std::string &fileName); StorageError Android_MoveFile(const std::string &fileUri, const std::string &srcParentUri, const std::string &destParentUri); StorageError Android_CopyFile(const std::string &fileUri, const std::string &destParentUri); StorageError Android_RemoveFile(const std::string &fileUri); @@ -65,8 +65,8 @@ extern std::string g_extFilesDir; inline bool Android_IsContentUri(const std::string &uri) { return false; } inline int Android_OpenContentUriFd(const std::string &uri, const Android_OpenContentUriMode mode) { return -1; } -inline bool Android_CreateDirectory(const std::string &parentTreeUri, const std::string &dirName) { return false; } -inline bool Android_CreateFile(const std::string &parentTreeUri, const std::string &fileName) { return false; } +inline StorageError Android_CreateDirectory(const std::string &parentTreeUri, const std::string &dirName) { return StorageError::UNKNOWN; } +inline StorageError Android_CreateFile(const std::string &parentTreeUri, const std::string &fileName) { return StorageError::UNKNOWN; } inline StorageError Android_MoveFile(const std::string &fileUri, const std::string &srcParentUri, const std::string &destParentUri) { return StorageError::UNKNOWN; } inline StorageError Android_CopyFile(const std::string &fileUri, const std::string &destParentUri) { return StorageError::UNKNOWN; } inline StorageError Android_RemoveFile(const std::string &fileUri) { return StorageError::UNKNOWN; } diff --git a/Common/File/FileUtil.cpp b/Common/File/FileUtil.cpp index 9684b3b26c..134d84f74b 100644 --- a/Common/File/FileUtil.cpp +++ b/Common/File/FileUtil.cpp @@ -119,7 +119,7 @@ FILE *OpenCFile(const Path &path, const char *mode) { std::string name = path.GetFilename(); if (path.CanNavigateUp()) { Path parent = path.NavigateUp(); - if (!Android_CreateFile(parent.ToString(), name)) { + if (Android_CreateFile(parent.ToString(), name) != StorageError::SUCCESS) { WARN_LOG(COMMON, "Failed to create file '%s' in '%s'", name.c_str(), parent.c_str()); return nullptr; } @@ -189,7 +189,7 @@ int OpenFD(const Path &path, OpenFlag flags) { std::string name = path.GetFilename(); if (path.CanNavigateUp()) { Path parent = path.NavigateUp(); - if (!Android_CreateFile(parent.ToString(), name)) { + if (Android_CreateFile(parent.ToString(), name) != StorageError::SUCCESS) { WARN_LOG(COMMON, "OpenFD: Failed to create file '%s' in '%s'", name.c_str(), parent.c_str()); return -1; } @@ -451,7 +451,7 @@ bool CreateDir(const Path &path) { std::string newDirName = uri.GetLastPart(); if (uri.NavigateUp()) { INFO_LOG(COMMON, "Calling Android_CreateDirectory(%s, %s)", uri.ToString().c_str(), newDirName.c_str()); - return Android_CreateDirectory(uri.ToString(), newDirName); + return Android_CreateDirectory(uri.ToString(), newDirName) == StorageError::SUCCESS; } else { // Bad path - can't create this directory. WARN_LOG(COMMON, "CreateDir failed: '%s'", path.c_str()); diff --git a/android/src/org/ppsspp/ppsspp/PpssppActivity.java b/android/src/org/ppsspp/ppsspp/PpssppActivity.java index dc1869d7b2..bb5673084f 100644 --- a/android/src/org/ppsspp/ppsspp/PpssppActivity.java +++ b/android/src/org/ppsspp/ppsspp/PpssppActivity.java @@ -213,38 +213,38 @@ public class PpssppActivity extends NativeActivity { } } - public boolean contentUriCreateDirectory(String rootTreeUri, String dirName) { + public int contentUriCreateDirectory(String rootTreeUri, String dirName) { try { Uri uri = Uri.parse(rootTreeUri); DocumentFile documentFile = DocumentFile.fromTreeUri(this, uri); if (documentFile != null) { DocumentFile createdDir = documentFile.createDirectory(dirName); - return createdDir != null; + return createdDir != null ? STORAGE_ERROR_SUCCESS : STORAGE_ERROR_UNKNOWN; } else { Log.e(TAG, "contentUriCreateDirectory: fromTreeUri returned null"); - return false; + return STORAGE_ERROR_UNKNOWN; } } catch (Exception e) { Log.e(TAG, "contentUriCreateDirectory exception: " + e.toString()); - return false; + return STORAGE_ERROR_UNKNOWN; } } - public boolean contentUriCreateFile(String rootTreeUri, String fileName) { + public int contentUriCreateFile(String rootTreeUri, String fileName) { try { Uri uri = Uri.parse(rootTreeUri); DocumentFile documentFile = DocumentFile.fromTreeUri(this, uri); if (documentFile != null) { // TODO: Check the file extension and choose MIME type appropriately. DocumentFile createdFile = documentFile.createFile("application/octet-stream", fileName); - return createdFile != null; + return createdFile != null ? STORAGE_ERROR_SUCCESS : STORAGE_ERROR_UNKNOWN; } else { Log.e(TAG, "contentUriCreateFile: fromTreeUri returned null"); - return false; + return STORAGE_ERROR_UNKNOWN; } } catch (Exception e) { Log.e(TAG, "contentUriCreateFile exception: " + e.toString()); - return false; + return STORAGE_ERROR_UNKNOWN; } } From 5d047a394bd15b0d8fca4230a7ef083fea55224f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 25 Jul 2021 15:25:22 +0200 Subject: [PATCH 054/336] Scoped storage: Make the home button simply go to the root of the current directory tree. --- Common/File/Path.cpp | 1 - UI/MainScreen.cpp | 15 ++++++++++----- UI/MainScreen.h | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Common/File/Path.cpp b/Common/File/Path.cpp index 96110fc2d3..5f0e905dda 100644 --- a/Common/File/Path.cpp +++ b/Common/File/Path.cpp @@ -279,7 +279,6 @@ Path Path::GetRootVolume() const { return Path(path); } #endif - return Path("/"); } diff --git a/UI/MainScreen.cpp b/UI/MainScreen.cpp index 8596294209..6f7872289a 100644 --- a/UI/MainScreen.cpp +++ b/UI/MainScreen.cpp @@ -540,10 +540,15 @@ UI::EventReturn GameBrowser::StorageClick(UI::EventParams &e) { return UI::EVENT_DONE; } -UI::EventReturn GameBrowser::HomeClick(UI::EventParams &e) { - if (System_GetPropertyBool(SYSPROP_ANDROID_SCOPED_STORAGE)) { - if (path_.GetPath().Type() == PathType::CONTENT_URI) { - path_.SetPath(path_.GetPath().GetRootVolume()); +UI::EventReturn GameBrowser::OnHomeClick(UI::EventParams &e) { + if (path_.GetPath().Type() == PathType::CONTENT_URI) { + Path rootPath = path_.GetPath().GetRootVolume(); + if (rootPath != path_.GetPath()) { + SetPath(rootPath); + return UI::EVENT_DONE; + } + if (System_GetPropertyBool(SYSPROP_ANDROID_SCOPED_STORAGE)) { + // There'll be no sensible home, ignore. return UI::EVENT_DONE; } } @@ -669,7 +674,7 @@ void GameBrowser::Refresh() { if (browseFlags_ & BrowseFlags::NAVIGATE) { topBar->Add(new Spacer(2.0f)); topBar->Add(new TextView(path_.GetFriendlyPath().c_str(), 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::HomeClick); + 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)) { topBar->Add(new Choice(ImageID("I_SDCARD"), new LayoutParams(WRAP_CONTENT, 64.0f)))->OnClick.Handle(this, &GameBrowser::StorageClick); } diff --git a/UI/MainScreen.h b/UI/MainScreen.h index 9a19321755..6b15f06427 100644 --- a/UI/MainScreen.h +++ b/UI/MainScreen.h @@ -74,7 +74,7 @@ private: UI::EventReturn LastClick(UI::EventParams &e); UI::EventReturn BrowseClick(UI::EventParams &e); UI::EventReturn StorageClick(UI::EventParams &e); - UI::EventReturn HomeClick(UI::EventParams &e); + UI::EventReturn OnHomeClick(UI::EventParams &e); UI::EventReturn PinToggleClick(UI::EventParams &e); UI::EventReturn GridSettingsClick(UI::EventParams &e); UI::EventReturn OnRecentClear(UI::EventParams &e); From d14a90001b9aa0f8ee741018094d3cb3d1e2b875 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 25 Jul 2021 17:49:35 +0200 Subject: [PATCH 055/336] Less "Fd x for content URI" logspam --- Core/FileLoaders/LocalFileLoader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/FileLoaders/LocalFileLoader.cpp b/Core/FileLoaders/LocalFileLoader.cpp index 96d3412cf6..2e2caeff74 100644 --- a/Core/FileLoaders/LocalFileLoader.cpp +++ b/Core/FileLoaders/LocalFileLoader.cpp @@ -60,7 +60,7 @@ LocalFileLoader::LocalFileLoader(const Path &filename) #if PPSSPP_PLATFORM(ANDROID) if (filename.Type() == PathType::CONTENT_URI) { int fd = Android_OpenContentUriFd(filename.ToString(), Android_OpenContentUriMode::READ); - INFO_LOG(SYSTEM, "Fd %d for content URI: '%s'", fd, filename.c_str()); + VERBOSE_LOG(SYSTEM, "Fd %d for content URI: '%s'", fd, filename.c_str()); if (fd < 0) { ERROR_LOG(FILESYS, "LoadFileLoader failed to open content URI: '%s'", filename.c_str()); return; From b3c2252b28dc2da546a42f97875a8da0cec5fede Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 25 Jul 2021 18:14:46 +0200 Subject: [PATCH 056/336] Fix further issues when the memstick dir is the PSP dir --- Core/FileSystems/DirectoryFileSystem.cpp | 6 ++++-- Core/System.cpp | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Core/FileSystems/DirectoryFileSystem.cpp b/Core/FileSystems/DirectoryFileSystem.cpp index 4a7bde8f8b..4e2ab9b2d8 100644 --- a/Core/FileSystems/DirectoryFileSystem.cpp +++ b/Core/FileSystems/DirectoryFileSystem.cpp @@ -187,7 +187,7 @@ Path DirectoryFileHandle::GetLocalPath(const Path &basePath, std::string localpa localpath.erase(0, 1); if (fileSystemFlags_ & FileSystemFlags::STRIP_PSP) { - if (startsWith(localpath, "/PSP")) { + if (startsWith(localpath, "PSP/")) { localpath = localpath.substr(4); } } @@ -203,7 +203,7 @@ Path DirectoryFileSystem::GetLocalPath(std::string internalPath) const { internalPath.erase(0, 1); if (flags & FileSystemFlags::STRIP_PSP) { - if (startsWith(internalPath, "/PSP")) { + if (startsWith(internalPath, "PSP/")) { internalPath = internalPath.substr(4); } } @@ -638,6 +638,7 @@ bool DirectoryFileSystem::RemoveFile(const std::string &filename) { int DirectoryFileSystem::OpenFile(std::string filename, FileAccess access, const char *devicename) { OpenFileEntry entry; + entry.hFile.fileSystemFlags_ = flags; u32 err = 0; bool success = entry.hFile.Open(basePath, filename, access, err); if (err == 0 && !success) { @@ -964,6 +965,7 @@ void DirectoryFileSystem::DoState(PointerWrap &p) { CloseAll(); u32 key; OpenFileEntry entry; + entry.hFile.fileSystemFlags_ = flags; for (u32 i = 0; i < num; i++) { Do(p, key); Do(p, entry.guestFilename); diff --git a/Core/System.cpp b/Core/System.cpp index d2427d43fd..d11fb469fe 100644 --- a/Core/System.cpp +++ b/Core/System.cpp @@ -708,8 +708,8 @@ void InitSysDirectories() { // 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. - File::CreateDir(g_Config.memStickDirectory / "PSP"); - File::CreateDir(g_Config.memStickDirectory / "PSP/COMMON"); + File::CreateDir(GetSysDirectory(DIRECTORY_PSP)); + File::CreateDir(GetSysDirectory(DIRECTORY_PSP) / "COMMON"); File::CreateDir(GetSysDirectory(DIRECTORY_GAME)); File::CreateDir(GetSysDirectory(DIRECTORY_SAVEDATA)); File::CreateDir(GetSysDirectory(DIRECTORY_SAVESTATE)); From 4489f1b312a77f39836e4a7ea1b33859da6b9666 Mon Sep 17 00:00:00 2001 From: iota97 Date: Mon, 26 Jul 2021 08:28:46 +0200 Subject: [PATCH 057/336] Accept numpad enter as well --- Common/UI/View.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Common/UI/View.cpp b/Common/UI/View.cpp index dbb206185d..c3fc74ffdc 100644 --- a/Common/UI/View.cpp +++ b/Common/UI/View.cpp @@ -972,6 +972,7 @@ bool TextEdit::Key(const KeyInput &input) { } break; case NKCODE_ENTER: + case NKCODE_NUMPAD_ENTER: { EventParams e{}; e.v = this; From 0fcf68632dbbd5c816967fe784d405047b7877f2 Mon Sep 17 00:00:00 2001 From: Linblow <8434205+Linblow@users.noreply.github.com> Date: Mon, 26 Jul 2021 11:47:21 +0200 Subject: [PATCH 058/336] Detect CwCheat file UTF-8 BOM sequence and ignore it --- Core/CwCheat.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Core/CwCheat.cpp b/Core/CwCheat.cpp index 0a348cf089..d1a12f98d6 100644 --- a/Core/CwCheat.cpp +++ b/Core/CwCheat.cpp @@ -98,6 +98,9 @@ bool CheatFileParser::Parse() { if (!tempLine) continue; + // Detect UTF-8 BOM sequence, and ignore it. + if (line_ == 1 && memcmp(tempLine, "\xEF\xBB\xBF", 3) == 0) + tempLine += 3; std::string line = TrimString(tempLine); // Minimum length 5 is shortest possible _ lines name of the game "_G N+" From 4205ce7c421a33d253fd1dcc06fd3ee5e48c4c1a Mon Sep 17 00:00:00 2001 From: iota97 Date: Mon, 26 Jul 2021 21:11:21 +0200 Subject: [PATCH 059/336] Trim username on join as well --- Core/HLE/proAdhoc.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Core/HLE/proAdhoc.cpp b/Core/HLE/proAdhoc.cpp index c99c22590e..7a7033b91d 100644 --- a/Core/HLE/proAdhoc.cpp +++ b/Core/HLE/proAdhoc.cpp @@ -1591,8 +1591,9 @@ int friendFinder(){ } // Update HUD User Count + name = (char*)packet->name.data; incoming = ""; - incoming.append((char*)packet->name.data); + incoming.append(name.substr(0, 8)); incoming.append(" Joined "); //do we need ip? //joined.append((char *)packet->ip); From 3f1a5a148f8decb8a09842628142516214462b9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 26 Jul 2021 21:54:23 +0200 Subject: [PATCH 060/336] Add a missing java function (fix a little merge mistake) --- android/src/org/ppsspp/ppsspp/PpssppActivity.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/android/src/org/ppsspp/ppsspp/PpssppActivity.java b/android/src/org/ppsspp/ppsspp/PpssppActivity.java index bb5673084f..761cc156ab 100644 --- a/android/src/org/ppsspp/ppsspp/PpssppActivity.java +++ b/android/src/org/ppsspp/ppsspp/PpssppActivity.java @@ -14,6 +14,7 @@ import android.os.storage.StorageManager; import android.content.ContentResolver; import android.database.Cursor; import android.provider.DocumentsContract; +import android.os.Environment; import androidx.documentfile.provider.DocumentFile; import java.util.ArrayList; import java.util.UUID; @@ -391,4 +392,14 @@ public class PpssppActivity extends NativeActivity { return -1; } } + + public boolean isExternalStoragePreservedLegacy() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + // In 29 and later, we can check whether we got preserved storage legacy. + return Environment.isExternalStorageLegacy(); + } else { + // In 28 and earlier, we won't call this - we'll still request an exception. + return false; + } + } } From f53eb4ae0d6e3a828a1e4e4132b1bd6d4ab96dec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 27 Jul 2021 22:55:02 +0200 Subject: [PATCH 061/336] Fix silly filesystem mounting bug introduced in #14638 Fixes #14650. --- Core/FileSystems/MetaFileSystem.cpp | 9 +++++++++ Core/FileSystems/MetaFileSystem.h | 1 + Core/HLE/sceIo.cpp | 7 ++++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Core/FileSystems/MetaFileSystem.cpp b/Core/FileSystems/MetaFileSystem.cpp index b8ebc9238e..6ecd36226c 100644 --- a/Core/FileSystems/MetaFileSystem.cpp +++ b/Core/FileSystems/MetaFileSystem.cpp @@ -298,6 +298,15 @@ void MetaFileSystem::UnmountAll() { currentDir.clear(); } +void MetaFileSystem::Unmount(std::string prefix) { + for (auto iter = fileSystems.begin(); iter != fileSystems.end(); iter++) { + if (iter->prefix == prefix) { + fileSystems.erase(iter); + return; + } + } +} + bool MetaFileSystem::Remount(std::string prefix, std::shared_ptr system) { std::lock_guard guard(lock); for (auto &it : fileSystems) { diff --git a/Core/FileSystems/MetaFileSystem.h b/Core/FileSystems/MetaFileSystem.h index 84ea60a44a..f980fc1900 100644 --- a/Core/FileSystems/MetaFileSystem.h +++ b/Core/FileSystems/MetaFileSystem.h @@ -62,6 +62,7 @@ public: bool Remount(std::string prefix, std::shared_ptr system); void UnmountAll(); + void Unmount(std::string prefix); // The pointer returned from these are for temporary usage only. Do not store. IFileSystem *GetSystem(const std::string &prefix); diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index 3b99c2d2d3..c856794110 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -775,7 +775,12 @@ void __IoShutdown() { } asyncDefaultPriority = -1; - pspFileSystem.UnmountAll(); + pspFileSystem.Unmount("ms0:"); + pspFileSystem.Unmount("fatms0:"); + pspFileSystem.Unmount("fatms:"); + pspFileSystem.Unmount("pfat0:"); + pspFileSystem.Unmount("flash0:"); + pspFileSystem.Unmount("exdata0:"); MemoryStick_Shutdown(); memStickCallbacks.clear(); From a80dabc087d184eb4e1a8648db07b19683aeb2d8 Mon Sep 17 00:00:00 2001 From: iota97 Date: Wed, 28 Jul 2021 12:55:39 +0200 Subject: [PATCH 062/336] Clean up unused event --- UI/TouchControlVisibilityScreen.cpp | 6 ------ UI/TouchControlVisibilityScreen.h | 1 - 2 files changed, 7 deletions(-) diff --git a/UI/TouchControlVisibilityScreen.cpp b/UI/TouchControlVisibilityScreen.cpp index af88eb93e3..b0d56df21b 100644 --- a/UI/TouchControlVisibilityScreen.cpp +++ b/UI/TouchControlVisibilityScreen.cpp @@ -197,12 +197,6 @@ UI::EventReturn TouchControlVisibilityScreen::OnToggleAll(UI::EventParams &e) { return UI::EVENT_DONE; } -UI::EventReturn TouchControlVisibilityScreen::RightAnalogBindScreen(UI::EventParams &e) { - screenManager()->push(new RightAnalogMappingScreen()); - - return UI::EVENT_DONE; -} - UI::EventReturn CheckBoxChoice::HandleClick(UI::EventParams &e) { checkbox_->Toggle(); diff --git a/UI/TouchControlVisibilityScreen.h b/UI/TouchControlVisibilityScreen.h index c3a7df1613..f44e333395 100644 --- a/UI/TouchControlVisibilityScreen.h +++ b/UI/TouchControlVisibilityScreen.h @@ -38,7 +38,6 @@ public: protected: UI::EventReturn OnToggleAll(UI::EventParams &e); - UI::EventReturn RightAnalogBindScreen(UI::EventParams &e); private: std::vector toggles_; From d9a3741fcbb51fbd9f5ff82b70ed93314c798ab1 Mon Sep 17 00:00:00 2001 From: Pierce Andjelkovic Date: Wed, 28 Jul 2021 21:58:56 +1000 Subject: [PATCH 063/336] RISC-V CPU detect --- CMakeLists.txt | 1 + Common/Common.vcxproj | 1 + Common/Common.vcxproj.filters | 1 + Common/FakeCPUDetect.cpp | 2 + Common/RiscVCPUDetect.cpp | 121 ++++++++++++++++++++++++++++++++++ UI/DevScreens.cpp | 2 + libretro/Makefile.common | 1 + ppsspp_config.h | 5 ++ 8 files changed, 134 insertions(+) create mode 100644 Common/RiscVCPUDetect.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index ef5e97ed41..07ba91f5c8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -430,6 +430,7 @@ set(CommonMIPS source_group(MIPS FILES ${CommonMIPS}) set(CommonRISCV64 + Common/RiscVCPUDetect.cpp Core/MIPS/fake/FakeJit.cpp Core/MIPS/fake/FakeJit.h ) diff --git a/Common/Common.vcxproj b/Common/Common.vcxproj index 5bc0e2ab83..ef63de1054 100644 --- a/Common/Common.vcxproj +++ b/Common/Common.vcxproj @@ -898,6 +898,7 @@ + diff --git a/Common/Common.vcxproj.filters b/Common/Common.vcxproj.filters index 58ca55dbbf..ddfbebd6e3 100644 --- a/Common/Common.vcxproj.filters +++ b/Common/Common.vcxproj.filters @@ -777,6 +777,7 @@ Thread + diff --git a/Common/FakeCPUDetect.cpp b/Common/FakeCPUDetect.cpp index 9b1469c21c..3bdaeabbcd 100644 --- a/Common/FakeCPUDetect.cpp +++ b/Common/FakeCPUDetect.cpp @@ -22,6 +22,8 @@ #define REAL_CPUDETECT_AVAIL 1 #elif PPSSPP_ARCH(MIPS) || PPSSPP_ARCH(MIPS64) #define REAL_CPUDETECT_AVAIL 1 +#elif PPSSPP_ARCH(RISCV64) +#define REAL_CPUDETECT_AVAIL 1 #endif #ifndef REAL_CPUDETECT_AVAIL diff --git a/Common/RiscVCPUDetect.cpp b/Common/RiscVCPUDetect.cpp new file mode 100644 index 0000000000..28be934fd2 --- /dev/null +++ b/Common/RiscVCPUDetect.cpp @@ -0,0 +1,121 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "ppsspp_config.h" +#if PPSSPP_ARCH(RISCV64) + +#include "Common/Common.h" +#include "Common/CPUDetect.h" +#include "Common/StringUtils.h" +#include "Common/File/FileUtil.h" +#include "Common/Data/Encoding/Utf8.h" +#include +#include + +// Only Linux platforms have /proc/cpuinfo +#if defined(__linux__) +const char procfile[] = "/proc/cpuinfo"; +// https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-system-cpu +const char syscpupresentfile[] = "/sys/devices/system/cpu/present"; + +std::string GetCPUString() { + std::string cpu_string = "Unknown"; + + return cpu_string; +} + +int GetCoreCount() +{ + std::string line, marker = "processor\t: "; + int cores = 1; + + std::string presentData; + bool presentSuccess = File::ReadFileToString(true, syscpupresentfile, presentData); + std::istringstream presentFile(presentData); + + if (presentSuccess) { + int low, high, found; + std::getline(presentFile, line); + found = sscanf(line.c_str(), "%d-%d", &low, &high); + if (found == 1) + return 1; + if (found == 2) + return high - low + 1; + } + + std::string procdata; + if (!File::ReadFileToString(true, procfile, procdata)) + return 1; + std::istringstream file(procdata); + + while (std::getline(file, line)) + { + if (line.find(marker) != std::string::npos) + ++cores; + } + + return cores; +} +#endif + +CPUInfo cpu_info; + +CPUInfo::CPUInfo() { + Detect(); +} + +// Detects the various cpu features +void CPUInfo::Detect() +{ + // Set some defaults here + HTT = false; +#if PPSSPP_ARCH(RISCV64) + OS64bit = true; + CPU64bit = true; + Mode64bit = true; +#else + OS64bit = false; + CPU64bit = false; + Mode64bit = false; +#endif + vendor = VENDOR_OTHER; + logical_cpu_count = 1; + + // Get the information about the CPU +#if !defined(__linux__) + num_cores = 1; +#else // __linux__ + strncpy(cpu_string, GetCPUString().c_str(), sizeof(cpu_string)); + unsigned short CPUPart = GetCPUPart(); + num_cores = GetCoreCount(); +#endif +} + +// Turn the cpu info into a string we can show +std::string CPUInfo::Summarize() +{ + std::string sum; + if (num_cores == 1) + sum = StringFromFormat("%s, %i core", cpu_string, num_cores); + else + sum = StringFromFormat("%s, %i cores", cpu_string, num_cores); + if (CPU64bit) sum += ", 64-bit"; + + return sum; +} + +#endif // PPSSPP_ARCH(RISCV64) diff --git a/UI/DevScreens.cpp b/UI/DevScreens.cpp index 735ae47928..89fceb30bd 100644 --- a/UI/DevScreens.cpp +++ b/UI/DevScreens.cpp @@ -423,6 +423,8 @@ const char *GetCompilerABI() { return "x86"; #elif PPSSPP_ARCH(AMD64) return "x86-64"; +#elif PPSSPP_ARCH(RISCV64) + return "rv64"; #else return "other"; #endif diff --git a/libretro/Makefile.common b/libretro/Makefile.common index 77fd240274..a80ff92847 100644 --- a/libretro/Makefile.common +++ b/libretro/Makefile.common @@ -300,6 +300,7 @@ SOURCES_CXX += \ $(COMMONDIR)/OSVersion.cpp \ $(COMMONDIR)/MemoryUtil.cpp \ $(COMMONDIR)/MipsCPUDetect.cpp \ + $(COMMONDIR)/RiscVCPUDetect.cpp \ $(COMMONDIR)/LogReporting.cpp \ $(COMMONDIR)/SysError.cpp \ $(COMMONDIR)/StringUtils.cpp \ diff --git a/ppsspp_config.h b/ppsspp_config.h index 5725778144..91f0ffb854 100644 --- a/ppsspp_config.h +++ b/ppsspp_config.h @@ -64,6 +64,11 @@ #define PPSSPP_ARCH_32BIT 1 #endif +#if defined(__riscv64__) + #define PPSSPP_ARCH_RISCV64 1 + #define PPSSPP_ARCH_64BIT 1 +#endif + // PLATFORM defines #if defined(_WIN32) From d452b0c1f7f1a747563635fc54da9b67ca097725 Mon Sep 17 00:00:00 2001 From: Pierce Andjelkovic Date: Thu, 29 Jul 2021 03:26:18 +1000 Subject: [PATCH 064/336] No CPU part for RISC-V --- Common/RiscVCPUDetect.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Common/RiscVCPUDetect.cpp b/Common/RiscVCPUDetect.cpp index 28be934fd2..d9f446acb2 100644 --- a/Common/RiscVCPUDetect.cpp +++ b/Common/RiscVCPUDetect.cpp @@ -100,7 +100,6 @@ void CPUInfo::Detect() num_cores = 1; #else // __linux__ strncpy(cpu_string, GetCPUString().c_str(), sizeof(cpu_string)); - unsigned short CPUPart = GetCPUPart(); num_cores = GetCoreCount(); #endif } From 8cb4fb83a4c7c7de03ceaee447031ea8844b11eb Mon Sep 17 00:00:00 2001 From: Pierce Andjelkovic Date: Thu, 29 Jul 2021 07:19:44 +1000 Subject: [PATCH 065/336] temporary riscv define fix --- ppsspp_config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ppsspp_config.h b/ppsspp_config.h index 91f0ffb854..fcb3f06038 100644 --- a/ppsspp_config.h +++ b/ppsspp_config.h @@ -64,7 +64,7 @@ #define PPSSPP_ARCH_32BIT 1 #endif -#if defined(__riscv64__) +#if defined(__riscv) #define PPSSPP_ARCH_RISCV64 1 #define PPSSPP_ARCH_64BIT 1 #endif From c48888c5e50af48ecc0674d0201116d781d8d8d2 Mon Sep 17 00:00:00 2001 From: Pierce Andjelkovic Date: Thu, 29 Jul 2021 07:28:29 +1000 Subject: [PATCH 066/336] Add in bit length check --- ppsspp_config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ppsspp_config.h b/ppsspp_config.h index fcb3f06038..0c4e2b9c1d 100644 --- a/ppsspp_config.h +++ b/ppsspp_config.h @@ -64,7 +64,7 @@ #define PPSSPP_ARCH_32BIT 1 #endif -#if defined(__riscv) +#if defined(__riscv) && defined(__riscv_xlen) && __riscv_xlen == 64 #define PPSSPP_ARCH_RISCV64 1 #define PPSSPP_ARCH_64BIT 1 #endif From 0d0e2c44e0d218d17a0f0676ede9e144abf459ee Mon Sep 17 00:00:00 2001 From: Pierce Andjelkovic Date: Thu, 29 Jul 2021 07:47:09 +1000 Subject: [PATCH 067/336] Fix copied mips bugs --- Common/RiscVCPUDetect.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Common/RiscVCPUDetect.cpp b/Common/RiscVCPUDetect.cpp index d9f446acb2..c433136c84 100644 --- a/Common/RiscVCPUDetect.cpp +++ b/Common/RiscVCPUDetect.cpp @@ -44,7 +44,7 @@ int GetCoreCount() int cores = 1; std::string presentData; - bool presentSuccess = File::ReadFileToString(true, syscpupresentfile, presentData); + bool presentSuccess = File::ReadFileToString(true, Path(syscpupresentfile), presentData); std::istringstream presentFile(presentData); if (presentSuccess) { @@ -58,7 +58,7 @@ int GetCoreCount() } std::string procdata; - if (!File::ReadFileToString(true, procfile, procdata)) + if (!File::ReadFileToString(true, Path(procfile), procdata)) return 1; std::istringstream file(procdata); From bd8759853bf8496abb113a5b17d0c972fce0250b Mon Sep 17 00:00:00 2001 From: Pierce Andjelkovic Date: Sat, 31 Jul 2021 01:50:48 +1000 Subject: [PATCH 068/336] Fix ABI --- Common/RiscVCPUDetect.cpp | 4 ++-- UI/DevScreens.cpp | 12 +++++++++++- ppsspp_config.h | 1 + 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Common/RiscVCPUDetect.cpp b/Common/RiscVCPUDetect.cpp index c433136c84..4e3c10d7aa 100644 --- a/Common/RiscVCPUDetect.cpp +++ b/Common/RiscVCPUDetect.cpp @@ -33,8 +33,8 @@ const char procfile[] = "/proc/cpuinfo"; const char syscpupresentfile[] = "/sys/devices/system/cpu/present"; std::string GetCPUString() { - std::string cpu_string = "Unknown"; - + std::string cpu_string; + cpu_string = "Unknown"; return cpu_string; } diff --git a/UI/DevScreens.cpp b/UI/DevScreens.cpp index 89fceb30bd..e5e9878d6f 100644 --- a/UI/DevScreens.cpp +++ b/UI/DevScreens.cpp @@ -424,7 +424,17 @@ const char *GetCompilerABI() { #elif PPSSPP_ARCH(AMD64) return "x86-64"; #elif PPSSPP_ARCH(RISCV64) - return "rv64"; + //https://github.com/riscv/riscv-toolchain-conventions#cc-preprocessor-definitions + //https://github.com/riscv/riscv-c-api-doc/blob/master/riscv-c-api.md#abi-related-preprocessor-definitions + #if defined(__riscv_float_abi_single) + return "lp64f"; + #elif defined(__riscv_float_abi_double) + return "lp64d"; + #elif defined(__riscv_float_abi_quad) + return "lp64q"; + #elif defined(__riscv_float_abi_soft) + return "lp64"; + #endif #else return "other"; #endif diff --git a/ppsspp_config.h b/ppsspp_config.h index 0c4e2b9c1d..cdf01e07d6 100644 --- a/ppsspp_config.h +++ b/ppsspp_config.h @@ -65,6 +65,7 @@ #endif #if defined(__riscv) && defined(__riscv_xlen) && __riscv_xlen == 64 + //https://github.com/riscv/riscv-c-api-doc/blob/master/riscv-c-api.md #define PPSSPP_ARCH_RISCV64 1 #define PPSSPP_ARCH_64BIT 1 #endif From 9ac49316366dde99418f3e81249fe17a74d0d605 Mon Sep 17 00:00:00 2001 From: Pierce Andjelkovic Date: Sat, 31 Jul 2021 03:03:13 +1000 Subject: [PATCH 069/336] Fix get CPU & CPU Brand --- Common/RiscVCPUDetect.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Common/RiscVCPUDetect.cpp b/Common/RiscVCPUDetect.cpp index 4e3c10d7aa..7a47bd1021 100644 --- a/Common/RiscVCPUDetect.cpp +++ b/Common/RiscVCPUDetect.cpp @@ -33,11 +33,19 @@ const char procfile[] = "/proc/cpuinfo"; const char syscpupresentfile[] = "/sys/devices/system/cpu/present"; std::string GetCPUString() { + //TODO std::string cpu_string; cpu_string = "Unknown"; return cpu_string; } +std::string GetCPUBrandString() { + //TODO + std::string brand_string; + brand_string = "Unknown"; + return brand_string; +} + int GetCoreCount() { std::string line, marker = "processor\t: "; @@ -99,7 +107,8 @@ void CPUInfo::Detect() #if !defined(__linux__) num_cores = 1; #else // __linux__ - strncpy(cpu_string, GetCPUString().c_str(), sizeof(cpu_string)); + truncate_cpy(cpu_string, GetCPUString().c_str()); + truncate_cpy(brand_string, GetCPUBrandString().c_str()); num_cores = GetCoreCount(); #endif } @@ -114,6 +123,8 @@ std::string CPUInfo::Summarize() sum = StringFromFormat("%s, %i cores", cpu_string, num_cores); if (CPU64bit) sum += ", 64-bit"; + //TODO: parse "isa : rv64imafdc" from /proc/cpuinfo + return sum; } From 60946381d9cab84a068daf94821f7a85473967ad Mon Sep 17 00:00:00 2001 From: PpmeiS Date: Sun, 1 Aug 2021 15:00:52 +0200 Subject: [PATCH 070/336] Update es_ES.ini Aesthetic changes and missing lines added. --- assets/lang/es_ES.ini | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/assets/lang/es_ES.ini b/assets/lang/es_ES.ini index 48ebf1d73d..b7dbb6e8ff 100644 --- a/assets/lang/es_ES.ini +++ b/assets/lang/es_ES.ini @@ -26,7 +26,7 @@ AnalogLimiter Tip = Cuando se pulsa el botón del limitador analógico Auto = Automática Auto-centering analog stick = Auto-centrado del stick analógico Auto-hide buttons after seconds = Ocultar botones después de -Binds = Binds +Binds = Mapear Button Opacity = Transparencia de botones Button style = Estilo de botones Calibrate D-Pad = Calibrar cruceta @@ -321,7 +321,7 @@ Zoom = Acercar A PSP game couldn't be found on the disc. = No se pudo encontrar un juego de PSP en el disco. Cannot boot ELF located outside mountRoot. = No se pudo inicar el ELF localizado fuera del mountRoot. Could not save screenshot file = No se pudo guardar la captura de pantalla. -D3D9or11 = Direct3D 9? (o "no" para Direct3D 11) +D3D9or11 = ¿Direct3D 9? (o "no" para Direct3D 11) D3D11CompilerMissing = D3DCompiler_47.dll no encontrado. Por favor instala. O presiona Sí para probar con Direct3D 9. D3D11InitializationError = Error de inicialización de Direct3D 11. D3D11Missing = Tu sistema operativo no incluye D3D11. Por favor ejecuta Windows Update.\n\nPresiona Sí para probar con Direct3D 9. @@ -373,6 +373,7 @@ Warning: Video memory FULL, reducing upscaling and switching to slow caching mod Warning: Video memory FULL, switching to slow caching mode = AVISO: memoria de vídeo LLENA, cambiando a modo de caché lento. ZIP file detected (Require UnRAR) = Es un archivo comprimido (en ZIP).\nPor lo que necesita ser descomprimido (usa UnRAR). ZIP file detected (Require WINRAR) = Es un archivo comprimido (en ZIP).\nPor lo que necesita ser descomprimido (usa WinRAR). + [Game] Asia = Asia ConfirmDelete = Confirmar @@ -398,6 +399,7 @@ Setting Background = Ajustar imagen de fondo Show In Folder = Mostrar en carpeta USA = USA Use UI background = Usar imagen de fondo + [Graphics] % of the void = % de vacío % of viewport = % de ventana gráfica @@ -479,7 +481,7 @@ Internal Resolution = Resolución interna Lazy texture caching = Caché de texturas diferido (rápido) Linear = Lineal Low = Baja -LowCurves = Calidad de curvas bézier +LowCurves = Calidad de curvas Bézier LowCurves Tip = Aumenta/reduce significativamente el renderizado de curvas Bézier Lower resolution for effects (reduces artifacts) = Efectos en baja resolución (reduce errores gráficos) Manual Scaling = Escalado manual @@ -539,11 +541,12 @@ VSync = Sincronización vertical Vulkan = Vulkan Window Size = Tamaño de ventana xBRZ = xBRZ + [InstallZip] Delete ZIP file = Borrar archivo ZIP Install = Instalar Install game from ZIP file? = ¿Instalar juego desde archivo ZIP? -Install textures from ZIP file? = Instalar texturas desde archivo ZIP? +Install textures from ZIP file? = ¿Instalar texturas desde archivo ZIP? Installed! = ¡Instalado! Texture pack doesn't support install = Pack de texturas no soporte instalación Zip archive corrupt = Archivo ZIP corrupto @@ -583,6 +586,7 @@ SavesAreTemporaryGuidance = Extraer PPSSPP en algún lado para guardar permanent SavesAreTemporaryIgnore = Ignorar avisos UnpinPath = Desanclar www.ppsspp.org = Sitio oficial + [MainSettings] Audio = Sonido Controls = Controles @@ -590,6 +594,7 @@ Graphics = Gráficos Networking = Juego en red System = Sistema Tools = Herramientas + [MappableControls] Alt speed 1 = Vel. Alt. 1 Alt speed 2 = Vel. Alt. 2 @@ -653,6 +658,7 @@ Up = Cruceta arriba Vol + = Vol + Vol - = Vol - Wlan = WLAN + [Networking] Adhoc Multiplayer forum = Visitar foro de juego en red AdHoc Server = Servidor AdHoc @@ -702,7 +708,7 @@ Quick Chat 5 = Chat rápido 5 QuickChat = Chat rápido Send = Enviar Send Discord Presence information = Enviar información a Discord "Rich Presence" -TCP No Delay = TCP Sin retardo(más rápido) +TCP No Delay = TCP Sin retardo (más rápido) Top Center = Superior centrado Top Left = Superior izquierda Top Right = Superior derecha @@ -735,7 +741,7 @@ Switch UMD = Cambiar UMD AAColor = AA + color Amount = Cantidad Black border = Bordes negros -Bloom = Brillo +Bloom = Resplandor Brightness = Brillo Cartoon = Dibujos animados ColorCorrection = Corrección de color @@ -781,7 +787,7 @@ PPSSPP Forums = Foro PPSSPP Privacy Policy = Política de privacidad Share PPSSPP = Compartir... specialthanks = Agradecimientos especiales a: -specialthanksKeithGalocy = at NVIDIA (hardware, advice) +specialthanksKeithGalocy = NVIDIA (hardware, consejos) specialthanksMaxim = Por su trabajo en el decodificador Atrac3+ testing = Testeando this translation by = Traducido por: @@ -974,9 +980,9 @@ Change CPU Clock = Velocidad CPU PSP (inestable) Change Memory Stick folder = Cambiar directorio de Memory Stick Change Memory Stick Size = Cambiar tamaño de Memory Stick (GB) Change Nickname = Cambiar apodo PSP -ChangingMemstickPath = Partidas guardadas, estados y otros datos no serán copiados a este directorio.\n\nCambiar directorio de la Memory Stick? +ChangingMemstickPath = Partidas guardadas, estados y otros datos no serán copiados a este directorio.\n\n¿Cambiar directorio de la Memory Stick? ChangingMemstickPathInvalid = Esa ruta no se pudo utilizar para guardar los archivos de la Memory Stick. -ChangingMemstickPathNotExists = Ese directorio todavía no existe.\n\nPartidas guardadas, estados y otros datos no serán copiados a este directorio.\n\nCrear nuevo directorio para la Memory Stick? +ChangingMemstickPathNotExists = Ese directorio todavía no existe.\n\nPartidas guardadas, estados y otros datos no serán copiados a este directorio.\n\n¿Crear nuevo directorio para la Memory Stick? Cheats = Trucos (beta, ver foros) Clear Recent = Limpiar "Recientes" Clear Recent Games List = Borrar lista de juegos recientes From 6f346e5d767811da183b2ab9efebe50ae7273877 Mon Sep 17 00:00:00 2001 From: Sean McGovern Date: Tue, 9 Mar 2021 01:57:20 -0500 Subject: [PATCH 071/336] sceNetAdhoc: fix format specifier for debug log --- Core/HLE/sceNetAdhoc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index e1f5b69867..ea7347272a 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -5605,7 +5605,7 @@ void __NetMatchingCallbacks() //(int matchingId) if (actionAfterMatchingMipsCall < 0) { actionAfterMatchingMipsCall = __KernelRegisterActionType(AfterMatchingMipsCall::Create); } - DEBUG_LOG(SCENET, "AdhocMatching - Remaining Events: %d", (int)matchingEvents.size()); + DEBUG_LOG(SCENET, "AdhocMatching - Remaining Events: %zu", matchingEvents.size()); DEBUG_LOG(SCENET, "AdhocMatchingCallback: [ID=%i][EVENT=%i][%s]", args[0], args[1], mac2str((SceNetEtherAddr*)Memory::GetPointer(args[2])).c_str()); AfterMatchingMipsCall* after = (AfterMatchingMipsCall*)__KernelCreateAction(actionAfterMatchingMipsCall); after->SetData(args[0], args[1], args[2]); From a7a64beb88ba869cd9eab2721008a6a564615382 Mon Sep 17 00:00:00 2001 From: Sean McGovern Date: Sat, 20 Feb 2021 04:19:15 -0500 Subject: [PATCH 072/336] fix overlinking of OpenGL libraries --- CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index d43497e2cf..4e5d446c65 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1954,6 +1954,10 @@ if(WIN32) set(GlslangLibs ${GlslangLibs} spirv-cross-hlsl) endif() +if(OpenGL_OpenGL_FOUND AND NOT APPLE) + set(OPENGL_LIBRARIES OpenGL::OpenGL) +endif() + target_link_libraries(${CoreLibName} Common native kirk cityhash sfmt19937 xbrz xxhash ${GlslangLibs} ${CoreExtraLibs} ${OPENGL_LIBRARIES} ${X11_LIBRARIES} ${CMAKE_DL_LIBS}) From 4a0a1864b0f069d0a1576a07ba1f398969c73bb4 Mon Sep 17 00:00:00 2001 From: iota97 Date: Sun, 1 Aug 2021 21:34:37 +0200 Subject: [PATCH 073/336] Make tap to customize translatable --- UI/TouchControlVisibilityScreen.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UI/TouchControlVisibilityScreen.cpp b/UI/TouchControlVisibilityScreen.cpp index b0d56df21b..4876306b89 100644 --- a/UI/TouchControlVisibilityScreen.cpp +++ b/UI/TouchControlVisibilityScreen.cpp @@ -138,7 +138,7 @@ void TouchControlVisibilityScreen::CreateViews() { row->Add(checkbox); Choice *choice; if (toggle.handle) { - choice = new Choice(std::string(mc->T(toggle.key))+mc->T(" (tap to customize)"), "", false, new LinearLayoutParams(1.0f)); + choice = new Choice(std::string(mc->T(toggle.key))+" ("+mc->T("tap to customize")+")", "", false, new LinearLayoutParams(1.0f)); choice->OnClick.Add(toggle.handle); } else if (toggle.img.isValid()) { choice = new CheckBoxChoice(toggle.img, checkbox, new LinearLayoutParams(1.0f)); From eee209343381e763bbabb0d0c0e13bf1919b5b73 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 31 Jul 2021 22:28:09 -0700 Subject: [PATCH 074/336] GitHub: Switch to issue form templates. --- .github/ISSUE_TEMPLATE/bug.md | 34 ------ .github/ISSUE_TEMPLATE/bug.yml | 135 ++++++++++++++++++++++ .github/ISSUE_TEMPLATE/build.md | 31 ----- .github/ISSUE_TEMPLATE/build.yml | 95 ++++++++++++++++ .github/ISSUE_TEMPLATE/feature.md | 30 ----- .github/ISSUE_TEMPLATE/feature.yml | 73 ++++++++++++ .github/ISSUE_TEMPLATE/graphics.md | 43 ------- .github/ISSUE_TEMPLATE/graphics.yml | 149 +++++++++++++++++++++++++ .github/ISSUE_TEMPLATE/performance.md | 42 ------- .github/ISSUE_TEMPLATE/performance.yml | 133 ++++++++++++++++++++++ 10 files changed, 585 insertions(+), 180 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug.md create mode 100644 .github/ISSUE_TEMPLATE/bug.yml delete mode 100644 .github/ISSUE_TEMPLATE/build.md create mode 100644 .github/ISSUE_TEMPLATE/build.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature.md create mode 100644 .github/ISSUE_TEMPLATE/feature.yml delete mode 100644 .github/ISSUE_TEMPLATE/graphics.md create mode 100644 .github/ISSUE_TEMPLATE/graphics.yml delete mode 100644 .github/ISSUE_TEMPLATE/performance.md create mode 100644 .github/ISSUE_TEMPLATE/performance.yml diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md deleted file mode 100644 index 837cb61c75..0000000000 --- a/.github/ISSUE_TEMPLATE/bug.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -name: Bug, crash, or compatibility issue -about: Choose this if something doesn't work and no other template applies. -labels: needs triage ---- - - - -### What happens? - - -### What *should* happen? - - -### What are you using? -#### What hardware / device and operating system? - -#### What graphics card (GPU) or mobile phone model? - -#### What PPSSPP version (standalone/official), and did it work before? - -#### Which game or games? - - - -#### Checklist - - - [ ] Test in the [latest git build](https://buildbot.orphis.net/ppsspp/) in case it's already fixed. - - [ ] [Search for other reports](https://github.com/hrydgard/ppsspp/search?q=my+issue&type=issues) of the same issue. - - [ ] Try resetting settings or older versions and include if the issue is related. - - [ ] Include logs or screenshots of issue. diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml new file mode 100644 index 0000000000..a343b8cdb5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -0,0 +1,135 @@ +name: Bug, crash, or compatibility issue +description: Choose this if something doesn't work and no other template applies. +body: + - type: markdown + attributes: + value: | + Want the issue fixed faster? Check the wiki for tips: + https://github.com/hrydgard/ppsspp/wiki/How-to-report-an-issue-properly + + - type: input + id: game + validations: + required: true + attributes: + label: Game or games this happens in + placeholder: ULUS-10336 - Crisis Core + description: > + Shown in the title bar, logs, and long press on the game icon. If it's outside a game, put 'None.' + + - type: textarea + id: reproduction + validations: + required: true + attributes: + label: What area of the game / PPSSPP + placeholder: | + When I equip a Mythril Bangle, a blue screen appears and it says the game crashed. + + Here's a screenshot of the blue screen: + [upload screenshot] + + Here's a my savedata with a Mythril Bangle not equipped yet: + [upload zip of savedata] + description: > + Try to explain so someone else could do the same thing. Upload savedata if possible to make it easier to reproduce. + + - type: textarea + id: desired + validations: + required: true + attributes: + label: What should happen + placeholder: | + The Mythril Bangle should be equipped without crashing. + + My friend also tried this on their actual PSP, and it worked fine. Here's a screenshot right after equipping frmo my savedata: + [upload photo] + description: > + If it's a crash, just say "It shouldn't crash." For more complex bugs, it helps to explain what should happen as it's not always obvious. + + - type: textarea + id: logs + attributes: + label: Logs + placeholder: '[drag files here...]' + description: | + Upload logs if possible (use DebugLog.bat on Windows or [adb logcat][] on Android.) + [adb logcat]: https://github.com/hrydgard/ppsspp/wiki/How-to-get-an-adb-logcat-from-a-PC + + - type: markdown + attributes: + value: | + ## Your device + + If you're not sure about any of these questions, check Settings -> Tools -> System Information. + + - type: dropdown + id: platform + validations: + required: true + attributes: + label: Platform + options: + - Android + - Windows + - libretro / Retroarch + - iOS + - Switch + - Raspberry Pi + - Linux / BSD + - macOS + - Other + + - type: input + id: device + validations: + required: true + attributes: + label: Mobile phone model or graphics card + placeholder: Google Pixel 4a or NVIDIA GeForce GTX 1080Ti + description: > + If you don't know, copy what's under 'Driver version' in System Information. + + - type: input + id: version + validations: + required: true + attributes: + label: PPSSPP version affected + placeholder: v2.0.0-999-gabcdef123 + description: > + Shown on the main screen of PPSSPP where games are listed. + + - type: input + id: workingversion + attributes: + label: Last working version + placeholder: v2.0.0-500-g321fedcba + description: > + If it worked before, it's usually easier to narrow down a fix. + + - type: dropdown + id: gpubackend + validations: + required: true + attributes: + label: Graphics backend (3D API) + options: + - Vulkan + - OpenGL / GLES + - Direct3D 11 + - Direct3D 9 + - Other + + - type: checkboxes + attributes: + label: Checklist + options: + - label: "Test in the [latest git build](https://buildbot.orphis.net/ppsspp/) in case it's already fixed." + required: true + - label: "[Search for other reports](https://github.com/hrydgard/ppsspp/search?q=my+issue&type=issues) of the same issue." + required: true + - label: "Try resetting settings or older versions and include if the issue is related." + - label: "Try without any cheats and without loading any save states." + - label: "Include logs or screenshots of issue." diff --git a/.github/ISSUE_TEMPLATE/build.md b/.github/ISSUE_TEMPLATE/build.md deleted file mode 100644 index 71048873dd..0000000000 --- a/.github/ISSUE_TEMPLATE/build.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -name: Building or contributing -about: Choose for issues building PPSSPP on certain platforms or with certain toolsets. -labels: needs triage ---- - - -### What platform, compiler, and build tools? - - -### What compile flags or command did you run specifically? - - -### What happens (don't forget logs)? - - -### What are you using? -#### What hardware / device and operating system? - -#### What PPSSPP version (standalone/official), and did it work before? - - -#### Checklist - - - [ ] Test in the [latest git build](https://buildbot.orphis.net/ppsspp/) in case it's already fixed. - - [ ] Don't forget `git submodule update --init --recursive`. - - [ ] [Search for other reports](https://github.com/hrydgard/ppsspp/search?q=my+issue&type=issues) of the same issue. - - [ ] Try deleting the build directory and starting fresh. - - [ ] Include logs and help us reproduce. - - [ ] Check GitHub Actions, which builds every merge and PR. diff --git a/.github/ISSUE_TEMPLATE/build.yml b/.github/ISSUE_TEMPLATE/build.yml new file mode 100644 index 0000000000..599e030936 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/build.yml @@ -0,0 +1,95 @@ +name: Building or contributing +description: Choose for issues building PPSSPP on certain platforms or with certain toolsets. +body: + - type: dropdown + id: platform + attributes: + label: Platform + options: + - Android + - Windows + - libretro / Retroarch + - iOS + - Switch + - Raspberry Pi + - Linux / BSD + - macOS + - Other + + - type: input + id: buildversions + validations: + required: true + attributes: + label: Compiler and build tool versions + placeholder: Clang 8.0.0 + CMake 3.21.1 + description: > + The more detail, the better. + + - type: input + id: osversion + validations: + required: true + attributes: + label: Operating system version + placeholder: Arch Linux 2021.08.01 + + - type: textarea + id: commands + validations: + required: true + attributes: + label: Build commands used + placeholder: './b.sh --release' + description: > + Include the command or commands you ran, script you used, build arguments, etc. + + - type: textarea + id: problem + validations: + required: true + attributes: + label: What happens + placeholder: | + I receive the following error: + ``` + ld.gold: undefined reference to function 'vkCreateWaylandSurfaceKHR' + ``` + + Here's the entire build log: + [upload zip file of log] + description: > + Include logs and as much detail as possible. Paste exact error messages. + + - type: input + id: version + validations: + required: true + attributes: + label: PPSSPP version affected + placeholder: v2.0.0-999-gabcdef123 + description: > + Use `git describe` if a git checkout. Please try the latest git build if using an older version. + + - type: input + id: workingversion + attributes: + label: Last working version + placeholder: v2.0.0-500-g321fedcba + description: > + If it worked before, it's usually easier to narrow down a fix. + + - type: checkboxes + attributes: + label: Checklist + options: + - label: "Test in the [latest git build](https://buildbot.orphis.net/ppsspp/) in case it's already fixed." + required: true + - label: "Make sure to run `git submodule update --init --recursive` before building." + required: true + - label: "[Search for other reports](https://github.com/hrydgard/ppsspp/search?q=my+issue&type=issues) of the same issue." + required: true + - label: "Try deleting the build directory and running the build again." + required: true + - label: "Check GitHub Actions, which builds every merge and PR." + - label: "Include logs and help us reproduce." diff --git a/.github/ISSUE_TEMPLATE/feature.md b/.github/ISSUE_TEMPLATE/feature.md deleted file mode 100644 index 6a82a5f328..0000000000 --- a/.github/ISSUE_TEMPLATE/feature.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -name: New feature or behavior change -about: Choose when something isn't broken, but you want it to be better. -labels: needs triage ---- - - - -### What should happen? - - -### Who would benefit from it? - - -### What's it specific to (remove if not)? -#### Hardware, device, or operating system? - -#### Specific games? - - -### Does anything else have a similar feature? - - -#### Checklist - - - [ ] Check the [latest git build](https://buildbot.orphis.net/ppsspp/) in case it's already implemented. - - [ ] [Search for other requests](https://github.com/hrydgard/ppsspp/search?q=my+issue&type=issues) of the same feature. diff --git a/.github/ISSUE_TEMPLATE/feature.yml b/.github/ISSUE_TEMPLATE/feature.yml new file mode 100644 index 0000000000..62dd323e51 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature.yml @@ -0,0 +1,73 @@ +name: New feature or behavior change +description: "Choose when something isn't broken, but you want it to be better." +body: + - type: markdown + attributes: + value: | + Want the improvement faster? Check the wiki for tips: + https://github.com/hrydgard/ppsspp/wiki/How-to-report-an-issue-properly + + - type: textarea + id: desired + validations: + required: true + attributes: + label: What should happen + placeholder: | + PPSSPP should have a button that makes all graphics look like the screen was cracked. + + The button should always be present on the screen and be labeled "Drop PSP". + description: > + Be specific and descriptive. + + - type: textarea + id: audience + validations: + required: true + attributes: + label: Who would this benefit + placeholder: | + No one really. I know it'd be a lot of work but it'd be fun for a 2 minute nostalgia trip since I've dropped by PSP before. + description: > + PPSSPP features are contributed by the community, so explaining who else would benefit may help your case. + + - type: dropdown + id: platform + attributes: + label: Platform (if relevant) + options: + - Android + - Windows + - libretro / Retroarch + - iOS + - Switch + - Raspberry Pi + - Linux / BSD + - macOS + - Other + + - type: input + id: game + validations: + required: true + attributes: + label: Games this would be useful in + placeholder: 'ULUS-10336 - Crisis Core, ULUS-10482 - Lunar: Silver Star Harmony' + description: > + Requests for mods to game logic belong in the forum or Discord. This isn't the place to request game hacks. + + - type: textarea + id: notes + attributes: + label: Other emulators or software with a similar feature + description: > + May be helpful in showing someone how it'd be helpful. + + - type: checkboxes + attributes: + label: Checklist + options: + - label: "Check the [latest git build](https://buildbot.orphis.net/ppsspp/) in case it's already implemented." + required: true + - label: "[Search for other requests](https://github.com/hrydgard/ppsspp/search?q=my+issue&type=issues) of the same feature." + required: true diff --git a/.github/ISSUE_TEMPLATE/graphics.md b/.github/ISSUE_TEMPLATE/graphics.md deleted file mode 100644 index 9de08270e0..0000000000 --- a/.github/ISSUE_TEMPLATE/graphics.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -name: Graphics or rendering issue -about: Choose when something is drawing wrong. -labels: needs triage ---- - - - -### What happens? - - - -### What *should* happen? - - -### Include a GE frame capture - - - -### What are you using? -#### What hardware / device and operating system? - -#### What graphics card (GPU) or mobile phone model? - -#### What PPSSPP version (standalone/official), and did it work before? - -#### Which game or games? - - -#### Graphics backend (Vulkan, OpenGL, etc.)? - - -#### Checklist - - - [ ] Test in the [latest git build](https://buildbot.orphis.net/ppsspp/) in case it's already fixed. - - [ ] [Search for other reports](https://github.com/hrydgard/ppsspp/search?q=my+issue&type=issues) of the same issue. - - [ ] Try resetting settings or older versions and include if the issue is related. - - [ ] Try changing graphics settings to determine if one causes the bug. - - [ ] Include logs or screenshots of issue. diff --git a/.github/ISSUE_TEMPLATE/graphics.yml b/.github/ISSUE_TEMPLATE/graphics.yml new file mode 100644 index 0000000000..4a111788d5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/graphics.yml @@ -0,0 +1,149 @@ +name: Graphics or rendering issue +description: Choose when something is drawing wrong. +body: + - type: markdown + attributes: + value: | + Want the issue fixed faster? Check the wiki for tips: + https://github.com/hrydgard/ppsspp/wiki/How-to-report-an-issue-properly + + - type: input + id: game + validations: + required: true + attributes: + label: Game or games this happens in + placeholder: ULUS-10336 - Crisis Core + description: > + Shown in the title bar, logs, and long press on the game icon. + + - type: textarea + id: reproduction + validations: + required: true + attributes: + label: What area of the game + placeholder: 'At the start of Chapter 3, in Sector 8. Right outside the briefing room, the save point looks garbled.' + description: > + If it happens from the start of any game, just say "After new game". Try to explain so someone else could do the same thing. + + - type: textarea + id: problem + validations: + required: true + attributes: + label: What happens + placeholder: | + The save point seems to be moving like it should, but the colors all all wrong - it shouldn't be red. Here's what it looks like: + [upload screenshot] + + Even when I step into it, it turned black which it shouldn't: + [upload screenshot] + description: > + Include screenshots, they're important. But explain what's wrong in the screenshot - it may not be obvious to others. + + - type: textarea + id: desired + validations: + required: true + attributes: + label: What should happen + placeholder: | + The save point should look like it does in other places: + [upload screenshot] + + My friend also tried this on their actual PSP, where it looks right: + [upload photo] + description: > + If you can include a screenshot (from a previous version, another emulator, or a PSP), it helps a lot. But explaining how it should look helps a lot too. + + - type: markdown + attributes: + value: | + Including a frame capture (or multiple) usually helps a lot. These are like 3D screenshots for PPSSPP. Instructions are available [on the wiki][] to create one. + [on the wiki]: https://github.com/hrydgard/ppsspp/wiki/How-to-create-a-frame-dump + + - type: textarea + id: screenshots + attributes: + label: GE frame capture + placeholder: '[drag files here...]' + description: > + You can upload the frame capture or captures as a zip file. Make sure the issue is visible on screen during the capture. + + - type: markdown + attributes: + value: | + ## Your device + + If you're not sure about any of these questions, check Settings -> Tools -> System Information. + + - type: dropdown + id: platform + validations: + required: true + attributes: + label: Platform + options: + - Android + - Windows + - libretro / Retroarch + - iOS + - Switch + - Raspberry Pi + - Linux / BSD + - macOS + - Other + + - type: input + id: device + validations: + required: true + attributes: + label: Mobile phone model or graphics card + placeholder: Google Pixel 4a or NVIDIA GeForce GTX 1080Ti + description: > + If you don't know, copy what's under 'Driver version' in System Information. + + - type: input + id: version + validations: + required: true + attributes: + label: PPSSPP version affected + placeholder: v2.0.0-999-gabcdef123 + description: > + Shown on the main screen of PPSSPP where games are listed. + + - type: input + id: workingversion + attributes: + label: Last working version + placeholder: v2.0.0-500-g321fedcba + description: > + If it worked before, it's usually easier to narrow down a fix. + + - type: dropdown + id: gpubackend + validations: + required: true + attributes: + label: Graphics backend (3D API) + options: + - Vulkan + - OpenGL / GLES + - Direct3D 11 + - Direct3D 9 + - Other + + - type: checkboxes + attributes: + label: Checklist + options: + - label: "Test in the [latest git build](https://buildbot.orphis.net/ppsspp/) in case it's already fixed." + required: true + - label: "[Search for other reports](https://github.com/hrydgard/ppsspp/search?q=my+issue&type=issues) of the same issue." + required: true + - label: "Try resetting settings or older versions and include if the issue is related." + - label: "Try changing graphics settings to determine if one causes the glitch (especially speed hacks or enhancements/replacements.)" + - label: "Include logs or screenshots of issue." diff --git a/.github/ISSUE_TEMPLATE/performance.md b/.github/ISSUE_TEMPLATE/performance.md deleted file mode 100644 index 569e37c68a..0000000000 --- a/.github/ISSUE_TEMPLATE/performance.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -name: Slowdown or performance problem -about: Choose when things got slower from a previous version or a specific scene runs really poorly. -labels: needs triage ---- - - - -### What games and where in them does it happen? - - - -### What speed are you getting with PPSSPP speed display enabled? - - -### Include a GE frame capture and debug stats - - - -### What are you using? -#### What hardware / device and operating system? - -#### What graphics card (GPU) or mobile phone model? - -#### What PPSSPP version (standalone/official), and did it work before? - -#### Graphics backend (Vulkan, OpenGL, etc.)? - - -#### Checklist - - - [ ] Test in the [latest git build](https://buildbot.orphis.net/ppsspp/) in case it's already fixed. - - [ ] [Search for other reports](https://github.com/hrydgard/ppsspp/search?q=my+issue&type=issues) of the same issue. - - [ ] Try resetting settings or older versions and include if the issue is related. - - [ ] Try changing graphics settings to determine if one causes the slowdown. - - [ ] Include logs of screenshots of issue. diff --git a/.github/ISSUE_TEMPLATE/performance.yml b/.github/ISSUE_TEMPLATE/performance.yml new file mode 100644 index 0000000000..2798cc13b5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/performance.yml @@ -0,0 +1,133 @@ +name: Slowdown or performance problem +description: Choose when things got slower from a previous version or a specific scene runs really poorly. +body: + - type: markdown + attributes: + value: | + Want the issue fixed faster? Check the wiki for tips: + https://github.com/hrydgard/ppsspp/wiki/How-to-report-an-issue-properly + + - type: input + id: game + validations: + required: true + attributes: + label: Game or games this happens in + placeholder: ULUS-10336 - Crisis Core + description: > + Shown in the title bar, logs, and long press on the game icon. + + - type: textarea + id: reproduction + validations: + required: true + attributes: + label: What area of the game + placeholder: 'At the start of Chapter 3, in Sector 8. It got slow when I talked to the Sephiroth fan.' + description: > + If it happens from the start of any game, just say "After new game". Try to explain so someone else could do the same thing. + + - type: input + id: speed + attributes: + label: Speed seen in PPSSPP + placeholder: 75% (45/60) + description: Enable FPS and Speed display in settings. + + - type: markdown + attributes: + value: | + Many performance issues are graphics related. Instructions are available [on the wiki][] to create a frame capture. + + Please also include 1 or 2 screenshots during the performance problem while "Show debug statistics" (in Settings) is enabled. + [on the wiki]: https://github.com/hrydgard/ppsspp/wiki/How-to-create-a-frame-dump + + - type: textarea + id: screenshots + attributes: + label: GE frame capture and debug statistics + placeholder: '[drag files here...]' + description: > + You can upload the frame capture as a zip file, and upload screenshots directly. + + - type: markdown + attributes: + value: | + ## Your device + + If you're not sure about any of these questions, check Settings -> Tools -> System Information. + + - type: dropdown + id: platform + validations: + required: true + attributes: + label: Platform + options: + - Android + - Windows + - libretro / Retroarch + - iOS + - Switch + - Raspberry Pi + - Linux / BSD + - macOS + - Other + + - type: input + id: device + validations: + required: true + attributes: + label: Mobile phone model or graphics card + placeholder: Google Pixel 4a or NVIDIA GeForce GTX 1080Ti + description: > + If you don't know, copy what's under 'Driver version' in System Information. + + - type: input + id: version + validations: + required: true + attributes: + label: PPSSPP version affected + placeholder: v2.0.0-999-gabcdef123 + description: > + Shown on the main screen of PPSSPP where games are listed. + + - type: input + id: workingversion + attributes: + label: Last working version + placeholder: v2.0.0-500-g321fedcba + description: > + If it worked before, it's usually easier to narrow down a fix. + + - type: dropdown + id: gpubackend + validations: + required: true + attributes: + label: Graphics backend (3D API) + options: + - Vulkan + - OpenGL / GLES + - Direct3D 11 + - Direct3D 9 + - Other + + - type: textarea + id: notes + attributes: + label: Any other notes or things you've tried + + - type: checkboxes + attributes: + label: Checklist + options: + - label: "Test in the [latest git build](https://buildbot.orphis.net/ppsspp/) in case it's already fixed." + required: true + - label: "[Search for other reports](https://github.com/hrydgard/ppsspp/search?q=my+issue&type=issues) of the same issue." + required: true + - label: "Try resetting settings or older versions and include if the issue is related." + - label: "Try changing graphics settings to determine if one causes the slowdown." + - label: "Include logs or screenshots of issue." From d146370075582cdccc692faff19f8441066ff5b3 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 1 Aug 2021 15:28:59 -0700 Subject: [PATCH 075/336] GitHub: Update link for translation contribution. --- .github/ISSUE_TEMPLATE/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 6f478bb9da..fed2eb62d7 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -7,5 +7,5 @@ contact_links: url: http://report.ppsspp.org/games about: Look here for user reports on best settings and compatibility. - name: Translations - url: https://github.com/hrydgard/ppsspp-lang + url: 'https://github.com/hrydgard/ppsspp/tree/master/assets/lang#readme' about: Look here to contribute translations to PPSSPP. From 0446608f4a5cad7640200312d5f5659d40dc5d7d Mon Sep 17 00:00:00 2001 From: bslenul <33353403+bslenul@users.noreply.github.com> Date: Mon, 2 Aug 2021 12:07:54 +0200 Subject: [PATCH 076/336] Update libretro.cpp --- libretro/libretro.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index 52a23330ba..8c6ad684aa 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -432,6 +432,7 @@ void retro_init(void) g_Config.bFragmentTestCache = true; g_Config.bSavedataUpgrade= true; g_Config.bSeparateSASThread = true; + g_Config.sMACAddress = "12:34:56:78:9A:BC"; g_Config.iFirmwareVersion = PSP_DEFAULT_FIRMWARE; g_Config.iPSPModel = PSP_MODEL_SLIM; From a3e17807a71c83f8e796d34f5d95092e02f9a66c Mon Sep 17 00:00:00 2001 From: Sean McGovern Date: Mon, 2 Aug 2021 14:22:35 -0400 Subject: [PATCH 077/336] cmake: use vendor-neutral GL implementation when available; fallback to legacy GL --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4e5d446c65..0725795392 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1954,7 +1954,7 @@ if(WIN32) set(GlslangLibs ${GlslangLibs} spirv-cross-hlsl) endif() -if(OpenGL_OpenGL_FOUND AND NOT APPLE) +if(OPENGL_opengl_LIBRARY AND OpenGL_GL_PREFERENCE STREQUAL GLVND AND NOT APPLE) set(OPENGL_LIBRARIES OpenGL::OpenGL) endif() From 2b8d05cfa914e8d5b5a59dbd8dccf53be8d30fca Mon Sep 17 00:00:00 2001 From: iota97 Date: Mon, 2 Aug 2021 15:40:59 +0200 Subject: [PATCH 078/336] Add savestate undo UI --- Core/SaveState.cpp | 4 +-- UI/PauseScreen.cpp | 76 +++++++++++++++++++++++++++++++++++----------- 2 files changed, 60 insertions(+), 20 deletions(-) diff --git a/Core/SaveState.cpp b/Core/SaveState.cpp index 6dbea6ac77..ac94c52399 100644 --- a/Core/SaveState.cpp +++ b/Core/SaveState.cpp @@ -531,8 +531,8 @@ namespace SaveState bool HasUndoSaveInSlot(const Path &gameFilename, int slot) { - Path fn = GenerateSaveSlotFilename(gameFilename, slot, STATE_EXTENSION); - return File::Exists(fn.WithExtraExtension(".undo")); + Path fn = GenerateSaveSlotFilename(gameFilename, slot, UNDO_STATE_EXTENSION); + return File::Exists(fn); } bool HasScreenshotInSlot(const Path &gameFilename, int slot) diff --git a/UI/PauseScreen.cpp b/UI/PauseScreen.cpp index f4108a85f8..cb1fd33506 100644 --- a/UI/PauseScreen.cpp +++ b/UI/PauseScreen.cpp @@ -157,10 +157,16 @@ void AsyncImageFileView::Draw(UIContext &dc) { } } +static void AfterSaveStateAction(SaveState::Status status, const std::string &message, void *) { + if (!message.empty() && (!g_Config.bDumpFrames || !g_Config.bDumpVideoOutput)) { + osm.Show(message, status == SaveState::Status::SUCCESS ? 2.0 : 5.0); + } +} + class ScreenshotViewScreen : public PopupScreen { public: - ScreenshotViewScreen(const Path &filename, std::string title, int slot, std::shared_ptr i18n) - : PopupScreen(title, i18n->T("Load State"), "Back"), filename_(filename), slot_(slot) {} // PopupScreen will translate Back on its own + ScreenshotViewScreen(const Path &filename, std::string title, int slot, std::shared_ptr i18n, Path gamePath) + : PopupScreen(title), filename_(filename), slot_(slot), gamePath_(gamePath) {} // PopupScreen will translate Back on its own int GetSlot() const { return slot_; @@ -176,17 +182,62 @@ protected: bool ShowButtons() const override { return true; } void CreatePopupContents(UI::ViewGroup *parent) override { - UI::LinearLayout *content = new UI::LinearLayout(UI::ORIENT_VERTICAL); - parent->Add(content); - UI::Margins contentMargins(10, 0); - content->Add(new AsyncImageFileView(filename_, UI::IS_KEEP_ASPECT, new UI::LinearLayoutParams(480, 272, contentMargins)))->SetCanBeFocused(false); + using namespace UI; + auto pa = GetI18NCategory("Pause"); + auto di = GetI18NCategory("Dialog"); + + ScrollView *scroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, 50, 1.0f)); + LinearLayout *content = new LinearLayout(ORIENT_VERTICAL); + Margins contentMargins(10, 0); + content->Add(new AsyncImageFileView(filename_, IS_KEEP_ASPECT, new LinearLayoutParams(480, 272, contentMargins)))->SetCanBeFocused(false); + + GridLayoutSettings gridsettings(240, 64, 5); + gridsettings.fillCells = true; + GridLayout *grid = content->Add(new GridLayoutList(gridsettings, new LayoutParams(FILL_PARENT, WRAP_CONTENT))); + + Choice *back = new Choice(di->T("Back")); + Choice *undoButton = new Choice(pa->T("Undo last save")); + undoButton->SetEnabled(SaveState::HasUndoSaveInSlot(gamePath_, slot_)); + + grid->Add(new Choice(pa->T("Save State")))->OnClick.Handle(this, &ScreenshotViewScreen::OnSaveState); + grid->Add(new Choice(pa->T("Load State")))->OnClick.Handle(this, &ScreenshotViewScreen::OnLoadState); + grid->Add(back)->OnClick.Handle(this, &UIScreen::OnBack); + grid->Add(undoButton)->OnClick.Handle(this, &ScreenshotViewScreen::OnUndoState); + + scroll->Add(content); + parent->Add(scroll); } private: + UI::EventReturn OnSaveState(UI::EventParams &e); + UI::EventReturn OnLoadState(UI::EventParams &e); + UI::EventReturn OnUndoState(UI::EventParams &e); + Path filename_; + Path gamePath_; int slot_; }; +UI::EventReturn ScreenshotViewScreen::OnSaveState(UI::EventParams &e) { + g_Config.iCurrentStateSlot = slot_; + SaveState::SaveSlot(gamePath_, slot_, &AfterSaveStateAction); + TriggerFinish(DR_OK); //OK will close the pause screen as well + return UI::EVENT_DONE; +} + +UI::EventReturn ScreenshotViewScreen::OnLoadState(UI::EventParams &e) { + g_Config.iCurrentStateSlot = slot_; + SaveState::LoadSlot(gamePath_, slot_, &AfterSaveStateAction); + TriggerFinish(DR_OK); + return UI::EVENT_DONE; +} + +UI::EventReturn ScreenshotViewScreen::OnUndoState(UI::EventParams &e) { + SaveState::UndoSaveSlot(gamePath_, slot_); + TriggerFinish(DR_CANCEL); + return UI::EVENT_DONE; +} + class SaveSlotView : public UI::LinearLayout { public: SaveSlotView(const Path &gamePath, int slot, UI::LayoutParams *layoutParams = nullptr); @@ -273,12 +324,6 @@ void SaveSlotView::Draw(UIContext &dc) { UI::LinearLayout::Draw(dc); } -static void AfterSaveStateAction(SaveState::Status status, const std::string &message, void *) { - if (!message.empty() && (!g_Config.bDumpFrames || !g_Config.bDumpVideoOutput)) { - osm.Show(message, status == SaveState::Status::SUCCESS ? 2.0 : 5.0); - } -} - UI::EventReturn SaveSlotView::OnLoadState(UI::EventParams &e) { g_Config.iCurrentStateSlot = slot_; SaveState::LoadSlot(gamePath_, slot_, &AfterSaveStateAction); @@ -405,11 +450,6 @@ UI::EventReturn GamePauseScreen::OnState(UI::EventParams &e) { void GamePauseScreen::dialogFinished(const Screen *dialog, DialogResult dr) { std::string tag = dialog->tag(); if (tag == "screenshot" && dr == DR_OK) { - ScreenshotViewScreen *s = (ScreenshotViewScreen *)dialog; - int slot = s->GetSlot(); - g_Config.iCurrentStateSlot = slot; - SaveState::LoadSlot(gamePath_, slot, &AfterSaveStateAction); - finishNextFrame_ = true; } else { // There may have been changes to our savestates, so let's recreate. @@ -425,7 +465,7 @@ UI::EventReturn GamePauseScreen::OnScreenshotClicked(UI::EventParams &e) { Path fn = v->GetScreenshotFilename(); std::string title = v->GetScreenshotTitle(); auto pa = GetI18NCategory("Pause"); - Screen *screen = new ScreenshotViewScreen(fn, title, v->GetSlot(), pa); + Screen *screen = new ScreenshotViewScreen(fn, title, v->GetSlot(), pa, gamePath_); screenManager()->push(screen); } return UI::EVENT_DONE; From 9a841664a6d838529f54fb6fdef40415ee198f4c Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 2 Aug 2021 23:45:49 -0700 Subject: [PATCH 079/336] D3D11: Use right state in flush before output. We were accidentally changing the blend state for the final draw in a frame. This could cause apparently random issues if a game didn't align drawing with vblanks. Fixes #13152. --- GPU/D3D11/GPU_D3D11.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/GPU/D3D11/GPU_D3D11.cpp b/GPU/D3D11/GPU_D3D11.cpp index 22725465df..f973d49e5e 100644 --- a/GPU/D3D11/GPU_D3D11.cpp +++ b/GPU/D3D11/GPU_D3D11.cpp @@ -242,11 +242,12 @@ void GPU_D3D11::SetDisplayFramebuffer(u32 framebuf, u32 stride, GEBufferFormat f } void GPU_D3D11::CopyDisplayToOutput(bool reallyDirty) { + // Flush anything left over. + drawEngine_.Flush(); + float blendColor[4]{}; context_->OMSetBlendState(stockD3D11.blendStateDisabledWithColorMask[0xF], blendColor, 0xFFFFFFFF); - drawEngine_.Flush(); - framebufferManagerD3D11_->CopyDisplayToOutput(reallyDirty); framebufferManagerD3D11_->EndFrame(); From 626dfb5bd71d1f5292a7cb5fd658cdd6f4a0c7cc Mon Sep 17 00:00:00 2001 From: iota97 Date: Tue, 3 Aug 2021 10:04:49 +0200 Subject: [PATCH 080/336] Savestate load undo --- Core/Config.cpp | 1 + Core/Config.h | 1 + Core/SaveState.cpp | 88 ++++++++++++++++++++++++++++++++++++---------- Core/SaveState.h | 5 +++ UI/PauseScreen.cpp | 13 +++++++ UI/PauseScreen.h | 1 + 6 files changed, 91 insertions(+), 18 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index d97e2509cd..9e83f27e48 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -532,6 +532,7 @@ static ConfigSetting generalSettings[] = { ConfigSetting("SaveLoadResetsAVdumping", &g_Config.bSaveLoadResetsAVdumping, false), ConfigSetting("StateSlot", &g_Config.iCurrentStateSlot, 0, true, true), ConfigSetting("EnableStateUndo", &g_Config.bEnableStateUndo, &DefaultEnableStateUndo, true, true), + ConfigSetting("StateLoadUndoGame", &g_Config.sStateLoadUndoGame, "NA", true, false), ConfigSetting("RewindFlipFrequency", &g_Config.iRewindFlipFrequency, 0, true, true), ConfigSetting("ShowOnScreenMessage", &g_Config.bShowOnScreenMessages, true, true, false), diff --git a/Core/Config.h b/Core/Config.h index a07a6182d8..5e29220fc7 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -209,6 +209,7 @@ public: int iRewindFlipFrequency; bool bUISound; bool bEnableStateUndo; + std::string sStateLoadUndoGame; int iAutoLoadSaveState; // 0 = off, 1 = oldest, 2 = newest, >2 = slot number + 3 bool bEnableCheats; bool bReloadCheats; diff --git a/Core/SaveState.cpp b/Core/SaveState.cpp index ac94c52399..2df8b9e6f3 100644 --- a/Core/SaveState.cpp +++ b/Core/SaveState.cpp @@ -412,18 +412,19 @@ namespace SaveState return filename.GetFilename() + " " + sy->T("(broken)"); } - Path GenerateSaveSlotFilename(const Path &gameFilename, int slot, const char *extension) - { + std::string GenerateFullDiskId(const Path &gameFilename) { std::string discId = g_paramSFO.GetValueString("DISC_ID"); std::string discVer = g_paramSFO.GetValueString("DISC_VERSION"); - std::string fullDiscId; if (discId.empty()) { discId = g_paramSFO.GenerateFakeID(); discVer = "1.00"; } - fullDiscId = StringFromFormat("%s_%s", discId.c_str(), discVer.c_str()); + return StringFromFormat("%s_%s", discId.c_str(), discVer.c_str()); + } - std::string filename = StringFromFormat("%s_%d.%s", fullDiscId.c_str(), slot, extension); + Path GenerateSaveSlotFilename(const Path &gameFilename, int slot, const char *extension) + { + std::string filename = StringFromFormat("%s_%d.%s", GenerateFullDiskId(gameFilename).c_str(), slot, extension); return GetSysDirectory(DIRECTORY_SAVESTATE) / filename; } @@ -437,18 +438,6 @@ namespace SaveState g_Config.iCurrentStateSlot = (g_Config.iCurrentStateSlot + 1) % NUM_SLOTS; } - void LoadSlot(const Path &gameFilename, int slot, Callback callback, void *cbUserData) - { - Path fn = GenerateSaveSlotFilename(gameFilename, slot, STATE_EXTENSION); - if (!fn.empty()) { - Load(fn, slot, callback, cbUserData); - } else { - auto sy = GetI18NCategory("System"); - if (callback) - callback(Status::FAILURE, sy->T("Failed to load state. Error in the file system."), cbUserData); - } - } - static void DeleteIfExists(const Path &fn) { // Just avoiding error messages. if (File::Exists(fn)) { @@ -471,6 +460,63 @@ namespace SaveState } } + void LoadSlot(const Path &gameFilename, int slot, Callback callback, void *cbUserData) + { + Path fn = GenerateSaveSlotFilename(gameFilename, slot, STATE_EXTENSION); + if (!fn.empty()) { + // This add only 1 extra state, should we just always enable it? + if (g_Config.bEnableStateUndo) { + Path backup = GetSysDirectory(DIRECTORY_SAVESTATE) / LOAD_UNDO_NAME; + + auto saveCallback = [=](Status status, const std::string &message, void *data) { + if (status != Status::FAILURE) { + DeleteIfExists(backup); + File::Rename(backup.WithExtraExtension(".tmp"), backup); + g_Config.sStateLoadUndoGame = GenerateFullDiskId(gameFilename); + Load(fn, slot, callback, cbUserData); + } else if (callback) { + callback(status, message, data); + } + }; + + if (!backup.empty()) { + Save(backup.WithExtraExtension(".tmp"), -2, saveCallback, cbUserData); + } else { + auto sy = GetI18NCategory("System"); + if (callback) + callback(Status::FAILURE, sy->T("Failed to save state for load undo. Error in the file system."), cbUserData); + } + } else { + Load(fn, slot, callback, cbUserData); + } + } else { + auto sy = GetI18NCategory("System"); + if (callback) + callback(Status::FAILURE, sy->T("Failed to load state. Error in the file system."), cbUserData); + } + } + + bool UndoLoad(const Path &gameFilename, Callback callback, void *cbUserData) + { + if (g_Config.sStateLoadUndoGame != GenerateFullDiskId(gameFilename)) { + auto sy = GetI18NCategory("System"); + if (callback) + callback(Status::FAILURE, sy->T("Error: load undo state is from a different game"), cbUserData); + return false; + } + + Path fn = GetSysDirectory(DIRECTORY_SAVESTATE) / LOAD_UNDO_NAME; + if (!fn.empty()) { + Load(fn, -2, callback, cbUserData); // Slot number is visual only, -2 will display special message (kinda have to find a better way) + return true; + } else { + auto sy = GetI18NCategory("System"); + if (callback) + callback(Status::FAILURE, sy->T("Failed to load state for load undo. Error in the file system."), cbUserData); + return false; + } + } + void SaveSlot(const Path &gameFilename, int slot, Callback callback, void *cbUserData) { Path fn = GenerateSaveSlotFilename(gameFilename, slot, STATE_EXTENSION); @@ -541,6 +587,12 @@ namespace SaveState return File::Exists(fn); } + bool HasUndoLoad(const Path &gameFilename) + { + Path fn = GetSysDirectory(DIRECTORY_SAVESTATE) / LOAD_UNDO_NAME; + return File::Exists(fn) && g_Config.sStateLoadUndoGame == GenerateFullDiskId(gameFilename); + } + bool operator < (const tm &t1, const tm &t2) { if (t1.tm_year < t2.tm_year) return true; if (t1.tm_year > t2.tm_year) return false; @@ -752,7 +804,7 @@ namespace SaveState // Use the state's latest version as a guess for saveStateInitialGitVersion. result = CChunkFileReader::Load(op.filename, &saveStateInitialGitVersion, state, &errorString); if (result == CChunkFileReader::ERROR_NONE) { - callbackMessage = slot_prefix + sc->T("Loaded State"); + callbackMessage = op.slot != -2 ? slot_prefix + sc->T("Loaded State") : sc->T("State load undone"); callbackResult = Status::SUCCESS; hasLoadedState = true; diff --git a/Core/SaveState.h b/Core/SaveState.h index d7bb0142fe..7936fd32d6 100644 --- a/Core/SaveState.h +++ b/Core/SaveState.h @@ -37,6 +37,8 @@ namespace SaveState static const char *UNDO_STATE_EXTENSION = "undo.ppst"; static const char *UNDO_SCREENSHOT_EXTENSION = "undo.jpg"; + static const char *LOAD_UNDO_NAME = "load_undo.ppst"; + void Init(); void Shutdown(); @@ -45,9 +47,11 @@ namespace SaveState void SaveSlot(const Path &gameFilename, int slot, Callback callback, void *cbUserData = 0); void LoadSlot(const Path &gameFilename, int slot, Callback callback, void *cbUserData = 0); bool UndoSaveSlot(const Path &gameFilename, int slot); + bool UndoLoad(const Path &gameFilename, Callback callback, void *cbUserData = 0); // Checks whether there's an existing save in the specified slot. bool HasSaveInSlot(const Path &gameFilename, int slot); bool HasUndoSaveInSlot(const Path &gameFilename, int slot); + bool HasUndoLoad(const Path &gameFilename); bool HasScreenshotInSlot(const Path &gameFilename, int slot); int GetCurrentSlot(); @@ -57,6 +61,7 @@ namespace SaveState int GetOldestSlot(const Path &gameFilename); std::string GetSlotDateAsString(const Path &gameFilename, int slot); + std::string GenerateFullDiskId(const Path &gameFilename); Path GenerateSaveSlotFilename(const Path &gameFilename, int slot, const char *extension); std::string GetTitle(const Path &filename); diff --git a/UI/PauseScreen.cpp b/UI/PauseScreen.cpp index cb1fd33506..ec135051d8 100644 --- a/UI/PauseScreen.cpp +++ b/UI/PauseScreen.cpp @@ -396,6 +396,12 @@ void GamePauseScreen::CreateViews() { rewindButton->OnClick.Handle(this, &GamePauseScreen::OnRewind); } + if (g_Config.bEnableStateUndo) { + UI::Choice *loadUndoButton = leftColumnItems->Add(new Choice(pa->T("Undo last state load"))); + loadUndoButton->SetEnabled(SaveState::HasUndoLoad(gamePath_)); + loadUndoButton->OnClick.Handle(this, &GamePauseScreen::OnLoadUndo); + } + ViewGroup *rightColumn = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(300, FILL_PARENT, actionMenuMargins)); root_->Add(rightColumn); @@ -492,6 +498,13 @@ UI::EventReturn GamePauseScreen::OnRewind(UI::EventParams &e) { return UI::EVENT_DONE; } +UI::EventReturn GamePauseScreen::OnLoadUndo(UI::EventParams &e) { + SaveState::UndoLoad(gamePath_, &AfterSaveStateAction); + + TriggerFinish(DR_CANCEL); + return UI::EVENT_DONE; +} + UI::EventReturn GamePauseScreen::OnCwCheat(UI::EventParams &e) { screenManager()->push(new CwCheatScreen(gamePath_)); return UI::EVENT_DONE; diff --git a/UI/PauseScreen.h b/UI/PauseScreen.h index e45a1a93ec..6d4acbd961 100644 --- a/UI/PauseScreen.h +++ b/UI/PauseScreen.h @@ -44,6 +44,7 @@ private: UI::EventReturn OnReportFeedback(UI::EventParams &e); UI::EventReturn OnRewind(UI::EventParams &e); + UI::EventReturn OnLoadUndo(UI::EventParams &e); UI::EventReturn OnScreenshotClicked(UI::EventParams &e); UI::EventReturn OnCwCheat(UI::EventParams &e); From 6d5b8799ba3db72aa12ad6b67d405ab728c3dbe8 Mon Sep 17 00:00:00 2001 From: "Victor Rojas Carrasco (VR0)" Date: Tue, 3 Aug 2021 13:11:52 -0400 Subject: [PATCH 081/336] Retraduciendo el archivo --- assets/lang/es_LA.ini | 54 +++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/assets/lang/es_LA.ini b/assets/lang/es_LA.ini index 480f7525c0..f133bf7928 100644 --- a/assets/lang/es_LA.ini +++ b/assets/lang/es_LA.ini @@ -1,10 +1,10 @@ [Audio] -Alternate speed volume = Alternate speed volume +Alternate speed volume = Alternar velocidad de volumén Audio backend = Motor de audio (req. reiniciar) AudioBufferingForBluetooth = Buffer amigable con Bluetooth (enlentece) Auto = Automático Device = Dispositivo -DSound (compatible) = DSound (compatible) +DSound (compatible) = DirectSound (compatible) Enable Sound = Activar Sonido Global volume = Volumen global Microphone = Micrófono @@ -199,7 +199,7 @@ Allow remote debugger = Admitir depurador remoto Backspace = Borrar Block address = Bloquear dirección By Address = Por dirección -Copy savestates to memstick root = Copy save states to Memory Stick root +Copy savestates to memstick root = Copiar estados de guardado a la ruta inicial de Memory Stick Create/Open textures.ini file for current game = Crear/Abrir archivo textures.ini para el juego actual Current = Actual Dev Tools = Herramientas de\ndesarrollador @@ -255,7 +255,7 @@ Cancel = Cancelar Center = Centrar ChangingGPUBackends = Cambiar el GPU requiere reiniciar PPSSPP.\n¿Reiniciar ahora? ChangingInflightFrames = Cambiar el almacenamiento en búfer de comandos gráficos requiere que PPSSPP se reinicie.\n¿Reiniciar ahora? -Channel: = Channel: +Channel: = Canal: Choose PPSSPP save folder = Elige la carpeta de guardado de PPSSPP. Confirm Overwrite = Hay archivos existentes,\n¿Deseas sobreescribirlos? Confirm Save = ¿Deseas guardar estos datos? @@ -280,16 +280,16 @@ Enter = Confirmar Finish = Terminar Grid = Cuadrícula Inactive = Inactivo -InternalError = An internal error has occurred. +InternalError = Ha ocurrido una falla interna. Load = Abrir Load completed = Datos cargados. Loading = Cargando\nPor favor espere... LoadingFailed = Los datos no se pudieron cargar. Move = Mover Network Connection = Conexión de red -NEW DATA = NO HAY DATOS +NEW DATA = CREAR DATOS No = No -ObtainingIP = Obtaining IP address.\nPlease wait... +ObtainingIP = Obteniendo dirección IP.\nEspere un momento... OK = OK Old savedata detected = Detectados datos de partida antiguos. Options = Opciones @@ -330,7 +330,7 @@ Disk full while writing data = El disco se ha llenado durante la escritura de da ELF file truncated - can't load = Archivo ELF truncado: no se puede cargar Error loading file = Error al cargar archivo. Error reading file = Error al leer el archivo. -Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed initializing CPU/Memory = Falló al iniciar CPU o memoria. Failed to identify file = No se pudo identificar el archivo. Failed to load executable: = Falló al cargar ejecutable: File corrupt = Archivo corrupto @@ -356,13 +356,13 @@ PPSSPP doesn't support UMD Music. = PPSSPP no soporta canciones de UMD. PPSSPP doesn't support UMD Video. = PPSSPP no soporta videos de UMD. PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP solo soporta juegos de PSP y no soporta juegos de PS1 o PS2. PPSSPPDoesNotSupportInternet = Por ahora PPSSPP no soporta las funciones de red para actualizaciones de juegos, DLCs o PSN. -PS1 EBOOTs are not supported by PPSSPP. = PPSSPP no soporta los EBOOTs de PSX. -PSX game image detected. = El archivo es una imagen MODE2. PPSSPP no soporta juegos de PSX. -RAR file detected (Require UnRAR) = Es un archivo comprimido (RAR).\nPor favor, descomprima primero (usa UnRAR). -RAR file detected (Require WINRAR) = Es un archivo comprimido (RAR).\nPor favor, descomprima primero (usa WinRAR). +PS1 EBOOTs are not supported by PPSSPP. = PPSSPP no soporta los EBOOTs de PS1. +PSX game image detected. = El archivo es una imagen MODE2 y esa imagen es de PS1, por lo cual PPSSPP no la soporta. +RAR file detected (Require UnRAR) = Se ha detectado un archivo RAR.\nUtiliza UnRar para descomprimirlo. +RAR file detected (Require WINRAR) = Se ha detectado un archivo RAR.\nUtiliza WinRar para descomprimirlo. Running slow: try frameskip, sound is choppy when slow = Se ejecuta lento:\nIntenta saltar cuadros, puede sonar mal debido a la ralentización. Running slow: Try turning off Software Rendering = Se ejecuta lento:\nIntenta desactivar "renderizado por software". -Save encryption failed. This save won't work on real PSP = Falló al cifrar los datos guardados. No funcionarán en una PSP real. +Save encryption failed. This save won't work on real PSP = Falló al encriptar los datos guardados. No funcionarán en una PSP real. textures.ini filenames may not be cross-platform = Los nombres del archivo "textures.ini" pueden no ser multiplataforma. This is a saved state, not a game. = Este es un estado guardado en vez de un juego. This is save data, not a game. = Esta es una carpeta de datos guardado en vez de un juego. @@ -371,8 +371,8 @@ Unable to initialize rendering engine. = No se pudo inicializar el motor de rend Unable to write savedata, disk may be full = No se pudieron escribir los datos de guardado, el disco podría estar lleno. Warning: Video memory FULL, reducing upscaling and switching to slow caching mode = ADVERTENCIA: VRAM lleno, reduciendo escalado y cambiando al modo cache lento. Warning: Video memory FULL, switching to slow caching mode = ADVERTENCIA: VRAM lleno, cambiando al modo cache lento. -ZIP file detected (Require UnRAR) = Es un archivo comprimido (ZIP).\nPor favor, descomprima primero (usa UnRAR). -ZIP file detected (Require WINRAR) = Es un archivo comprimido (ZIP).\nPor favor, descomprima primero (usa WinRAR). +ZIP file detected (Require UnRAR) = Se ha detectado un archivo ZIP.\nUtiliza UnRar para descomprimirlo. +ZIP file detected (Require WINRAR) = Se ha detectado un archivo ZIP.\nUtiliza compresores como WinRar o WinZip para descomprimirlo. [Game] Asia = Asia @@ -382,14 +382,14 @@ Create Shortcut = Crear acceso directo Delete Game = Borrar juego Delete Game Config = Borrar config. del juego Delete Save Data = Borrar datos -Europe = Europe\n(Europa) +Europe = Europa Game = Juego Game Settings = Ajustes de juego Homebrew = Homebrew Hong Kong = Hong Kong InstallData = Instalación de datos -Japan = Japan\n(Japón) -Korea = Korea\n(Corea) +Japan = Japón +Korea = Corea MB = MB One moment please... = Espere un momento... Play = Jugar @@ -397,7 +397,7 @@ Remove From Recent = Borrar de "recientes" SaveData = Datos Setting Background = Configurar fondo Show In Folder = Mostrar en carpeta -USA = USA\n(Norteamérica) +USA = Norte y\nLatinoamérica Use UI background = Usar fondo como interfaz [Graphics] @@ -447,8 +447,8 @@ Cardboard Screen X Shift = Desplazamiento X (en % del espacio en blanco) Cardboard Screen Y Shift = Desplazamiento Y (en % del espacio en blanco) Cardboard VR Settings = Configurar Google Cardboard VR Cheats = Trampas -Clear Speedhack = Clear framebuffers on first use (speed hack) -ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +Clear Speedhack = Limpia los búfers de frames al primer uso (hackea velocidad) +ClearSpeedhack Tip = A veces acelera (la mayoría en disposiivos móviles), pero puede causar glitches CPU Core = Núcleo de CPU Debugging = Depuración DefaultCPUClockRequired = ADVERTENCIA: Este juego req. poner por défecto el reloj de CPU. @@ -512,7 +512,7 @@ Retain changed textures = Retener texturas cambiadas\n(A veces se ralentiza) RetainChangedTextures Tip = Ralentiza muchos juegos, pero acelera algunos Rotation = Rotación Safe = Seguro -Screen layout = Screen layout +Screen layout = Disposición de pantalla Screen Scaling Filter = Filtro de escalado de pantalla Show Debug Statistics = Mostrar estadísticas de depuración Show FPS Counter = Mostrar contador de FPS @@ -546,7 +546,7 @@ xBRZ = xBRZ Delete ZIP file = Borrar archivo ZIP Install = Instalar Install game from ZIP file? = ¿Instalar juego desde un archivo ZIP? -Install textures from ZIP file? = Install textures from ZIP file? +Install textures from ZIP file? = ¿Instalar texturas desde un archivo ZIP? Installed! = ¡Instalado! Texture pack doesn't support install = El paquete de texturas no es compatible con la instalación Zip archive corrupt = Archivo ZIP corrupto @@ -670,7 +670,7 @@ Bottom Right = Abajo Derecha Center Left = Izquierda Center Right = Derecha Change Mac Address = Cambiar dirección MAC -Change proAdhocServer Address = Cambiar dirección IP de\nservidor PRO ad hoc (localhost = multiple instances) +Change proAdhocServer Address = Cambiar dirección IP de\nservidor PRO ad hoc (localhost = multiples instancias) Chat = Chat Chat Button Position = Posición del botón de chat Chat Here = Escriba aquí @@ -768,7 +768,7 @@ Vignette = Viñeta [PSPCredits] all the forum mods = Todos los foros de Mods -build server = build server +build server = Servidor de build Buy Gold = Comprar\nPPSSPP Gold check = También te recomendamos el emulador de Wii/GC Dolphin CheckOutPPSSPP = Prueba PPSSPP, el mejor emulador de PSP: https://www.ppsspp.org/ @@ -838,7 +838,7 @@ FeedbackSubmitFail = No puede enviar tus datos al servidor. Prueba actualizando FeedbackThanks = Gracias por tu reporte. Gameplay = Jugabilidad Graphics = Gráficos -Great = Geniales +Great = Genial In-game = Funciona In-game Description = Funciona en jugabilidad pero no es posible completarlo. Menu/Intro = Menu/Intro @@ -1066,7 +1066,7 @@ WARNING: Battery save mode is on = ADVERTENCIA: Modo ahorro activado YYYYMMDD = YYYYMMDD [Upgrade] -Details = Details +Details = Detalles Dismiss = Cancelar Download = Descargar New version of PPSSPP available = Nueva versión de PPSSPP disponible From 9be2bef617426280f0a579cca8b7d581d099aa04 Mon Sep 17 00:00:00 2001 From: iota97 Date: Tue, 3 Aug 2021 21:20:01 +0200 Subject: [PATCH 082/336] Use horizontal layout --- UI/PauseScreen.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/UI/PauseScreen.cpp b/UI/PauseScreen.cpp index ec135051d8..961d6b054a 100644 --- a/UI/PauseScreen.cpp +++ b/UI/PauseScreen.cpp @@ -390,18 +390,19 @@ void GamePauseScreen::CreateViews() { } leftColumnItems->Add(new Spacer(0.0)); - if (g_Config.iRewindFlipFrequency > 0) { - UI::Choice *rewindButton = leftColumnItems->Add(new Choice(pa->T("Rewind"))); - rewindButton->SetEnabled(SaveState::CanRewind()); - rewindButton->OnClick.Handle(this, &GamePauseScreen::OnRewind); - } - + LinearLayout *buttonRow = leftColumnItems->Add(new LinearLayout(ORIENT_HORIZONTAL)); if (g_Config.bEnableStateUndo) { - UI::Choice *loadUndoButton = leftColumnItems->Add(new Choice(pa->T("Undo last state load"))); + UI::Choice *loadUndoButton = buttonRow->Add(new Choice(pa->T("Undo last state load"))); loadUndoButton->SetEnabled(SaveState::HasUndoLoad(gamePath_)); loadUndoButton->OnClick.Handle(this, &GamePauseScreen::OnLoadUndo); } + if (g_Config.iRewindFlipFrequency > 0) { + UI::Choice *rewindButton = buttonRow->Add(new Choice(pa->T("Rewind"))); + rewindButton->SetEnabled(SaveState::CanRewind()); + rewindButton->OnClick.Handle(this, &GamePauseScreen::OnRewind); + } + ViewGroup *rightColumn = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(300, FILL_PARENT, actionMenuMargins)); root_->Add(rightColumn); From 4f4133fbab89be7ebc824bdac9e5c3fd1070ac17 Mon Sep 17 00:00:00 2001 From: Linblow <8434205+Linblow@users.noreply.github.com> Date: Tue, 3 Aug 2021 19:57:13 +0200 Subject: [PATCH 083/336] Add ULES00581 to compat.ini for MTX JIT hack --- assets/compat.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/compat.ini b/assets/compat.ini index bab7fb84fe..e713ef08b0 100644 --- a/assets/compat.ini +++ b/assets/compat.ini @@ -863,6 +863,7 @@ ULES00034 = true ULES00035 = true # MTX MotoTrax ULUS10138 = true +ULES00581 = true [HideISOFiles] # DJ Max Portable has some crude copy-protection functionality where it looks for ISO/CSO files From 0ae0d307512c313e1242440f9455bc882bb68c6b Mon Sep 17 00:00:00 2001 From: iota97 Date: Wed, 4 Aug 2021 09:18:23 +0200 Subject: [PATCH 084/336] Allow to invert context dimension for combo button --- UI/GamepadEmu.cpp | 11 ++++++++++- UI/GamepadEmu.h | 26 +++++++++++++++----------- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/UI/GamepadEmu.cpp b/UI/GamepadEmu.cpp index f36ccfee42..f0adecd093 100644 --- a/UI/GamepadEmu.cpp +++ b/UI/GamepadEmu.cpp @@ -177,6 +177,15 @@ bool ComboKey::IsDown() { return (toggle_ && on_) || (!toggle_ && pointerDownMask_ != 0); } +void ComboKey::GetContentDimensions(const UIContext &dc, float &w, float &h) const { + MultiTouchButton::GetContentDimensions(dc, w, h); + if (invertedContextDimension_) { + float tmp = w; + w = h; + h = tmp; + } +} + void ComboKey::Touch(const TouchInput &input) { using namespace CustomKey; bool lastDown = pointerDownMask_ != 0; @@ -739,7 +748,7 @@ UI::ViewGroup *CreatePadLayout(float xres, float yres, bool *pause, ControlMappe if (touch.show) { auto aux = root->Add(new ComboKey(cfg.key, key, cfg.toggle, controllMapper, g_Config.iTouchButtonStyle == 0 ? comboKeyShapes[cfg.shape].i : comboKeyShapes[cfg.shape].l, comboKeyShapes[cfg.shape].i, - comboKeyImages[cfg.image].i, touch.scale, buttonLayoutParams(touch))); + comboKeyImages[cfg.image].i, touch.scale, comboKeyShapes[cfg.shape].d, buttonLayoutParams(touch))); aux->SetAngle(comboKeyImages[cfg.image].r, comboKeyShapes[cfg.shape].r); aux->FlipImageH(comboKeyShapes[cfg.shape].f); return aux; diff --git a/UI/GamepadEmu.h b/UI/GamepadEmu.h index 20c1a72a2d..3e32054964 100644 --- a/UI/GamepadEmu.h +++ b/UI/GamepadEmu.h @@ -169,16 +169,19 @@ const int baseActionButtonSpacing = 60; class ComboKey : public MultiTouchButton { public: - ComboKey(uint64_t pspButtonBit, const char *key, bool toggle, ControlMapper* controllMapper, ImageID bgImg, ImageID bgDownImg, ImageID img, float scale, UI::LayoutParams *layoutParams) - : MultiTouchButton(key, bgImg, bgDownImg, img, scale, layoutParams), pspButtonBit_(pspButtonBit), toggle_(toggle), controllMapper_(controllMapper), on_(false) { + ComboKey(uint64_t pspButtonBit, const char *key, bool toggle, ControlMapper* controllMapper, ImageID bgImg, ImageID bgDownImg, ImageID img, float scale, bool invertedContextDimension, UI::LayoutParams *layoutParams) + : MultiTouchButton(key, bgImg, bgDownImg, img, scale, layoutParams), pspButtonBit_(pspButtonBit), toggle_(toggle), controllMapper_(controllMapper), on_(false), invertedContextDimension_(invertedContextDimension) { } void Touch(const TouchInput &input) override; bool IsDown() override; + + void GetContentDimensions(const UIContext &dc, float &w, float &h) const override; private: uint64_t pspButtonBit_; bool toggle_; ControlMapper* controllMapper_; bool on_; + bool invertedContextDimension_; // Swap width and height }; // Just edit this to add new image, shape or button function @@ -227,17 +230,18 @@ namespace CustomKey { ImageID l; // ImageID line version float r; // Rotation angle in dregree bool f; // Flip Horizontally + bool d; // Invert height and width for context dimension (for example for 90 degree rot) }; static const keyShape comboKeyShapes[] = { - { "Circle", ImageID("I_ROUND"), ImageID("I_ROUND_LINE"), 0.0f, false }, - { "Rectangle", ImageID("I_RECT"), ImageID("I_RECT_LINE"), 0.0f, false }, - { "Vertical Rectangle", ImageID("I_RECT"), ImageID("I_RECT_LINE"), 90.0f, false }, - { "L button", ImageID("I_SHOULDER"), ImageID("I_SHOULDER_LINE"), 0.0f, false }, - { "R button", ImageID("I_SHOULDER"), ImageID("I_SHOULDER_LINE"), 0.0f, true }, - { "Arrow up", ImageID("I_DIR"), ImageID("I_DIR_LINE"), 270.0f, false }, - { "Arrow down", ImageID("I_DIR"), ImageID("I_DIR_LINE"), 90.0f, false }, - { "Arrow left", ImageID("I_DIR"), ImageID("I_DIR_LINE"), 180.0f, false }, - { "Arrow right", ImageID("I_DIR"), ImageID("I_DIR_LINE"), 0.0f, false }, + { "Circle", ImageID("I_ROUND"), ImageID("I_ROUND_LINE"), 0.0f, false, false }, + { "Rectangle", ImageID("I_RECT"), ImageID("I_RECT_LINE"), 0.0f, false, false }, + { "Vertical Rectangle", ImageID("I_RECT"), ImageID("I_RECT_LINE"), 90.0f, false, true }, + { "L button", ImageID("I_SHOULDER"), ImageID("I_SHOULDER_LINE"), 0.0f, false, false }, + { "R button", ImageID("I_SHOULDER"), ImageID("I_SHOULDER_LINE"), 0.0f, true, false }, + { "Arrow up", ImageID("I_DIR"), ImageID("I_DIR_LINE"), 270.0f, false, true }, + { "Arrow down", ImageID("I_DIR"), ImageID("I_DIR_LINE"), 90.0f, false, true }, + { "Arrow left", ImageID("I_DIR"), ImageID("I_DIR_LINE"), 180.0f, false, false }, + { "Arrow right", ImageID("I_DIR"), ImageID("I_DIR_LINE"), 0.0f, false, false }, }; // Button list From 793e79945fe81a02331906e6cfb8cd6065881f4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 17 Jul 2021 19:50:36 +0200 Subject: [PATCH 085/336] Enable scoped storage enforcement on Android 11+. This has a number of UX issues and bugs we need to work through, but at least games are playable, things mostly work. Upgrades are handled smoothly by keeping existing storage access until you uninstall. After a reinstall, you'll need to re-select your old PSP directory manually in settings :( --- UI/DevScreens.cpp | 6 ++-- UI/MainScreen.cpp | 3 +- android/AndroidManifest.xml | 8 +++-- android/build.gradle | 6 ++-- android/jni/app-android.cpp | 34 ++++++++++++++++--- .../src/org/ppsspp/ppsspp/PpssppActivity.java | 1 + 6 files changed, 42 insertions(+), 16 deletions(-) diff --git a/UI/DevScreens.cpp b/UI/DevScreens.cpp index 735ae47928..81f17d589f 100644 --- a/UI/DevScreens.cpp +++ b/UI/DevScreens.cpp @@ -23,6 +23,7 @@ #include "Common/System/NativeApp.h" #include "Common/System/System.h" #include "Common/GPU/OpenGL/GLFeatures.h" +#include "Common/File/AndroidStorage.h" #include "Common/Data/Text/I18n.h" #include "Common/Net/HTTPClient.h" #include "Common/UI/Context.h" @@ -59,12 +60,8 @@ int GetD3DCompilerVersion(); #endif -#if PPSSPP_PLATFORM(ANDROID) - #include "android/jni/app-android.h" -#endif - static const char *logLevelList[] = { "Notice", "Error", @@ -595,6 +592,7 @@ void SystemInfoScreen::CreateViews() { if (System_GetPropertyBool(SYSPROP_ANDROID_SCOPED_STORAGE)) { storage->Add(new InfoItem("Scoped Storage", di->T("Yes"))); } + storage->Add(new InfoItem("IsStoragePreservedLegacy", Android_IsExternalStoragePreservedLegacy() ? di->T("Yes") : di->T("No"))); #endif ViewGroup *buildConfigScroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, FILL_PARENT)); diff --git a/UI/MainScreen.cpp b/UI/MainScreen.cpp index 6f7872289a..bc07677ac5 100644 --- a/UI/MainScreen.cpp +++ b/UI/MainScreen.cpp @@ -978,7 +978,8 @@ void MainScreen::CreateViews() { tabHolder_->SetClip(true); bool showRecent = g_Config.iMaxRecent > 0; - bool hasStorageAccess = System_GetPermissionStatus(SYSTEM_PERMISSION_STORAGE) == PERMISSION_STATUS_GRANTED; + bool hasStorageAccess = !System_GetPropertyBool(SYSPROP_SUPPORTS_PERMISSIONS) || + System_GetPermissionStatus(SYSTEM_PERMISSION_STORAGE) == PERMISSION_STATUS_GRANTED; bool storageIsTemporary = IsTempPath(GetSysDirectory(DIRECTORY_SAVEDATA)) && !confirmedTemporary_; if (showRecent && !hasStorageAccess) { showRecent = !g_Config.recentIsos.empty(); diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 002a779cc4..9c2477efa2 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -19,8 +19,8 @@ - - + + @@ -45,7 +45,9 @@ android:logo="@drawable/ic_banner" android:isGame="true" android:banner="@drawable/tv_banner" - android:requestLegacyExternalStorage="true"> + android:requestLegacyExternalStorage="true" + android:preserveLegacyExternalStorage="true" + > = 14000000) { @@ -61,7 +61,7 @@ android { new File("versioncode.txt").write(androidGitVersion.code().toString()) minSdkVersion 9 - targetSdkVersion 29 + targetSdkVersion 30 if (project.hasProperty("ANDROID_VERSION_CODE") && project.hasProperty("ANDROID_VERSION_NAME")) { versionCode ANDROID_VERSION_CODE versionName ANDROID_VERSION_NAME diff --git a/android/jni/app-android.cpp b/android/jni/app-android.cpp index 0cfe1f4e19..fb2723f9c1 100644 --- a/android/jni/app-android.cpp +++ b/android/jni/app-android.cpp @@ -97,8 +97,18 @@ struct JNIEnv {}; bool useCPUThread = true; -// We'll turn this on when we target Android 12. -bool useScopedStorageIfRequired = false; +// We turn this on now that when we target Android 11+. +// Along with adding: +// android:preserveLegacyExternalStorage="true" +// To the already requested: +// android:requestLegacyExternalStorage="true" +// +// This will cause Android 11+ to still behave like Android 10 until the app +// is manually uninstalled. We can detect this state with +// Android_IsExternalStoragePreservedLegacy(), but most of the app will just see +// that scoped storage enforcement is disabled in this case. + +static const bool useScopedStorageIfRequired = true; enum class EmuThreadState { DISABLED, @@ -433,7 +443,15 @@ float System_GetPropertyFloat(SystemProperty prop) { bool System_GetPropertyBool(SystemProperty prop) { switch (prop) { case SYSPROP_SUPPORTS_PERMISSIONS: - return androidVersion >= 23; // 6.0 Marshmallow introduced run time permissions. + if (androidVersion < 23) { + // 6.0 Marshmallow introduced run time permissions. + return false; + } else { + // It gets a bit complicated here. If scoped storage enforcement is on, + // we also don't need to request permissions. We'll have the access we request + // on a per-folder basis. + return !System_GetPropertyBool(SYSPROP_ANDROID_SCOPED_STORAGE); + } case SYSPROP_SUPPORTS_SUSTAINED_PERF_MODE: return sustainedPerfSupported; // 7.0 introduced sustained performance mode as an optional feature. case SYSPROP_HAS_ADDITIONAL_STORAGE: @@ -458,8 +476,14 @@ bool System_GetPropertyBool(SystemProperty prop) { case SYSPROP_CAN_JIT: return true; case SYSPROP_ANDROID_SCOPED_STORAGE: - if (useScopedStorageIfRequired && androidVersion >= 28) - return true; + if (useScopedStorageIfRequired && androidVersion >= 28) { + // Here we do a check to see if we ended up in the preserveLegacyExternalStorage path. + // That won't last if the user uninstalls/reinstalls though, but would preserve the user + // experience for simple upgrades so maybe let's support it. + return !Android_IsExternalStoragePreservedLegacy(); + } else { + return false; + } default: return false; } diff --git a/android/src/org/ppsspp/ppsspp/PpssppActivity.java b/android/src/org/ppsspp/ppsspp/PpssppActivity.java index 761cc156ab..f7786ef707 100644 --- a/android/src/org/ppsspp/ppsspp/PpssppActivity.java +++ b/android/src/org/ppsspp/ppsspp/PpssppActivity.java @@ -5,6 +5,7 @@ import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.os.Environment; import android.os.Looper; import android.os.ParcelFileDescriptor; import android.util.Log; From 87bcdb7b88d70842bb9edf1b681560de9385877b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 25 Jul 2021 15:33:11 +0200 Subject: [PATCH 086/336] Work on the new experience --- Core/Config.cpp | 11 ++- Core/Config.h | 2 +- UI/GameSettingsScreen.cpp | 2 +- UI/MemStickScreen.cpp | 164 ++++++++++++++++++++++---------------- UI/MemStickScreen.h | 16 +++- UI/NativeApp.cpp | 44 +++++----- 6 files changed, 141 insertions(+), 98 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index d97e2509cd..7c35cd89de 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -1412,12 +1412,14 @@ void Config::Load(const char *iniFileName, const char *controllerIniFilename) { INFO_LOG(LOADER, "Config loaded: '%s'", iniFilename_.c_str()); } -void Config::Save(const char *saveReason) { +bool Config::Save(const char *saveReason) { if (!IsFirstInstance()) { // TODO: Should we allow saving config if started from a different directory? // How do we tell? WARN_LOG(LOADER, "Not saving config - secondary instances don't."); - return; + + // Don't want to retry or something. + return true; } if (jitForcedOff) { @@ -1488,7 +1490,7 @@ void Config::Save(const char *saveReason) { if (!iniFile.Save(iniFilename_)) { ERROR_LOG(LOADER, "Error saving config (%s)- can't write ini '%s'", saveReason, iniFilename_.c_str()); System_SendMessage("toast", "Failed to save settings!\nCheck permissions, or try to restart the device."); - return; + return false; } INFO_LOG(LOADER, "Config saved (%s): '%s'", saveReason, iniFilename_.c_str()); @@ -1501,7 +1503,7 @@ void Config::Save(const char *saveReason) { KeyMap::SaveToIni(controllerIniFile); if (!controllerIniFile.Save(controllerIniFilename_)) { ERROR_LOG(LOADER, "Error saving config - can't write ini '%s'", controllerIniFilename_.c_str()); - return; + return false; } INFO_LOG(LOADER, "Controller config saved: %s", controllerIniFilename_.c_str()); } @@ -1512,6 +1514,7 @@ void Config::Save(const char *saveReason) { // force JIT off again just in case Config::Save() is called without exiting PPSSPP g_Config.iCpuCore = (int)CPUCore::INTERPRETER; } + return true; } // Use for debugging the version check without messing with the server diff --git a/Core/Config.h b/Core/Config.h index a07a6182d8..f5dcd9ad44 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -490,7 +490,7 @@ public: std::string dismissedVersion; void Load(const char *iniFileName = nullptr, const char *controllerIniFilename = nullptr); - void Save(const char *saveReason); + bool Save(const char *saveReason); void Reload(); void RestoreDefaults(); diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 996638b294..71006d005b 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -1097,7 +1097,7 @@ UI::EventReturn GameSettingsScreen::OnJitAffectingSetting(UI::EventParams &e) { } UI::EventReturn GameSettingsScreen::OnChangeMemStickDir(UI::EventParams &e) { - screenManager()->push(new MemStickScreen()); + screenManager()->push(new MemStickScreen(false)); return UI::EVENT_DONE; } diff --git a/UI/MemStickScreen.cpp b/UI/MemStickScreen.cpp index 6759457f39..beee406b99 100644 --- a/UI/MemStickScreen.cpp +++ b/UI/MemStickScreen.cpp @@ -25,23 +25,26 @@ #include "Common/UI/ViewGroup.h" #include "Common/StringUtils.h" -#include "Common/File/FileUtil.h" -#include "Common/File/Path.h" #include "Common/System/System.h" #include "Common/System/NativeApp.h" -#include "Common/Data/Text/I18n.h" #include "Common/System/Display.h" +#include "Common/Data/Text/I18n.h" + +#include "Common/File/AndroidStorage.h" +#include "Common/File/FileUtil.h" +#include "Common/File/Path.h" #include "Core/Util/GameManager.h" #include "Core/System.h" +#include "Core/Config.h" #include "UI/MemStickScreen.h" #include "UI/MainScreen.h" #include "UI/MiscScreens.h" -#include "Core/Config.h" - -MemStickScreen::~MemStickScreen() { } +MemStickScreen::~MemStickScreen() { + pendingMemStickFolder_ = g_Config.memStickDirectory; +} void MemStickScreen::CreateViews() { using namespace UI; @@ -51,45 +54,68 @@ void MemStickScreen::CreateViews() { Margins actionMenuMargins(15, 15, 15, 0); - root_ = new AnchorLayout(); + root_ = new LinearLayout(ORIENT_HORIZONTAL, new AnchorLayoutParams(FILL_PARENT, FILL_PARENT)); - ViewGroup *columns = new LinearLayout(ORIENT_HORIZONTAL, new AnchorLayoutParams(FILL_PARENT, FILL_PARENT)); - root_->Add(columns); - - ViewGroup *leftColumn = new AnchorLayout(new LinearLayoutParams(1.0)); + Spacer *spacerColumn = new Spacer(new LinearLayoutParams(20.0, FILL_PARENT, 0.0f)); + ViewGroup *leftColumn = new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(1.0)); ViewGroup *rightColumnItems = new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(300, FILL_PARENT, actionMenuMargins)); - columns->Add(leftColumn); - columns->Add(rightColumnItems); + root_->Add(spacerColumn); + root_->Add(leftColumn); + root_->Add(rightColumnItems); - Path path = g_Config.memStickDirectory; - int64_t freeSpaceAtMemStick = -1; -#if PPSSPP_PLATFORM(ANDROID) - if (Android_IsContentUri(path.ToString())) { - freeSpaceAtMemStick = Android_GetFreeSpaceByContentUri(path.ToString()); - } else { - freeSpaceAtMemStick = Android_GetFreeSpaceByFilePath(path.ToString()); + if (initialSetup_) { + leftColumn->Add(new TextView(iz->T("Welcome to PPSSPP!"), ALIGN_LEFT, false)); + leftColumn->Add(new Spacer(new LinearLayoutParams(FILL_PARENT, 12.0f, 0.0f))); + } + + leftColumn->Add(new TextView(iz->T("MemoryStickDescription", "Choose PSP data storage (Memory Stick)"), ALIGN_LEFT, false)); + +#if !PPSSPP_PLATFORM(WINDOWS) + if (!pendingMemStickFolder_.empty()) { + int64_t freeSpaceAtMemStick = -1; + if (Android_IsContentUri(pendingMemStickFolder_.ToString())) { + freeSpaceAtMemStick = Android_GetFreeSpaceByContentUri(pendingMemStickFolder_.ToString()); + } else { + freeSpaceAtMemStick = Android_GetFreeSpaceByFilePath(pendingMemStickFolder_.ToString()); + } + + leftColumn->Add(new TextView(pendingMemStickFolder_.ToVisualString(), ALIGN_LEFT, false)); + std::string freeSpaceText = "Free space: N/A"; + if (freeSpaceAtMemStick >= 0) { + freeSpaceText = StringFromFormat("free space: %lld MB", freeSpaceAtMemStick / (1024 * 1024)); + leftColumn->Add(new TextView(freeSpaceText, ALIGN_LEFT, false)); + } + } + + if (!g_Config.memStickDirectory.empty()) { + TextView *view = leftColumn->Add(new TextView(g_Config.memStickDirectory.ToVisualString(), ALIGN_LEFT, false)); + view->SetShadow(true); } #endif - int leftSide = 100; - settingInfo_ = new SettingInfoMessage(ALIGN_CENTER | FLAG_WRAP_TEXT, new AnchorLayoutParams(dp_xres - leftSide - 40.0f, WRAP_CONTENT, leftSide, dp_yres - 80.0f - 40.0f, NONE, NONE)); - settingInfo_->SetBottomCutoff(dp_yres - 200.0f); + leftColumn->Add(new Choice(iz->T("Create or Choose a PSP folder")))->OnClick.Handle(this, &MemStickScreen::OnBrowse); + leftColumn->Add(new TextView(iz->T("ChooseFolderDesc", "* Data will stay even if you uninstall PPSSPP.\n* Data can be shared with PPSSPP Gold\n* Easy USB access"), ALIGN_LEFT, false)); - root_->Add(settingInfo_); + leftColumn->Add(new Choice(iz->T("Use App Private Directory")))->OnClick.Handle(this, &MemStickScreen::OnUseInternalStorage); + leftColumn->Add(new TextView(iz->T("InternalStorageDesc", "* Warning! Data will be deleted if you uninstall PPSSPP!\n* Data cannot be shared with PPSSPP Gold\n* USB access through Android/data/org.ppsspp.ppsspp/files"), ALIGN_LEFT, false)); - leftColumn->Add(new TextView(iz->T("Memory Stick Storage"), ALIGN_LEFT, false, new AnchorLayoutParams(10, 10, NONE, NONE))); - leftColumn->Add(new TextView(iz->T("MemoryStickDescription", "Choose where your PSP memory stick data (savegames, etc) is stored"), ALIGN_LEFT, false, new AnchorLayoutParams(10, 50, NONE, NONE))); - leftColumn->Add(new TextView(g_Config.memStickDirectory.ToVisualString(), ALIGN_LEFT, false, new AnchorLayoutParams(10, 140, NONE, NONE))); + leftColumn->Add(new Spacer(new LinearLayoutParams(FILL_PARENT, 12.0f, 0.0f))); - std::string freeSpaceText = "Free space: N/A"; - if (freeSpaceAtMemStick >= 0) { - freeSpaceText = StringFromFormat("free space: %lld MB", freeSpaceAtMemStick / (1024 * 1024)); + Choice *confirmButton = rightColumnItems->Add(new Choice(iz->T("Confirm"))); + confirmButton->OnClick.Handle(this, &MemStickScreen::OnConfirm); + confirmButton->SetEnabled(!pendingMemStickFolder_.empty()); + + if (!initialSetup_) { + rightColumnItems->Add(new CheckBox(&moveData_, iz->T("Move Data"))); + rightColumnItems->Add(new Choice(di->T("Back")))->OnClick.Handle(this, &UIScreen::OnOK); } - leftColumn->Add(new TextView(freeSpaceText, ALIGN_LEFT, false, new AnchorLayoutParams(10, 240, NONE, NONE))); + INFO_LOG(SYSTEM, "MemStickScreen: initialSetup=%d", (int)initialSetup_); +} - rightColumnItems->Add(new Choice(iz->T("Browse")))->OnClick.Handle(this, &MemStickScreen::OnBrowse); - rightColumnItems->Add(new Choice(di->T("Back")))->OnClick.Handle(this, &UIScreen::OnOK); +UI::EventReturn MemStickScreen::OnUseInternalStorage(UI::EventParams ¶ms) { + pendingMemStickFolder_ = Path(g_extFilesDir); + return UI::EVENT_DONE; } UI::EventReturn MemStickScreen::OnBrowse(UI::EventParams ¶ms) { @@ -108,48 +134,52 @@ void MemStickScreen::sendMessage(const char *message, const char *value) { filename = value; INFO_LOG(SYSTEM, "Got folder: '%s'", filename.c_str()); pendingMemStickFolder_ = Path(filename); - CallbackMemStickFolder(true); + RecreateViews(); } } } -void MemStickScreen::CallbackMemStickFolder(bool yes) { +UI::EventReturn MemStickScreen::OnConfirm(UI::EventParams ¶ms) { auto sy = GetI18NCategory("System"); - if (yes) { - Path memStickDirFile = g_Config.internalDataDirectory / "memstick_dir.txt"; - Path testWriteFile = pendingMemStickFolder_ / ".write_verify_file"; + Path memStickDirFile = g_Config.internalDataDirectory / "memstick_dir.txt"; + Path testWriteFile = pendingMemStickFolder_ / ".write_verify_file"; - // Doesn't already exist, create. - // Should this ever happen? - if (pendingMemStickFolder_.Type() == PathType::NATIVE) { - if (!File::Exists(pendingMemStickFolder_)) { - File::CreateFullPath(pendingMemStickFolder_); - } - if (!File::WriteDataToFile(true, "1", 1, testWriteFile)) { - settingInfo_->Show(sy->T("ChangingMemstickPathInvalid", "That path couldn't be used to save Memory Stick files."), nullptr); - return; - } - File::Delete(testWriteFile); - } else { - // TODO: Do the same but with scoped storage? Not really necessary, right? If it came from a browse - // for folder, we can assume it exists, barring wacky race conditions like the user being connected - // by USB and deleting it. + // Doesn't already exist, create. + // Should this ever happen? + if (pendingMemStickFolder_.Type() == PathType::NATIVE) { + if (!File::Exists(pendingMemStickFolder_)) { + File::CreateFullPath(pendingMemStickFolder_); } - - // This doesn't need the storage API - this path is accessible the normal way. - std::string str = pendingMemStickFolder_.ToString(); - if (!File::WriteDataToFile(true, str.c_str(), (unsigned int)str.size(), memStickDirFile)) { - ERROR_LOG(SYSTEM, "Failed to write memstick path '%s' to '%s'", pendingMemStickFolder_.c_str(), memStickDirFile.c_str()); - // Not sure what to do if this file. + if (!File::WriteDataToFile(true, "1", 1, testWriteFile)) { + // settingInfo_->Show(sy->T("ChangingMemstickPathInvalid", "That path couldn't be used to save Memory Stick files."), nullptr); + return UI::EVENT_DONE; } - - // Save so the settings, at least, are transferred. - g_Config.memStickDirectory = pendingMemStickFolder_; - g_Config.SetSearchPath(GetSysDirectory(DIRECTORY_SYSTEM)); - g_Config.UpdateIniLocation(); - - g_Config.Save("MemstickPathChanged"); - screenManager()->RecreateAllViews(); + File::Delete(testWriteFile); + } else { + // TODO: Do the same but with scoped storage? Not really necessary, right? If it came from a browse + // for folder, we can assume it exists and is writable, barring wacky race conditions like the user + // being connected by USB and deleting it. } + + // This doesn't need the storage API - this path is accessible the normal way. + std::string str = pendingMemStickFolder_.ToString(); + if (!File::WriteDataToFile(true, str.c_str(), (unsigned int)str.size(), memStickDirFile)) { + ERROR_LOG(SYSTEM, "Failed to write memstick path '%s' to '%s'", pendingMemStickFolder_.c_str(), memStickDirFile.c_str()); + // Not sure what to do if this file. + } + + // Save so the settings, at least, are transferred. + g_Config.memStickDirectory = pendingMemStickFolder_; + g_Config.SetSearchPath(GetSysDirectory(DIRECTORY_SYSTEM)); + g_Config.UpdateIniLocation(); + + if (g_Config.Save("MemstickPathChanged")) { + TriggerFinish(DialogResult::DR_OK); + } else { + error_ = sy->T("Failed to save config"); + RecreateViews(); + } + + return UI::EVENT_DONE; } diff --git a/UI/MemStickScreen.h b/UI/MemStickScreen.h index b0c4f55dee..7f7ccaafa2 100644 --- a/UI/MemStickScreen.h +++ b/UI/MemStickScreen.h @@ -30,19 +30,27 @@ // Currently only useful for Android. class MemStickScreen : public UIDialogScreenWithBackground { public: - MemStickScreen() {} + MemStickScreen(bool initialSetup) + : initialSetup_(initialSetup) {} virtual ~MemStickScreen(); std::string tag() const override { return "game"; } + void CreateViews() override; protected: - void CreateViews() override; - void CallbackMemStickFolder(bool yes); void sendMessage(const char *message, const char *value) override; private: // Event handlers UI::EventReturn OnBrowse(UI::EventParams &e); + UI::EventReturn OnConfirm(UI::EventParams ¶ms); + UI::EventReturn OnUseInternalStorage(UI::EventParams ¶ms); + Path pendingMemStickFolder_; - SettingInfoMessage *settingInfo_; + SettingInfoMessage *settingInfo_ = nullptr; + + std::string error_; + + bool initialSetup_; + bool moveData_ = true; }; diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index 5fb7f3a8de..8925f0485c 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -108,6 +108,7 @@ #include "UI/GPUDriverTestScreen.h" #include "UI/HostTypes.h" #include "UI/MiscScreens.h" +#include "UI/MemStickScreen.h" #include "UI/OnScreenDisplay.h" #include "UI/RemoteISOScreen.h" #include "UI/TiltEventProcessor.h" @@ -338,8 +339,6 @@ static void PostLoadConfig() { i18nrepo.LoadIni(g_Config.sLanguageIni); else i18nrepo.LoadIni(g_Config.sLanguageIni, langOverridePath); - - g_threadManager.Init(cpu_info.num_cores, cpu_info.logical_cpu_count); } static bool CreateDirectoriesAndroid() { @@ -436,7 +435,7 @@ static void ClearFailedGPUBackends() { // We've successfully started graphics without crashing, hurray. // In case they update drivers and have totally different problems much later, clear the failed list. g_Config.sFailedGPUBackends.clear(); - if (System_GetPropertyBool(SYSPROP_SUPPORTS_PERMISSIONS)) { + if (System_GetPropertyBool(SYSPROP_SUPPORTS_PERMISSIONS) || System_GetPropertyBool(SYSPROP_ANDROID_SCOPED_STORAGE)) { File::Delete(GetSysDirectory(DIRECTORY_APP_CACHE) / "FailedGraphicsBackends.txt"); } else { g_Config.Save("clearFailedGPUBackends"); @@ -449,6 +448,8 @@ void NativeInit(int argc, const char *argv[], const char *savegame_dir, const ch ShaderTranslationInit(); InitFastMath(cpu_info.bNEON); + g_threadManager.Init(cpu_info.num_cores, cpu_info.logical_cpu_count); + SetupAudioFormats(); g_Discord.SetPresenceMenu(); @@ -504,22 +505,22 @@ void NativeInit(int argc, const char *argv[], const char *savegame_dir, const ch // is no longer the plain root of external storage, but it's an app specific directory // on external storage (g_extFilesDir). if (System_GetPropertyBool(SYSPROP_ANDROID_SCOPED_STORAGE)) { - g_Config.defaultCurrentDirectory = Path(g_extFilesDir); + // There's no sensible default directory. Let the user browse for files. + g_Config.defaultCurrentDirectory.clear(); } else { - // Maybe there should be an option to use internal memory instead, but I think - // that for most people, using external memory (SDCard/USB Storage) makes the - // most sense. + g_Config.memStickDirectory = Path(external_dir); g_Config.defaultCurrentDirectory = Path(external_dir); + CreateDirectoriesAndroid(); } // Might also add an option to move it to internal / non-visible storage, but there's // little point, really. - g_Config.memStickDirectory = Path(external_dir); g_Config.flash0Directory = Path(external_dir) / "flash0"; Path memstickDirFile = g_Config.internalDataDirectory / "memstick_dir.txt"; if (File::Exists(memstickDirFile)) { + INFO_LOG(SYSTEM, "Reading '%s' to find memstick dir.", memstickDirFile.c_str()); std::string memstickDir; if (File::ReadFileToString(true, memstickDirFile, memstickDir)) { Path memstickPath(memstickDir); @@ -529,15 +530,14 @@ void NativeInit(int argc, const char *argv[], const char *savegame_dir, const ch } else { ERROR_LOG(SYSTEM, "Couldn't read directory '%s' specified by memstick_dir.txt.", memstickDir.c_str()); if (System_GetPropertyBool(SYSPROP_ANDROID_SCOPED_STORAGE)) { - // TODO: Gotta resolve this somehow... - // I think we wanna pop up the memstick dir chooser before any other screen in this case. - // For now we just choose a default. - g_Config.memStickDirectory = g_Config.defaultCurrentDirectory; + // Ask the user to configure a memstick directory. + INFO_LOG(SYSTEM, "Asking the user."); + g_Config.memStickDirectory.clear(); } } } } else { - INFO_LOG(SYSTEM, "No memstick directory file found. Using '%s'", memstickDirFile.c_str()); + INFO_LOG(SYSTEM, "No memstick directory file found (tried to open '%s')", memstickDirFile.c_str()); } #elif PPSSPP_PLATFORM(IOS) @@ -572,8 +572,9 @@ void NativeInit(int argc, const char *argv[], const char *savegame_dir, const ch DiskCachingFileLoaderCache::SetCacheDir(g_Config.appCacheDirectory); } - if (!LogManager::GetInstance()) + if (!LogManager::GetInstance()) { LogManager::Init(&g_Config.bEnableLogging); + } #if !PPSSPP_PLATFORM(WINDOWS) g_Config.SetSearchPath(GetSysDirectory(DIRECTORY_SYSTEM)); @@ -585,11 +586,6 @@ void NativeInit(int argc, const char *argv[], const char *savegame_dir, const ch LogManager *logman = LogManager::GetInstance(); -#if PPSSPP_PLATFORM(ANDROID) - // On early versions of Android we don't need to ask permission. - CreateDirectoriesAndroid(); -#endif - const char *fileToLog = 0; Path stateToLoad; @@ -785,8 +781,13 @@ void NativeInit(int argc, const char *argv[], const char *savegame_dir, const ch }); } + INFO_LOG(SYSTEM, "ScreenManager!"); screenManager = new ScreenManager(); - if (gotoGameSettings) { + if (g_Config.memStickDirectory.empty()) { + INFO_LOG(SYSTEM, "No memstick directory! Asking for one to be configured."); + screenManager->switchScreen(new MainScreen()); + screenManager->push(new MemStickScreen(true)); + } else if (gotoGameSettings) { screenManager->switchScreen(new LogoScreen(true)); } else if (gotoTouchScreenTest) { screenManager->switchScreen(new MainScreen()); @@ -832,7 +833,6 @@ static UI::Style MakeStyle(uint32_t fg, uint32_t bg) { UI::Style s; s.background = UI::Drawable(bg); s.fgColor = fg; - return s; } @@ -1477,6 +1477,8 @@ void NativeShutdown() { logger = nullptr; } + g_threadManager.Teardown(); + // Previously we did exit() here on Android but that makes it hard to do things like restart on backend change. // I think we handle most globals correctly or correct-enough now. } From 3be1ff6ce486a079c9d61eeee7325e2a73004ad8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 25 Jul 2021 00:16:30 +0200 Subject: [PATCH 087/336] Get the new setup flow going, with a confirmation dialog etc. Moving the folder while already installed still crashes. --- Common/File/DiskFree.cpp | 4 +- Common/File/DiskFree.h | 3 +- Common/File/Path.cpp | 1 - Common/File/PathBrowser.h | 4 + Common/System/NativeApp.h | 2 + Common/UI/Screen.cpp | 3 + Core/FileLoaders/DiskCachingFileLoader.cpp | 4 +- Core/FileSystems/DirectoryFileSystem.cpp | 4 +- Core/HLE/sceCtrl.cpp | 6 +- UI/MemStickScreen.cpp | 301 +++++++++++++++++---- UI/MemStickScreen.h | 28 +- UI/NativeApp.cpp | 21 +- 12 files changed, 298 insertions(+), 83 deletions(-) diff --git a/Common/File/DiskFree.cpp b/Common/File/DiskFree.cpp index 3a5fb9e722..f1412a35be 100644 --- a/Common/File/DiskFree.cpp +++ b/Common/File/DiskFree.cpp @@ -23,7 +23,7 @@ #include "Common/File/AndroidStorage.h" #include "Common/Data/Encoding/Utf8.h" -bool free_disk_space(const Path &path, uint64_t &space) { +bool free_disk_space(const Path &path, int64_t &space) { #ifdef _WIN32 ULARGE_INTEGER free; if (GetDiskFreeSpaceExW(path.ToWString().c_str(), &free, nullptr, nullptr)) { @@ -43,7 +43,7 @@ bool free_disk_space(const Path &path, uint64_t &space) { if (res == 0) { #ifndef __ANDROID__ if (diskstat.f_flag & ST_RDONLY) { - space = 0; + space = -1; return true; } #endif diff --git a/Common/File/DiskFree.h b/Common/File/DiskFree.h index 5405fc4dc4..a08f44bdd1 100644 --- a/Common/File/DiskFree.h +++ b/Common/File/DiskFree.h @@ -4,4 +4,5 @@ #include "Common/File/Path.h" -bool free_disk_space(const Path &path, uint64_t &space); +// If this fails, false is returned and space is negative. +bool free_disk_space(const Path &path, int64_t &space); diff --git a/Common/File/Path.cpp b/Common/File/Path.cpp index 5f0e905dda..86a43f20bd 100644 --- a/Common/File/Path.cpp +++ b/Common/File/Path.cpp @@ -236,7 +236,6 @@ bool Path::CanNavigateUp() const { if (type_ == PathType::CONTENT_URI) { return AndroidContentURI(path_).CanNavigateUp(); } - if (path_ == "/" || path_ == "") { return false; } diff --git a/Common/File/PathBrowser.h b/Common/File/PathBrowser.h index dd8cdeebb2..9f10cde560 100644 --- a/Common/File/PathBrowser.h +++ b/Common/File/PathBrowser.h @@ -35,6 +35,10 @@ public: } std::string GetFriendlyPath() const; + bool empty() const { + return path_.empty(); + } + private: void HandlePath(); void ResetPending(); diff --git a/Common/System/NativeApp.h b/Common/System/NativeApp.h index d501d03b43..d911fd9076 100644 --- a/Common/System/NativeApp.h +++ b/Common/System/NativeApp.h @@ -89,3 +89,5 @@ void NativeSetMixer(void* mixer); // Main thread. void NativeShutdownGraphics(); void NativeShutdown(); + +void PostLoadConfig(); diff --git a/Common/UI/Screen.cpp b/Common/UI/Screen.cpp index 1945b5be4f..ea5ed185f5 100644 --- a/Common/UI/Screen.cpp +++ b/Common/UI/Screen.cpp @@ -163,6 +163,8 @@ void ScreenManager::render() { iter--; Layer backback = *iter; + _assert_(backback.screen); + // TODO: Make really sure that this "mismatched" pre/post only happens // when screens are "compatible" (both are UIScreens, for example). backback.screen->preRender(); @@ -174,6 +176,7 @@ void ScreenManager::render() { break; } default: + _assert_(stack_.back().screen); stack_.back().screen->preRender(); stack_.back().screen->render(); if (postRenderCb_) diff --git a/Core/FileLoaders/DiskCachingFileLoader.cpp b/Core/FileLoaders/DiskCachingFileLoader.cpp index 06b140e0e5..73ba1ca868 100644 --- a/Core/FileLoaders/DiskCachingFileLoader.cpp +++ b/Core/FileLoaders/DiskCachingFileLoader.cpp @@ -754,9 +754,9 @@ u64 DiskCachingFileLoaderCache::FreeDiskSpace() { dir = GetSysDirectory(DIRECTORY_CACHE); } - uint64_t result = 0; + int64_t result = 0; if (free_disk_space(dir, result)) { - return result; + return (u64)result; } // We can't know for sure how much is free, so we have to assume none. diff --git a/Core/FileSystems/DirectoryFileSystem.cpp b/Core/FileSystems/DirectoryFileSystem.cpp index 4e2ab9b2d8..528654a045 100644 --- a/Core/FileSystems/DirectoryFileSystem.cpp +++ b/Core/FileSystems/DirectoryFileSystem.cpp @@ -925,9 +925,9 @@ std::vector DirectoryFileSystem::GetDirListing(std::string path) { } u64 DirectoryFileSystem::FreeSpace(const std::string &path) { - uint64_t result = 0; + int64_t result = 0; if (free_disk_space(GetLocalPath(path), result)) { - return ReplayApplyDisk64(ReplayAction::FREESPACE, result, CoreTiming::GetGlobalTimeUs()); + return ReplayApplyDisk64(ReplayAction::FREESPACE, (uint64_t)result, CoreTiming::GetGlobalTimeUs()); } #if HOST_IS_CASE_SENSITIVE diff --git a/Core/HLE/sceCtrl.cpp b/Core/HLE/sceCtrl.cpp index fe78433792..78dee49bda 100644 --- a/Core/HLE/sceCtrl.cpp +++ b/Core/HLE/sceCtrl.cpp @@ -501,7 +501,8 @@ static int sceCtrlReadBufferNegative(u32 ctrlDataPtr, u32 nBufs) static int sceCtrlPeekBufferPositive(u32 ctrlDataPtr, u32 nBufs) { int done = __CtrlReadBuffer(ctrlDataPtr, nBufs, false, true); - DEBUG_LOG(SCECTRL, "%d=sceCtrlPeekBufferPositive(%08x, %i)", done, ctrlDataPtr, nBufs); + // Some homebrew call this in a tight loop - so VERBOSE it is. + VERBOSE_LOG(SCECTRL, "%d=sceCtrlPeekBufferPositive(%08x, %i)", done, ctrlDataPtr, nBufs); hleEatCycles(330); return done; } @@ -509,7 +510,8 @@ static int sceCtrlPeekBufferPositive(u32 ctrlDataPtr, u32 nBufs) static int sceCtrlPeekBufferNegative(u32 ctrlDataPtr, u32 nBufs) { int done = __CtrlReadBuffer(ctrlDataPtr, nBufs, true, true); - DEBUG_LOG(SCECTRL, "%d=sceCtrlPeekBufferNegative(%08x, %i)", done, ctrlDataPtr, nBufs); + // Some homebrew call this in a tight loop - so VERBOSE it is. + VERBOSE_LOG(SCECTRL, "%d=sceCtrlPeekBufferNegative(%08x, %i)", done, ctrlDataPtr, nBufs); hleEatCycles(330); return done; } diff --git a/UI/MemStickScreen.cpp b/UI/MemStickScreen.cpp index beee406b99..0e62fd644d 100644 --- a/UI/MemStickScreen.cpp +++ b/UI/MemStickScreen.cpp @@ -33,6 +33,7 @@ #include "Common/File/AndroidStorage.h" #include "Common/File/FileUtil.h" #include "Common/File/Path.h" +#include "Common/File/DiskFree.h" #include "Core/Util/GameManager.h" #include "Core/System.h" @@ -42,7 +43,63 @@ #include "UI/MainScreen.h" #include "UI/MiscScreens.h" -MemStickScreen::~MemStickScreen() { +static bool FolderSeemsToBeUsed(Path newMemstickFolder) { + // Inspect the potential new folder. + if (File::Exists(newMemstickFolder / "PSP") || File::Exists(newMemstickFolder / "SYSTEM")) { + // Does seem likely. We could add more critera like checking for actual savegames or something. + return true; + } else { + return false; + } +} + +static bool SwitchMemstickFolderTo(Path newMemstickFolder) { + Path testWriteFile = newMemstickFolder / ".write_verify_file"; + + // Doesn't already exist, create. + // Should this ever happen? + if (newMemstickFolder.Type() == PathType::NATIVE) { + if (!File::Exists(newMemstickFolder)) { + File::CreateFullPath(newMemstickFolder); + } + if (!File::WriteDataToFile(true, "1", 1, testWriteFile)) { + // settingInfo_->Show(sy->T("ChangingMemstickPathInvalid", "That path couldn't be used to save Memory Stick files."), nullptr); + // TODO: Display an error! + return UI::EVENT_DONE; + } + File::Delete(testWriteFile); + } else { + // TODO: Do the same but with scoped storage? Not really necessary, right? If it came from a browse + // for folder, we can assume it exists and is writable, barring wacky race conditions like the user + // being connected by USB and deleting it. + } + + Path memStickDirFile = g_Config.internalDataDirectory / "memstick_dir.txt"; + std::string str = newMemstickFolder.ToString(); + if (!File::WriteDataToFile(true, str.c_str(), (unsigned int)str.size(), memStickDirFile)) { + ERROR_LOG(SYSTEM, "Failed to write memstick path '%s' to '%s'", newMemstickFolder.c_str(), memStickDirFile.c_str()); + // Not sure what to do if this file. + } + + // Save so the settings, at least, are transferred. + g_Config.memStickDirectory = newMemstickFolder; + g_Config.SetSearchPath(GetSysDirectory(DIRECTORY_SYSTEM)); + g_Config.UpdateIniLocation(); + + return true; +} + +static std::string FormatSpaceString(int64_t space) { + if (space >= 0) { + // TODO: Smarter display (MB, GB as appropriate). Don't we have one of these somewhere? + return StringFromFormat("%lld MB", space / (1024 * 1024)); + } else { + return "N/A"; + } +} + +MemStickScreen::MemStickScreen(bool initialSetup) + : initialSetup_(initialSetup) { pendingMemStickFolder_ = g_Config.memStickDirectory; } @@ -54,7 +111,7 @@ void MemStickScreen::CreateViews() { Margins actionMenuMargins(15, 15, 15, 0); - root_ = new LinearLayout(ORIENT_HORIZONTAL, new AnchorLayoutParams(FILL_PARENT, FILL_PARENT)); + root_ = new LinearLayout(ORIENT_HORIZONTAL); Spacer *spacerColumn = new Spacer(new LinearLayoutParams(20.0, FILL_PARENT, 0.0f)); ViewGroup *leftColumn = new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(1.0)); @@ -70,29 +127,6 @@ void MemStickScreen::CreateViews() { leftColumn->Add(new TextView(iz->T("MemoryStickDescription", "Choose PSP data storage (Memory Stick)"), ALIGN_LEFT, false)); -#if !PPSSPP_PLATFORM(WINDOWS) - if (!pendingMemStickFolder_.empty()) { - int64_t freeSpaceAtMemStick = -1; - if (Android_IsContentUri(pendingMemStickFolder_.ToString())) { - freeSpaceAtMemStick = Android_GetFreeSpaceByContentUri(pendingMemStickFolder_.ToString()); - } else { - freeSpaceAtMemStick = Android_GetFreeSpaceByFilePath(pendingMemStickFolder_.ToString()); - } - - leftColumn->Add(new TextView(pendingMemStickFolder_.ToVisualString(), ALIGN_LEFT, false)); - std::string freeSpaceText = "Free space: N/A"; - if (freeSpaceAtMemStick >= 0) { - freeSpaceText = StringFromFormat("free space: %lld MB", freeSpaceAtMemStick / (1024 * 1024)); - leftColumn->Add(new TextView(freeSpaceText, ALIGN_LEFT, false)); - } - } - - if (!g_Config.memStickDirectory.empty()) { - TextView *view = leftColumn->Add(new TextView(g_Config.memStickDirectory.ToVisualString(), ALIGN_LEFT, false)); - view->SetShadow(true); - } -#endif - leftColumn->Add(new Choice(iz->T("Create or Choose a PSP folder")))->OnClick.Handle(this, &MemStickScreen::OnBrowse); leftColumn->Add(new TextView(iz->T("ChooseFolderDesc", "* Data will stay even if you uninstall PPSSPP.\n* Data can be shared with PPSSPP Gold\n* Easy USB access"), ALIGN_LEFT, false)); @@ -101,13 +135,8 @@ void MemStickScreen::CreateViews() { leftColumn->Add(new Spacer(new LinearLayoutParams(FILL_PARENT, 12.0f, 0.0f))); - Choice *confirmButton = rightColumnItems->Add(new Choice(iz->T("Confirm"))); - confirmButton->OnClick.Handle(this, &MemStickScreen::OnConfirm); - confirmButton->SetEnabled(!pendingMemStickFolder_.empty()); - if (!initialSetup_) { - rightColumnItems->Add(new CheckBox(&moveData_, iz->T("Move Data"))); - rightColumnItems->Add(new Choice(di->T("Back")))->OnClick.Handle(this, &UIScreen::OnOK); + leftColumn->Add(new Choice(di->T("Back")))->OnClick.Handle(this, &UIScreen::OnBack); } INFO_LOG(SYSTEM, "MemStickScreen: initialSetup=%d", (int)initialSetup_); @@ -115,6 +144,16 @@ void MemStickScreen::CreateViews() { UI::EventReturn MemStickScreen::OnUseInternalStorage(UI::EventParams ¶ms) { pendingMemStickFolder_ = Path(g_extFilesDir); + + if (initialSetup_) { + // There's not gonna be any files here in this case since it's a fresh install. + // Let's just accept it and move on. No need to move files either. + SwitchMemstickFolderTo(pendingMemStickFolder_); + TriggerFinish(DialogResult::DR_OK); + } else { + // Always ask for confirmation when called from the UI. Likely there's already some data. + screenManager()->push(new ConfirmMemstickMoveScreen(pendingMemStickFolder_, false)); + } return UI::EVENT_DONE; } @@ -133,51 +172,195 @@ void MemStickScreen::sendMessage(const char *message, const char *value) { std::string filename; filename = value; INFO_LOG(SYSTEM, "Got folder: '%s'", filename.c_str()); + + // Browse finished. Let's pop up the confirmation dialog. pendingMemStickFolder_ = Path(filename); - RecreateViews(); + bool existingFiles = FolderSeemsToBeUsed(pendingMemStickFolder_); + screenManager()->push(new ConfirmMemstickMoveScreen(pendingMemStickFolder_, initialSetup_)); } } } -UI::EventReturn MemStickScreen::OnConfirm(UI::EventParams ¶ms) { - auto sy = GetI18NCategory("System"); +void MemStickScreen::dialogFinished(const Screen *dialog, DialogResult result) { + if (result == DialogResult::DR_OK) { + INFO_LOG(SYSTEM, "Confirmation screen done - moving on."); + // There's a screen manager bug if we call TriggerFinish directly. + // Can't be bothered right now, so we pick this up in update(). + done_ = true; + } + // otherwise, we just keep going. +} - Path memStickDirFile = g_Config.internalDataDirectory / "memstick_dir.txt"; - Path testWriteFile = pendingMemStickFolder_ / ".write_verify_file"; +void MemStickScreen::update() { + UIDialogScreenWithBackground::update(); + if (done_) { + TriggerFinish(DialogResult::DR_OK); + done_ = false; + } +} - // Doesn't already exist, create. - // Should this ever happen? - if (pendingMemStickFolder_.Type() == PathType::NATIVE) { - if (!File::Exists(pendingMemStickFolder_)) { - File::CreateFullPath(pendingMemStickFolder_); +static bool ListFileSuffixesRecursively(const Path &root, Path folder, std::vector &dirSuffixes, std::vector &fileSuffixes) { + std::vector files; + if (!File::GetFilesInDir(folder, &files)) { + return false; + } + + for (auto &file : files) { + if (file.isDirectory) { + dirSuffixes.push_back(root.PathTo(folder)); + ListFileSuffixesRecursively(root, folder / file.name, dirSuffixes, fileSuffixes); + } else { + fileSuffixes.push_back(root.PathTo(file.fullName)); } - if (!File::WriteDataToFile(true, "1", 1, testWriteFile)) { - // settingInfo_->Show(sy->T("ChangingMemstickPathInvalid", "That path couldn't be used to save Memory Stick files."), nullptr); + } + + return true; +} + +ConfirmMemstickMoveScreen::ConfirmMemstickMoveScreen(Path newMemstickFolder, bool initialSetup) + : newMemstickFolder_(newMemstickFolder), initialSetup_(initialSetup) { + existingFilesInNewFolder_ = FolderSeemsToBeUsed(newMemstickFolder); + if (initialSetup_) { + moveData_ = false; + } +} + +void ConfirmMemstickMoveScreen::CreateViews() { + using namespace UI; + auto di = GetI18NCategory("Dialog"); + auto sy = GetI18NCategory("System"); + auto iz = GetI18NCategory("MemStick"); + + root_ = new LinearLayout(ORIENT_HORIZONTAL); + + Path oldMemstickFolder = g_Config.memStickDirectory; + + Spacer *spacerColumn = new Spacer(new LinearLayoutParams(20.0, FILL_PARENT, 0.0f)); + ViewGroup *leftColumn = new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(1.0)); + ViewGroup *rightColumn = new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(1.0)); + root_->Add(spacerColumn); + root_->Add(leftColumn); + root_->Add(rightColumn); + + int64_t freeSpaceNew; + int64_t freeSpaceOld; + free_disk_space(newMemstickFolder_, freeSpaceNew); + free_disk_space(oldMemstickFolder, freeSpaceOld); + + leftColumn->Add(new TextView(iz->T("New PSP Data Folder"), ALIGN_LEFT, false)); + leftColumn->Add(new TextView(newMemstickFolder_.ToVisualString(), ALIGN_LEFT, false)); + std::string newFreeSpaceText = std::string(iz->T("Free space")) + ": " + FormatSpaceString(freeSpaceNew); + leftColumn->Add(new TextView(newFreeSpaceText, ALIGN_LEFT, false)); + if (existingFilesInNewFolder_) { + leftColumn->Add(new TextView(iz->T("Warning: Already contains data"), ALIGN_LEFT, false)); + } + if (!error_.empty()) { + leftColumn->Add(new TextView(error_, ALIGN_LEFT, false)); + } + + if (!oldMemstickFolder.empty()) { + std::string oldFreeSpaceText = std::string(iz->T("Free space")) + ": " + FormatSpaceString(freeSpaceOld); + rightColumn->Add(new TextView(iz->T("Old PSP Data Folder"), ALIGN_LEFT, false)); + rightColumn->Add(new TextView(oldMemstickFolder.ToVisualString(), ALIGN_LEFT, false)); + rightColumn->Add(new TextView(oldFreeSpaceText, ALIGN_LEFT, false)); + } + + if (!initialSetup_) { + leftColumn->Add(new CheckBox(&moveData_, iz->T("Move Data"))); + } + + leftColumn->Add(new Choice(di->T("OK")))->OnClick.Handle(this, &ConfirmMemstickMoveScreen::OnConfirm); + leftColumn->Add(new Choice(di->T("Back")))->OnClick.Handle(this, &UIScreen::OnBack); +} + +UI::EventReturn ConfirmMemstickMoveScreen::OnConfirm(UI::EventParams ¶ms) { + auto sy = GetI18NCategory("System"); + auto iz = GetI18NCategory("MemStick"); + + // Transfer all the files in /PSP from the original directory. + // Should probably be done on a background thread so we can show some UI. + // So we probably need another screen for this with a progress bar.. + // If the directory itself is called PSP, don't go below. + + if (moveData_) { + Path moveSrc = g_Config.memStickDirectory; + Path moveDest = newMemstickFolder_; + if (moveSrc.GetFilename() != "PSP") { + moveSrc = moveSrc / "PSP"; + } + if (moveDest.GetFilename() != "PSP") { + moveDest = moveDest / "PSP"; + File::CreateDir(moveDest); + } + + INFO_LOG(SYSTEM, "About to move PSP data from '%s' to '%s'", moveSrc.c_str(), moveDest.c_str()); + + // Search through recursively, listing the files to move and also summing their sizes. + std::vector fileSuffixesToMove; + std::vector directorySuffixesToCreate; + + // NOTE: It's correct to pass moveSrc twice here, it's to keep the root in the recursion. + if (!ListFileSuffixesRecursively(moveSrc, moveSrc, directorySuffixesToCreate, fileSuffixesToMove)) { + // TODO: Handle failure listing files. + error_ = "Failed to read old directory"; + INFO_LOG(SYSTEM, "%s", error_.c_str()); + return UI::EVENT_DONE; + } + + bool dryRun = true; // Useful for debugging. + + size_t moveFailures = 0; + + if (!moveSrc.empty()) { + // Better not interrupt the app while this is happening! + + // Create all the necessary directories. + for (auto &dirSuffix : directorySuffixesToCreate) { + Path dir = moveDest / dirSuffix; + if (dryRun) { + INFO_LOG(SYSTEM, "dry run: Would have created dir '%s'", dir.c_str()); + } else { + if (!File::Exists(dir)) { + File::CreateDir(dir); + } + } + } + for (auto &fileSuffix : fileSuffixesToMove) { + Path from = moveSrc / fileSuffix; + Path to = moveDest / fileSuffix; + if (dryRun) { + INFO_LOG(SYSTEM, "dry run: Would have moved '%s' to '%s'", from.c_str(), to.c_str()); + } else { + // Remove the "from" prefix from the path. + // We have to drop down to string operations for this. + if (!File::Move(from, to)) { + ERROR_LOG(SYSTEM, "Failed to move file '%s' to '%s'", from.c_str(), to.c_str()); + moveFailures++; + // Should probably just bail? + } + } + } + } + + if (moveFailures > 0) { + error_ = "Failed to move some files!"; + RecreateViews(); return UI::EVENT_DONE; } - File::Delete(testWriteFile); - } else { - // TODO: Do the same but with scoped storage? Not really necessary, right? If it came from a browse - // for folder, we can assume it exists and is writable, barring wacky race conditions like the user - // being connected by USB and deleting it. } - // This doesn't need the storage API - this path is accessible the normal way. - std::string str = pendingMemStickFolder_.ToString(); - if (!File::WriteDataToFile(true, str.c_str(), (unsigned int)str.size(), memStickDirFile)) { - ERROR_LOG(SYSTEM, "Failed to write memstick path '%s' to '%s'", pendingMemStickFolder_.c_str(), memStickDirFile.c_str()); - // Not sure what to do if this file. - } + // Successful so far, switch the memstick folder. + SwitchMemstickFolderTo(newMemstickFolder_); + + // If the chosen folder already had a config, reload it! + g_Config.Load(); + - // Save so the settings, at least, are transferred. - g_Config.memStickDirectory = pendingMemStickFolder_; - g_Config.SetSearchPath(GetSysDirectory(DIRECTORY_SYSTEM)); - g_Config.UpdateIniLocation(); if (g_Config.Save("MemstickPathChanged")) { TriggerFinish(DialogResult::DR_OK); } else { - error_ = sy->T("Failed to save config"); + error_ = iz->T("Failed to save config"); RecreateViews(); } diff --git a/UI/MemStickScreen.h b/UI/MemStickScreen.h index 7f7ccaafa2..1a5d12b63d 100644 --- a/UI/MemStickScreen.h +++ b/UI/MemStickScreen.h @@ -30,27 +30,43 @@ // Currently only useful for Android. class MemStickScreen : public UIDialogScreenWithBackground { public: - MemStickScreen(bool initialSetup) - : initialSetup_(initialSetup) {} - virtual ~MemStickScreen(); + MemStickScreen(bool initialSetup); + ~MemStickScreen() {} std::string tag() const override { return "game"; } void CreateViews() override; protected: void sendMessage(const char *message, const char *value) override; + void dialogFinished(const Screen *dialog, DialogResult result) override; + void update() override; private: // Event handlers UI::EventReturn OnBrowse(UI::EventParams &e); - UI::EventReturn OnConfirm(UI::EventParams ¶ms); UI::EventReturn OnUseInternalStorage(UI::EventParams ¶ms); + // TODO: probably not necessary to store here, we just forward to the confirmation dialog. Path pendingMemStickFolder_; SettingInfoMessage *settingInfo_ = nullptr; - std::string error_; - bool initialSetup_; + bool done_ = false; +}; + +class ConfirmMemstickMoveScreen : public UIDialogScreenWithBackground { +public: + ConfirmMemstickMoveScreen(Path newMemstickFolder, bool initialSetup); + + void CreateViews() override; + +private: + UI::EventReturn OnConfirm(UI::EventParams ¶ms); + + Path newMemstickFolder_; + bool existingFilesInNewFolder_; bool moveData_ = true; + bool initialSetup_; + + std::string error_; }; diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index 8925f0485c..6a0d731c0b 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -322,7 +322,9 @@ static bool CheckFontIsUsable(const wchar_t *fontFace) { } #endif -static void PostLoadConfig() { +bool CreateDirectoriesAndroid(); + +void PostLoadConfig() { // On Windows, we deal with currentDirectory in InitSysDirectories(). #if !PPSSPP_PLATFORM(WINDOWS) if (g_Config.currentDirectory.empty()) { @@ -339,11 +341,14 @@ static void PostLoadConfig() { i18nrepo.LoadIni(g_Config.sLanguageIni); else i18nrepo.LoadIni(g_Config.sLanguageIni, langOverridePath); + +#if PPSSPP_PLATFORM(ANDROID) + CreateDirectoriesAndroid(); +#endif } -static bool CreateDirectoriesAndroid() { - // On Android, create a PSP directory tree in the external_dir, - // to hopefully reduce confusion a bit. +bool CreateDirectoriesAndroid() { + // TODO: Really not sure why this code is Android-exclusive, except the ".nomedia" part. Path pspDir = g_Config.memStickDirectory; if (pspDir.GetFilename() != "PSP") { @@ -530,9 +535,9 @@ void NativeInit(int argc, const char *argv[], const char *savegame_dir, const ch } else { ERROR_LOG(SYSTEM, "Couldn't read directory '%s' specified by memstick_dir.txt.", memstickDir.c_str()); if (System_GetPropertyBool(SYSPROP_ANDROID_SCOPED_STORAGE)) { - // Ask the user to configure a memstick directory. - INFO_LOG(SYSTEM, "Asking the user."); - g_Config.memStickDirectory.clear(); + // Ask the user to configure a memstick directory. + INFO_LOG(SYSTEM, "Asking the user."); + g_Config.memStickDirectory.clear(); } } } @@ -785,7 +790,7 @@ void NativeInit(int argc, const char *argv[], const char *savegame_dir, const ch screenManager = new ScreenManager(); if (g_Config.memStickDirectory.empty()) { INFO_LOG(SYSTEM, "No memstick directory! Asking for one to be configured."); - screenManager->switchScreen(new MainScreen()); + screenManager->switchScreen(new LogoScreen(false)); screenManager->push(new MemStickScreen(true)); } else if (gotoGameSettings) { screenManager->switchScreen(new LogoScreen(true)); From f51b8116a08e8346a5aa1b3e80a76afd99459912 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 25 Jul 2021 00:54:41 +0200 Subject: [PATCH 088/336] Basic flow of setting up and moving the PSP directory works now. --- Common/File/FileUtil.cpp | 5 ++++- Common/File/Path.cpp | 23 ++++++++++++++--------- Common/File/Path.h | 2 +- UI/GameSettingsScreen.cpp | 6 ++++++ UI/GameSettingsScreen.h | 1 + UI/MemStickScreen.cpp | 20 ++++++++++++++++---- UI/MemStickScreen.h | 9 +++++++++ android/jni/AndroidContentURI.h | 12 ++++++++++-- unittest/UnitTest.cpp | 13 ++++++++++--- 9 files changed, 71 insertions(+), 20 deletions(-) diff --git a/Common/File/FileUtil.cpp b/Common/File/FileUtil.cpp index 134d84f74b..dc8551767f 100644 --- a/Common/File/FileUtil.cpp +++ b/Common/File/FileUtil.cpp @@ -510,7 +510,10 @@ bool CreateFullPath(const Path &path) { Path root = path.GetRootVolume(); - std::string diff = root.PathTo(path); // always with forward slashes + std::string diff; + if (!root.ComputePathTo(path, diff)) { + return false; + } std::vector parts; SplitString(diff, '/', parts); diff --git a/Common/File/Path.cpp b/Common/File/Path.cpp index 86a43f20bd..2af4374937 100644 --- a/Common/File/Path.cpp +++ b/Common/File/Path.cpp @@ -299,27 +299,32 @@ bool Path::IsAbsolute() const { return false; } -std::string Path::PathTo(const Path &other) const { +bool Path::ComputePathTo(const Path &other, std::string &path) const { if (!other.StartsWith(*this)) { // Can't do this. Should return an error. - return std::string(); + return false; + } + + if (*this == other) { + // Equal, the path is empty. + path.clear(); + return true; } std::string diff; - if (type_ == PathType::CONTENT_URI) { AndroidContentURI a(path_); AndroidContentURI b(other.path_); if (a.RootPath() != b.RootPath()) { // No common root, can't do anything - return std::string(); + return false; } - diff = a.PathTo(b); + return a.ComputePathTo(b, path); } else if (path_ == "/") { - diff = other.path_.substr(1); + path = other.path_.substr(1); + return true; } else { - diff = other.path_.substr(path_.size() + 1); + path = other.path_.substr(path_.size() + 1); + return true; } - - return diff; } diff --git a/Common/File/Path.h b/Common/File/Path.h index afec18ac7e..4a0658e5f7 100644 --- a/Common/File/Path.h +++ b/Common/File/Path.h @@ -82,7 +82,7 @@ public: // For Android directory trees, navigates to the root of the tree. Path GetRootVolume() const; - std::string PathTo(const Path &child) const; + bool ComputePathTo(const Path &other, std::string &path) const; bool operator ==(const Path &other) const { return path_ == other.path_ && type_ == other.type_; diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 71006d005b..18c8398060 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -1257,6 +1257,12 @@ void GameSettingsScreen::sendMessage(const char *message, const char *value) { } } +void GameSettingsScreen::dialogFinished(const Screen *dialog, DialogResult result) { + if (result == DialogResult::DR_OK) { + RecreateViews(); + } +} + void GameSettingsScreen::CallbackMemstickFolder(bool yes) { auto sy = GetI18NCategory("System"); diff --git a/UI/GameSettingsScreen.h b/UI/GameSettingsScreen.h index ebc5d59f88..09127656ec 100644 --- a/UI/GameSettingsScreen.h +++ b/UI/GameSettingsScreen.h @@ -43,6 +43,7 @@ protected: void CallbackInflightFrames(bool yes); void CallbackMemstickFolder(bool yes); bool UseVerticalLayout() const; + void dialogFinished(const Screen *dialog, DialogResult result) override; private: void TriggerRestart(const char *why); diff --git a/UI/MemStickScreen.cpp b/UI/MemStickScreen.cpp index 0e62fd644d..2696ed4004 100644 --- a/UI/MemStickScreen.cpp +++ b/UI/MemStickScreen.cpp @@ -207,10 +207,18 @@ static bool ListFileSuffixesRecursively(const Path &root, Path folder, std::vect for (auto &file : files) { if (file.isDirectory) { - dirSuffixes.push_back(root.PathTo(folder)); - ListFileSuffixesRecursively(root, folder / file.name, dirSuffixes, fileSuffixes); + std::string dirSuffix; + if (root.ComputePathTo(file.fullName, dirSuffix)) { + dirSuffixes.push_back(dirSuffix); + ListFileSuffixesRecursively(root, folder / file.name, dirSuffixes, fileSuffixes); + } else { + ERROR_LOG(SYSTEM, "Failed to compute PathTo from '%s' to '%s'", root.c_str(), folder.c_str()); + } } else { - fileSuffixes.push_back(root.PathTo(file.fullName)); + std::string fileSuffix; + if (root.ComputePathTo(file.fullName, fileSuffix)) { + fileSuffixes.push_back(fileSuffix); + } } } @@ -307,7 +315,7 @@ UI::EventReturn ConfirmMemstickMoveScreen::OnConfirm(UI::EventParams ¶ms) { return UI::EVENT_DONE; } - bool dryRun = true; // Useful for debugging. + bool dryRun = false; // Useful for debugging. size_t moveFailures = 0; @@ -320,11 +328,13 @@ UI::EventReturn ConfirmMemstickMoveScreen::OnConfirm(UI::EventParams ¶ms) { if (dryRun) { INFO_LOG(SYSTEM, "dry run: Would have created dir '%s'", dir.c_str()); } else { + INFO_LOG(SYSTEM, "Creating dir '%s'", dir.c_str()); if (!File::Exists(dir)) { File::CreateDir(dir); } } } + for (auto &fileSuffix : fileSuffixesToMove) { Path from = moveSrc / fileSuffix; Path to = moveDest / fileSuffix; @@ -337,6 +347,8 @@ UI::EventReturn ConfirmMemstickMoveScreen::OnConfirm(UI::EventParams ¶ms) { ERROR_LOG(SYSTEM, "Failed to move file '%s' to '%s'", from.c_str(), to.c_str()); moveFailures++; // Should probably just bail? + } else { + INFO_LOG(SYSTEM, "Moved file '%s' to '%s'", from.c_str(), to.c_str()); } } } diff --git a/UI/MemStickScreen.h b/UI/MemStickScreen.h index 1a5d12b63d..84d6d4d84c 100644 --- a/UI/MemStickScreen.h +++ b/UI/MemStickScreen.h @@ -40,6 +40,15 @@ protected: void sendMessage(const char *message, const char *value) override; void dialogFinished(const Screen *dialog, DialogResult result) override; void update() override; + void render() override { + // Simple anti-flicker due to delayed finish. + if (!done_) { + // render as usual. + UIDialogScreenWithBackground::render(); + } else { + // no render. black frame insertion is better than flicker. + } + } private: // Event handlers diff --git a/android/jni/AndroidContentURI.h b/android/jni/AndroidContentURI.h index f9837a5ba4..92e77afb62 100644 --- a/android/jni/AndroidContentURI.h +++ b/android/jni/AndroidContentURI.h @@ -112,8 +112,16 @@ public: } // Only goes downwards in hierarchies. No ".." will ever be generated. - std::string PathTo(const AndroidContentURI &other) const { - return other.FilePath().substr(FilePath().size() + 1); + bool ComputePathTo(const AndroidContentURI &other, std::string &path) const { + size_t offset = FilePath().size() + 1; + std::string otherFilePath = other.FilePath(); + if (offset >= otherFilePath.size()) { + ERROR_LOG(SYSTEM, "Bad call to PathTo. '%s' -> '%s'", FilePath().c_str(), other.FilePath().c_str()); + return false; + } + + path = other.FilePath().substr(FilePath().size() + 1); + return true; } std::string GetFileExtension() const { diff --git a/unittest/UnitTest.cpp b/unittest/UnitTest.cpp index 7c399f0f9c..f2ef8cdb88 100644 --- a/unittest/UnitTest.cpp +++ b/unittest/UnitTest.cpp @@ -607,8 +607,14 @@ static bool TestPath() { EXPECT_EQ_STR(Path("C:\\Yo\\Lo").GetDirectory(), std::string("C:/Yo")); EXPECT_EQ_STR(Path("C:\\Yo\\Lo").GetFilename(), std::string("Lo")); - EXPECT_EQ_STR(Path("/a/b").PathTo(Path("/a/b/c/d/e")), std::string("c/d/e")); - EXPECT_EQ_STR(Path("/").PathTo(Path("/home/foo/bar")), std::string("home/foo/bar")); + std::string computedPath; + + EXPECT_TRUE(Path("/a/b").ComputePathTo(Path("/a/b/c/d/e"), computedPath)); + + EXPECT_EQ_STR(computedPath, std::string("c/d/e")); + + EXPECT_TRUE(Path("/").ComputePathTo(Path("/home/foo/bar"), computedPath)); + EXPECT_EQ_STR(computedPath, std::string("home/foo/bar")); return true; } @@ -639,7 +645,8 @@ static bool TestAndroidContentURI() { EXPECT_EQ_STR(fileURI.ToString(), std::string(directoryURIString)); - std::string diff = dirURI.PathTo(fileURI); + std::string diff; + EXPECT_TRUE(dirURI.ComputePathTo(fileURI, diff)); EXPECT_EQ_STR(diff, std::string("Tekken 6.iso")); return true; From 2d88ae511298c60f99579f76f6557ef35ea47d66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 26 Jul 2021 01:15:32 +0200 Subject: [PATCH 089/336] Delete some left-behind lines --- Core/HLE/sceIo.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index c856794110..0c4dcf20e1 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -558,13 +558,6 @@ static void __IoAsyncEndCallback(SceUID threadID, SceUID prevCallbackId) { } } -static DirectoryFileSystem *exdataSystem = nullptr; -#if defined(USING_WIN_UI) || defined(APPLE) -static DirectoryFileSystem *flash0System = nullptr; -#else -static VFSFileSystem *flash0System = nullptr; -#endif - static void __IoManagerThread() { SetCurrentThreadName("IO"); while (ioManagerThreadEnabled && coreState != CORE_BOOT_ERROR && coreState != CORE_RUNTIME_ERROR && coreState != CORE_POWERDOWN) { From 59088e0921e8dc0417ff62f813e5519417378f18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 26 Jul 2021 21:49:37 +0200 Subject: [PATCH 090/336] Android 28 was the wrong cutoff for oldschool permissions, 29 is correct. --- android/AndroidManifest.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 9c2477efa2..7ccdce7798 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -19,8 +19,8 @@ - - + + From 64dbd97731bfd1cf6ff51e924d7e3cf3018f59ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 26 Jul 2021 22:11:07 +0200 Subject: [PATCH 091/336] Address feedback --- Common/Data/Text/Parsers.cpp | 17 +++++++++++++++++ Common/Data/Text/Parsers.h | 2 ++ Common/File/DiskFree.cpp | 4 +++- Core/Dialog/SavedataParam.cpp | 5 ++--- UI/MemStickScreen.cpp | 6 ++++-- UI/MemStickScreen.h | 4 +++- UI/NativeApp.cpp | 2 +- Windows/W32Util/Misc.cpp | 18 ------------------ Windows/W32Util/Misc.h | 2 -- 9 files changed, 32 insertions(+), 28 deletions(-) diff --git a/Common/Data/Text/Parsers.cpp b/Common/Data/Text/Parsers.cpp index 427fb74316..b6ce78d958 100644 --- a/Common/Data/Text/Parsers.cpp +++ b/Common/Data/Text/Parsers.cpp @@ -6,6 +6,23 @@ #include "Common/StringUtils.h" +// Not strictly a parser... +void NiceSizeFormat(size_t size, char *out, size_t bufSize) { + const char *sizes[] = { "B","KB","MB","GB","TB","PB","EB" }; + int s = 0; + int frac = 0; + while (size >= 1024) { + s++; + frac = (int)size & 1023; + size /= 1024; + } + float f = (float)size + ((float)frac / 1024.0f); + if (s == 0) + snprintf(out, bufSize, "%d B", (int)size); + else + snprintf(out, bufSize, "%3.1f %s", f, sizes[s]); +} + bool Version::ParseVersionString(std::string str) { if (str.empty()) return false; diff --git a/Common/Data/Text/Parsers.h b/Common/Data/Text/Parsers.h index bfa111774c..35b3839cfb 100644 --- a/Common/Data/Text/Parsers.h +++ b/Common/Data/Text/Parsers.h @@ -70,3 +70,5 @@ static bool TryParse(const std::string &str, N *const output) { } else return false; } + +void NiceSizeFormat(size_t size, char *out, size_t bufSize); diff --git a/Common/File/DiskFree.cpp b/Common/File/DiskFree.cpp index f1412a35be..ea8e0f0d39 100644 --- a/Common/File/DiskFree.cpp +++ b/Common/File/DiskFree.cpp @@ -41,9 +41,11 @@ bool free_disk_space(const Path &path, int64_t &space) { int res = statvfs(path.c_str(), &diskstat); if (res == 0) { + // Not sure why we're excluding Android here anyway... #ifndef __ANDROID__ if (diskstat.f_flag & ST_RDONLY) { - space = -1; + // No space to write. + space = 0; return true; } #endif diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index 1e26486e2c..0558dacc60 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -1045,11 +1045,11 @@ int SavedataParam::BuildHash(unsigned char *output, return 0; } +// TODO: Merge with NiceSizeFormat? That one has a decimal though. std::string SavedataParam::GetSpaceText(u64 size, bool roundUp) { - static const char *suffixes[] = {"B", "KB", "MB", "GB"}; char text[50]; - + static const char *suffixes[] = {"B", "KB", "MB", "GB"}; for (size_t i = 0; i < ARRAY_SIZE(suffixes); ++i) { if (size < 1024) @@ -1063,7 +1063,6 @@ std::string SavedataParam::GetSpaceText(u64 size, bool roundUp) size /= 1024; } } - snprintf(text, sizeof(text), "%llu TB", size); return std::string(text); } diff --git a/UI/MemStickScreen.cpp b/UI/MemStickScreen.cpp index 2696ed4004..65a8a85b76 100644 --- a/UI/MemStickScreen.cpp +++ b/UI/MemStickScreen.cpp @@ -29,6 +29,7 @@ #include "Common/System/NativeApp.h" #include "Common/System/Display.h" #include "Common/Data/Text/I18n.h" +#include "Common/Data/Text/Parsers.h" #include "Common/File/AndroidStorage.h" #include "Common/File/FileUtil.h" @@ -91,8 +92,9 @@ static bool SwitchMemstickFolderTo(Path newMemstickFolder) { static std::string FormatSpaceString(int64_t space) { if (space >= 0) { - // TODO: Smarter display (MB, GB as appropriate). Don't we have one of these somewhere? - return StringFromFormat("%lld MB", space / (1024 * 1024)); + char buffer[50]; + NiceSizeFormat(space, buffer, sizeof(buffer)); + return buffer; } else { return "N/A"; } diff --git a/UI/MemStickScreen.h b/UI/MemStickScreen.h index 84d6d4d84c..6fb9df31d3 100644 --- a/UI/MemStickScreen.h +++ b/UI/MemStickScreen.h @@ -34,9 +34,10 @@ public: ~MemStickScreen() {} std::string tag() const override { return "game"; } - void CreateViews() override; protected: + void CreateViews() override; + void sendMessage(const char *message, const char *value) override; void dialogFinished(const Screen *dialog, DialogResult result) override; void update() override; @@ -67,6 +68,7 @@ class ConfirmMemstickMoveScreen : public UIDialogScreenWithBackground { public: ConfirmMemstickMoveScreen(Path newMemstickFolder, bool initialSetup); +protected: void CreateViews() override; private: diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index 6a0d731c0b..fd11d1ca5f 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -348,7 +348,7 @@ void PostLoadConfig() { } bool CreateDirectoriesAndroid() { - // TODO: Really not sure why this code is Android-exclusive, except the ".nomedia" part. + // TODO: We should probably simply use this as the shared function to create memstick directories. Path pspDir = g_Config.memStickDirectory; if (pspDir.GetFilename() != "PSP") { diff --git a/Windows/W32Util/Misc.cpp b/Windows/W32Util/Misc.cpp index d646302986..4f0ffb982f 100644 --- a/Windows/W32Util/Misc.cpp +++ b/Windows/W32Util/Misc.cpp @@ -53,24 +53,6 @@ namespace W32Util MoveWindow(hwnd, x, y, width, height, FALSE); } - void NiceSizeFormat(size_t size, char *out) - { - const char *sizes[] = {"B","KB","MB","GB","TB","PB","EB"}; - int s = 0; - int frac = 0; - while (size>=1024) - { - s++; - frac = (int)size & 1023; - size /= 1024; - } - float f = (float)size + ((float)frac / 1024.0f); - if (s==0) - sprintf(out, "%d B", (int)size); - else - sprintf(out, "%3.1f %s", f, sizes[s]); - } - BOOL CopyTextToClipboard(HWND hwnd, const char *text) { std::wstring wtext = ConvertUTF8ToWString(text); return CopyTextToClipboard(hwnd, wtext); diff --git a/Windows/W32Util/Misc.h b/Windows/W32Util/Misc.h index fa447de78d..0cddf63df9 100644 --- a/Windows/W32Util/Misc.h +++ b/Windows/W32Util/Misc.h @@ -6,8 +6,6 @@ namespace W32Util { void CenterWindow(HWND hwnd); - HBITMAP CreateBitmapFromARGB(HWND someHwnd, DWORD *image, int w, int h); - void NiceSizeFormat(size_t size, char *out); BOOL CopyTextToClipboard(HWND hwnd, const char *text); BOOL CopyTextToClipboard(HWND hwnd, const std::wstring &wtext); void MakeTopMost(HWND hwnd, bool topMost); From 1b7c2a36d8408081c4f657e3911420893fd1ac3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 26 Jul 2021 22:15:34 +0200 Subject: [PATCH 092/336] UI message cleanup --- UI/MemStickScreen.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/UI/MemStickScreen.cpp b/UI/MemStickScreen.cpp index 65a8a85b76..1a7dc7ffaa 100644 --- a/UI/MemStickScreen.cpp +++ b/UI/MemStickScreen.cpp @@ -64,9 +64,7 @@ static bool SwitchMemstickFolderTo(Path newMemstickFolder) { File::CreateFullPath(newMemstickFolder); } if (!File::WriteDataToFile(true, "1", 1, testWriteFile)) { - // settingInfo_->Show(sy->T("ChangingMemstickPathInvalid", "That path couldn't be used to save Memory Stick files."), nullptr); - // TODO: Display an error! - return UI::EVENT_DONE; + return false; } File::Delete(testWriteFile); } else { @@ -150,8 +148,11 @@ UI::EventReturn MemStickScreen::OnUseInternalStorage(UI::EventParams ¶ms) { if (initialSetup_) { // There's not gonna be any files here in this case since it's a fresh install. // Let's just accept it and move on. No need to move files either. - SwitchMemstickFolderTo(pendingMemStickFolder_); - TriggerFinish(DialogResult::DR_OK); + if (SwitchMemstickFolderTo(pendingMemStickFolder_)) { + TriggerFinish(DialogResult::DR_OK); + } else { + // This can't really happen?? Not worth making an error message. + } } else { // Always ask for confirmation when called from the UI. Likely there's already some data. screenManager()->push(new ConfirmMemstickMoveScreen(pendingMemStickFolder_, false)); @@ -364,13 +365,15 @@ UI::EventReturn ConfirmMemstickMoveScreen::OnConfirm(UI::EventParams ¶ms) { } // Successful so far, switch the memstick folder. - SwitchMemstickFolderTo(newMemstickFolder_); + if (!SwitchMemstickFolderTo(newMemstickFolder_)) { + // TODO: More precise errors. + error_ = iz->T("That folder doesn't work as a memstick folder."); + return UI::EVENT_DONE; + } // If the chosen folder already had a config, reload it! g_Config.Load(); - - if (g_Config.Save("MemstickPathChanged")) { TriggerFinish(DialogResult::DR_OK); } else { From 80fc09a222e71f27953594882656c3286fefdd6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 26 Jul 2021 22:22:58 +0200 Subject: [PATCH 093/336] Indentation fix --- android/AndroidManifest.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 7ccdce7798..833ed5827b 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -46,8 +46,7 @@ android:isGame="true" android:banner="@drawable/tv_banner" android:requestLegacyExternalStorage="true" - android:preserveLegacyExternalStorage="true" - > + android:preserveLegacyExternalStorage="true"> Date: Thu, 29 Jul 2021 23:03:43 +0200 Subject: [PATCH 094/336] When changing the PSP folder, move the files in a nice background process, showing progress. Not everything is properly refreshed after the move though - for example the main screen needs a refresh. --- UI/MemStickScreen.cpp | 210 ++++++++++++++++++++++++++++-------------- UI/MemStickScreen.h | 32 ++++++- 2 files changed, 173 insertions(+), 69 deletions(-) diff --git a/UI/MemStickScreen.cpp b/UI/MemStickScreen.cpp index 1a7dc7ffaa..5b51cbba9a 100644 --- a/UI/MemStickScreen.cpp +++ b/UI/MemStickScreen.cpp @@ -36,6 +36,8 @@ #include "Common/File/Path.h" #include "Common/File/DiskFree.h" +#include "Common/Thread/ThreadManager.h" + #include "Core/Util/GameManager.h" #include "Core/System.h" #include "Core/Config.h" @@ -236,6 +238,14 @@ ConfirmMemstickMoveScreen::ConfirmMemstickMoveScreen(Path newMemstickFolder, boo } } +ConfirmMemstickMoveScreen::~ConfirmMemstickMoveScreen() { + if (moveDataTask_) { + INFO_LOG(SYSTEM, "Move Data task still running, blocking on it"); + moveDataTask_->BlockUntilReady(); + delete moveDataTask_; + } +} + void ConfirmMemstickMoveScreen::CreateViews() { using namespace UI; auto di = GetI18NCategory("Dialog"); @@ -276,14 +286,50 @@ void ConfirmMemstickMoveScreen::CreateViews() { rightColumn->Add(new TextView(oldFreeSpaceText, ALIGN_LEFT, false)); } - if (!initialSetup_) { - leftColumn->Add(new CheckBox(&moveData_, iz->T("Move Data"))); + if (moveDataTask_) { + progressView_ = leftColumn->Add(new TextView(progressReporter_.Get())); + } else { + progressView_ = nullptr; } - leftColumn->Add(new Choice(di->T("OK")))->OnClick.Handle(this, &ConfirmMemstickMoveScreen::OnConfirm); - leftColumn->Add(new Choice(di->T("Back")))->OnClick.Handle(this, &UIScreen::OnBack); + if (!moveDataTask_) { + if (!initialSetup_) { + leftColumn->Add(new CheckBox(&moveData_, iz->T("Move Data"))); + } + + leftColumn->Add(new Choice(di->T("OK")))->OnClick.Handle(this, &ConfirmMemstickMoveScreen::OnConfirm); + leftColumn->Add(new Choice(di->T("Back")))->OnClick.Handle(this, &UIScreen::OnBack); + } } +void ConfirmMemstickMoveScreen::update() { + UIDialogScreenWithBackground::update(); + + if (moveDataTask_) { + if (progressView_) { + progressView_->SetText(progressReporter_.Get()); + } + + bool *result = moveDataTask_->Poll(); + + if (result) { + if (*result) { + progressReporter_.Set("Done!"); + INFO_LOG(SYSTEM, "Move data task finished successfully!"); + // Succeeded! + FinishFolderMove(); + } else { + INFO_LOG(SYSTEM, "Move data task failed!"); + // What do we do here? We might be in the middle of a move... Bad. + RecreateViews(); + } + delete moveDataTask_; + moveDataTask_ = nullptr; + } + } +} + + UI::EventReturn ConfirmMemstickMoveScreen::OnConfirm(UI::EventParams ¶ms) { auto sy = GetI18NCategory("System"); auto iz = GetI18NCategory("MemStick"); @@ -294,81 +340,113 @@ UI::EventReturn ConfirmMemstickMoveScreen::OnConfirm(UI::EventParams ¶ms) { // If the directory itself is called PSP, don't go below. if (moveData_) { - Path moveSrc = g_Config.memStickDirectory; - Path moveDest = newMemstickFolder_; - if (moveSrc.GetFilename() != "PSP") { - moveSrc = moveSrc / "PSP"; - } - if (moveDest.GetFilename() != "PSP") { - moveDest = moveDest / "PSP"; - File::CreateDir(moveDest); - } + progressReporter_.Set("Starting move..."); - INFO_LOG(SYSTEM, "About to move PSP data from '%s' to '%s'", moveSrc.c_str(), moveDest.c_str()); - - // Search through recursively, listing the files to move and also summing their sizes. - std::vector fileSuffixesToMove; - std::vector directorySuffixesToCreate; - - // NOTE: It's correct to pass moveSrc twice here, it's to keep the root in the recursion. - if (!ListFileSuffixesRecursively(moveSrc, moveSrc, directorySuffixesToCreate, fileSuffixesToMove)) { - // TODO: Handle failure listing files. - error_ = "Failed to read old directory"; - INFO_LOG(SYSTEM, "%s", error_.c_str()); - return UI::EVENT_DONE; - } - - bool dryRun = false; // Useful for debugging. - - size_t moveFailures = 0; - - if (!moveSrc.empty()) { - // Better not interrupt the app while this is happening! - - // Create all the necessary directories. - for (auto &dirSuffix : directorySuffixesToCreate) { - Path dir = moveDest / dirSuffix; - if (dryRun) { - INFO_LOG(SYSTEM, "dry run: Would have created dir '%s'", dir.c_str()); - } else { - INFO_LOG(SYSTEM, "Creating dir '%s'", dir.c_str()); - if (!File::Exists(dir)) { - File::CreateDir(dir); - } - } + moveDataTask_ = Promise::Spawn(&g_threadManager, [&]() -> bool * { + Path moveSrc = g_Config.memStickDirectory; + Path moveDest = newMemstickFolder_; + if (moveSrc.GetFilename() != "PSP") { + moveSrc = moveSrc / "PSP"; + } + if (moveDest.GetFilename() != "PSP") { + moveDest = moveDest / "PSP"; + File::CreateDir(moveDest); } - for (auto &fileSuffix : fileSuffixesToMove) { - Path from = moveSrc / fileSuffix; - Path to = moveDest / fileSuffix; - if (dryRun) { - INFO_LOG(SYSTEM, "dry run: Would have moved '%s' to '%s'", from.c_str(), to.c_str()); - } else { - // Remove the "from" prefix from the path. - // We have to drop down to string operations for this. - if (!File::Move(from, to)) { - ERROR_LOG(SYSTEM, "Failed to move file '%s' to '%s'", from.c_str(), to.c_str()); - moveFailures++; - // Should probably just bail? + INFO_LOG(SYSTEM, "About to move PSP data from '%s' to '%s'", moveSrc.c_str(), moveDest.c_str()); + + // Search through recursively, listing the files to move and also summing their sizes. + std::vector fileSuffixesToMove; + std::vector directorySuffixesToCreate; + + // NOTE: It's correct to pass moveSrc twice here, it's to keep the root in the recursion. + if (!ListFileSuffixesRecursively(moveSrc, moveSrc, directorySuffixesToCreate, fileSuffixesToMove)) { + // TODO: Handle failure listing files. + std::string error = "Failed to read old directory"; + INFO_LOG(SYSTEM, "%s", error.c_str()); + progressReporter_.Set(error); + return new bool(false); + } + + bool dryRun = false; // Useful for debugging. + + size_t moveFailures = 0; + + if (!moveSrc.empty()) { + // Better not interrupt the app while this is happening! + + // Create all the necessary directories. + for (auto &dirSuffix : directorySuffixesToCreate) { + Path dir = moveDest / dirSuffix; + if (dryRun) { + INFO_LOG(SYSTEM, "dry run: Would have created dir '%s'", dir.c_str()); } else { - INFO_LOG(SYSTEM, "Moved file '%s' to '%s'", from.c_str(), to.c_str()); + INFO_LOG(SYSTEM, "Creating dir '%s'", dir.c_str()); + if (!File::Exists(dir)) { + File::CreateDir(dir); + } + } + } + + for (auto &fileSuffix : fileSuffixesToMove) { + progressReporter_.Set(fileSuffix); + + Path from = moveSrc / fileSuffix; + Path to = moveDest / fileSuffix; + if (dryRun) { + INFO_LOG(SYSTEM, "dry run: Would have moved '%s' to '%s'", from.c_str(), to.c_str()); + } else { + // Remove the "from" prefix from the path. + // We have to drop down to string operations for this. + if (!File::Move(from, to)) { + ERROR_LOG(SYSTEM, "Failed to move file '%s' to '%s'", from.c_str(), to.c_str()); + moveFailures++; + // Should probably just bail? + } else { + INFO_LOG(SYSTEM, "Moved file '%s' to '%s'", from.c_str(), to.c_str()); + } + } + } + + // Delete all the old, now hopefully empty, directories. + for (auto &dirSuffix : directorySuffixesToCreate) { + Path dir = moveSrc / dirSuffix; + if (dryRun) { + INFO_LOG(SYSTEM, "dry run: Would have deleted dir '%s'", dir.c_str()); + } else { + INFO_LOG(SYSTEM, "Deleting dir '%s'", dir.c_str()); + if (!File::Exists(dir)) { + File::DeleteDir(dir); + } } } } - } - if (moveFailures > 0) { - error_ = "Failed to move some files!"; - RecreateViews(); - return UI::EVENT_DONE; - } + if (moveFailures > 0) { + std::string error = "Failed to move some files!"; + progressReporter_.Set(error); + return new bool(false); + } + + return new bool(true); + }, TaskType::IO_BLOCKING); + + RecreateViews(); + } else { + FinishFolderMove(); } + return UI::EVENT_DONE; +} + +void ConfirmMemstickMoveScreen::FinishFolderMove() { + auto iz = GetI18NCategory("MemStick"); + // Successful so far, switch the memstick folder. if (!SwitchMemstickFolderTo(newMemstickFolder_)) { // TODO: More precise errors. error_ = iz->T("That folder doesn't work as a memstick folder."); - return UI::EVENT_DONE; + return; } // If the chosen folder already had a config, reload it! @@ -380,6 +458,4 @@ UI::EventReturn ConfirmMemstickMoveScreen::OnConfirm(UI::EventParams ¶ms) { error_ = iz->T("Failed to save config"); RecreateViews(); } - - return UI::EVENT_DONE; } diff --git a/UI/MemStickScreen.h b/UI/MemStickScreen.h index 6fb9df31d3..7b9f843562 100644 --- a/UI/MemStickScreen.h +++ b/UI/MemStickScreen.h @@ -19,12 +19,15 @@ #include #include +#include #include "ppsspp_config.h" #include "Common/File/Path.h" -#include "UI/MiscScreens.h" #include "Common/UI/UIScreen.h" +#include "Common/Thread/Promise.h" + +#include "UI/MiscScreens.h" // MemStickScreen - let's you configure your memory stick directory. // Currently only useful for Android. @@ -64,14 +67,34 @@ private: bool done_ = false; }; +class ProgressReporter { +public: + void Set(std::string value) { + std::lock_guard guard(mutex_); + progress_ = value; + } + + std::string Get() { + std::lock_guard guard(mutex_); + return progress_; + } + +private: + std::string progress_; + std::mutex mutex_; +}; + class ConfirmMemstickMoveScreen : public UIDialogScreenWithBackground { public: ConfirmMemstickMoveScreen(Path newMemstickFolder, bool initialSetup); - + ~ConfirmMemstickMoveScreen(); protected: + void update() override; void CreateViews() override; private: + void FinishFolderMove(); + UI::EventReturn OnConfirm(UI::EventParams ¶ms); Path newMemstickFolder_; @@ -79,5 +102,10 @@ private: bool moveData_ = true; bool initialSetup_; + ProgressReporter progressReporter_; + UI::TextView *progressView_ = nullptr; + + Promise *moveDataTask_ = nullptr; + std::string error_; }; From dbd3d8ca2a969da5e9119bb037b43e49b8c7e7d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 29 Jul 2021 23:15:35 +0200 Subject: [PATCH 095/336] Handle an empty path in the game browser. --- Common/File/PathBrowser.cpp | 8 +++++++- UI/MainScreen.cpp | 6 +++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Common/File/PathBrowser.cpp b/Common/File/PathBrowser.cpp index ab85e2422b..756f0f74b3 100644 --- a/Common/File/PathBrowser.cpp +++ b/Common/File/PathBrowser.cpp @@ -144,11 +144,14 @@ void PathBrowser::HandlePath() { std::unique_lock guard(pendingLock_); std::vector results; - Path lastPath; + Path lastPath("NONSENSE THAT WONT EQUAL A PATH"); while (!pendingStop_) { while (lastPath == pendingPath_ && !pendingCancel_) { pendingCond_.wait(guard); } + if (pendingStop_) { + break; + } lastPath = pendingPath_; bool success = false; if (lastPath.Type() == PathType::HTTP) { @@ -156,6 +159,9 @@ void PathBrowser::HandlePath() { results.clear(); success = LoadRemoteFileList(lastPath, &pendingCancel_, results); guard.lock(); + } else if (lastPath.empty()) { + results.clear(); + success = true; } else { guard.unlock(); results.clear(); diff --git a/UI/MainScreen.cpp b/UI/MainScreen.cpp index bc07677ac5..4009dc7c42 100644 --- a/UI/MainScreen.cpp +++ b/UI/MainScreen.cpp @@ -816,7 +816,7 @@ void GameBrowser::Refresh() { } // Show a button to toggle pinning at the very end. - if (browseFlags_ & BrowseFlags::PIN) { + if ((browseFlags_ & BrowseFlags::PIN) && !path_.GetPath().empty()) { std::string caption = IsCurrentPathPinned() ? "-" : "+"; if (!*gridStyle_) { caption = IsCurrentPathPinned() ? mm->T("UnpinPath", "Unpin") : mm->T("PinPath", "Pin"); @@ -825,6 +825,10 @@ void GameBrowser::Refresh() { OnClick.Handle(this, &GameBrowser::PinToggleClick); } + if (path_.GetPath().empty()) { + Add(new TextView(mm->T("UseBrowseOrLoad", "Use Browse to choose a folder, or Load to choose a file."))); + } + if (!lastText_.empty() && gameButtons.empty()) { Add(new Spacer()); Add(new Choice(lastText_, new UI::LinearLayoutParams(UI::WRAP_CONTENT, UI::WRAP_CONTENT)))->OnClick.Handle(this, &GameBrowser::LastClick); From 93673cb56593ac5bab5754e8efab01f712197810 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 4 Aug 2021 22:51:22 +0200 Subject: [PATCH 096/336] Correct the cutoff for scoped storage. Android 9,10 (API 28,29) shouldn't use it. --- android/jni/app-android.cpp | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/android/jni/app-android.cpp b/android/jni/app-android.cpp index fb2723f9c1..f7baea793d 100644 --- a/android/jni/app-android.cpp +++ b/android/jni/app-android.cpp @@ -97,19 +97,6 @@ struct JNIEnv {}; bool useCPUThread = true; -// We turn this on now that when we target Android 11+. -// Along with adding: -// android:preserveLegacyExternalStorage="true" -// To the already requested: -// android:requestLegacyExternalStorage="true" -// -// This will cause Android 11+ to still behave like Android 10 until the app -// is manually uninstalled. We can detect this state with -// Android_IsExternalStoragePreservedLegacy(), but most of the app will just see -// that scoped storage enforcement is disabled in this case. - -static const bool useScopedStorageIfRequired = true; - enum class EmuThreadState { DISABLED, START_REQUESTED, @@ -466,6 +453,8 @@ bool System_GetPropertyBool(SystemProperty prop) { return androidVersion >= 19; // when ACTION_OPEN_DOCUMENT was added case SYSPROP_HAS_FOLDER_BROWSER: // Uses OPEN_DOCUMENT_TREE to let you select a folder. + // Doesn't actually mean it's usable though, in many early versions of Android + // this dialog is complete garbage and only lets you select subfolders of the Downloads folder. return androidVersion >= 21; // when ACTION_OPEN_DOCUMENT_TREE was added case SYSPROP_APP_GOLD: #ifdef GOLD @@ -476,7 +465,17 @@ bool System_GetPropertyBool(SystemProperty prop) { case SYSPROP_CAN_JIT: return true; case SYSPROP_ANDROID_SCOPED_STORAGE: - if (useScopedStorageIfRequired && androidVersion >= 28) { + // We turn this on for Android 30+ (11) now that when we target Android 11+. + // Along with adding: + // android:preserveLegacyExternalStorage="true" + // To the already requested: + // android:requestLegacyExternalStorage="true" + // + // This will cause Android 11+ to still behave like Android 10 until the app + // is manually uninstalled. We can detect this state with + // Android_IsExternalStoragePreservedLegacy(), but most of the app will just see + // that scoped storage enforcement is disabled in this case. + if (androidVersion >= 30) { // Here we do a check to see if we ended up in the preserveLegacyExternalStorage path. // That won't last if the user uninstalls/reinstalls though, but would preserve the user // experience for simple upgrades so maybe let's support it. From a0a5f7a67a27c563593ca1e9c522f482bbfd782a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 4 Aug 2021 23:21:28 +0200 Subject: [PATCH 097/336] Minor improvements on Android 9/10. Let the user reset to root of storage. This includes handling weird "raw:/" content URIs. These I haven't seen on newer versions. --- Common/File/AndroidStorage.cpp | 4 +++- Common/File/AndroidStorage.h | 7 +++--- Common/File/Path.cpp | 40 ++++++++++++++++++++++++---------- UI/GameSettingsScreen.cpp | 6 ++--- UI/MemStickScreen.cpp | 39 +++++++++++++++++++++++++++------ UI/MemStickScreen.h | 3 +-- android/jni/app-android.cpp | 4 +++- 7 files changed, 74 insertions(+), 29 deletions(-) diff --git a/Common/File/AndroidStorage.cpp b/Common/File/AndroidStorage.cpp index d8d6468b91..78d457aabf 100644 --- a/Common/File/AndroidStorage.cpp +++ b/Common/File/AndroidStorage.cpp @@ -279,7 +279,9 @@ const char *Android_ErrorToString(StorageError error) { #else -// This string should never appear except on Android. +// These strings should never appear except on Android. +// Very hacky. std::string g_extFilesDir = "(IF YOU SEE THIS THERE'S A BUG)"; +std::string g_externalDir = "(IF YOU SEE THIS THERE'S A BUG (2))"; #endif diff --git a/Common/File/AndroidStorage.h b/Common/File/AndroidStorage.h index 131c0125d2..2a890d33b4 100644 --- a/Common/File/AndroidStorage.h +++ b/Common/File/AndroidStorage.h @@ -30,12 +30,13 @@ inline StorageError StorageErrorFromInt(int ival) { } } +extern std::string g_extFilesDir; +extern std::string g_externalDir; + #if PPSSPP_PLATFORM(ANDROID) && !defined(__LIBRETRO__) #include -extern std::string g_extFilesDir; - void Android_StorageSetNativeActivity(jobject nativeActivity); bool Android_IsContentUri(const std::string &uri); @@ -59,8 +60,6 @@ void Android_RegisterStorageCallbacks(JNIEnv * env, jobject obj); #else -extern std::string g_extFilesDir; - // Stub out the Android Storage wrappers, so that we can avoid ifdefs everywhere. inline bool Android_IsContentUri(const std::string &uri) { return false; } diff --git a/Common/File/Path.cpp b/Common/File/Path.cpp index 2af4374937..3ffd64549d 100644 --- a/Common/File/Path.cpp +++ b/Common/File/Path.cpp @@ -10,16 +10,6 @@ #include "android/jni/AndroidContentURI.h" Path::Path(const std::string &str) { - if (str.empty()) { - type_ = PathType::UNDEFINED; - } else if (startsWith(str, "http://") || startsWith(str, "https://")) { - type_ = PathType::HTTP; - } else if (Android_IsContentUri(str)) { - type_ = PathType::CONTENT_URI; - } else { - type_ = PathType::NATIVE; - } - Init(str); } @@ -31,7 +21,35 @@ Path::Path(const std::wstring &str) { #endif void Path::Init(const std::string &str) { - path_ = str; + if (str.empty()) { + type_ = PathType::UNDEFINED; + path_.clear(); + } else if (startsWith(str, "http://") || startsWith(str, "https://")) { + type_ = PathType::HTTP; + path_ = str; + } else if (Android_IsContentUri(str)) { + // Content URIs on non scoped-storage (and possibly other cases?) can contain + // "raw:/" URIs inside. This happens when picking the Download folder using the folder browser + // on Android 9. + // Here's an example: + // content://com.android.providers.downloads.documents/tree/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2Fp/document/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2Fp + // + // Since this is a legacy use case, I think it's safe enough to just detect this + // and flip it to a NATIVE url and hope for the best. + AndroidContentURI uri(str); + if (startsWith(uri.FilePath(), "raw:/")) { + INFO_LOG(SYSTEM, "Raw path detected: %s", uri.FilePath().c_str()); + path_ = uri.FilePath().substr(4); + type_ = PathType::NATIVE; + } else { + // A normal content URI path. + type_ = PathType::CONTENT_URI; + path_ = str; + } + } else { + type_ = PathType::NATIVE; + path_ = str; + } #if PPSSPP_PLATFORM(WINDOWS) // Flip all the slashes around. We flip them back on ToWString(). diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 18c8398060..6b1e97e368 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -903,9 +903,6 @@ void GameSettingsScreen::CreateViews() { systemSettings->Add(new ItemHeader(sy->T("PSP Memory Stick"))); - systemSettings->Add(new CheckBox(&g_Config.bMemStickInserted, sy->T("Memory Stick inserted"))); - systemSettings->Add(new PopupSliderChoice(&g_Config.iMemStickSizeGB, 1, 32, sy->T("Change Memory Stick Size", "Memory Stick Size (GB)"), screenManager(), "GB")); - #if PPSSPP_PLATFORM(ANDROID) memstickDisplay_ = g_Config.memStickDirectory.ToVisualString(); auto memstickPath = systemSettings->Add(new ChoiceWithValueDisplay(&memstickDisplay_, sy->T("Change Memory Stick folder", "Memory Stick folder"), (const char *)nullptr)); @@ -955,6 +952,9 @@ void GameSettingsScreen::CreateViews() { } } #endif + systemSettings->Add(new CheckBox(&g_Config.bMemStickInserted, sy->T("Memory Stick inserted"))); + systemSettings->Add(new PopupSliderChoice(&g_Config.iMemStickSizeGB, 1, 32, sy->T("Change Memory Stick Size", "Memory Stick Size (GB)"), screenManager(), "GB")); + systemSettings->Add(new ItemHeader(sy->T("General"))); #if PPSSPP_PLATFORM(ANDROID) diff --git a/UI/MemStickScreen.cpp b/UI/MemStickScreen.cpp index 5b51cbba9a..f2eae807b8 100644 --- a/UI/MemStickScreen.cpp +++ b/UI/MemStickScreen.cpp @@ -102,7 +102,6 @@ static std::string FormatSpaceString(int64_t space) { MemStickScreen::MemStickScreen(bool initialSetup) : initialSetup_(initialSetup) { - pendingMemStickFolder_ = g_Config.memStickDirectory; } void MemStickScreen::CreateViews() { @@ -129,6 +128,14 @@ void MemStickScreen::CreateViews() { leftColumn->Add(new TextView(iz->T("MemoryStickDescription", "Choose PSP data storage (Memory Stick)"), ALIGN_LEFT, false)); + // For legacy Android systems, so you can switch back to the old ways if you move to SD or something. + // TODO: Gonna need a scroll view. +#if PPSSPP_PLATFORM(ANDROID) + if (!System_GetPropertyBool(SYSPROP_ANDROID_SCOPED_STORAGE)) { + leftColumn->Add(new Choice(iz->T("Use PSP folder at root of storage")))->OnClick.Handle(this, &MemStickScreen::OnUseStorageRoot); + } +#endif + leftColumn->Add(new Choice(iz->T("Create or Choose a PSP folder")))->OnClick.Handle(this, &MemStickScreen::OnBrowse); leftColumn->Add(new TextView(iz->T("ChooseFolderDesc", "* Data will stay even if you uninstall PPSSPP.\n* Data can be shared with PPSSPP Gold\n* Easy USB access"), ALIGN_LEFT, false)); @@ -145,19 +152,37 @@ void MemStickScreen::CreateViews() { } UI::EventReturn MemStickScreen::OnUseInternalStorage(UI::EventParams ¶ms) { - pendingMemStickFolder_ = Path(g_extFilesDir); + Path pendingMemStickFolder = Path(g_extFilesDir); if (initialSetup_) { // There's not gonna be any files here in this case since it's a fresh install. // Let's just accept it and move on. No need to move files either. - if (SwitchMemstickFolderTo(pendingMemStickFolder_)) { + if (SwitchMemstickFolderTo(pendingMemStickFolder)) { TriggerFinish(DialogResult::DR_OK); } else { // This can't really happen?? Not worth making an error message. } } else { // Always ask for confirmation when called from the UI. Likely there's already some data. - screenManager()->push(new ConfirmMemstickMoveScreen(pendingMemStickFolder_, false)); + screenManager()->push(new ConfirmMemstickMoveScreen(pendingMemStickFolder, false)); + } + return UI::EVENT_DONE; +} + +UI::EventReturn MemStickScreen::OnUseStorageRoot(UI::EventParams ¶ms) { + Path pendingMemStickFolder = Path(g_externalDir); + + if (initialSetup_) { + // There's not gonna be any files here in this case since it's a fresh install. + // Let's just accept it and move on. No need to move files either. + if (SwitchMemstickFolderTo(pendingMemStickFolder)) { + TriggerFinish(DialogResult::DR_OK); + } else { + // This can't really happen?? Not worth making an error message. + } + } else { + // Always ask for confirmation when called from the UI. Likely there's already some data. + screenManager()->push(new ConfirmMemstickMoveScreen(pendingMemStickFolder, false)); } return UI::EVENT_DONE; } @@ -179,9 +204,9 @@ void MemStickScreen::sendMessage(const char *message, const char *value) { INFO_LOG(SYSTEM, "Got folder: '%s'", filename.c_str()); // Browse finished. Let's pop up the confirmation dialog. - pendingMemStickFolder_ = Path(filename); - bool existingFiles = FolderSeemsToBeUsed(pendingMemStickFolder_); - screenManager()->push(new ConfirmMemstickMoveScreen(pendingMemStickFolder_, initialSetup_)); + Path pendingMemStickFolder = Path(filename); + bool existingFiles = FolderSeemsToBeUsed(pendingMemStickFolder); + screenManager()->push(new ConfirmMemstickMoveScreen(pendingMemStickFolder, initialSetup_)); } } } diff --git a/UI/MemStickScreen.h b/UI/MemStickScreen.h index 7b9f843562..d058d3c490 100644 --- a/UI/MemStickScreen.h +++ b/UI/MemStickScreen.h @@ -58,9 +58,8 @@ private: // Event handlers UI::EventReturn OnBrowse(UI::EventParams &e); UI::EventReturn OnUseInternalStorage(UI::EventParams ¶ms); + UI::EventReturn OnUseStorageRoot(UI::EventParams ¶ms); - // TODO: probably not necessary to store here, we just forward to the confirmation dialog. - Path pendingMemStickFolder_; SettingInfoMessage *settingInfo_ = nullptr; bool initialSetup_; diff --git a/android/jni/app-android.cpp b/android/jni/app-android.cpp index f7baea793d..795ec23f4e 100644 --- a/android/jni/app-android.cpp +++ b/android/jni/app-android.cpp @@ -128,7 +128,8 @@ std::string langRegion; std::string mogaVersion; std::string boardName; -std::string g_extFilesDir; +std::string g_externalDir; // Original external dir (root of Android storage). +std::string g_extFilesDir; // App private external dir. std::vector g_additionalStorageDirs; @@ -637,6 +638,7 @@ extern "C" void Java_org_ppsspp_ppsspp_NativeApp_init std::string additionalStorageDirsString = GetJavaString(env, jadditionalStorageDirs); std::string externalFilesDir = GetJavaString(env, jexternalFilesDir); + g_externalDir = externalStorageDir; g_extFilesDir = externalFilesDir; if (!additionalStorageDirsString.empty()) { From 157bbb99ae59873375d0df8da81b66ce8e5ee380 Mon Sep 17 00:00:00 2001 From: iota97 Date: Thu, 5 Aug 2021 09:16:10 +0200 Subject: [PATCH 098/336] Address feedback --- Core/SaveState.cpp | 30 ++++++++++++++++-------------- Core/SaveState.h | 2 +- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/Core/SaveState.cpp b/Core/SaveState.cpp index 2df8b9e6f3..568a1269d6 100644 --- a/Core/SaveState.cpp +++ b/Core/SaveState.cpp @@ -55,6 +55,9 @@ #include "Core/HLE/__sceAudio.h" #endif +// Slot number is visual only, -2 will display special message +constexpr int LOAD_UNDO_SLOT = -2; + namespace SaveState { struct SaveStart @@ -412,7 +415,7 @@ namespace SaveState return filename.GetFilename() + " " + sy->T("(broken)"); } - std::string GenerateFullDiskId(const Path &gameFilename) { + std::string GenerateFullDiscId(const Path &gameFilename) { std::string discId = g_paramSFO.GetValueString("DISC_ID"); std::string discVer = g_paramSFO.GetValueString("DISC_VERSION"); if (discId.empty()) { @@ -424,7 +427,7 @@ namespace SaveState Path GenerateSaveSlotFilename(const Path &gameFilename, int slot, const char *extension) { - std::string filename = StringFromFormat("%s_%d.%s", GenerateFullDiskId(gameFilename).c_str(), slot, extension); + std::string filename = StringFromFormat("%s_%d.%s", GenerateFullDiscId(gameFilename).c_str(), slot, extension); return GetSysDirectory(DIRECTORY_SAVESTATE) / filename; } @@ -472,19 +475,18 @@ namespace SaveState if (status != Status::FAILURE) { DeleteIfExists(backup); File::Rename(backup.WithExtraExtension(".tmp"), backup); - g_Config.sStateLoadUndoGame = GenerateFullDiskId(gameFilename); - Load(fn, slot, callback, cbUserData); - } else if (callback) { - callback(status, message, data); + g_Config.sStateLoadUndoGame = GenerateFullDiscId(gameFilename); + } else { + ERROR_LOG(SAVESTATE, "Saving load undo state failed: %s", message.c_str()); } + Load(fn, slot, callback, cbUserData); }; if (!backup.empty()) { - Save(backup.WithExtraExtension(".tmp"), -2, saveCallback, cbUserData); + Save(backup.WithExtraExtension(".tmp"), LOAD_UNDO_SLOT, saveCallback, cbUserData); } else { - auto sy = GetI18NCategory("System"); - if (callback) - callback(Status::FAILURE, sy->T("Failed to save state for load undo. Error in the file system."), cbUserData); + ERROR_LOG(SAVESTATE, "Saving load undo state failed. Error in the file system."); + Load(fn, slot, callback, cbUserData); } } else { Load(fn, slot, callback, cbUserData); @@ -498,7 +500,7 @@ namespace SaveState bool UndoLoad(const Path &gameFilename, Callback callback, void *cbUserData) { - if (g_Config.sStateLoadUndoGame != GenerateFullDiskId(gameFilename)) { + if (g_Config.sStateLoadUndoGame != GenerateFullDiscId(gameFilename)) { auto sy = GetI18NCategory("System"); if (callback) callback(Status::FAILURE, sy->T("Error: load undo state is from a different game"), cbUserData); @@ -507,7 +509,7 @@ namespace SaveState Path fn = GetSysDirectory(DIRECTORY_SAVESTATE) / LOAD_UNDO_NAME; if (!fn.empty()) { - Load(fn, -2, callback, cbUserData); // Slot number is visual only, -2 will display special message (kinda have to find a better way) + Load(fn, LOAD_UNDO_SLOT, callback, cbUserData); return true; } else { auto sy = GetI18NCategory("System"); @@ -590,7 +592,7 @@ namespace SaveState bool HasUndoLoad(const Path &gameFilename) { Path fn = GetSysDirectory(DIRECTORY_SAVESTATE) / LOAD_UNDO_NAME; - return File::Exists(fn) && g_Config.sStateLoadUndoGame == GenerateFullDiskId(gameFilename); + return File::Exists(fn) && g_Config.sStateLoadUndoGame == GenerateFullDiscId(gameFilename); } bool operator < (const tm &t1, const tm &t2) { @@ -804,7 +806,7 @@ namespace SaveState // Use the state's latest version as a guess for saveStateInitialGitVersion. result = CChunkFileReader::Load(op.filename, &saveStateInitialGitVersion, state, &errorString); if (result == CChunkFileReader::ERROR_NONE) { - callbackMessage = op.slot != -2 ? slot_prefix + sc->T("Loaded State") : sc->T("State load undone"); + callbackMessage = op.slot != LOAD_UNDO_SLOT ? slot_prefix + sc->T("Loaded State") : sc->T("State load undone"); callbackResult = Status::SUCCESS; hasLoadedState = true; diff --git a/Core/SaveState.h b/Core/SaveState.h index 7936fd32d6..40d72ca109 100644 --- a/Core/SaveState.h +++ b/Core/SaveState.h @@ -61,7 +61,7 @@ namespace SaveState int GetOldestSlot(const Path &gameFilename); std::string GetSlotDateAsString(const Path &gameFilename, int slot); - std::string GenerateFullDiskId(const Path &gameFilename); + std::string GenerateFullDiscId(const Path &gameFilename); Path GenerateSaveSlotFilename(const Path &gameFilename, int slot, const char *extension); std::string GetTitle(const Path &filename); From ff5b6ca3dae32e4c8e3297eb897c16225a98c47a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 5 Aug 2021 21:53:08 +0200 Subject: [PATCH 099/336] A bunch of small scoped storage UX improvements. --- UI/DevScreens.cpp | 8 +++++--- UI/MemStickScreen.cpp | 46 +++++++++++++++++++++++++++++++++++-------- UI/MemStickScreen.h | 1 + 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/UI/DevScreens.cpp b/UI/DevScreens.cpp index 81f17d589f..2d18c69315 100644 --- a/UI/DevScreens.cpp +++ b/UI/DevScreens.cpp @@ -589,10 +589,12 @@ void SystemInfoScreen::CreateViews() { #if PPSSPP_PLATFORM(ANDROID) storage->Add(new InfoItem("ExtFilesDir", g_extFilesDir)); - if (System_GetPropertyBool(SYSPROP_ANDROID_SCOPED_STORAGE)) { - storage->Add(new InfoItem("Scoped Storage", di->T("Yes"))); + bool scoped = System_GetPropertyBool(SYSPROP_ANDROID_SCOPED_STORAGE); + storage->Add(new InfoItem("Scoped Storage Enabled", scoped ? di->T("Yes") : di->T("No"))); + if (System_GetPropertyInt(SYSPROP_SYSTEMVERSION) >= 30) { + // This flag is only relevant on Android API 30+. + storage->Add(new InfoItem("IsStoragePreservedLegacy", Android_IsExternalStoragePreservedLegacy() ? di->T("Yes") : di->T("No"))); } - storage->Add(new InfoItem("IsStoragePreservedLegacy", Android_IsExternalStoragePreservedLegacy() ? di->T("Yes") : di->T("No"))); #endif ViewGroup *buildConfigScroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, FILL_PARENT)); diff --git a/UI/MemStickScreen.cpp b/UI/MemStickScreen.cpp index f2eae807b8..41d7c63aa2 100644 --- a/UI/MemStickScreen.cpp +++ b/UI/MemStickScreen.cpp @@ -48,8 +48,8 @@ static bool FolderSeemsToBeUsed(Path newMemstickFolder) { // Inspect the potential new folder. - if (File::Exists(newMemstickFolder / "PSP") || File::Exists(newMemstickFolder / "SYSTEM")) { - // Does seem likely. We could add more critera like checking for actual savegames or something. + if (File::Exists(newMemstickFolder / "PSP/SAVEDATA") || File::Exists(newMemstickFolder / "SAVEDATA")) { + // Does seem likely. We could add more criteria like checking for actual savegames or something. return true; } else { return false; @@ -115,17 +115,25 @@ void MemStickScreen::CreateViews() { root_ = new LinearLayout(ORIENT_HORIZONTAL); Spacer *spacerColumn = new Spacer(new LinearLayoutParams(20.0, FILL_PARENT, 0.0f)); - ViewGroup *leftColumn = new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(1.0)); + ScrollView *leftColumnScroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(1.0)); + + ViewGroup *leftColumn = new LinearLayoutList(ORIENT_VERTICAL); ViewGroup *rightColumnItems = new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(300, FILL_PARENT, actionMenuMargins)); root_->Add(spacerColumn); - root_->Add(leftColumn); + root_->Add(leftColumnScroll); root_->Add(rightColumnItems); + leftColumnScroll->Add(leftColumn); + if (initialSetup_) { leftColumn->Add(new TextView(iz->T("Welcome to PPSSPP!"), ALIGN_LEFT, false)); leftColumn->Add(new Spacer(new LinearLayoutParams(FILL_PARENT, 12.0f, 0.0f))); } + if (System_GetPropertyBool(SYSPROP_ANDROID_SCOPED_STORAGE)) { + leftColumn->Add(new TextView(iz->T("ScopedStorageWarning", "WARNING: BETA ANDROID SCOPED STORAGE SUPPORT\nMAY EAT YOUR DATA"), ALIGN_LEFT, false)); + } + leftColumn->Add(new TextView(iz->T("MemoryStickDescription", "Choose PSP data storage (Memory Stick)"), ALIGN_LEFT, false)); // For legacy Android systems, so you can switch back to the old ways if you move to SD or something. @@ -133,6 +141,7 @@ void MemStickScreen::CreateViews() { #if PPSSPP_PLATFORM(ANDROID) if (!System_GetPropertyBool(SYSPROP_ANDROID_SCOPED_STORAGE)) { leftColumn->Add(new Choice(iz->T("Use PSP folder at root of storage")))->OnClick.Handle(this, &MemStickScreen::OnUseStorageRoot); + leftColumn->Add(new TextView(iz->T("ChooseFolderDesc", "* Data will stay even if you uninstall PPSSPP.\n* Data can be shared with PPSSPP Gold\n* Easy USB access"), ALIGN_LEFT, false)); } #endif @@ -145,7 +154,7 @@ void MemStickScreen::CreateViews() { leftColumn->Add(new Spacer(new LinearLayoutParams(FILL_PARENT, 12.0f, 0.0f))); if (!initialSetup_) { - leftColumn->Add(new Choice(di->T("Back")))->OnClick.Handle(this, &UIScreen::OnBack); + rightColumnItems->Add(new Choice(di->T("Back")))->OnClick.Handle(this, &UIScreen::OnBack); } INFO_LOG(SYSTEM, "MemStickScreen: initialSetup=%d", (int)initialSetup_); @@ -188,7 +197,6 @@ UI::EventReturn MemStickScreen::OnUseStorageRoot(UI::EventParams ¶ms) { } UI::EventReturn MemStickScreen::OnBrowse(UI::EventParams ¶ms) { - auto sy = GetI18NCategory("System"); System_SendMessage("browse_folder", ""); return UI::EVENT_DONE; } @@ -205,6 +213,12 @@ void MemStickScreen::sendMessage(const char *message, const char *value) { // Browse finished. Let's pop up the confirmation dialog. Path pendingMemStickFolder = Path(filename); + + if (pendingMemStickFolder == g_Config.memStickDirectory) { + auto iz = GetI18NCategory("MemStick"); + SystemToast(iz->T("That's the folder being used!")); + } + bool existingFiles = FolderSeemsToBeUsed(pendingMemStickFolder); screenManager()->push(new ConfirmMemstickMoveScreen(pendingMemStickFolder, initialSetup_)); } @@ -294,11 +308,17 @@ void ConfirmMemstickMoveScreen::CreateViews() { free_disk_space(oldMemstickFolder, freeSpaceOld); leftColumn->Add(new TextView(iz->T("New PSP Data Folder"), ALIGN_LEFT, false)); + if (!initialSetup_) { + leftColumn->Add(new TextView(iz->T("PPSSPP will restart after the change."), ALIGN_LEFT, false)); + } leftColumn->Add(new TextView(newMemstickFolder_.ToVisualString(), ALIGN_LEFT, false)); std::string newFreeSpaceText = std::string(iz->T("Free space")) + ": " + FormatSpaceString(freeSpaceNew); leftColumn->Add(new TextView(newFreeSpaceText, ALIGN_LEFT, false)); if (existingFilesInNewFolder_) { - leftColumn->Add(new TextView(iz->T("Warning: Already contains data"), ALIGN_LEFT, false)); + leftColumn->Add(new TextView(iz->T("Already contains data."), ALIGN_LEFT, false)); + if (!moveData_) { + leftColumn->Add(new TextView(iz->T("No data will be changed."), ALIGN_LEFT, false)); + } } if (!error_.empty()) { leftColumn->Add(new TextView(error_, ALIGN_LEFT, false)); @@ -319,7 +339,7 @@ void ConfirmMemstickMoveScreen::CreateViews() { if (!moveDataTask_) { if (!initialSetup_) { - leftColumn->Add(new CheckBox(&moveData_, iz->T("Move Data"))); + leftColumn->Add(new CheckBox(&moveData_, iz->T("Move Data")))->OnClick.Handle(this, &ConfirmMemstickMoveScreen::OnMoveDataClick); } leftColumn->Add(new Choice(di->T("OK")))->OnClick.Handle(this, &ConfirmMemstickMoveScreen::OnConfirm); @@ -327,6 +347,11 @@ void ConfirmMemstickMoveScreen::CreateViews() { } } +UI::EventReturn ConfirmMemstickMoveScreen::OnMoveDataClick(UI::EventParams ¶ms) { + RecreateViews(); + return UI::EVENT_DONE; +} + void ConfirmMemstickMoveScreen::update() { UIDialogScreenWithBackground::update(); @@ -477,6 +502,11 @@ void ConfirmMemstickMoveScreen::FinishFolderMove() { // If the chosen folder already had a config, reload it! g_Config.Load(); + if (!initialSetup_) { + // We restart the app here, to get the new settings. + System_SendMessage("graphics_restart", ""); + } + if (g_Config.Save("MemstickPathChanged")) { TriggerFinish(DialogResult::DR_OK); } else { diff --git a/UI/MemStickScreen.h b/UI/MemStickScreen.h index d058d3c490..2c248103f0 100644 --- a/UI/MemStickScreen.h +++ b/UI/MemStickScreen.h @@ -92,6 +92,7 @@ protected: void CreateViews() override; private: + UI::EventReturn OnMoveDataClick(UI::EventParams ¶ms); void FinishFolderMove(); UI::EventReturn OnConfirm(UI::EventParams ¶ms); From 61198164075ce346d2f2f5dffd23051902eaecfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 5 Aug 2021 23:37:35 +0200 Subject: [PATCH 100/336] Buildfix, bugfix --- UI/MemStickScreen.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/UI/MemStickScreen.cpp b/UI/MemStickScreen.cpp index 41d7c63aa2..318195738e 100644 --- a/UI/MemStickScreen.cpp +++ b/UI/MemStickScreen.cpp @@ -216,7 +216,10 @@ void MemStickScreen::sendMessage(const char *message, const char *value) { if (pendingMemStickFolder == g_Config.memStickDirectory) { auto iz = GetI18NCategory("MemStick"); +#if PPSSPP_PLATFORM(ANDROID) SystemToast(iz->T("That's the folder being used!")); +#endif + return; } bool existingFiles = FolderSeemsToBeUsed(pendingMemStickFolder); From 1e949c8097602d6bf4a6c5a49902fbe37eedbd33 Mon Sep 17 00:00:00 2001 From: Pierce Andjelkovic Date: Sat, 7 Aug 2021 04:08:39 +1000 Subject: [PATCH 101/336] Fix indentation --- ppsspp_config.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ppsspp_config.h b/ppsspp_config.h index cdf01e07d6..eb12cf244e 100644 --- a/ppsspp_config.h +++ b/ppsspp_config.h @@ -66,8 +66,8 @@ #if defined(__riscv) && defined(__riscv_xlen) && __riscv_xlen == 64 //https://github.com/riscv/riscv-c-api-doc/blob/master/riscv-c-api.md - #define PPSSPP_ARCH_RISCV64 1 - #define PPSSPP_ARCH_64BIT 1 + #define PPSSPP_ARCH_RISCV64 1 + #define PPSSPP_ARCH_64BIT 1 #endif From 83b6139c577082a1141af1762bdd67adefdf65e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 6 Aug 2021 21:48:20 +0200 Subject: [PATCH 102/336] Wording fixes for PPSSPP Gold. Followup to #14619 --- UI/MemStickScreen.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/UI/MemStickScreen.cpp b/UI/MemStickScreen.cpp index 318195738e..9b0e9c6351 100644 --- a/UI/MemStickScreen.cpp +++ b/UI/MemStickScreen.cpp @@ -141,15 +141,21 @@ void MemStickScreen::CreateViews() { #if PPSSPP_PLATFORM(ANDROID) if (!System_GetPropertyBool(SYSPROP_ANDROID_SCOPED_STORAGE)) { leftColumn->Add(new Choice(iz->T("Use PSP folder at root of storage")))->OnClick.Handle(this, &MemStickScreen::OnUseStorageRoot); - leftColumn->Add(new TextView(iz->T("ChooseFolderDesc", "* Data will stay even if you uninstall PPSSPP.\n* Data can be shared with PPSSPP Gold\n* Easy USB access"), ALIGN_LEFT, false)); + leftColumn->Add(new TextView(iz->T("ChooseFolderDesc", "* Data will stay even if you uninstall PPSSPP.\n* Data can be shared between PPSSPP regular/Gold.\n* Easy USB access"), ALIGN_LEFT, false)); } #endif leftColumn->Add(new Choice(iz->T("Create or Choose a PSP folder")))->OnClick.Handle(this, &MemStickScreen::OnBrowse); - leftColumn->Add(new TextView(iz->T("ChooseFolderDesc", "* Data will stay even if you uninstall PPSSPP.\n* Data can be shared with PPSSPP Gold\n* Easy USB access"), ALIGN_LEFT, false)); + leftColumn->Add(new TextView(iz->T("ChooseFolderDesc", "* Data will stay even if you uninstall PPSSPP.\n* Data can be shared between PPSSPP regular/Gold\n* Easy USB access"), ALIGN_LEFT, false)); leftColumn->Add(new Choice(iz->T("Use App Private Directory")))->OnClick.Handle(this, &MemStickScreen::OnUseInternalStorage); - leftColumn->Add(new TextView(iz->T("InternalStorageDesc", "* Warning! Data will be deleted if you uninstall PPSSPP!\n* Data cannot be shared with PPSSPP Gold\n* USB access through Android/data/org.ppsspp.ppsspp/files"), ALIGN_LEFT, false)); + leftColumn->Add(new TextView(iz->T("InternalStorageDesc", "* Warning! Data will be deleted if you uninstall PPSSPP!\n* Data cannot be shared between PPSSPP regular/Gold\n* USB access through " +#ifdef GOLD + "Android/data/org.ppsspp.ppssppgold/files" +#else + "Android/data/org.ppsspp.ppsspp/files" +#endif + ), ALIGN_LEFT, false)); leftColumn->Add(new Spacer(new LinearLayoutParams(FILL_PARENT, 12.0f, 0.0f))); From 707795e2e47dcdc9e8b00cf03a18810740b0f393 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 6 Aug 2021 22:32:43 +0200 Subject: [PATCH 103/336] Improve translatability of memstick screen --- Common/UI/View.cpp | 22 ++++++++++++++++++++-- Common/UI/View.h | 2 ++ UI/MemStickScreen.cpp | 21 +++++++++++++-------- 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/Common/UI/View.cpp b/Common/UI/View.cpp index c3fc74ffdc..8d929056c0 100644 --- a/Common/UI/View.cpp +++ b/Common/UI/View.cpp @@ -801,6 +801,8 @@ void ImageView::Draw(UIContext &dc) { } } +const float bulletOffset = 25; + void TextView::GetContentDimensionsBySpec(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert, float &w, float &h) const { Bounds bounds(0, 0, layoutParams_->width, layoutParams_->height); if (bounds.w < 0) { @@ -812,6 +814,10 @@ void TextView::GetContentDimensionsBySpec(const UIContext &dc, MeasureSpec horiz } ApplyBoundsBySpec(bounds, horiz, vert); dc.MeasureTextRect(small_ ? dc.theme->uiFontSmall : dc.theme->uiFont, 1.0f, 1.0f, text_.c_str(), (int)text_.length(), bounds, &w, &h, textAlign_); + + if (bullet_) { + w += bulletOffset; + } } void TextView::Draw(UIContext &dc) { @@ -838,11 +844,23 @@ void TextView::Draw(UIContext &dc) { dc.FillRect(style.background, bounds_); } dc.SetFontStyle(small_ ? dc.theme->uiFontSmall : dc.theme->uiFont); + + Bounds textBounds = bounds_; + + if (bullet_) { + // Possible alternatives: •●■ + // TODO: Maybe draw an actual circle if we don't have real unicode fonts. So far this is only + // used on Android. + dc.DrawTextRect("●", textBounds, textColor, ALIGN_LEFT); + textBounds.x += bulletOffset; + textBounds.w -= bulletOffset; + } + if (shadow_) { uint32_t shadowColor = 0x80000000; - dc.DrawTextRect(text_.c_str(), bounds_.Offset(1.0f, 1.0f), shadowColor, textAlign_); + dc.DrawTextRect(text_.c_str(), textBounds.Offset(1.0f, 1.0f), shadowColor, textAlign_); } - dc.DrawTextRect(text_.c_str(), bounds_, textColor, textAlign_); + dc.DrawTextRect(text_.c_str(), textBounds, textColor, textAlign_); if (small_) { // If we changed font style, reset it. dc.SetFontStyle(dc.theme->uiFont); diff --git a/Common/UI/View.h b/Common/UI/View.h index 1d7c2b40d2..fd05d38e9b 100644 --- a/Common/UI/View.h +++ b/Common/UI/View.h @@ -841,6 +841,7 @@ public: void SetShadow(bool shadow) { shadow_ = shadow; } void SetFocusable(bool focusable) { focusable_ = focusable; } void SetClip(bool clip) { clip_ = clip; } + void SetBullet(bool bullet) { bullet_ = bullet; } bool CanBeFocused() const override { return focusable_; } @@ -853,6 +854,7 @@ private: bool shadow_; bool focusable_; bool clip_; + bool bullet_ = false; }; class TextEdit : public View { diff --git a/UI/MemStickScreen.cpp b/UI/MemStickScreen.cpp index 9b0e9c6351..dc4084b039 100644 --- a/UI/MemStickScreen.cpp +++ b/UI/MemStickScreen.cpp @@ -134,28 +134,33 @@ void MemStickScreen::CreateViews() { leftColumn->Add(new TextView(iz->T("ScopedStorageWarning", "WARNING: BETA ANDROID SCOPED STORAGE SUPPORT\nMAY EAT YOUR DATA"), ALIGN_LEFT, false)); } - leftColumn->Add(new TextView(iz->T("MemoryStickDescription", "Choose PSP data storage (Memory Stick)"), ALIGN_LEFT, false)); + leftColumn->Add(new TextView(iz->T("MemoryStickDescription", "Choose PSP data storage (Memory Stick):"), ALIGN_LEFT, false)); // For legacy Android systems, so you can switch back to the old ways if you move to SD or something. // TODO: Gonna need a scroll view. #if PPSSPP_PLATFORM(ANDROID) if (!System_GetPropertyBool(SYSPROP_ANDROID_SCOPED_STORAGE)) { leftColumn->Add(new Choice(iz->T("Use PSP folder at root of storage")))->OnClick.Handle(this, &MemStickScreen::OnUseStorageRoot); - leftColumn->Add(new TextView(iz->T("ChooseFolderDesc", "* Data will stay even if you uninstall PPSSPP.\n* Data can be shared between PPSSPP regular/Gold.\n* Easy USB access"), ALIGN_LEFT, false)); + leftColumn->Add(new TextView(iz->T("DataWillStay", "Data will stay even if you uninstall PPSSPP.")))->SetBullet(true); + leftColumn->Add(new TextView(iz->T("DataCanBeShared", "Data can be shared between PPSSPP regular/Gold.")))->SetBullet(true); + leftColumn->Add(new TextView(iz->T("EasyUSBAccess", "Easy USB access")))->SetBullet(true); } #endif leftColumn->Add(new Choice(iz->T("Create or Choose a PSP folder")))->OnClick.Handle(this, &MemStickScreen::OnBrowse); - leftColumn->Add(new TextView(iz->T("ChooseFolderDesc", "* Data will stay even if you uninstall PPSSPP.\n* Data can be shared between PPSSPP regular/Gold\n* Easy USB access"), ALIGN_LEFT, false)); + leftColumn->Add(new TextView(iz->T("DataWillStay", "Data will stay even if you uninstall PPSSPP.")))->SetBullet(true); + leftColumn->Add(new TextView(iz->T("DataCanBeShared", "Data can be shared between PPSSPP regular/Gold.")))->SetBullet(true); + leftColumn->Add(new TextView(iz->T("EasyUSBAccess", "Easy USB access")))->SetBullet(true); leftColumn->Add(new Choice(iz->T("Use App Private Directory")))->OnClick.Handle(this, &MemStickScreen::OnUseInternalStorage); - leftColumn->Add(new TextView(iz->T("InternalStorageDesc", "* Warning! Data will be deleted if you uninstall PPSSPP!\n* Data cannot be shared between PPSSPP regular/Gold\n* USB access through " -#ifdef GOLD - "Android/data/org.ppsspp.ppssppgold/files" + // Consider https://www.compart.com/en/unicode/U+26A0 (unicode warning sign?)? or a graphic? + leftColumn->Add(new TextView(iz->T("DataWillBeLostOnUninstall", "Warning! Data will be lost when you uninstall PPSSPP!")))->SetBullet(true); + leftColumn->Add(new TextView(iz->T("DataCannotBeShared", "Data cannot be shared between PPSSPP regular / Gold!")))->SetBullet(true); +#if GOLD + leftColumn->Add(new TextView(iz->T("USBAccessThrough", "USB access through Android/data/org.ppsspp.ppssppgold/files")))->SetBullet(true); #else - "Android/data/org.ppsspp.ppsspp/files" + leftColumn->Add(new TextView(iz->T("USBAccessThrough", "USB access through Android/data/org.ppsspp.ppsspp/files")))->SetBullet(true); #endif - ), ALIGN_LEFT, false)); leftColumn->Add(new Spacer(new LinearLayoutParams(FILL_PARENT, 12.0f, 0.0f))); From fee06fc21a3d0c0db1946ccf22b82d806ab219e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 6 Aug 2021 22:54:43 +0200 Subject: [PATCH 104/336] Tweaks --- UI/MemStickScreen.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UI/MemStickScreen.cpp b/UI/MemStickScreen.cpp index dc4084b039..e946768f35 100644 --- a/UI/MemStickScreen.cpp +++ b/UI/MemStickScreen.cpp @@ -155,9 +155,9 @@ void MemStickScreen::CreateViews() { leftColumn->Add(new Choice(iz->T("Use App Private Directory")))->OnClick.Handle(this, &MemStickScreen::OnUseInternalStorage); // Consider https://www.compart.com/en/unicode/U+26A0 (unicode warning sign?)? or a graphic? leftColumn->Add(new TextView(iz->T("DataWillBeLostOnUninstall", "Warning! Data will be lost when you uninstall PPSSPP!")))->SetBullet(true); - leftColumn->Add(new TextView(iz->T("DataCannotBeShared", "Data cannot be shared between PPSSPP regular / Gold!")))->SetBullet(true); + leftColumn->Add(new TextView(iz->T("DataCannotBeShared", "Data CANNOT be shared between PPSSPP regular/Gold!")))->SetBullet(true); #if GOLD - leftColumn->Add(new TextView(iz->T("USBAccessThrough", "USB access through Android/data/org.ppsspp.ppssppgold/files")))->SetBullet(true); + leftColumn->Add(new TextView(iz->T("USBAccessThroughGold", "USB access through Android/data/org.ppsspp.ppssppgold/files")))->SetBullet(true); #else leftColumn->Add(new TextView(iz->T("USBAccessThrough", "USB access through Android/data/org.ppsspp.ppsspp/files")))->SetBullet(true); #endif From 1e9a391f650ee7b5fec654678a486e8f79f49e48 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 6 Aug 2021 23:14:37 -0700 Subject: [PATCH 105/336] SaveState: Add const for save compression. --- Common/Serialize/Serializer.cpp | 55 +++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/Common/Serialize/Serializer.cpp b/Common/Serialize/Serializer.cpp index a04448cc8a..7ba0ad2183 100644 --- a/Common/Serialize/Serializer.cpp +++ b/Common/Serialize/Serializer.cpp @@ -25,6 +25,14 @@ #include "Common/File/FileUtil.h" #include "Common/StringUtils.h" +enum class SerializeCompressType { + NONE = 0, + SNAPPY = 1, + ZSTD = 2, +}; + +static constexpr SerializeCompressType SAVE_TYPE = SerializeCompressType::SNAPPY; + PointerWrapSection PointerWrap::Section(const char *title, int ver) { return Section(title, ver, ver); } @@ -289,12 +297,17 @@ CChunkFileReader::Error CChunkFileReader::LoadFile(const Path &filename, std::st u8 *uncomp_buffer = new u8[header.UncompressedSize]; size_t uncomp_size = header.UncompressedSize; bool success = false; - if (header.Compress == 1) { + if (SerializeCompressType(header.Compress) == SerializeCompressType::SNAPPY) { auto status = snappy_uncompress((const char *)buffer, sz, (char *)uncomp_buffer, &uncomp_size); success = status == SNAPPY_OK; - } else { - auto status = ZSTD_decompress((char *)uncomp_buffer, uncomp_size, (const char *)buffer, sz); + } else if (SerializeCompressType(header.Compress) == SerializeCompressType::ZSTD) { + size_t status = ZSTD_decompress((char *)uncomp_buffer, uncomp_size, (const char *)buffer, sz); success = !ZSTD_isError(status); + if (success) { + uncomp_size = status; + } + } else { + ERROR_LOG(SAVESTATE, "ChunkReader: Unexpected compression type %d", header.Compress); } if (!success) { ERROR_LOG(SAVESTATE, "ChunkReader: Failed to decompress file"); @@ -336,16 +349,40 @@ CChunkFileReader::Error CChunkFileReader::SaveFile(const Path &filename, const s } // Make sure we can allocate a buffer to compress before compressing. - size_t write_len = ZSTD_compressBound(sz); - u8 *compressed_buffer = (u8 *)malloc(write_len); + size_t write_len; + SerializeCompressType usedType = SAVE_TYPE; + switch (usedType) { + case SerializeCompressType::NONE: + write_len = 0; + break; + case SerializeCompressType::SNAPPY: + write_len = snappy_max_compressed_length(sz); + break; + case SerializeCompressType::ZSTD: + write_len = ZSTD_compressBound(sz); + break; + } + u8 *compressed_buffer = write_len == 0 ? nullptr : (u8 *)malloc(write_len); u8 *write_buffer = buffer; if (!compressed_buffer) { - ERROR_LOG(SAVESTATE, "ChunkReader: Unable to allocate compressed buffer"); + if (write_len != 0) + ERROR_LOG(SAVESTATE, "ChunkReader: Unable to allocate compressed buffer"); // We'll save uncompressed. Better than not saving... write_len = sz; + usedType = SerializeCompressType::NONE; } else { - // TODO: If free disk space is low, we could max this out to 22? - write_len = ZSTD_compress(compressed_buffer, write_len, buffer, sz, 1); + switch (usedType) { + case SerializeCompressType::NONE: + _assert_(false); + break; + case SerializeCompressType::SNAPPY: + snappy_compress((const char *)buffer, sz, (char *)compressed_buffer, &write_len); + break; + case SerializeCompressType::ZSTD: + // TODO: If free disk space is low, we could max this out to 22? + write_len = ZSTD_compress(compressed_buffer, write_len, buffer, sz, 1); + break; + } free(buffer); write_buffer = compressed_buffer; @@ -353,7 +390,7 @@ CChunkFileReader::Error CChunkFileReader::SaveFile(const Path &filename, const s // Create header SChunkHeader header{}; - header.Compress = compressed_buffer ? 2 : 0; + header.Compress = (int)usedType; header.Revision = REVISION_CURRENT; header.ExpectedSize = (u32)write_len; header.UncompressedSize = (u32)sz; From 0097772d3c01c0ac604c047a1baa7da9e93ec2ad Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 6 Aug 2021 23:42:43 -0700 Subject: [PATCH 106/336] SaveState: Ask to include xxhash in frames. Hopefully this should detect any decompression errors better. --- Common/Serialize/Serializer.cpp | 34 +++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/Common/Serialize/Serializer.cpp b/Common/Serialize/Serializer.cpp index 7ba0ad2183..78f4ac1342 100644 --- a/Common/Serialize/Serializer.cpp +++ b/Common/Serialize/Serializer.cpp @@ -31,7 +31,7 @@ enum class SerializeCompressType { ZSTD = 2, }; -static constexpr SerializeCompressType SAVE_TYPE = SerializeCompressType::SNAPPY; +static constexpr SerializeCompressType SAVE_TYPE = SerializeCompressType::ZSTD; PointerWrapSection PointerWrap::Section(const char *title, int ver) { return Section(title, ver, ver); @@ -371,21 +371,43 @@ CChunkFileReader::Error CChunkFileReader::SaveFile(const Path &filename, const s write_len = sz; usedType = SerializeCompressType::NONE; } else { + bool success = true; switch (usedType) { case SerializeCompressType::NONE: _assert_(false); break; case SerializeCompressType::SNAPPY: - snappy_compress((const char *)buffer, sz, (char *)compressed_buffer, &write_len); + success = snappy_compress((const char *)buffer, sz, (char *)compressed_buffer, &write_len) == SNAPPY_OK; break; case SerializeCompressType::ZSTD: - // TODO: If free disk space is low, we could max this out to 22? - write_len = ZSTD_compress(compressed_buffer, write_len, buffer, sz, 1); + { + auto ctx = ZSTD_createCCtx(); + if (!ctx) { + success = false; + } else { + ZSTD_CCtx_setParameter(ctx, ZSTD_c_compressionLevel, 1); + ZSTD_CCtx_setParameter(ctx, ZSTD_c_checksumFlag, 1); + ZSTD_CCtx_setPledgedSrcSize(ctx, sz); + // TODO: If free disk space is low, we could max this out to 22? + write_len = ZSTD_compress2(ctx, compressed_buffer, write_len, buffer, sz); + success = !ZSTD_isError(write_len); + } + ZSTD_freeCCtx(ctx); + } break; } - free(buffer); - write_buffer = compressed_buffer; + if (success) { + free(buffer); + write_buffer = compressed_buffer; + } else { + ERROR_LOG(SAVESTATE, "ChunkReader: Compression failed"); + free(compressed_buffer); + + // We can still save uncompressed. + write_len = sz; + usedType = SerializeCompressType::NONE; + } } // Create header From dc12b3a7c8839c8e1dc1f331c8070ed38cba9458 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 6 Aug 2021 23:46:07 -0700 Subject: [PATCH 107/336] SaveState: Use default ZSTD compress level. --- Common/Serialize/Serializer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Common/Serialize/Serializer.cpp b/Common/Serialize/Serializer.cpp index 78f4ac1342..6000328a75 100644 --- a/Common/Serialize/Serializer.cpp +++ b/Common/Serialize/Serializer.cpp @@ -385,10 +385,10 @@ CChunkFileReader::Error CChunkFileReader::SaveFile(const Path &filename, const s if (!ctx) { success = false; } else { - ZSTD_CCtx_setParameter(ctx, ZSTD_c_compressionLevel, 1); + // TODO: If free disk space is low, we could max this out to 22? + ZSTD_CCtx_setParameter(ctx, ZSTD_c_compressionLevel, ZSTD_CLEVEL_DEFAULT); ZSTD_CCtx_setParameter(ctx, ZSTD_c_checksumFlag, 1); ZSTD_CCtx_setPledgedSrcSize(ctx, sz); - // TODO: If free disk space is low, we could max this out to 22? write_len = ZSTD_compress2(ctx, compressed_buffer, write_len, buffer, sz); success = !ZSTD_isError(write_len); } From eba67d5fcdc09b8f9e4b3bdfaca95ffcd71750b4 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 8 May 2021 09:42:52 -0700 Subject: [PATCH 108/336] SaveState: Show a warning if saved after savestate. If you load a save state from before you created savedata (or from a different path of savedata), some games will refuse to save. This shows a warning since it can be a confusing situation. We could potentially add an undo for loading state, to give an option for getting back after this warning. --- Core/Dialog/PSPSaveDialog.cpp | 14 +++++--- Core/SaveState.cpp | 64 +++++++++++++++++++++++++++-------- Core/SaveState.h | 3 ++ 3 files changed, 62 insertions(+), 19 deletions(-) diff --git a/Core/Dialog/PSPSaveDialog.cpp b/Core/Dialog/PSPSaveDialog.cpp index b54a8ddd62..2ff51d7301 100755 --- a/Core/Dialog/PSPSaveDialog.cpp +++ b/Core/Dialog/PSPSaveDialog.cpp @@ -25,23 +25,23 @@ #include #include -#include "Common/Data/Text/I18n.h" #include "Common/Data/Encoding/Utf8.h" -#include "Common/Thread/ThreadUtil.h" - +#include "Common/Data/Text/I18n.h" #include "Common/File/FileUtil.h" #include "Common/Serialize/Serializer.h" #include "Common/Serialize/SerializeFuncs.h" #include "Common/StringUtils.h" +#include "Common/Thread/ThreadUtil.h" +#include "Core/Dialog/PSPSaveDialog.h" #include "Core/FileSystems/MetaFileSystem.h" #include "Core/Util/PPGeDraw.h" #include "Core/HLE/sceCtrl.h" #include "Core/HLE/sceUtility.h" +#include "Core/HW/MemoryStick.h" #include "Core/MemMapHelpers.h" #include "Core/Config.h" #include "Core/Reporting.h" -#include "Core/HW/MemoryStick.h" -#include "Core/Dialog/PSPSaveDialog.h" +#include "Core/SaveState.h" const static float FONT_SCALE = 0.55f; @@ -1048,6 +1048,7 @@ void PSPSaveDialog::ExecuteIOAction() { } break; case DS_SAVE_SAVING: + SaveState::NotifySaveData(); if (param.Save(param.GetPspParam(), GetSelectedSaveDirName()) == 0) { display = DS_SAVE_DONE; } else { @@ -1085,6 +1086,7 @@ void PSPSaveDialog::ExecuteNotVisibleIOAction() { break; case SCE_UTILITY_SAVEDATA_TYPE_SAVE: // Only save and exit case SCE_UTILITY_SAVEDATA_TYPE_AUTOSAVE: + SaveState::NotifySaveData(); result = param.Save(param.GetPspParam(), GetSelectedSaveDirName()); break; case SCE_UTILITY_SAVEDATA_TYPE_SIZES: @@ -1129,6 +1131,7 @@ void PSPSaveDialog::ExecuteNotVisibleIOAction() { // TODO: Should reset the directory's other files. case SCE_UTILITY_SAVEDATA_TYPE_MAKEDATA: case SCE_UTILITY_SAVEDATA_TYPE_MAKEDATASECURE: + SaveState::NotifySaveData(); result = param.Save(param.GetPspParam(), GetSelectedSaveDirName(), param.GetPspParam()->mode == SCE_UTILITY_SAVEDATA_TYPE_MAKEDATASECURE); if (result == SCE_UTILITY_SAVEDATA_ERROR_SAVE_MS_NOSPACE) { result = SCE_UTILITY_SAVEDATA_ERROR_RW_MEMSTICK_FULL; @@ -1136,6 +1139,7 @@ void PSPSaveDialog::ExecuteNotVisibleIOAction() { break; case SCE_UTILITY_SAVEDATA_TYPE_WRITEDATA: case SCE_UTILITY_SAVEDATA_TYPE_WRITEDATASECURE: + SaveState::NotifySaveData(); result = param.Save(param.GetPspParam(), GetSelectedSaveDirName(), param.GetPspParam()->mode == SCE_UTILITY_SAVEDATA_TYPE_WRITEDATASECURE); break; case SCE_UTILITY_SAVEDATA_TYPE_READDATA: diff --git a/Core/SaveState.cpp b/Core/SaveState.cpp index 568a1269d6..8875e01494 100644 --- a/Core/SaveState.cpp +++ b/Core/SaveState.cpp @@ -260,6 +260,8 @@ namespace SaveState // 4 hours of total gameplay since the virtual PSP started the game. static const u64 STALE_STATE_TIME = 4 * 3600 * 1000000ULL; static int saveStateGeneration = 0; + static int saveDataGeneration = 0; + static int lastSaveDataGeneration = 0; static std::string saveStateInitialGitVersion = ""; // TODO: Should this be configurable? @@ -289,6 +291,12 @@ namespace SaveState } else { saveStateGeneration = 1; } + if (s >= 3) { + // Keep track of savedata (not save states) too. + Do(p, saveDataGeneration); + } else { + saveDataGeneration = 0; + } // Gotta do CoreTiming first since we'll restore into it. CoreTiming::DoState(p); @@ -761,6 +769,37 @@ namespace SaveState return state < gitVer; } + static Status TriggerLoadWarnings(std::string &callbackMessage) { + auto sc = GetI18NCategory("Screen"); + + if (g_Config.bHideStateWarnings) + return Status::SUCCESS; + + if (IsStale()) { + // For anyone wondering why (too long to put on the screen in an osm): + // Using save states instead of saves simulates many hour play sessions. + // Sometimes this exposes game bugs that were rarely seen on real devices, + // because few people played on a real PSP for 10 hours straight. + callbackMessage = sc->T("Loaded. Save in game, restart, and load for less bugs."); + return Status::WARNING; + } + if (IsOldVersion()) { + // Save states also preserve bugs from old PPSSPP versions, so warn. + callbackMessage = sc->T("Loaded. Save in game, restart, and load for less bugs."); + return Status::WARNING; + } + // If the loaded state (saveDataGeneration) is older, the game may prevent saving again. + // This can happen with newer too, but ignore to/from 0 as a common likely safe case. + if (saveDataGeneration != lastSaveDataGeneration && saveDataGeneration != 0 && lastSaveDataGeneration != 0) { + if (saveDataGeneration < lastSaveDataGeneration) + callbackMessage = sc->T("Loaded. Game may refuse to save over newer savedata."); + else + callbackMessage = sc->T("Loaded. Game may refuse to save over different savedata."); + return Status::WARNING; + } + return Status::SUCCESS; + } + void Process() { if (g_Config.iRewindFlipFrequency != 0 && gpuStats.numFlips != 0) @@ -806,22 +845,12 @@ namespace SaveState // Use the state's latest version as a guess for saveStateInitialGitVersion. result = CChunkFileReader::Load(op.filename, &saveStateInitialGitVersion, state, &errorString); if (result == CChunkFileReader::ERROR_NONE) { - callbackMessage = op.slot != LOAD_UNDO_SLOT ? slot_prefix + sc->T("Loaded State") : sc->T("State load undone"); - callbackResult = Status::SUCCESS; + callbackMessage = op.slot != LOAD_UNDO_SLOT ? sc->T("Loaded State") : sc->T("State load undone"); + callbackResult = TriggerLoadWarnings(callbackMessage); hasLoadedState = true; - if (!g_Config.bHideStateWarnings && IsStale()) { - // For anyone wondering why (too long to put on the screen in an osm): - // Using save states instead of saves simulates many hour play sessions. - // Sometimes this exposes game bugs that were rarely seen on real devices, - // because few people played on a real PSP for 10 hours straight. - callbackMessage = slot_prefix + sc->T("Loaded. Save in game, restart, and load for less bugs."); - callbackResult = Status::WARNING; - } else if (!g_Config.bHideStateWarnings && IsOldVersion()) { - // Save states also preserve bugs from old PPSSPP versions, so warn. - callbackMessage = slot_prefix + sc->T("Loaded. Save in game, restart, and load for less bugs."); - callbackResult = Status::WARNING; - } + if (!slot_prefix.empty()) + callbackMessage = slot_prefix + callbackMessage; #ifndef MOBILE_DEVICE if (g_Config.bSaveLoadResetsAVdumping) { @@ -945,6 +974,11 @@ namespace SaveState } } + void NotifySaveData() { + saveDataGeneration++; + lastSaveDataGeneration = saveDataGeneration; + } + void Cleanup() { if (needsRestart) { PSP_Shutdown(); @@ -971,6 +1005,8 @@ namespace SaveState hasLoadedState = false; saveStateGeneration = 0; + saveDataGeneration = 0; + lastSaveDataGeneration = 0; saveStateInitialGitVersion.clear(); } diff --git a/Core/SaveState.h b/Core/SaveState.h index 40d72ca109..c9b7e663d1 100644 --- a/Core/SaveState.h +++ b/Core/SaveState.h @@ -100,6 +100,9 @@ namespace SaveState // Check if there's any save stating needing to be done. Normally called once per frame. void Process(); + // Notify save state code that new save data has been written. + void NotifySaveData(); + // Cleanup by triggering a restart if needed. void Cleanup(); }; From 96d04e582bf65c2c3214c063cab894fa40131f7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 7 Aug 2021 10:47:11 +0200 Subject: [PATCH 109/336] Only pop up the config save error after main and settings screens. --- Core/Config.cpp | 1 - UI/GameSettingsScreen.cpp | 5 ++++- UI/MainScreen.cpp | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index 27bfd3b5cb..21208ea10f 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -1490,7 +1490,6 @@ bool Config::Save(const char *saveReason) { if (!iniFile.Save(iniFilename_)) { ERROR_LOG(LOADER, "Error saving config (%s)- can't write ini '%s'", saveReason, iniFilename_.c_str()); - System_SendMessage("toast", "Failed to save settings!\nCheck permissions, or try to restart the device."); return false; } INFO_LOG(LOADER, "Config saved (%s): '%s'", saveReason, iniFilename_.c_str()); diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 6b1e97e368..5f35d37b78 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -1232,7 +1232,10 @@ void GameSettingsScreen::onFinish(DialogResult result) { Reporting::Enable(enableReports_, "report.ppsspp.org"); Reporting::UpdateConfig(); - g_Config.Save("GameSettingsScreen::onFinish"); + if (!g_Config.Save("GameSettingsScreen::onFinish")) { + System_SendMessage("toast", "Failed to save settings!\nCheck permissions, or try to restart the device."); + } + if (editThenRestore_) { // In case we didn't have the title yet before, try again. std::shared_ptr info = g_gameInfoCache->GetInfo(nullptr, gamePath_, 0); diff --git a/UI/MainScreen.cpp b/UI/MainScreen.cpp index 4009dc7c42..ef5847c7c4 100644 --- a/UI/MainScreen.cpp +++ b/UI/MainScreen.cpp @@ -1409,7 +1409,9 @@ UI::EventReturn MainScreen::OnForums(UI::EventParams &e) { UI::EventReturn MainScreen::OnExit(UI::EventParams &e) { // Let's make sure the config was saved, since it may not have been. - g_Config.Save("MainScreen::OnExit"); + if (!g_Config.Save("MainScreen::OnExit")) { + System_SendMessage("toast", "Failed to save settings!\nCheck permissions, or try to restart the device."); + } // Request the framework to exit cleanly. System_SendMessage("finish", ""); From 7c1c06ed66cc1bf728ba93fe690d777d54e4f73d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 7 Aug 2021 11:00:44 +0200 Subject: [PATCH 110/336] If in legacy storage mode from an earlier install, we still might need to ask for permission. So can't cap on that, until Android removes legacy storage access entirely, probably in Android 13... Should help nassau-tk's issue in #13847. --- android/AndroidManifest.xml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 833ed5827b..f4f594b79f 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -19,8 +19,11 @@ - - + + + + From 43ba9082251cf5a6a794f844bb9c7f297334c8cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 7 Aug 2021 11:54:45 +0200 Subject: [PATCH 111/336] Propagate errors from file identification upwards better. --- Core/Loaders.cpp | 58 +++++++++++++++++++++------------ Core/Loaders.h | 2 +- Core/System.cpp | 9 +++-- Core/Util/GameManager.cpp | 3 +- UI/GameInfoCache.cpp | 4 ++- UI/MainScreen.cpp | 3 +- UI/SavedataScreen.cpp | 6 ++-- android/jni/AndroidContentURI.h | 3 ++ 8 files changed, 58 insertions(+), 30 deletions(-) diff --git a/Core/Loaders.cpp b/Core/Loaders.cpp index 226cb597c3..9eccacc215 100644 --- a/Core/Loaders.cpp +++ b/Core/Loaders.cpp @@ -59,17 +59,19 @@ FileLoader *ConstructFileLoader(const Path &filename) { } // TODO : improve, look in the file more -IdentifiedFileType Identify_File(FileLoader *fileLoader) { +IdentifiedFileType Identify_File(FileLoader *fileLoader, std::string *errorString) { + *errorString = ""; if (fileLoader == nullptr) { - ERROR_LOG(LOADER, "Invalid fileLoader"); + *errorString = "Invalid fileLoader"; return IdentifiedFileType::ERROR_IDENTIFYING; } if (fileLoader->GetPath().size() == 0) { - ERROR_LOG(LOADER, "Invalid filename %s", fileLoader->GetPath().c_str()); + *errorString = "Invalid filename " + fileLoader->GetPath().ToString(); return IdentifiedFileType::ERROR_IDENTIFYING; } if (!fileLoader->Exists()) { + *errorString = "IdentifyFile: File doesn't exist" + fileLoader->GetPath().ToString(); return IdentifiedFileType::ERROR_IDENTIFYING; } @@ -82,10 +84,11 @@ IdentifiedFileType Identify_File(FileLoader *fileLoader) { // each sector in a mode2 image starts with these 12 bytes if (memcmp(sync,"\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00", 12) == 0) { + *errorString = "ISO in Mode 2: Not a PSP game"; return IdentifiedFileType::ISO_MODE2; } - // maybe it also just happened to have that size, + // maybe it also just happened to have that size, let's assume it's a PSP ISO and error out later if it's not. } return IdentifiedFileType::PSP_ISO; } else if (extension == ".cso") { @@ -127,7 +130,7 @@ IdentifiedFileType Identify_File(FileLoader *fileLoader) { size_t readSize = fileLoader->ReadAt(0, 4, 1, &id); if (readSize != 1) { - ERROR_LOG(LOADER, "Failed to read identification bytes"); + *errorString = "Failed to read identification bytes"; return IdentifiedFileType::ERROR_IDENTIFYING; } @@ -201,7 +204,8 @@ IdentifiedFileType Identify_File(FileLoader *fileLoader) { } FileLoader *ResolveFileLoaderTarget(FileLoader *fileLoader) { - IdentifiedFileType type = Identify_File(fileLoader); + std::string errorString; + IdentifiedFileType type = Identify_File(fileLoader, &errorString); if (type == IdentifiedFileType::PSP_PBP_DIRECTORY) { const Path ebootFilename = ResolvePBPFile(fileLoader->GetPath()); if (ebootFilename != fileLoader->GetPath()) { @@ -232,14 +236,15 @@ Path ResolvePBPFile(const Path &filename) { bool LoadFile(FileLoader **fileLoaderPtr, std::string *error_string) { FileLoader *&fileLoader = *fileLoaderPtr; // Note that this can modify filename! - switch (Identify_File(fileLoader)) { + IdentifiedFileType type = Identify_File(fileLoader, error_string); + switch (type) { case IdentifiedFileType::PSP_PBP_DIRECTORY: { // TODO: Perhaps we should/can never get here now? fileLoader = ResolveFileLoaderTarget(fileLoader); if (fileLoader->Exists()) { INFO_LOG(LOADER, "File is a PBP in a directory!"); - IdentifiedFileType ebootType = Identify_File(fileLoader); + IdentifiedFileType ebootType = Identify_File(fileLoader, error_string); if (ebootType == IdentifiedFileType::PSP_ISO_NP) { InitMemoryForGameISO(fileLoader); pspFileSystem.SetStartingDirectory("disc0:/PSP_GAME/USRDIR"); @@ -249,6 +254,10 @@ bool LoadFile(FileLoader **fileLoaderPtr, std::string *error_string) { *error_string = "PS1 EBOOTs are not supported by PPSSPP."; coreState = CORE_BOOT_ERROR; return false; + } else if (ebootType == IdentifiedFileType::ERROR_IDENTIFYING) { + // IdentifyFile will have written to errorString. + coreState = CORE_BOOT_ERROR; + return false; } std::string dir = fileLoader->GetPath().GetDirectory(); @@ -268,7 +277,7 @@ bool LoadFile(FileLoader **fileLoaderPtr, std::string *error_string) { case IdentifiedFileType::PSP_PBP: case IdentifiedFileType::PSP_ELF: { - INFO_LOG(LOADER,"File is an ELF or loose PBP!"); + INFO_LOG(LOADER, "File is an ELF or loose PBP!"); return Load_PSP_ELF_PBP(fileLoader, error_string); } @@ -282,13 +291,6 @@ bool LoadFile(FileLoader **fileLoaderPtr, std::string *error_string) { *error_string = "PS1 EBOOTs are not supported by PPSSPP."; break; - case IdentifiedFileType::ERROR_IDENTIFYING: - ERROR_LOG(LOADER, "Could not read file enough to identify it"); - *error_string = fileLoader ? fileLoader->LatestError() : ""; - if (error_string->empty()) - *error_string = "Error reading file"; - break; - case IdentifiedFileType::ARCHIVE_RAR: #ifdef WIN32 *error_string = "RAR file detected (Require WINRAR)"; @@ -336,9 +338,20 @@ bool LoadFile(FileLoader **fileLoaderPtr, std::string *error_string) { case IdentifiedFileType::UNKNOWN_BIN: case IdentifiedFileType::UNKNOWN_ELF: case IdentifiedFileType::UNKNOWN: + ERROR_LOG(LOADER, "Unknown file type: %s (%s)", fileLoader->GetPath().c_str(), error_string->c_str()); + *error_string = "Unknown file type: " + fileLoader->GetPath().ToString(); + break; + + case IdentifiedFileType::ERROR_IDENTIFYING: + *error_string = *error_string + ": " + (fileLoader ? fileLoader->LatestError() : ""); + if (error_string->empty()) + *error_string = "Error reading file"; + ERROR_LOG(LOADER, "Error while identifying file: %s", error_string->c_str()); + break; + default: - ERROR_LOG(LOADER, "Failed to identify file: %s", fileLoader->GetPath().c_str()); - *error_string = "Failed to identify file"; + *error_string = StringFromFormat("Unhandled identified file type %d", (int)type); + ERROR_LOG(LOADER, "%s", error_string->c_str()); break; } @@ -347,7 +360,7 @@ bool LoadFile(FileLoader **fileLoaderPtr, std::string *error_string) { } bool UmdReplace(const Path &filepath, std::string &error) { - IFileSystem* currentUMD = pspFileSystem.GetSystem("disc0:"); + IFileSystem *currentUMD = pspFileSystem.GetSystem("disc0:"); if (!currentUMD) { error = "has no disc"; @@ -364,7 +377,10 @@ bool UmdReplace(const Path &filepath, std::string &error) { UpdateLoadedFile(loadedFile); loadedFile = ResolveFileLoaderTarget(loadedFile); - IdentifiedFileType type = Identify_File(loadedFile); + + + std::string errorString; + IdentifiedFileType type = Identify_File(loadedFile, &errorString); switch (type) { case IdentifiedFileType::PSP_ISO: @@ -377,7 +393,7 @@ bool UmdReplace(const Path &filepath, std::string &error) { break; default: - error = "Unsupported file type:" + std::to_string((int)type); + error = "Unsupported file type: " + std::to_string((int)type) + " " + errorString; return false; break; } diff --git a/Core/Loaders.h b/Core/Loaders.h index cbf4329547..131c82451b 100644 --- a/Core/Loaders.h +++ b/Core/Loaders.h @@ -144,7 +144,7 @@ FileLoader *ResolveFileLoaderTarget(FileLoader *fileLoader); Path ResolvePBPDirectory(const Path &filename); Path ResolvePBPFile(const Path &filename); -IdentifiedFileType Identify_File(FileLoader *fileLoader); +IdentifiedFileType Identify_File(FileLoader *fileLoader, std::string *errorString); class FileLoaderFactory { public: diff --git a/Core/System.cpp b/Core/System.cpp index d11fb469fe..87392b22eb 100644 --- a/Core/System.cpp +++ b/Core/System.cpp @@ -216,7 +216,7 @@ bool DiscIDFromGEDumpPath(const Path &path, FileLoader *fileLoader, std::string } } -bool CPU_Init() { +bool CPU_Init(std::string *errorString) { coreState = CORE_POWERUP; currentMIPS = &mipsr4k; @@ -237,7 +237,8 @@ bool CPU_Init() { loadedFile = new RamCachingFileLoader(loadedFile); } #endif - IdentifiedFileType type = Identify_File(loadedFile); + + IdentifiedFileType type = Identify_File(loadedFile, errorString); // TODO: Put this somewhere better? if (!coreParameter.mountIso.empty()) { @@ -277,6 +278,8 @@ bool CPU_Init() { allowPlugins = false; break; default: + // Can we even get here? + WARN_LOG(LOADER, "CPU_Init didn't recognize file. %s", errorString->c_str()); break; } @@ -413,7 +416,7 @@ bool PSP_InitStart(const CoreParameter &coreParam, std::string *error_string) { pspIsIniting = true; PSP_SetLoading("Loading game..."); - if (!CPU_Init()) { + if (!CPU_Init(&coreParameter.errorString)) { *error_string = coreParameter.errorString; if (error_string->empty()) { *error_string = "Failed initializing CPU/Memory"; diff --git a/Core/Util/GameManager.cpp b/Core/Util/GameManager.cpp index 96688e9cdd..26b0581c95 100644 --- a/Core/Util/GameManager.cpp +++ b/Core/Util/GameManager.cpp @@ -399,7 +399,8 @@ std::string GameManager::GetGameID(const Path &path) const { auto loader = ConstructFileLoader(path); std::string id; - switch (Identify_File(loader)) { + std::string errorString; + switch (Identify_File(loader, &errorString)) { case IdentifiedFileType::PSP_PBP_DIRECTORY: delete loader; loader = ConstructFileLoader(ResolvePBPFile(path)); diff --git a/UI/GameInfoCache.cpp b/UI/GameInfoCache.cpp index 6fac432f99..3d8db8fd7c 100644 --- a/UI/GameInfoCache.cpp +++ b/UI/GameInfoCache.cpp @@ -356,8 +356,10 @@ public: return; } + std::string errorString; + info_->working = true; - info_->fileType = Identify_File(info_->GetFileLoader().get()); + info_->fileType = Identify_File(info_->GetFileLoader().get(), &errorString); switch (info_->fileType) { case IdentifiedFileType::PSP_PBP: case IdentifiedFileType::PSP_PBP_DIRECTORY: diff --git a/UI/MainScreen.cpp b/UI/MainScreen.cpp index ef5847c7c4..2bde92b1af 100644 --- a/UI/MainScreen.cpp +++ b/UI/MainScreen.cpp @@ -74,7 +74,8 @@ bool LaunchFile(ScreenManager *screenManager, const Path &path) { return false; } - IdentifiedFileType type = Identify_File(loader); + std::string errorString; + IdentifiedFileType type = Identify_File(loader, &errorString); delete loader; switch (type) { diff --git a/UI/SavedataScreen.cpp b/UI/SavedataScreen.cpp index 97fe8cb6d1..1c44d8127c 100644 --- a/UI/SavedataScreen.cpp +++ b/UI/SavedataScreen.cpp @@ -426,7 +426,8 @@ bool SavedataBrowser::ByFilename(const UI::View *v1, const UI::View *v2) { static time_t GetTotalSize(const SavedataButton *b) { auto fileLoader = std::unique_ptr(ConstructFileLoader(b->GamePath())); - switch (Identify_File(fileLoader.get())) { + std::string errorString; + switch (Identify_File(fileLoader.get(), &errorString)) { case IdentifiedFileType::PSP_PBP_DIRECTORY: case IdentifiedFileType::PSP_SAVEDATA_DIRECTORY: return File::GetDirectoryRecursiveSize(ResolvePBPDirectory(b->GamePath()), nullptr, File::GETFILES_GETHIDDEN); @@ -449,7 +450,8 @@ static time_t GetDateSeconds(const SavedataButton *b) { auto fileLoader = std::unique_ptr(ConstructFileLoader(b->GamePath())); tm datetm; bool success; - if (Identify_File(fileLoader.get()) == IdentifiedFileType::PSP_SAVEDATA_DIRECTORY) { + std::string errorString; + if (Identify_File(fileLoader.get(), &errorString) == IdentifiedFileType::PSP_SAVEDATA_DIRECTORY) { success = File::GetModifTime(b->GamePath() / "PARAM.SFO", datetm); } else { success = File::GetModifTime(b->GamePath(), datetm); diff --git a/android/jni/AndroidContentURI.h b/android/jni/AndroidContentURI.h index 92e77afb62..880675bcb9 100644 --- a/android/jni/AndroidContentURI.h +++ b/android/jni/AndroidContentURI.h @@ -37,13 +37,16 @@ public: std::vector parts; SplitString(components, '/', parts); if (parts.size() == 3) { + // Single file URI. provider = parts[0]; if (parts[1] != "tree") { return false; } root = UriDecode(parts[2]); + // file empty signals this type. return true; } else if (parts.size() == 5) { + // Tree URI provider = parts[0]; if (parts[1] != "tree") { return false; From ed7053329ab26f56e2dc257557bac37c4b88025b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 7 Aug 2021 12:17:31 +0200 Subject: [PATCH 112/336] Fix some mis-handling of single file URI. Fixes the Load... button. --- android/jni/AndroidContentURI.h | 40 +++++++++++++++++++++++---------- unittest/UnitTest.cpp | 31 +++++++++++++++---------- 2 files changed, 47 insertions(+), 24 deletions(-) diff --git a/android/jni/AndroidContentURI.h b/android/jni/AndroidContentURI.h index 880675bcb9..07977a2d71 100644 --- a/android/jni/AndroidContentURI.h +++ b/android/jni/AndroidContentURI.h @@ -4,6 +4,7 @@ #include "Common/StringUtils.h" #include "Common/Net/URL.h" +#include "Common/Log.h" // Utility to deal with Android storage URIs of the forms: // content://com.android.externalstorage.documents/tree/primary%3APSP%20ISO @@ -39,12 +40,20 @@ public: if (parts.size() == 3) { // Single file URI. provider = parts[0]; - if (parts[1] != "tree") { + if (parts[1] == "tree") { + // Single directory URI. + // Not sure when we encounter these? + // file empty signals this type. + root = UriDecode(parts[2]); + return true; + } else if (parts[1] == "document") { + // root empty signals this type. + file = UriDecode(parts[2]); + return true; + } else { + // What's this? return false; } - root = UriDecode(parts[2]); - // file empty signals this type. - return true; } else if (parts.size() == 5) { // Tree URI provider = parts[0]; @@ -65,6 +74,11 @@ public: } AndroidContentURI WithRootFilePath(const std::string &filePath) { + if (root.empty()) { + ERROR_LOG(SYSTEM, "WithRootFilePath cannot be used with single file URIs."); + return *this; + } + AndroidContentURI uri = *this; uri.file = uri.root; if (!filePath.empty()) { @@ -106,11 +120,10 @@ public: return uri; } - bool IsTreeURI() const { - return file.empty(); - } - bool CanNavigateUp() const { + if (root.empty()) { + return false; + } return file.size() > root.size(); } @@ -145,7 +158,7 @@ public: } std::string GetLastPart() const { - if (IsTreeURI()) { + if (file.empty()) { // Can't do anything anyway. return std::string(); } @@ -182,7 +195,7 @@ public: } bool TreeContains(const AndroidContentURI &fileURI) { - if (!IsTreeURI()) { + if (root.empty()) { return false; } return startsWith(fileURI.file, root); @@ -192,8 +205,11 @@ public: if (file.empty()) { // Tree URI return StringFromFormat("content://%s/tree/%s", provider.c_str(), UriEncode(root).c_str()); + } else if (root.empty()) { + // Single file URI + return StringFromFormat("content://%s/document/%s", provider.c_str(), UriEncode(file).c_str()); } else { - // File URI + // File URI from Tree return StringFromFormat("content://%s/tree/%s/document/%s", provider.c_str(), UriEncode(root).c_str(), UriEncode(file).c_str()); } } @@ -208,6 +224,6 @@ public: } const std::string &RootPath() const { - return root; + return root.empty() ? file : root; } }; diff --git a/unittest/UnitTest.cpp b/unittest/UnitTest.cpp index f2ef8cdb88..b0585bc05b 100644 --- a/unittest/UnitTest.cpp +++ b/unittest/UnitTest.cpp @@ -622,33 +622,40 @@ static bool TestPath() { static bool TestAndroidContentURI() { static const char *treeURIString = "content://com.android.externalstorage.documents/tree/primary%3APSP%20ISO"; static const char *directoryURIString = "content://com.android.externalstorage.documents/tree/primary%3APSP%20ISO/document/primary%3APSP%20ISO"; - static const char *fileURIString = "content://com.android.externalstorage.documents/tree/primary%3APSP%20ISO/document/primary%3APSP%20ISO%2FTekken%206.iso"; + static const char *fileTreeURIString = "content://com.android.externalstorage.documents/tree/primary%3APSP%20ISO/document/primary%3APSP%20ISO%2FTekken%206.iso"; + static const char *fileNonTreeString = "content://com.android.externalstorage.documents/document/primary%3APSP%2Fcrash_bad_execaddr.prx"; + AndroidContentURI treeURI; EXPECT_TRUE(treeURI.Parse(std::string(treeURIString))); AndroidContentURI dirURI; EXPECT_TRUE(dirURI.Parse(std::string(directoryURIString))); + AndroidContentURI fileTreeURI; + EXPECT_TRUE(fileTreeURI.Parse(std::string(fileTreeURIString))); + AndroidContentURI fileTreeURICopy; + EXPECT_TRUE(fileTreeURICopy.Parse(std::string(fileTreeURIString))); AndroidContentURI fileURI; - EXPECT_TRUE(fileURI.Parse(std::string(fileURIString))); + EXPECT_TRUE(fileURI.Parse(std::string(fileNonTreeString))); - std::string lastPart = dirURI.GetLastPart(); + EXPECT_EQ_STR(fileTreeURI.GetLastPart(), std::string("Tekken 6.iso")); - EXPECT_EQ_STR(fileURI.GetLastPart(), std::string("Tekken 6.iso")); + EXPECT_TRUE(treeURI.TreeContains(fileTreeURI)); - EXPECT_TRUE(treeURI.TreeContains(fileURI)); - - EXPECT_TRUE(fileURI.CanNavigateUp()); - fileURI.NavigateUp(); - EXPECT_FALSE(fileURI.CanNavigateUp()); + EXPECT_TRUE(fileTreeURI.CanNavigateUp()); + fileTreeURI.NavigateUp(); + EXPECT_FALSE(fileTreeURI.CanNavigateUp()); - EXPECT_EQ_STR(fileURI.FilePath(), fileURI.RootPath()); + EXPECT_EQ_STR(fileTreeURI.FilePath(), fileTreeURI.RootPath()); - EXPECT_EQ_STR(fileURI.ToString(), std::string(directoryURIString)); + EXPECT_EQ_STR(fileTreeURI.ToString(), std::string(directoryURIString)); std::string diff; - EXPECT_TRUE(dirURI.ComputePathTo(fileURI, diff)); + EXPECT_TRUE(dirURI.ComputePathTo(fileTreeURICopy, diff)); EXPECT_EQ_STR(diff, std::string("Tekken 6.iso")); + EXPECT_EQ_STR(fileURI.GetFileExtension(), std::string(".prx")); + EXPECT_FALSE(fileURI.CanNavigateUp()); + return true; } From bac96bd47c12414ead56bb52544f409ea421eff5 Mon Sep 17 00:00:00 2001 From: iota97 Date: Sat, 7 Aug 2021 12:47:50 +0200 Subject: [PATCH 113/336] Allow to disable right analog diagonal --- Core/Config.cpp | 1 + Core/Config.h | 1 + UI/GamepadEmu.cpp | 8 ++++---- UI/TouchControlVisibilityScreen.cpp | 4 ++++ 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index 21208ea10f..42bed7e5aa 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -548,6 +548,7 @@ static ConfigSetting generalSettings[] = { ConfigSetting("RightAnalogRight", &g_Config.iRightAnalogRight, 0, true, true), ConfigSetting("RightAnalogPress", &g_Config.iRightAnalogPress, 0, true, true), ConfigSetting("RightAnalogCustom", &g_Config.bRightAnalogCustom, false, true, true), + ConfigSetting("RightAnalogDisableDiagonal", &g_Config.bRightAnalogDisableDiagonal, false, true, true), // "default" means let emulator decide, "" means disable. ConfigSetting("ReportingHost", &g_Config.sReportHost, "default"), diff --git a/Core/Config.h b/Core/Config.h index 6971630841..a19d3541cb 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -315,6 +315,7 @@ public: int iRightAnalogRight; int iRightAnalogPress; bool bRightAnalogCustom; + bool bRightAnalogDisableDiagonal; // Disable diagonals bool bDisableDpadDiagonals; diff --git a/UI/GamepadEmu.cpp b/UI/GamepadEmu.cpp index f0adecd093..5d18052ed2 100644 --- a/UI/GamepadEmu.cpp +++ b/UI/GamepadEmu.cpp @@ -529,25 +529,25 @@ void PSPCustomStick::ProcessTouch(float x, float y, bool down) { dy = std::min(1.0f, std::max(-1.0f, dy)); if (g_Config.iRightAnalogRight != 0) { - if (dx > 0.5f) + if (dx > 0.5f && (!g_Config.bRightAnalogDisableDiagonal || fabs(dx) > fabs(dy))) __CtrlButtonDown(button[g_Config.iRightAnalogRight-1]); else __CtrlButtonUp(button[g_Config.iRightAnalogRight-1]); } if (g_Config.iRightAnalogLeft != 0) { - if (dx < -0.5f) + if (dx < -0.5f && (!g_Config.bRightAnalogDisableDiagonal || fabs(dx) > fabs(dy))) __CtrlButtonDown(button[g_Config.iRightAnalogLeft-1]); else __CtrlButtonUp(button[g_Config.iRightAnalogLeft-1]); } if (g_Config.iRightAnalogUp != 0) { - if (dy < -0.5f) + if (dy < -0.5f && (!g_Config.bRightAnalogDisableDiagonal || fabs(dx) <= fabs(dy))) __CtrlButtonDown(button[g_Config.iRightAnalogUp-1]); else __CtrlButtonUp(button[g_Config.iRightAnalogUp-1]); } if (g_Config.iRightAnalogDown != 0) { - if (dy > 0.5f) + if (dy > 0.5f && (!g_Config.bRightAnalogDisableDiagonal || fabs(dx) <= fabs(dy))) __CtrlButtonDown(button[g_Config.iRightAnalogDown-1]); else __CtrlButtonUp(button[g_Config.iRightAnalogDown-1]); diff --git a/UI/TouchControlVisibilityScreen.cpp b/UI/TouchControlVisibilityScreen.cpp index 4876306b89..25c0cc60c3 100644 --- a/UI/TouchControlVisibilityScreen.cpp +++ b/UI/TouchControlVisibilityScreen.cpp @@ -174,8 +174,12 @@ void RightAnalogMappingScreen::CreateViews() { static const char *rightAnalogButton[] = {"None", "L", "R", "Square", "Triangle", "Circle", "Cross", "D-pad up", "D-pad down", "D-pad left", "D-pad right", "Start", "Select"}; + vert->Add(new ItemHeader(co->T("Analog Style"))); vert->Add(new CheckBox(&g_Config.touchRightAnalogStick.show, co->T("Visible"))); vert->Add(new CheckBox(&g_Config.bRightAnalogCustom, co->T("Use custom right analog"))); + vert->Add(new CheckBox(&g_Config.bRightAnalogDisableDiagonal, co->T("Disable diagonal input")))->SetEnabledPtr(&g_Config.bRightAnalogCustom); + + vert->Add(new ItemHeader(co->T("Analog Binding"))); PopupMultiChoice *rightAnalogUp = vert->Add(new PopupMultiChoice(&g_Config.iRightAnalogUp, mc->T("RightAn.Up"), rightAnalogButton, 0, ARRAY_SIZE(rightAnalogButton), mc->GetName(), screenManager())); PopupMultiChoice *rightAnalogDown = vert->Add(new PopupMultiChoice(&g_Config.iRightAnalogDown, mc->T("RightAn.Down"), rightAnalogButton, 0, ARRAY_SIZE(rightAnalogButton), mc->GetName(), screenManager())); PopupMultiChoice *rightAnalogLeft = vert->Add(new PopupMultiChoice(&g_Config.iRightAnalogLeft, mc->T("RightAn.Left"), rightAnalogButton, 0, ARRAY_SIZE(rightAnalogButton), mc->GetName(), screenManager())); From b643d60f7290f4effa5819bff0ebb3e7ec68af3f Mon Sep 17 00:00:00 2001 From: iota97 Date: Sat, 7 Aug 2021 13:28:43 +0200 Subject: [PATCH 114/336] Undo last save --- Core/Config.cpp | 2 ++ Core/Config.h | 2 ++ Core/SaveState.cpp | 18 ++++++++++++++++++ Core/SaveState.h | 2 ++ UI/PauseScreen.cpp | 13 ++++++++++++- UI/PauseScreen.h | 1 + 6 files changed, 37 insertions(+), 1 deletion(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index 21208ea10f..6f527ef557 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -533,6 +533,8 @@ static ConfigSetting generalSettings[] = { ConfigSetting("StateSlot", &g_Config.iCurrentStateSlot, 0, true, true), ConfigSetting("EnableStateUndo", &g_Config.bEnableStateUndo, &DefaultEnableStateUndo, true, true), ConfigSetting("StateLoadUndoGame", &g_Config.sStateLoadUndoGame, "NA", true, false), + ConfigSetting("StateUndoLastSaveGame", &g_Config.sStateUndoLastSaveGame, "NA", true, false), + ConfigSetting("StateUndoLastSaveSlot", &g_Config.iStateUndoLastSaveSlot, -5, true, false), // Start with an "invalid" value ConfigSetting("RewindFlipFrequency", &g_Config.iRewindFlipFrequency, 0, true, true), ConfigSetting("ShowOnScreenMessage", &g_Config.bShowOnScreenMessages, true, true, false), diff --git a/Core/Config.h b/Core/Config.h index 6971630841..fe077c0cfe 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -210,6 +210,8 @@ public: bool bUISound; bool bEnableStateUndo; std::string sStateLoadUndoGame; + std::string sStateUndoLastSaveGame; + int iStateUndoLastSaveSlot; int iAutoLoadSaveState; // 0 = off, 1 = oldest, 2 = newest, >2 = slot number + 3 bool bEnableCheats; bool bReloadCheats; diff --git a/Core/SaveState.cpp b/Core/SaveState.cpp index 568a1269d6..ac6fbf13a7 100644 --- a/Core/SaveState.cpp +++ b/Core/SaveState.cpp @@ -531,6 +531,8 @@ namespace SaveState if (g_Config.bEnableStateUndo) { DeleteIfExists(fnUndo); RenameIfExists(fn, fnUndo); + g_Config.sStateUndoLastSaveGame = GenerateFullDiscId(gameFilename); + g_Config.iStateUndoLastSaveSlot = slot; } else { DeleteIfExists(fn); } @@ -571,6 +573,14 @@ namespace SaveState return false; } + + bool UndoLastSave(const Path &gameFilename) { + if (g_Config.sStateUndoLastSaveGame != GenerateFullDiscId(gameFilename)) + return false; + + return UndoSaveSlot(gameFilename, g_Config.iStateUndoLastSaveSlot); + } + bool HasSaveInSlot(const Path &gameFilename, int slot) { Path fn = GenerateSaveSlotFilename(gameFilename, slot, STATE_EXTENSION); @@ -583,6 +593,14 @@ namespace SaveState return File::Exists(fn); } + bool HasUndoLastSave(const Path &gameFilename) + { + if (g_Config.sStateUndoLastSaveGame != GenerateFullDiscId(gameFilename)) + return false; + + return HasUndoSaveInSlot(gameFilename, g_Config.iStateUndoLastSaveSlot); + } + bool HasScreenshotInSlot(const Path &gameFilename, int slot) { Path fn = GenerateSaveSlotFilename(gameFilename, slot, SCREENSHOT_EXTENSION); diff --git a/Core/SaveState.h b/Core/SaveState.h index 40d72ca109..7cd9f0e096 100644 --- a/Core/SaveState.h +++ b/Core/SaveState.h @@ -47,10 +47,12 @@ namespace SaveState void SaveSlot(const Path &gameFilename, int slot, Callback callback, void *cbUserData = 0); void LoadSlot(const Path &gameFilename, int slot, Callback callback, void *cbUserData = 0); bool UndoSaveSlot(const Path &gameFilename, int slot); + bool UndoLastSave(const Path &gameFilename); bool UndoLoad(const Path &gameFilename, Callback callback, void *cbUserData = 0); // Checks whether there's an existing save in the specified slot. bool HasSaveInSlot(const Path &gameFilename, int slot); bool HasUndoSaveInSlot(const Path &gameFilename, int slot); + bool HasUndoLastSave(const Path &gameFilename); bool HasUndoLoad(const Path &gameFilename); bool HasScreenshotInSlot(const Path &gameFilename, int slot); diff --git a/UI/PauseScreen.cpp b/UI/PauseScreen.cpp index 961d6b054a..ce700f32a8 100644 --- a/UI/PauseScreen.cpp +++ b/UI/PauseScreen.cpp @@ -392,9 +392,13 @@ void GamePauseScreen::CreateViews() { LinearLayout *buttonRow = leftColumnItems->Add(new LinearLayout(ORIENT_HORIZONTAL)); if (g_Config.bEnableStateUndo) { - UI::Choice *loadUndoButton = buttonRow->Add(new Choice(pa->T("Undo last state load"))); + UI::Choice *loadUndoButton = buttonRow->Add(new Choice(pa->T("Undo last load"))); loadUndoButton->SetEnabled(SaveState::HasUndoLoad(gamePath_)); loadUndoButton->OnClick.Handle(this, &GamePauseScreen::OnLoadUndo); + + UI::Choice *saveUndoButton = buttonRow->Add(new Choice(pa->T("Undo last save"))); + saveUndoButton->SetEnabled(SaveState::HasUndoLastSave(gamePath_)); + saveUndoButton->OnClick.Handle(this, &GamePauseScreen::OnLastSaveUndo); } if (g_Config.iRewindFlipFrequency > 0) { @@ -506,6 +510,13 @@ UI::EventReturn GamePauseScreen::OnLoadUndo(UI::EventParams &e) { return UI::EVENT_DONE; } +UI::EventReturn GamePauseScreen::OnLastSaveUndo(UI::EventParams &e) { + SaveState::UndoLastSave(gamePath_); + + RecreateViews(); + return UI::EVENT_DONE; +} + UI::EventReturn GamePauseScreen::OnCwCheat(UI::EventParams &e) { screenManager()->push(new CwCheatScreen(gamePath_)); return UI::EVENT_DONE; diff --git a/UI/PauseScreen.h b/UI/PauseScreen.h index 6d4acbd961..15b22174e2 100644 --- a/UI/PauseScreen.h +++ b/UI/PauseScreen.h @@ -45,6 +45,7 @@ private: UI::EventReturn OnRewind(UI::EventParams &e); UI::EventReturn OnLoadUndo(UI::EventParams &e); + UI::EventReturn OnLastSaveUndo(UI::EventParams &e); UI::EventReturn OnScreenshotClicked(UI::EventParams &e); UI::EventReturn OnCwCheat(UI::EventParams &e); From 30550bd3686ed328768b1be15e33c6ea4be64c32 Mon Sep 17 00:00:00 2001 From: Benjamin Benda Gates Date: Sun, 8 Aug 2021 02:22:58 +0700 Subject: [PATCH 115/336] Update th_TH.ini --- assets/lang/th_TH.ini | 102 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 92 insertions(+), 10 deletions(-) diff --git a/assets/lang/th_TH.ini b/assets/lang/th_TH.ini index bdc36ab0ca..ff14bd895b 100644 --- a/assets/lang/th_TH.ini +++ b/assets/lang/th_TH.ini @@ -10,40 +10,56 @@ Global volume = ระดับเสียงหลัก Microphone = ไมโครโฟน Microphone Device = อุปกรณ์ไมโครโฟน Mute = เงียบ -Switch on new audio device = สลับไปใช้อุปกรณ์เสียงอันใหม่ Use global volume = ใช้ตามระดับเสียงหลัก +Use new audio devices automatically = สลับไปใช้อุปกรณ์เสียงอันใหม่อัตโนมัติ WASAPI (fast) = WASAPI (เร็ว) [Controls] Analog auto-rotation speed = ความเร็วที่ใช้หมุนปุ่มอนาล็อก Analog Axis Sensitivity = ความไวต่อการตอบสนองแกนอนาล็อก +Analog Binding = เซ็ตปุ่มควบคุมอนาล็อก Analog Limiter = ตัวจำกัดปุ่มอนาล็อก Analog Mapper High End = ปรับเปลี่ยนค่าอนาล็อก high-end (การตอบสนองของแกน) Analog Mapper Low End = ปรับเปลี่ยนค่าอนาล็อก low-end (สลับด้าน deadzone) Analog Mapper Mode = โหมดการปรับอนาล็อก +Analog Settings = ตั้งค่าปุ่มอนาล็อก Analog Stick = ปุ่มอนาล็อก +Analog Style = สไตล์ของปุ่มอนาล็อก AnalogLimiter Tip = เมื่อกดที่ขอบปุ่มอนาล็อก ตัวจำกัดอนาล็อกจะทำงาน Auto = อัตโนมัติ Auto-centering analog stick = อนาล็อกกลับคืนจุดศูนย์กลางอัตโนมัติ Auto-hide buttons after seconds = ซ่อนปุ่มทันทีหลังจาก/วินาที +Auto-rotation speed = ความเร็วหมุนอัตโนมัติ Binds = เซ็ตปุ่ม +Button Binding = เซ็ตปุ่มควบคุม Button Opacity = ความชัดของปุ่มกด Button style = รูปแบบของปุ่มกด +Button Style = รูปแบบของปุ่มกด +Calibrate Analog Stick = ปรับค่าความคลาดเคลื่อนปุ่มอนาล็อก Calibrate D-Pad = ปรับค่าความคลาดเคลื่อน +Calibrated = ค่าความคลาดเคลื่อนที่ปรับ Calibration = ปรับค่าความคลาดเคลื่อน +Circular stick input = ค่านำเข้าของปุ่มหมุน Classic = แบบดั้งเดิม Combo Key Setting = ตั้งค่าปุ่มคอมโบ Combo Key Setup = ติดตั้งปุ่มคอมโบ Confine Mouse = จำกัดเมาส์ภายในหน้าต่าง/พื้นที่แสดงผล Control Mapping = เปลี่ยนแปลงค่าควบคุม +Custom Key Setting = ติดตั้งปุ่มปรับแต่ง Custom layout... = ปรับเปลี่ยนการควบคุมแบบสัมผัส... +Customize = ปรับแต่ง Customize tilt = ปรับแต่งการเอียงโดยใช้เซ็นเซอร์ควบคุม... +Customize Touch Controls = ปรับแต่งปุ่มควบคุมสัมผัสหน้าจอ D-PAD = ปุ่มลูกศร +Deadzone radius = ขอบเขต Deadzone Deadzone Radius = ขอบเขต Deadzone DInput Analog Settings = ตั้งค่าอนาล็อกของจอย DInput Disable D-Pad diagonals (4-way touch) = ปิดการใช้งานปุ่มลูกศรในแนวทแยง (สัมผัส 4 ทิศทาง) +Disable diagonal input = ปิดการใช้งานอนาล็อกในแนวทแยง +Enable standard shortcut keys = เปิดการใช้งานปุ่มคีย์ลัดแบบพื้นฐาน Glowing borders = แบบขอบทึบแสง HapticFeedback = ตอบสนองเมื่อสัมผัส (การสั่น) +Icon = รูปปุ่ม Ignore gamepads when not focused = ละเว้นต่อปุ่มกดเมื่อไม่ได้ใช้หน้าจอนั้น Ignore Windows Key = ละเว้นการใช้งานปุ่มวินโดวส์ Invert Axes = การสลับด้านของแกน @@ -55,6 +71,7 @@ L/R Trigger Buttons = ปุ่มตัวหน่วงนำโดยใช Landscape = แนวนอน Landscape Auto = แนวนอนกลับด้านอัตโนมัติ Landscape Reversed = แนวนอนกลับด้าน +Low end radius = ขอบเขต Low end Mouse = การตั้งค่าเมาส์ Mouse sensitivity = ความไวต่อการตอบสนองของเมาส์ Mouse smoothing = ความลื่นไหลของเมาส์ @@ -65,9 +82,13 @@ OnScreen = ปรับใช้หน้าจอควบคุมแบบป Portrait = แนวตั้ง Portrait Reversed = แนวตั้งกลับด้าน PSP Action Buttons = ปุ่มแอ็คชั่นของ PSP +Raw input = ค่าตั้งต้น +Reset to defaults = คืนค่าเริ่มต้น Screen Rotation = การหมุนหน้าจอ seconds, 0 : off = วินาที, 0 = ปิด Sensitivity = ความไวต่อการตอบสนอง +Sensitivity (scale) = ความไวการตอบสนอง +Shape = กรอบปุ่ม Show right analog = โชว์ปุ่มอนาล็อกขวา Show Touch Pause Menu Button = แสดงปุ่มหยุดสำหรับเข้าหน้าเมนู Thin borders = แบบขอบบาง @@ -76,10 +97,12 @@ Tilt Input Type = นำเข้ารูปแบบการเอียง Tilt Sensitivity along X axis = ความไวต่อการตอบสนองเอียงตามแกน X Tilt Sensitivity along Y axis = ความไวต่อการตอบสนองเอียงตามแกน Y To Calibrate = ให้วางอุปกรณ์ลงบนพื้นราบ และกด "ปรับค่าความคลาดเคลื่อน" +Toggle mode = โหมดสลับปุ่มกด Touch Control Visibility = การแสดงผลปุ่มควบคุมแบบสัมผัส Use custom right analog = ใช้การปรับเปลี่ยนปุ่มอนาล็อกขวา Use Mouse Control = ใช้เมาส์ในการควบคุม Visibility = ซ่อนปุ่ม +Visible = แสดง X = แกน X X + Y = แกน X + แกน Y XInput Analog Settings = ตั้งค่าอนาล็อกของจอย XInput @@ -150,6 +173,7 @@ More Settings... = การตั้งค่าอื่นๆ... Nearest = แบบใกล้เคียง Non-Buffered Rendering = ข้ามการใช้บัฟเฟอร์เอฟเฟ็คท์ (ปิดบัฟเฟอร์) Off = ปิด +Open Chat = เปิดหน้าต่างแชท Open Directory... = เปิดแหล่งที่เก็บ... Open from MS:/PSP/GAME... = เปิดจาก MS:/PSP/GAME... Open Memory Stick = เปิดที่เก็บบันทึกข้อมูล @@ -209,10 +233,10 @@ Draw Frametimes Graph = กราฟแสดงจำนวนเฟรม Dump Decrypted Eboot = ดึงไฟล์ EBOOT.BIN ออกมาเก็บไว้เมื่อเริ่มเกม Dump Frame GPU Commands = ดึงค่าเฟรมคำสั่งของ GPU Enable Logging = เปิดใช้งานการเก็บค่าแก้ไขจุดบกพร่อง -Enable driver bug workarounds = Enable driver bug workarounds +Enable driver bug workarounds = เปิดใช้งานการแก้ขัดปัญหาไดรเวอร์บั๊ก Enter address = ใส่ค่าที่อยู่ FPU = FPU -Framedump tests = Framedump tests +Framedump tests = ทดสอบไฟล์เฟรมดั๊มพ์ Frame Profiler = รายละเอียดของเฟรม GPU Driver Test = ทดสอบไดรเวอร์ GPU GPU Profile = โปรไฟล์ GPU @@ -274,10 +298,12 @@ DeleteConfirmGameConfig = คุณแน่ใจนะว่าต้องก DeleteFailed = ไม่สามารถลบข้อมูลนี้ได้ Deleting = กำลังลบข้อมูล\nโปรดรอ... Disable All = ปิดใช้งานทั้งหมด +Dumps = ไฟล์ดั๊มพ์ Edit = แก้ไข Enable All = เปิดใช้งานทั้งหมด Enter = ยืนยัน Finish = สิ้นสุด +GE Frame Dumps = ไฟล์กราฟิกเอนจิ้นเฟรมดั๊มพ์ Grid = กริด Inactive = ปิดการทำงาน InternalError = เกิดข้อผิดพลาดภายใน @@ -300,6 +326,7 @@ Save = บันทึก Save completed = บันทึกข้อมูลสำเร็จ Saving = กำลังบันทึก\nโปรดรอ... SavingFailed = ไม่สามารถบันทึกข้อมูลนี้ได้ +Search = ค้นหา Select = เลือก Shift = เปลี่ยน Snap = ขยับ @@ -543,12 +570,35 @@ Window Size = ขนาดของหน้าจอ xBRZ = xBRZ [InstallZip] +Already contains data. = มีข้อมูลอยู่ข้างในนั้น +Create or Choose a PSP folder = สร้างหรือเลือกโฟลเดอร์ PSP +DataCanBeShared = ข้อมูลสามารถใช้งานร่วมกันได้ ทั้งใน PPSSPP ตัวสีฟ้า/สีทอง +DataCannotBeShared = ข้อมูลไม่สามารถใช้งานร่วมกันได้ ทั้งใน PPSSPP ตัวสีฟ้า/สีทอง! +DataWillStay = ข้อมูลจะยังคงอยู่ ถึงแม้ว่าจะถอนการติดตั้ง PPSSPP ออกไปแล้ว +DataWillBeLostOnUninstall = คำเตือน! ข้อมูลอาจจะสูญหาย เมื่อคุณถอนการติดตั้ง PPSSPP! Delete ZIP file = ลบไฟล์ ZIP +EasyUSBAccess = การเข้าถึงข้อมูลทำได้ง่าย +Failed to save config = ล้มเหลวในการบันทึกตั้งค่า +Free space = พื้นที่ว่าง Install = ติดตั้ง Install game from ZIP file? = ต้องการติดตั้งเกมจากไฟล์ ZIP เลยหรือไม่? Install textures from ZIP file? = ต้องการติดตั้งเท็คเจอร์จากไฟล์ ZIP เลยหรือไม่? Installed! = ติดตั้งเสร็จสิ้น! +MemoryStickDescription = เลือกแหล่งที่เก็บข้อมูล PSP (เม็มโมรี่ สติ๊ก) +Move Data = ย้ายข้อมูล +No data will be changed. = ไม่มีข้อมูลอะไรถูกเปลี่ยนแปลง +New PSP Data Folder = โฟลเดอร์เก็บข้อมูล PSP อันใหม่ +Old PSP Data Folder = โฟลเดอร์เก็บข้อมูล PSP อันเก่า +PPSSPP will restart after the change. = PPSSPP จะรีสตาร์ทใหม่หลังจากปรับเปลี่ยนตั้งค่า +ScopedStorageWarning = คำเตือน: รองรับแอนดรอยด์ที่ใช้ Scoped Storage ขั้นทดสอบ\nอาจจะเขมือบข้อมูลของคุณ Texture pack doesn't support install = เท็คเจอร์แพ็คนี้ไม่รองรับการติดตั้ง +That folder doesn't work as a memstick folder. = โฟลเดอร์นั้นไม่สามารถนำมาใช้เป็นโฟลเดอร์แหล่งที่เก็บข้อมูลได้ +That's the folder being used! = อันนั้นคือโฟลเดอร์ที่ใช้งานอยู่ +USBAccessThrough = การเข้าถึงข้อมูล ผ่านใน Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = การเข้าถึงข้อมูล ผ่านใน Android/data/org.ppsspp.ppssppgold/files +Use App Private Directory = ใช้แหล่งเก็บข้อมูลแบบส่วนบุคคล +Use PSP folder at root of storage = ใช้โฟลเดอร์ PSP ที่อยู่ในแหล่งเก็บข้อมูลของเครื่อง +Welcome to PPSSPP! = ยินดีต้อนรับสู่ PPSSPP! Zip archive corrupt = ไฟล์ ZIP ไม่สมบูรณ์ (เสียจ้า) Zip file does not contain PSP software = ไฟล์ ZIP นี้ ไม่มีข้อมูลซอฟแวร์ของเกม PSP @@ -585,6 +635,7 @@ SavesAreTemporary = PPSSPP จะเซฟข้อมูลในโฟลเ SavesAreTemporaryGuidance = แนะนำให้แตกไฟล์ PPSSPP ก่อนที่จะใช้งานนะจ้ะ เซฟจะได้ไม่บิน SavesAreTemporaryIgnore = ไม่สนคำเตือน UnpinPath = ถอนหมุด +UseBrowseOrLoad = ใช้ตัวเลือก เรียกใช้... เพื่อเลือกโฟลเดอร์ หรือ โหลด... เพื่อเลือกไฟล์ www.ppsspp.org = เว็บไซต์หลัก PPSSPP [MainSettings] @@ -604,12 +655,26 @@ An.Right = อนาล็อกขวา An.Up = อนาล็อกขึ้น Analog limiter = ตัวจำกัดปุ่มอนาล็อก Analog Stick = ปุ่มอนาล็อก +Arrow down = ลูกศรลง +Arrow left = ลูกศรซ้าย +Arrow right = ลูกศรขวา +Arrow up = ลูกศรขึ้น Audio/Video Recording = อัดบันทึกวีดีโอ/เสียง -Auto Analog Rotation (CCW) = หมุนปุ่มอนาล็อกอัตโนมัติ (ทวนเข็ม) -Auto Analog Rotation (CW) = หมุนปุ่มอนาล็อกอัตโนมัติ (ตามเข็ม) +Auto Analog Rotation (CCW) = หมุนอนาล็อกอัตโนมัติ (ทวนเข็ม) +Auto Analog Rotation (CW) = หมุนอนาล็อกอัตโนมัติ (ตามเข็ม) AxisSwap = สลับด้านแกน Circle = วงกลม Cross = กากบาท +Custom 1 = ปุ่มปรับแต่ง 1 +Custom 2 = ปุ่มปรับแต่ง 2 +Custom 3 = ปุ่มปรับแต่ง 3 +Custom 4 = ปุ่มปรับแต่ง 4 +Custom 5 = ปุ่มปรับแต่ง 5 +Custom 6 = ปุ่มปรับแต่ง 6 +Custom 7 = ปุ่มปรับแต่ง 7 +Custom 8 = ปุ่มปรับแต่ง 8 +Custom 9 = ปุ่มปรับแต่ง 9 +Custom 10 = ปุ่มปรับแต่ง 10 D-pad down = ปุ่มลูกศรลง D-pad left = ปุ่มลูกศรซ้าย D-pad right = ปุ่มลูกศรขวา @@ -621,6 +686,7 @@ Frame Advance = เฟรมขั้นสูง Hold = ระงับ Home = หน้าหลัก L = แอล +L button = ปุ่มแอล Left = ลูกศรซ้าย Load State = โหลดสเตทเกม Mute toggle = ปิดเสียง @@ -630,11 +696,14 @@ Note = หมายเหตุ OpenChat = เปิดแชท Pause = หยุดชั่วคราว R = อาร์ +R button = ปุ่มอาร์ RapidFire = กดรัวต่อเนื่อง +Record = บันทึกหน้าจอ +Rectangle = สี่เหลี่ยมพื้นผ้า Remote hold = หยุดการใช้รีโมท Rewind = โหลดสเตทพื้นหลัง Right = ลูกศรขวา -Right Analog Stick (tap to customize) = ปุ่มอนาล็อกขวา (กดตั้งค่าเพิ่มเติม) +Right Analog Stick = ปุ่มอนาล็อกขวา RightAn.Down = อนาล็อก(ขวา)ลง RightAn.Left = อนาล็อก(ขวา)ซ้าย RightAn.Right = อนาล็อก(ขวา)ขวา @@ -648,6 +717,7 @@ Select = ซีเล็คท์ SpeedToggle = สับเปลี่ยนความเร็ว Square = สี่เหลี่ยม Start = สตาร์ท +tap to customize = กดตั้งค่าเพิ่มเติม Texture Dumping = บันทึกพื้นผิว Texture Replacement = แทนที่พื้นผิว Toggle Fullscreen = ปรับเต็มหน้าจอ @@ -655,12 +725,12 @@ Toggle mode = โหมดสับเปลี่ยน Triangle = สามเหลี่ยม Unthrottle = เร่งความเร็ว Up = ลูกศรขึ้น +Vertical Rectangle = สี่เหลี่ยมพื้นผ้าแนวตั้ง Vol + = เพิ่มเสียง Vol - = ลดเสียง Wlan = เครือข่าย [Networking] -Adhoc Multiplayer forum = เยี่ยมชมเว็บ Adhoc Multiplayer Forum AdHoc Server = เซิร์ฟเวอร์ Adhoc AdhocServer Failed to Bind Port = เซิร์ฟเวอร์ Adhoc ล้มเหลวในการเชื่อมโยงพอร์ต Auto = อัตโนมัติ @@ -699,6 +769,7 @@ Misc = อื่นๆ (ค่าดั้งเดิม = ดีสุดแ Network Initialized = เริ่มการทำงานของเครือข่ายเรียบร้อย Please change your Port Offset = กรุณาเปลี่ยนค่าของพอร์ตชดเชย Port offset = พอร์ตชดเชย (0 = ค่าเริ่มต้นของ PSP) +PPSSPP Ad-Hoc Wiki Page = ไปที่หน้าเว็บ PPSSPP Ad-Hoc Wiki proAdhocServer Address: = ที่อยู่ของเซิร์ฟเวอร์ Pro Adhoc: Quick Chat 1 = แชทด่วน 1 Quick Chat 2 = แชทด่วน 2 @@ -732,6 +803,8 @@ Rewind = โหลดสเตทพื้นหลัง Save State = เซฟสเตทเกม Settings = การตั้งค่า Switch UMD = สลับแผ่น UMD +Undo last load = เลิกทำการโหลดครั้งล่าสุด +Undo last save = เลิกทำการเซฟครั้งล่าสุด [PostShaders] (duplicated setting, previous slider will be used) = (การตั้งค่าที่ซ้ำซ้อนกัน อาจจะใช้แถบเลื่อนก่อนหน้า) @@ -887,7 +960,9 @@ GLToolsWarning = ระวัง: ตรวจพบ GLTools อาจก่อ In menu = ในเมนู Load savestate failed = ล้มเหลวในการโหลดเซฟสเตท Loaded State = โหลดสเตทเกมเรียบร้อย -Loaded. Save in game, restart, and load for less bugs. = โหลดสเตทเรียบร้อยแล้ว แต่ทางที่ดีควรโหลดผ่านเซฟในเกมแทน เพราะบั๊กจะน้อยกว่า +Loaded. Game may refuse to save over different savedata. = โหลดสเตทเรียบร้อยแล้ว ระบบของเกมอาจจะสับสน เมื่อบันทึกด้วยข้อมูลที่แตกต่างจากเซฟธรรมดา +Loaded. Game may refuse to save over newer savedata. = โหลดสเตทเรียบร้อยแล้ว ระบบของเกมอาจจะสับสน เมื่อบันทึกด้วยข้อมูลที่ใหม่กว่าเซฟธรรมดา +Loaded. Save in game, restart, and load for less bugs. = โหลดสเตทเรียบร้อยแล้ว แต่ทางที่ดีควรออกเกมก่อน แล้วโหลดผ่านเซฟธรรมดาแทน เพราะบั๊กจะน้อยกว่า LoadStateDoesntExist = เกิดข้อผิดพลาดในการโหลดเกม: ไฟล์เซฟสเตทไม่ถูกต้อง! LoadStateWrongVersion = เกิดข้อผิดพลาดในการโหลดเกม: ไฟล์เซฟสเตทนั้นมาจาก PPSSPP เวอร์ชั่นที่ใหม่กว่า! norewind = ไม่มีข้อมูลเซฟสเตทแบบย้อนหลัง @@ -934,6 +1009,7 @@ D3DCompiler Version = เวอร์ชั่นตัวคอมไพล์ Debug = แก้ไขบั๊ก Debugger Present = ตัวช่วยแก้ไขบั๊ก Device Info = ข้อมูลอุปกรณ์ +Directories = เส้นทางเก็บข้อมูล Display Information = ข้อมูลของหน้าจอแสดงผล Driver Version = เวอร์ชั่นของไดรเวอร์ EGL Extensions = ส่วนขยายอีจีแอล @@ -951,12 +1027,13 @@ OpenGL Extensions = ส่วนขยายของโอเพ่นจีแ Optimal frames per buffer = จำนวนเฟรมต่อบัฟเฟอร์ที่เหมาะสม Optimal sample rate = อัตราค่าความถี่เสียงที่เหมาะสม OS Information = ข้อมูลของระบบปฏิบัติการ -PPSSPP build = การสร้าง PPSSPP +PPSSPP build = รูปแบบ PPSSPP Refresh rate = อัตราการรีเฟรชของหน้าจอ -Release = ทำได้ +Release = ใช้งาน RW/RX exclusive = RW/RX แบบพิเศษ Sample rate = อัตราค่าความถี่เสียง Shading Language = ภาษาของเฉดเดอร์ +Storage = พื้นที่เก็บข้อมูล Sustained perf mode = โหมดประสิทธิภาพที่ยั่งยืน System Information = ข้อมูลโดยรวมของระบบ System Name = ชื่อระบบ @@ -1006,6 +1083,7 @@ Failed to load state. Error in the file system. = ล้มเหลวในก Failed to save state. Error in the file system. = ล้มเหลวในการเซฟสเตทเกม เนื่องจากไฟล์ระบบเสียหาย Fast (lag on slow storage) = เร็ว (อาจแล็ก หากที่เก็บข้อมูลอ่านช้า) Fast Memory = หน่วยความจำทำงานได้เร็วขึ้น (ไม่เสถียร) +Floating symbols = สัญลักษณ์ปุ่มจอยลอยไปมา Force real clock sync (slower, less lag) = บังคับการซิงค์สัญญาณความถี่ (ช้ากว่า, เเล็กน้อยลง) frames, 0:off = เฟรม, 0 = ปิด Games list settings = การตั้งค่าในรายการเกม @@ -1024,13 +1102,16 @@ Memory Stick inserted = ใส่ที่บันทึกข้อมูล ( MHz, 0:default = MHz, 0 = ค่าเริ่มต้น MMDDYYYY = เดือน/วัน/ปี Newest Save = เซฟอันใหม่สุด +No animation = ไม่แสดงอนิเมชั่น Not a PSP game = นี่ไม่ใช่เกม PSP นะจ้ะ Off = ปิด Oldest Save = เซฟอันเก่าสุด +PSP Memory Stick = แหล่งเก็บข้อมูล PSP PSP Model = โมเดลของ PSP PSP Settings = การตั้งค่า PSP PSP-1000 = PSP รุ่น 1000 PSP-2000/3000 = PSP รุ่น 2000/3000 +Recent games = ภาพพื้นหลังของเกมที่เล่นครั้งล่าสุด Record Audio = อัดบันทึกเสียง Record Display = อัดบันทึกวีดีโอ Reset Recording on Save/Load State = เริ่มการอัดบันทึกไฟล์ใหม่ เมื่อกดเซฟ/โหลดสเตทเกม @@ -1054,6 +1135,7 @@ Storage full = ที่เก็บข้อมูลเต็ม Sustained performance mode = โหมดประสิทธิภาพที่ยั่งยืน Time Format = รูปแบบเวลา UI = หน้าจอผู้ใช้ +UI background animation = อนิเมชั่นพื้นหลังของอินเตอร์เฟซ UI Sound = เสียงของอินเตอร์เฟซ undo %c = สำรอง %c Use Lossless Video Codec (FFV1) = ใช้โค้ด FFV1 บันทึกวีดีโอ เพื่อรักษาความคมชัด From a1b88bedd9eacf522c1448aa704a1d226da3bd3d Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 7 Aug 2021 13:55:29 -0700 Subject: [PATCH 116/336] SaveState: Validate size matches measured. In #14653, a save state appears to have been generated truncated. This attempts to detect that at generation time. --- Common/Serialize/Serializer.h | 7 ++++--- Core/SaveState.cpp | 2 +- libretro/libretro.cpp | 7 ++++--- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Common/Serialize/Serializer.h b/Common/Serialize/Serializer.h index 77f024975c..cdf8bd4f06 100644 --- a/Common/Serialize/Serializer.h +++ b/Common/Serialize/Serializer.h @@ -160,12 +160,13 @@ public: // Expects ptr to have at least MeasurePtr bytes at ptr. template - static Error SavePtr(u8 *ptr, T &_class) + static Error SavePtr(u8 *ptr, T &_class, size_t expected_size) { + const u8 *expected_end = ptr + expected_size; PointerWrap p(&ptr, PointerWrap::MODE_WRITE); _class.DoState(p); - if (p.error != p.ERROR_FAILURE) { + if (p.error != p.ERROR_FAILURE && (expected_end == ptr || expected_size == 0)) { return ERROR_NONE; } else { return ERROR_BROKEN_STATE; @@ -201,7 +202,7 @@ public: u8 *buffer = (u8 *)malloc(sz); if (!buffer) return ERROR_BAD_ALLOC; - Error error = SavePtr(buffer, _class); + Error error = SavePtr(buffer, _class, sz); // SaveFile takes ownership of buffer if (error == ERROR_NONE) diff --git a/Core/SaveState.cpp b/Core/SaveState.cpp index c133486442..0149b91662 100644 --- a/Core/SaveState.cpp +++ b/Core/SaveState.cpp @@ -94,7 +94,7 @@ namespace SaveState size_t sz = CChunkFileReader::MeasurePtr(state); if (data.size() < sz) data.resize(sz); - return CChunkFileReader::SavePtr(&data[0], state); + return CChunkFileReader::SavePtr(&data[0], state, sz); } CChunkFileReader::Error LoadFromRam(std::vector &data, std::string *errorString) { diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index 8c6ad684aa..cd15cb94f0 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -877,9 +877,10 @@ bool retro_serialize(void *data, size_t size) if (useEmuThread) EmuThreadPause(); // Does nothing if already paused - assert(CChunkFileReader::MeasurePtr(state) <= size); - retVal = CChunkFileReader::SavePtr((u8 *)data, state) - == CChunkFileReader::ERROR_NONE; + size_t measured = CChunkFileReader::MeasurePtr(state); + assert(measured <= size); + auto err = CChunkFileReader::SavePtr((u8 *)data, state, measured); + retVal = err == CChunkFileReader::ERROR_NONE; if (useEmuThread) { From ba520120ab00574d6b50dab0bfea23bd3652514a Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 7 Aug 2021 15:50:13 -0700 Subject: [PATCH 117/336] Windows: Avoid deprecated functions. --- Common/File/FileDescriptor.cpp | 6 ++++-- Windows/GPU/D3D9Context.cpp | 15 ++++----------- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/Common/File/FileDescriptor.cpp b/Common/File/FileDescriptor.cpp index 513664c008..139e394c41 100644 --- a/Common/File/FileDescriptor.cpp +++ b/Common/File/FileDescriptor.cpp @@ -18,6 +18,7 @@ #include #include "Common/Common.h" +#include "Common/Data/Encoding/Utf8.h" #include "Common/File/FileDescriptor.h" #include "Common/Log.h" @@ -159,10 +160,11 @@ std::string GetLocalIP(int sock) { addr = &server_addr.ipv4.sin_addr; } #ifdef _WIN32 + wchar_t wtemp[sizeof(temp)]; DWORD len = (DWORD)sizeof(temp); // Windows XP doesn't support inet_ntop. - if (WSAAddressToStringA((struct sockaddr *)&server_addr, sizeof(server_addr), nullptr, temp, &len) == 0) { - return temp; + if (WSAAddressToStringW((struct sockaddr *)&server_addr, sizeof(server_addr), nullptr, wtemp, &len) == 0) { + return ConvertWStringToUTF8(wtemp); } #else const char *result = inet_ntop(server_addr.sa.sa_family, addr, temp, sizeof(temp)); diff --git a/Windows/GPU/D3D9Context.cpp b/Windows/GPU/D3D9Context.cpp index 67e472d0b9..9367078a81 100644 --- a/Windows/GPU/D3D9Context.cpp +++ b/Windows/GPU/D3D9Context.cpp @@ -8,8 +8,9 @@ #include "Common/System/Display.h" #include "Common/Data/Encoding/Utf8.h" #include "Common/Data/Text/I18n.h" - #include "Common/Log.h" +#include "Common/OSVersion.h" + #include "Core/Config.h" #include "Core/ConfigValues.h" #include "Core/Reporting.h" @@ -35,14 +36,6 @@ void D3D9Context::SwapBuffers() { typedef HRESULT (__stdcall *DIRECT3DCREATE9EX)(UINT, IDirect3D9Ex**); -bool IsWin7OrLater() { - DWORD version = GetVersion(); - DWORD major = (DWORD)(LOBYTE(LOWORD(version))); - DWORD minor = (DWORD)(HIBYTE(LOWORD(version))); - - return (major > 6) || ((major == 6) && (minor >= 1)); -} - static void GetRes(HWND hWnd, int &xres, int &yres) { RECT rc; GetClientRect(hWnd, &rc); @@ -149,7 +142,7 @@ bool D3D9Context::Init(HINSTANCE hInst, HWND wnd, std::string *error_message) { presentParams_.PresentationInterval = swapInterval_ == 1 ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE; if (has9Ex_) { - if (windowed && IsWin7OrLater()) { + if (windowed && IsWin7OrHigher()) { // This "new" flip mode should give higher performance but doesn't. //pp.BackBufferCount = 2; //pp.SwapEffect = D3DSWAPEFFECT_FLIPEX; @@ -170,7 +163,7 @@ bool D3D9Context::Init(HINSTANCE hInst, HWND wnd, std::string *error_message) { DX9::pD3Ddevice = device_; DX9::pD3DdeviceEx = deviceEx_; - if (deviceEx_ && IsWin7OrLater()) { + if (deviceEx_ && IsWin7OrHigher()) { // TODO: This makes it slower? //deviceEx->SetMaximumFrameLatency(1); } From 323d06bbc21e1350b46c12615988966b486c2250 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 7 Aug 2021 17:35:37 -0700 Subject: [PATCH 118/336] Font: Reuse alloc when reopening internal fonts. As shown in the font/open test. --- Core/HLE/sceFont.cpp | 108 ++++++++++++++++++++++++++++--------------- 1 file changed, 70 insertions(+), 38 deletions(-) diff --git a/Core/HLE/sceFont.cpp b/Core/HLE/sceFont.cpp index 89d5f79a38..f6dfa4631d 100644 --- a/Core/HLE/sceFont.cpp +++ b/Core/HLE/sceFont.cpp @@ -32,11 +32,6 @@ enum { ERROR_FONT_INVALID_FONT_DATA = 0x8046000a, }; -enum { - FONT_IS_CLOSED = 0, - FONT_IS_OPEN = 1, -}; - // For the save states. static bool useAllocCallbacks = true; @@ -511,8 +506,8 @@ public: void Done() { for (size_t i = 0; i < fonts_.size(); i++) { - if (isfontopen_[i] == FONT_IS_OPEN) { - CloseFont(fontMap[fonts_[i]]); + if (fontRefCount_[i] > 0) { + CloseFont(fontMap[fonts_[i]], true); delete fontMap[fonts_[i]]; fontMap.erase(fonts_[i]); } @@ -526,18 +521,18 @@ public: } handle_ = 0; fonts_.clear(); - isfontopen_.clear(); + fontRefCount_.clear(); openAllocatedAddresses_.clear(); } void AllocDone(u32 allocatedAddr) { handle_ = allocatedAddr; fonts_.resize(params_.numFonts); - isfontopen_.resize(params_.numFonts); + fontRefCount_.resize(params_.numFonts); openAllocatedAddresses_.resize(params_.numFonts); for (size_t i = 0; i < fonts_.size(); i++) { u32 addr = allocatedAddr + 0x4C + (u32)i * 0x4C; - isfontopen_[i] = 0; + fontRefCount_[i] = 0; fonts_[i] = addr; } @@ -588,34 +583,40 @@ public: LoadedFont *OpenFont(Font *font, FontOpenMode mode, int &error) { // TODO: Do something with mode, possibly save it where the PSP does in the struct. // Maybe needed in Font, though? Handlers seem... difficult to emulate. - int freeFontIndex = -1; - for (size_t i = 0; i < fonts_.size(); i++) { - if (isfontopen_[i] == 0) { - freeFontIndex = (int)i; - break; - } - } - if (freeFontIndex < 0) { + + // First, check if the font is already open. We need to refcount, see font/open test. + int foundFontIndex = FindExistingIndex(font); + if (foundFontIndex < 0) + foundFontIndex = FindFreeIndex(); + + if (foundFontIndex < 0) { ERROR_LOG(SCEFONT, "Too many fonts opened in FontLib"); error = ERROR_FONT_TOO_MANY_OPEN_FONTS; - return 0; + return nullptr; } if (!font->IsValid()) { ERROR_LOG(SCEFONT, "Invalid font data"); error = ERROR_FONT_INVALID_FONT_DATA; - return 0; + return nullptr; } - LoadedFont *loadedFont = new LoadedFont(font, mode, GetListID(), fonts_[freeFontIndex]); - isfontopen_[freeFontIndex] = 1; - auto prevFont = fontMap.find(loadedFont->Handle()); - if (prevFont != fontMap.end()) { - // Before replacing it and forgetting about it, let's free it. - delete prevFont->second; + LoadedFont *loadedFont = nullptr; + if (fontRefCount_[foundFontIndex] == 0) { + loadedFont = new LoadedFont(font, mode, GetListID(), fonts_[foundFontIndex]); + + auto prevFont = fontMap.find(loadedFont->Handle()); + if (prevFont != fontMap.end()) { + // Before replacing it and forgetting about it, let's free it. + delete prevFont->second; + } + fontMap[loadedFont->Handle()] = loadedFont; + } else { + loadedFont = fontMap[fonts_[foundFontIndex]]; } - fontMap[loadedFont->Handle()] = loadedFont; + fontRefCount_[foundFontIndex]++; - if (!useAllocCallbacks) + // Only need to allocate the first time. + if (!useAllocCallbacks || fontRefCount_[foundFontIndex] > 1) return loadedFont; u32 allocSize = 12; @@ -627,7 +628,7 @@ public: PostOpenAllocCallback *action = (PostOpenAllocCallback *)__KernelCreateAction(actionPostOpenAllocCallback); action->SetFontLib(GetListID()); - action->SetFont(loadedFont->Handle(), freeFontIndex); + action->SetFont(loadedFont->Handle(), foundFontIndex); u32 args[2] = { userDataAddr(), allocSize }; hleEnqueueCall(allocFuncAddr(), 2, args, action); @@ -635,11 +636,18 @@ public: return loadedFont; } - void CloseFont(LoadedFont *font) { + void CloseFont(LoadedFont *font, bool releaseAll) { + bool allowClose = true; for (size_t i = 0; i < fonts_.size(); i++) { - if (fonts_[i] == font->Handle()) { - isfontopen_[i] = 0; - if (openAllocatedAddresses_[i] != 0 && coreState != CORE_POWERDOWN) { + if (fonts_[i] == font->Handle() && fontRefCount_[i] > 0) { + if (releaseAll) + fontRefCount_[i] = 0; + else + fontRefCount_[i]--; + + allowClose = fontRefCount_[i] == 0; + bool deallocate = allowClose && openAllocatedAddresses_[i] != 0; + if (deallocate && coreState != CORE_POWERDOWN) { u32 args[2] = { userDataAddr(), openAllocatedAddresses_[i] }; hleEnqueueCall(freeFuncAddr(), 2, args); openAllocatedAddresses_[i] = 0; @@ -648,7 +656,8 @@ public: } } flushFont(); - font->Close(); + if (allowClose) + font->Close(); } void flushFont() { @@ -665,7 +674,7 @@ public: return; Do(p, fonts_); - Do(p, isfontopen_); + Do(p, fontRefCount_); Do(p, params_); Do(p, fontHRes_); Do(p, fontVRes_); @@ -708,8 +717,31 @@ public: void SetCharInfoBitmapAddress(u32 addr) { charInfoBitmapAddress_ = addr; } private: + int FindExistingIndex(Font *font) const { + // TODO: Should this also match for memory fonts, or only internal fonts? + for (auto it : fontMap) { + if (it.second->GetFont() != font || it.second->GetFontLib() != this) + continue; + for (size_t i = 0; i < fonts_.size(); i++) { + if (fonts_[i] == it.first) { + return (int)i; + } + } + } + return -1; + } + + int FindFreeIndex() const { + for (size_t i = 0; i < fonts_.size(); i++) { + if (fontRefCount_[i] == 0) { + return (int)i; + } + } + return -1; + } + std::vector fonts_; - std::vector isfontopen_; + std::vector fontRefCount_; FontNewLibParams params_; float fontHRes_; @@ -897,7 +929,7 @@ void __FontShutdown() { for (auto iter = fontMap.begin(); iter != fontMap.end(); iter++) { FontLib *fontLib = iter->second->GetFontLib(); if (fontLib) - fontLib->CloseFont(iter->second); + fontLib->CloseFont(iter->second, true); delete iter->second; } fontMap.clear(); @@ -1106,7 +1138,7 @@ static int sceFontClose(u32 fontHandle) { DEBUG_LOG(SCEFONT, "sceFontClose(%x)", fontHandle); FontLib *fontLib = font->GetFontLib(); if (fontLib) { - fontLib->CloseFont(font); + fontLib->CloseFont(font, false); } } else ERROR_LOG(SCEFONT, "sceFontClose(%x) - font not open?", fontHandle); From cb5954c9e31010edc5fa08f7ea8b4ccf73971a10 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 7 Aug 2021 17:36:29 -0700 Subject: [PATCH 119/336] Font: Delay only on first open of internal font. --- Core/HLE/sceFont.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/Core/HLE/sceFont.cpp b/Core/HLE/sceFont.cpp index f6dfa4631d..80b4a716b3 100644 --- a/Core/HLE/sceFont.cpp +++ b/Core/HLE/sceFont.cpp @@ -579,6 +579,13 @@ public: return fonts_[index]; } + int GetFontRefCount(Font *font) const { + int foundFontIndex = FindExistingIndex(font); + if (foundFontIndex >= 0) + return fontRefCount_.at(foundFontIndex); + return 0; + } + // For FONT_OPEN_USER* modes, the font will automatically be freed. LoadedFont *OpenFont(Font *font, FontOpenMode mode, int &error) { // TODO: Do something with mode, possibly save it where the PSP does in the struct. @@ -1033,10 +1040,12 @@ static u32 sceFontOpen(u32 libHandle, u32 index, u32 mode, u32 errorCodePtr) { LoadedFont *font = fontLib->OpenFont(internalFonts[index], openMode, *errorCode); if (font) { *errorCode = 0; - return hleDelayResult(font->Handle(), "font open", 10000); - } else { - return 0; + // Delay only on the first open. + if (fontLib->GetFontRefCount(internalFonts[index]) == 1) + return hleDelayResult(font->Handle(), "font open", 10000); + return font->Handle(); } + return 0; } // Open a user font in RAM into a FontLib From 0772557a493a7eac1ba43c9bd45fbe041a59e63c Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 7 Aug 2021 17:44:40 -0700 Subject: [PATCH 120/336] Font: Limit max references to fonts. This seems to match the font/open test behavior. --- Core/HLE/sceFont.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Core/HLE/sceFont.cpp b/Core/HLE/sceFont.cpp index 80b4a716b3..91be1080a8 100644 --- a/Core/HLE/sceFont.cpp +++ b/Core/HLE/sceFont.cpp @@ -32,6 +32,8 @@ enum { ERROR_FONT_INVALID_FONT_DATA = 0x8046000a, }; +constexpr int MAX_FONT_REFS = 4; + // For the save states. static bool useAllocCallbacks = true; @@ -596,7 +598,7 @@ public: if (foundFontIndex < 0) foundFontIndex = FindFreeIndex(); - if (foundFontIndex < 0) { + if (foundFontIndex < 0 || fontRefCount_[foundFontIndex] >= MAX_FONT_REFS) { ERROR_LOG(SCEFONT, "Too many fonts opened in FontLib"); error = ERROR_FONT_TOO_MANY_OPEN_FONTS; return nullptr; From 9882f2854a6a4aa577888172cd13dca9a45fcffb Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 7 Aug 2021 17:54:39 -0700 Subject: [PATCH 121/336] Font: Match stingy selection per test. --- Core/HLE/sceFont.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/HLE/sceFont.cpp b/Core/HLE/sceFont.cpp index 91be1080a8..251dbebdf5 100644 --- a/Core/HLE/sceFont.cpp +++ b/Core/HLE/sceFont.cpp @@ -1038,7 +1038,7 @@ static u32 sceFontOpen(u32 libHandle, u32 index, u32 mode, u32 errorCodePtr) { return 0; } - FontOpenMode openMode = mode == 0 ? FONT_OPEN_INTERNAL_STINGY : FONT_OPEN_INTERNAL_FULL; + FontOpenMode openMode = mode != 1 ? FONT_OPEN_INTERNAL_STINGY : FONT_OPEN_INTERNAL_FULL; LoadedFont *font = fontLib->OpenFont(internalFonts[index], openMode, *errorCode); if (font) { *errorCode = 0; From 0a5a3d4ef4fa9f6042aa77638ecc6910c96e4ee6 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 7 Aug 2021 17:55:04 -0700 Subject: [PATCH 122/336] Headless: Cleanup extraneous output. --- headless/Headless.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/headless/Headless.cpp b/headless/Headless.cpp index a0bc857169..0f3fc8f276 100644 --- a/headless/Headless.cpp +++ b/headless/Headless.cpp @@ -332,8 +332,6 @@ int main(int argc, const char* argv[]) if (testFilenames.empty()) return printUsage(argv[0], argc <= 1 ? NULL : "No executables specified"); - g_threadManager.Init(cpu_info.num_cores, cpu_info.logical_cpu_count); - LogManager::Init(&g_Config.bEnableLogging); LogManager *logman = LogManager::GetInstance(); @@ -346,6 +344,9 @@ int main(int argc, const char* argv[]) } logman->AddListener(printfLogger); + // Needs to be after log so we don't interfere with test output. + g_threadManager.Init(cpu_info.num_cores, cpu_info.logical_cpu_count); + HeadlessHost *headlessHost = getHost(gpuCore); headlessHost->SetGraphicsCore(gpuCore); host = headlessHost; From 4cb69760297dc7c915e8383892c0984f27510d14 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 7 Aug 2021 22:22:11 -0700 Subject: [PATCH 123/336] GPU: Use an empty vertex buf for reinterpret. See #14552. --- Common/GPU/D3D11/thin3d_d3d11.cpp | 4 ++-- Common/GPU/D3D9/thin3d_d3d9.cpp | 2 +- Common/GPU/OpenGL/thin3d_gl.cpp | 2 +- Common/GPU/Vulkan/thin3d_vulkan.cpp | 2 +- Common/GPU/thin3d.h | 2 +- GPU/Common/FramebufferManagerCommon.cpp | 31 ++++++++++++++----------- GPU/Common/FramebufferManagerCommon.h | 1 + 7 files changed, 25 insertions(+), 19 deletions(-) diff --git a/Common/GPU/D3D11/thin3d_d3d11.cpp b/Common/GPU/D3D11/thin3d_d3d11.cpp index b9f829e6c7..114692228c 100644 --- a/Common/GPU/D3D11/thin3d_d3d11.cpp +++ b/Common/GPU/D3D11/thin3d_d3d11.cpp @@ -87,7 +87,7 @@ public: void BindTextures(int start, int count, Texture **textures) override; void BindSamplerStates(int start, int count, SamplerState **states) override; - void BindVertexBuffers(int start, int count, Buffer **buffers, int *offsets) override; + void BindVertexBuffers(int start, int count, Buffer **buffers, const int *offsets) override; void BindIndexBuffer(Buffer *indexBuffer, int offset) override; void BindPipeline(Pipeline *pipeline) override; @@ -1163,7 +1163,7 @@ void D3D11DrawContext::UpdateBuffer(Buffer *buffer, const uint8_t *data, size_t context_->UpdateSubresource(buf->buf, 0, &box, data, 0, 0); } -void D3D11DrawContext::BindVertexBuffers(int start, int count, Buffer **buffers, int *offsets) { +void D3D11DrawContext::BindVertexBuffers(int start, int count, Buffer **buffers, const int *offsets) { _assert_(start + count <= ARRAY_SIZE(nextVertexBuffers_)); // Lazy application for (int i = 0; i < count; i++) { diff --git a/Common/GPU/D3D9/thin3d_d3d9.cpp b/Common/GPU/D3D9/thin3d_d3d9.cpp index 39a8b9d5b7..449b74b05c 100644 --- a/Common/GPU/D3D9/thin3d_d3d9.cpp +++ b/Common/GPU/D3D9/thin3d_d3d9.cpp @@ -533,7 +533,7 @@ public: s->Apply(device_, start + i); } } - void BindVertexBuffers(int start, int count, Buffer **buffers, int *offsets) override { + void BindVertexBuffers(int start, int count, Buffer **buffers, const int *offsets) override { _assert_(start + count <= ARRAY_SIZE(curVBuffers_)); for (int i = 0; i < count; i++) { curVBuffers_[i + start] = (D3D9Buffer *)buffers[i]; diff --git a/Common/GPU/OpenGL/thin3d_gl.cpp b/Common/GPU/OpenGL/thin3d_gl.cpp index d26f1ab8af..1c7a19792d 100644 --- a/Common/GPU/OpenGL/thin3d_gl.cpp +++ b/Common/GPU/OpenGL/thin3d_gl.cpp @@ -399,7 +399,7 @@ public: void BindTextures(int start, int count, Texture **textures) override; void BindPipeline(Pipeline *pipeline) override; - void BindVertexBuffers(int start, int count, Buffer **buffers, int *offsets) override { + void BindVertexBuffers(int start, int count, Buffer **buffers, const int *offsets) override { _assert_(start + count <= ARRAY_SIZE(curVBuffers_)); for (int i = 0; i < count; i++) { curVBuffers_[i + start] = (OpenGLBuffer *)buffers[i]; diff --git a/Common/GPU/Vulkan/thin3d_vulkan.cpp b/Common/GPU/Vulkan/thin3d_vulkan.cpp index f68132f5e4..5946ef0e14 100644 --- a/Common/GPU/Vulkan/thin3d_vulkan.cpp +++ b/Common/GPU/Vulkan/thin3d_vulkan.cpp @@ -415,7 +415,7 @@ public: } // TODO: Make VKBuffers proper buffers, and do a proper binding model. This is just silly. - void BindVertexBuffers(int start, int count, Buffer **buffers, int *offsets) override { + void BindVertexBuffers(int start, int count, Buffer **buffers, const int *offsets) override { _assert_(start + count <= ARRAY_SIZE(curVBuffers_)); for (int i = 0; i < count; i++) { curVBuffers_[i + start] = (VKBuffer *)buffers[i]; diff --git a/Common/GPU/thin3d.h b/Common/GPU/thin3d.h index 853ed27542..f3454df2e7 100644 --- a/Common/GPU/thin3d.h +++ b/Common/GPU/thin3d.h @@ -643,7 +643,7 @@ public: virtual void BindSamplerStates(int start, int count, SamplerState **state) = 0; virtual void BindTextures(int start, int count, Texture **textures) = 0; - virtual void BindVertexBuffers(int start, int count, Buffer **buffers, int *offsets) = 0; + virtual void BindVertexBuffers(int start, int count, Buffer **buffers, const int *offsets) = 0; virtual void BindIndexBuffer(Buffer *indexBuffer, int offset) = 0; // Only supports a single dynamic uniform buffer, for maximum compatibility with the old APIs and ease of emulation. diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 2690d94274..91b712086b 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -603,6 +603,10 @@ void FramebufferManagerCommon::ReinterpretFramebuffer(VirtualFramebuffer *vfb, G reinterpretSampler_ = draw_->CreateSamplerState(samplerDesc); } + if (!reinterpretVBuf_) { + reinterpretVBuf_ = draw_->CreateBuffer(12 * 3, Draw::BufferUsageFlag::DYNAMIC | Draw::BufferUsageFlag::VERTEXDATA); + } + // See if we need to create a new pipeline. Draw::Pipeline *pipeline = reinterpretFromTo_[(int)oldFormat][(int)newFormat]; @@ -650,7 +654,9 @@ void FramebufferManagerCommon::ReinterpretFramebuffer(VirtualFramebuffer *vfb, G draw_->SetScissorRect(0, 0, vfb->renderWidth, vfb->renderHeight); Draw::Viewport vp = Draw::Viewport{ 0.0f, 0.0f, (float)vfb->renderWidth, (float)vfb->renderHeight, 0.0f, 1.0f }; draw_->SetViewports(1, &vp); - // No vertex buffer - generate vertices in shader. TODO: Switch to a vertex buffer for GLES2/D3D9 compat. + // Vertex buffer not used - vertices generated in shader. + // TODO: Switch to a vertex buffer for GLES2/D3D9 compat. + draw_->BindVertexBuffers(0, 1, &reinterpretVBuf_, nullptr); draw_->Draw(3, 0); draw_->InvalidateCachedState(); @@ -2318,24 +2324,23 @@ std::vector FramebufferManagerCommon::GetFramebufferList() { return list; } +template +static void DoRelease(T *&obj) { + if (obj) + obj->Release(); + obj = nullptr; +} + void FramebufferManagerCommon::DeviceLost() { DestroyAllFBOs(); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { - if (reinterpretFromTo_[i][j]) { - reinterpretFromTo_[i][j]->Release(); - reinterpretFromTo_[i][j] = nullptr; - } + DoRelease(reinterpretFromTo_[i][j]); } } - if (reinterpretSampler_) { - reinterpretSampler_->Release(); - reinterpretSampler_ = nullptr; - } - if (reinterpretVS_) { - reinterpretVS_->Release(); - reinterpretVS_ = nullptr; - } + DoRelease(reinterpretVBuf_); + DoRelease(reinterpretSampler_); + DoRelease(reinterpretVS_); presentation_->DeviceLost(); draw_ = nullptr; } diff --git a/GPU/Common/FramebufferManagerCommon.h b/GPU/Common/FramebufferManagerCommon.h index 0b843b5bc4..1182c73e32 100644 --- a/GPU/Common/FramebufferManagerCommon.h +++ b/GPU/Common/FramebufferManagerCommon.h @@ -445,4 +445,5 @@ protected: Draw::Pipeline *reinterpretFromTo_[3][3]{}; Draw::ShaderModule *reinterpretVS_ = nullptr; Draw::SamplerState *reinterpretSampler_ = nullptr; + Draw::Buffer *reinterpretVBuf_ = nullptr; }; From cc045239856249b2168cd594df8fd2cb6a0c5240 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 8 Aug 2021 12:23:51 -0700 Subject: [PATCH 124/336] libpng: Patch out 100% opaque optimization. This optimization seems to work fine if you want RGB, but if you want RGBA, it forgets to add the fixed values back. See #14628. --- ext/libpng17/pngread.c | 3 +-- ext/libpng17/pngrtran.c | 4 +++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ext/libpng17/pngread.c b/ext/libpng17/pngread.c index 71ddc01fe1..96a5a1b4b4 100644 --- a/ext/libpng17/pngread.c +++ b/ext/libpng17/pngread.c @@ -3997,8 +3997,7 @@ png_image_read_direct(png_voidp argument) # endif /* This is actually an internal error. */ - // HACK to prevent crash: See issue #14628 - // affirm(out_format == format /* else unimplemented transformations */); + affirm(out_format == format /* else unimplemented transformations */); } /* Now read the rows. If do_local_compose is set then it is necessary to use diff --git a/ext/libpng17/pngrtran.c b/ext/libpng17/pngrtran.c index c5fb837bee..6a6583eff2 100644 --- a/ext/libpng17/pngrtran.c +++ b/ext/libpng17/pngrtran.c @@ -6603,7 +6603,9 @@ check_tRNS_for_alpha(png_structrp png_ptr) } /* All entries opaque; remove the tRNS data: */ - png_ptr->num_trans = 0U; + // TODO: This optimization doesn't handle adding it back if RGBA is requested. + // See PPSSPP issue #14628. + //png_ptr->num_trans = 0U; } #endif /* READ_tRNS */ From fe949aafda44bb8622c5121bc39300f25616d806 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 8 Aug 2021 13:38:19 -0700 Subject: [PATCH 125/336] UI: Track page up/down and home/end as focus moves. Doesn't actually do anything yet when pressed. --- Common/UI/Root.cpp | 18 +++++++++++++++++- Common/UI/View.h | 8 ++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Common/UI/Root.cpp b/Common/UI/Root.cpp index ef60f64e12..ad4b9c2c4c 100644 --- a/Common/UI/Root.cpp +++ b/Common/UI/Root.cpp @@ -195,11 +195,23 @@ static std::set heldKeys; const double repeatDelay = 15 * (1.0 / 60.0f); // 15 frames like before. const double repeatInterval = 5 * (1.0 / 60.0f); // 5 frames like before. +bool IsScrollKey(const KeyInput &input) { + switch (input.keyCode) { + case NKCODE_PAGE_UP: + case NKCODE_PAGE_DOWN: + case NKCODE_MOVE_HOME: + case NKCODE_MOVE_END: + return true; + default: + return false; + } +} + bool KeyEvent(const KeyInput &key, ViewGroup *root) { bool retval = false; // Ignore repeats for focus moves. if ((key.flags & (KEY_DOWN | KEY_IS_REPEAT)) == KEY_DOWN) { - if (IsDPadKey(key)) { + if (IsDPadKey(key) || IsScrollKey(key)) { // Let's only repeat DPAD initially. HeldKey hk; hk.key = key.keyCode; @@ -399,6 +411,10 @@ void UpdateViewHierarchy(ViewGroup *root) { case NKCODE_DPAD_RIGHT: MoveFocus(root, FOCUS_RIGHT); break; case NKCODE_DPAD_UP: MoveFocus(root, FOCUS_UP); break; case NKCODE_DPAD_DOWN: MoveFocus(root, FOCUS_DOWN); break; + case NKCODE_PAGE_UP: MoveFocus(root, FOCUS_PREV_PAGE); break; + case NKCODE_PAGE_DOWN: MoveFocus(root, FOCUS_NEXT_PAGE); break; + case NKCODE_MOVE_HOME: MoveFocus(root, FOCUS_FIRST); break; + case NKCODE_MOVE_END: MoveFocus(root, FOCUS_LAST); break; } } } diff --git a/Common/UI/View.h b/Common/UI/View.h index fd05d38e9b..860b133881 100644 --- a/Common/UI/View.h +++ b/Common/UI/View.h @@ -128,6 +128,10 @@ enum FocusDirection { FOCUS_RIGHT, FOCUS_NEXT, FOCUS_PREV, + FOCUS_FIRST, + FOCUS_LAST, + FOCUS_PREV_PAGE, + FOCUS_NEXT_PAGE, }; enum { @@ -177,6 +181,10 @@ inline FocusDirection Opposite(FocusDirection d) { case FOCUS_RIGHT: return FOCUS_LEFT; case FOCUS_PREV: return FOCUS_NEXT; case FOCUS_NEXT: return FOCUS_PREV; + case FOCUS_FIRST: return FOCUS_LAST; + case FOCUS_LAST: return FOCUS_FIRST; + case FOCUS_PREV_PAGE: return FOCUS_NEXT_PAGE; + case FOCUS_NEXT_PAGE: return FOCUS_PREV_PAGE; } return d; } From 8df188af2b1c834b726681546ff82317fd278591 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 8 Aug 2021 13:40:55 -0700 Subject: [PATCH 126/336] UI: Change focus with home/end. --- Common/UI/ViewGroup.cpp | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/Common/UI/ViewGroup.cpp b/Common/UI/ViewGroup.cpp index 7f133a25b6..3f876ace34 100644 --- a/Common/UI/ViewGroup.cpp +++ b/Common/UI/ViewGroup.cpp @@ -272,7 +272,7 @@ static float VerticalOverlap(const Bounds &a, const Bounds &b) { return std::min(1.0f, overlap / std::min(a.h, b.h)); } -float GetDirectionScore(View *origin, View *destination, FocusDirection direction) { +float GetDirectionScore(int originIndex, View *origin, View *destination, FocusDirection direction) { // Skip labels and things like that. if (!destination->CanBeFocused()) return 0.0f; @@ -332,6 +332,20 @@ float GetDirectionScore(View *origin, View *destination, FocusDirection directio } vertical = true; break; + case FOCUS_FIRST: + if (originIndex == -1) + return 0.0f; + if (dirX > 0.0f || dirY > 0.0f) + return 0.0f; + // More distance is good. + return distance; + case FOCUS_LAST: + if (originIndex == -1) + return 0.0f; + if (dirX < 0.0f || dirY < 0.0f) + return 0.0f; + // More distance is good. + return distance; case FOCUS_PREV: case FOCUS_NEXT: ERROR_LOG(SYSTEM, "Invalid focus direction"); @@ -398,13 +412,15 @@ NeighborResult ViewGroup::FindNeighbor(View *view, FocusDirection direction, Nei case FOCUS_LEFT: case FOCUS_RIGHT: case FOCUS_DOWN: + case FOCUS_FIRST: + case FOCUS_LAST: { // First, try the child views themselves as candidates for (size_t i = 0; i < views_.size(); i++) { if (views_[i] == view) continue; - float score = GetDirectionScore(view, views_[i], direction); + float score = GetDirectionScore(num, view, views_[i], direction); if (score > result.score) { result.score = score; result.view = views_[i]; @@ -782,13 +798,6 @@ bool ScrollView::Key(const KeyInput &input) { case NKCODE_PAGE_UP: ScrollRelative(-(orientation_ == ORIENT_VERTICAL ? bounds_.h : bounds_.w) + 50); break; - case NKCODE_MOVE_HOME: - ScrollTo(0); - break; - case NKCODE_MOVE_END: - if (views_.size()) - ScrollTo(orientation_ == ORIENT_VERTICAL ? views_[0]->GetBounds().h : views_[0]->GetBounds().w); - break; } } return ViewGroup::Key(input); From b52a495b9609f868ed3677d4b1e9002d9bb64014 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 8 Aug 2021 14:46:05 -0700 Subject: [PATCH 127/336] UI: Handle focus on page up/down. This moves keyboard focus along with paging, but it also only responds to paging when already focused inside the scroll view. --- Common/UI/View.h | 1 + Common/UI/ViewGroup.cpp | 101 +++++++++++++++++++++++++++++++++++++--- Common/UI/ViewGroup.h | 8 +++- 3 files changed, 102 insertions(+), 8 deletions(-) diff --git a/Common/UI/View.h b/Common/UI/View.h index 860b133881..f21f4475fd 100644 --- a/Common/UI/View.h +++ b/Common/UI/View.h @@ -448,6 +448,7 @@ public: // Fake RTTI virtual bool IsViewGroup() const { return false; } + virtual bool ContainsSubview(const View *view) const { return false; } Point GetFocusPosition(FocusDirection dir); diff --git a/Common/UI/ViewGroup.cpp b/Common/UI/ViewGroup.cpp index 3f876ace34..0f3bb0f843 100644 --- a/Common/UI/ViewGroup.cpp +++ b/Common/UI/ViewGroup.cpp @@ -57,6 +57,14 @@ void ViewGroup::RemoveSubview(View *view) { } } +bool ViewGroup::ContainsSubview(const View *view) const { + for (const View *subview : views_) { + if (subview == view || subview->ContainsSubview(view)) + return true; + } + return false; +} + void ViewGroup::Clear() { std::lock_guard guard(modifyLock_); for (size_t i = 0; i < views_.size(); i++) { @@ -444,11 +452,57 @@ NeighborResult ViewGroup::FindNeighbor(View *view, FocusDirection direction, Nei return result; } + case FOCUS_PREV_PAGE: + case FOCUS_NEXT_PAGE: + return FindScrollNeighbor(view, Point(INFINITY, INFINITY), direction, result); + default: return result; } } +float GetTargetScore(const Point &target, View *view) { + if (!view->CanBeFocused()) + return 0.0f; + if (view->IsEnabled() == false) + return 0.0f; + if (view->GetVisibility() != V_VISIBLE) + return 0.0f; + + Point viewPos = view->GetBounds().Center(); + float dx = viewPos.x - target.x; + float dy = viewPos.y - target.y; + + float distance = sqrtf(dx * dx + dy * dy); + return 10.0f / std::max(1.0f, distance); +} + +NeighborResult ViewGroup::FindScrollNeighbor(View *view, const Point &target, FocusDirection direction, NeighborResult best) { + if (!IsEnabled()) + return best; + if (GetVisibility() != V_VISIBLE) + return best; + + if (target.x < INFINITY && target.y < INFINITY) { + for (auto v : views_) { + // Note: we consider the origin itself, which might already be the best option. + float score = GetTargetScore(target, v); + if (score > best.score) { + best.score = score; + best.view = v; + } + } + } + for (auto v : views_) { + if (v->IsViewGroup()) { + ViewGroup *vg = static_cast(v); + if (vg) + best = vg->FindScrollNeighbor(view, target, direction, best); + } + } + return best; +} + // TODO: This code needs some cleanup/restructuring... void LinearLayout::Measure(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert) { MeasureBySpec(layoutParams_->width, 0.0f, horiz, &measuredWidth_); @@ -792,12 +846,6 @@ bool ScrollView::Key(const KeyInput &input) { case NKCODE_EXT_MOUSEWHEEL_DOWN: ScrollRelative(250); break; - case NKCODE_PAGE_DOWN: - ScrollRelative((orientation_ == ORIENT_VERTICAL ? bounds_.h : bounds_.w) - 50); - break; - case NKCODE_PAGE_UP: - ScrollRelative(-(orientation_ == ORIENT_VERTICAL ? bounds_.h : bounds_.w) + 50); - break; } } return ViewGroup::Key(input); @@ -903,6 +951,47 @@ bool ScrollView::SubviewFocused(View *view) { return true; } +NeighborResult ScrollView::FindScrollNeighbor(View *view, const Point &target, FocusDirection direction, NeighborResult best) { + if (ContainsSubview(view) && views_[0]->IsViewGroup()) { + ViewGroup *vg = static_cast(views_[0]); + int found = -1; + for (int i = 0, n = vg->GetNumSubviews(); i < n; ++i) { + View *child = vg->GetViewByIndex(i); + if (child == view || child->ContainsSubview(view)) { + found = i; + break; + } + } + + // Okay, the previously focused view is inside this. + if (found != -1) { + float mult = 0.0f; + switch (direction) { + case FOCUS_PREV_PAGE: + mult = -1.0f; + break; + case FOCUS_NEXT_PAGE: + mult = 1.0f; + break; + default: + break; + } + + // Okay, now where is our ideal target? + Point targetPos = view->GetBounds().Center(); + if (orientation_ == ORIENT_VERTICAL) + targetPos.y += mult * bounds_.h; + else + targetPos.x += mult * bounds_.x; + + // Okay, which subview is closest to that? + return vg->FindScrollNeighbor(view, targetPos, direction, best); + } + } + + return ViewGroup::FindScrollNeighbor(view, target, direction, best); +} + void ScrollView::PersistData(PersistStatus status, std::string anonId, PersistMap &storage) { ViewGroup::PersistData(status, anonId, storage); diff --git a/Common/UI/ViewGroup.h b/Common/UI/ViewGroup.h index 730f74f10b..5619d2317b 100644 --- a/Common/UI/ViewGroup.h +++ b/Common/UI/ViewGroup.h @@ -63,9 +63,11 @@ public: // Assumes that layout has taken place. NeighborResult FindNeighbor(View *view, FocusDirection direction, NeighborResult best); + virtual NeighborResult FindScrollNeighbor(View *view, const Point &target, FocusDirection direction, NeighborResult best); - virtual bool CanBeFocused() const override { return false; } - virtual bool IsViewGroup() const override { return true; } + bool CanBeFocused() const override { return false; } + bool IsViewGroup() const override { return true; } + bool ContainsSubview(const View *view) const override; virtual void SetBG(const Drawable &bg) { bg_ = bg; } @@ -268,6 +270,8 @@ public: void PersistData(PersistStatus status, std::string anonId, PersistMap &storage) override; void SetVisibility(Visibility visibility) override; + NeighborResult FindScrollNeighbor(View *view, const Point &target, FocusDirection direction, NeighborResult best) override; + // Quick hack to prevent scrolling to top in some lists void SetScrollToTop(bool t) { scrollToTopOnSizeChange_ = t; } From 700a7baa9b0802ba3b1973833b57d0cf5272f9fa Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 8 Aug 2021 15:20:18 -0700 Subject: [PATCH 128/336] UI: Refactor to reuse distance logic. --- Common/UI/ViewGroup.cpp | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/Common/UI/ViewGroup.cpp b/Common/UI/ViewGroup.cpp index 0f3bb0f843..efae72cdf8 100644 --- a/Common/UI/ViewGroup.cpp +++ b/Common/UI/ViewGroup.cpp @@ -280,7 +280,7 @@ static float VerticalOverlap(const Bounds &a, const Bounds &b) { return std::min(1.0f, overlap / std::min(a.h, b.h)); } -float GetDirectionScore(int originIndex, View *origin, View *destination, FocusDirection direction) { +float GetTargetScore(const Point &originPos, int originIndex, View *origin, View *destination, FocusDirection direction) { // Skip labels and things like that. if (!destination->CanBeFocused()) return 0.0f; @@ -289,7 +289,6 @@ float GetDirectionScore(int originIndex, View *origin, View *destination, FocusD if (destination->GetVisibility() != V_VISIBLE) return 0.0f; - Point originPos = origin->GetFocusPosition(direction); Point destPos = destination->GetFocusPosition(Opposite(direction)); float dx = destPos.x - originPos.x; @@ -305,8 +304,10 @@ float GetDirectionScore(int originIndex, View *origin, View *destination, FocusD float horizOverlap = HorizontalOverlap(origin->GetBounds(), destination->GetBounds()); float vertOverlap = VerticalOverlap(origin->GetBounds(), destination->GetBounds()); if (horizOverlap == 1.0f && vertOverlap == 1.0f) { - INFO_LOG(SYSTEM, "Contain overlap"); - return 0.0; + if (direction != FOCUS_PREV_PAGE && direction != FOCUS_NEXT_PAGE) { + INFO_LOG(SYSTEM, "Contain overlap"); + return 0.0; + } } float originSize = 0.0f; switch (direction) { @@ -354,6 +355,11 @@ float GetDirectionScore(int originIndex, View *origin, View *destination, FocusD return 0.0f; // More distance is good. return distance; + case FOCUS_PREV_PAGE: + case FOCUS_NEXT_PAGE: + // Not always, but let's go with the bonus on height. + vertical = true; + break; case FOCUS_PREV: case FOCUS_NEXT: ERROR_LOG(SYSTEM, "Invalid focus direction"); @@ -385,6 +391,11 @@ float GetDirectionScore(int originIndex, View *origin, View *destination, FocusD return 10.0f / std::max(1.0f, distance - distanceBonus) + overlap; } +float GetDirectionScore(int originIndex, View *origin, View *destination, FocusDirection direction) { + Point originPos = origin->GetFocusPosition(direction); + return GetTargetScore(originPos, originIndex, origin, destination, direction); +} + NeighborResult ViewGroup::FindNeighbor(View *view, FocusDirection direction, NeighborResult result) { if (!IsEnabled()) return result; @@ -461,22 +472,6 @@ NeighborResult ViewGroup::FindNeighbor(View *view, FocusDirection direction, Nei } } -float GetTargetScore(const Point &target, View *view) { - if (!view->CanBeFocused()) - return 0.0f; - if (view->IsEnabled() == false) - return 0.0f; - if (view->GetVisibility() != V_VISIBLE) - return 0.0f; - - Point viewPos = view->GetBounds().Center(); - float dx = viewPos.x - target.x; - float dy = viewPos.y - target.y; - - float distance = sqrtf(dx * dx + dy * dy); - return 10.0f / std::max(1.0f, distance); -} - NeighborResult ViewGroup::FindScrollNeighbor(View *view, const Point &target, FocusDirection direction, NeighborResult best) { if (!IsEnabled()) return best; @@ -486,7 +481,7 @@ NeighborResult ViewGroup::FindScrollNeighbor(View *view, const Point &target, Fo if (target.x < INFINITY && target.y < INFINITY) { for (auto v : views_) { // Note: we consider the origin itself, which might already be the best option. - float score = GetTargetScore(target, v); + float score = GetTargetScore(target, -1, view, v, direction); if (score > best.score) { best.score = score; best.view = v; From b43069109bb478565c0500c7fb92e0596f9d67e2 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 8 Aug 2021 15:23:12 -0700 Subject: [PATCH 129/336] UI: Avoid reselecting on page up at top. --- Common/UI/ViewGroup.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Common/UI/ViewGroup.cpp b/Common/UI/ViewGroup.cpp index efae72cdf8..55d1cbe5ef 100644 --- a/Common/UI/ViewGroup.cpp +++ b/Common/UI/ViewGroup.cpp @@ -980,7 +980,11 @@ NeighborResult ScrollView::FindScrollNeighbor(View *view, const Point &target, F targetPos.x += mult * bounds_.x; // Okay, which subview is closest to that? - return vg->FindScrollNeighbor(view, targetPos, direction, best); + best = vg->FindScrollNeighbor(view, targetPos, direction, best); + // Avoid reselecting the same view. + if (best.view == view) + best.view = nullptr; + return best; } } From 1e263a9a70815a6aceab154725abee429fd3e195 Mon Sep 17 00:00:00 2001 From: nassau-tk Date: Mon, 9 Aug 2021 07:22:25 +0900 Subject: [PATCH 130/336] Fix Translation lang ja_JP.ini(File change) --- assets/lang/ja_JP.ini | 101 +++++++++++++++++++++++++----------------- 1 file changed, 60 insertions(+), 41 deletions(-) diff --git a/assets/lang/ja_JP.ini b/assets/lang/ja_JP.ini index 05429e8765..d0bbceb0d7 100644 --- a/assets/lang/ja_JP.ini +++ b/assets/lang/ja_JP.ini @@ -7,8 +7,8 @@ Device = デバイス DSound (compatible) = DSound (互換性重視) Enable Sound = オーディオを有効にする Global volume = グローバルボリューム -Microphone = Microphone -Microphone Device = Microphone device +Microphone = マイクの設定 +Microphone Device = マイク入力機器の選択 Mute = ミュート Switch on new audio device = 新しいオーディオデバイスをオンにする Use global volume = グローバルボリュームを使う @@ -29,6 +29,7 @@ Auto-hide buttons after seconds = 指定した秒数後に自動でボタンを Binds = Binds Button Opacity = ボタンの透明度 Button style = ボタンのスタイル +Calibrate Analog Stick = アナログスティックをキャリブレートする Calibrate D-Pad = 方向キーをキャリブレートする Calibration = キャリブレーション Classic = クラシック @@ -38,10 +39,12 @@ Confine Mouse = ウィンドウ/表示領域内でマウスをトラップする Control Mapping = キーを設定する Custom layout... = カスタムレイアウト... Customize tilt = 傾きをカスタマイズする +Customize Touch Controls = 画面タッチ用コントローラーをカスタマイズする D-PAD = 方向キー Deadzone Radius = デッドゾーンの半径 DInput Analog Settings = DInputのアナログパッド設定 Disable D-Pad diagonals (4-way touch) = 方向キーの斜め入力を無効にする (4方向タッチ) +Enable standard shortcut keys = 標準のショートカットキーを有効にする Glowing borders = 点灯する枠線 HapticFeedback = 触感フィードバック (振動) Ignore gamepads when not focused = 非フォーカス時はゲームパッドを無効にする @@ -199,7 +202,7 @@ Allow remote debugger = リモートデバッガを許可する Backspace = Backspace Block address = アドレスをブロックする By Address = アドレスで -Copy savestates to memstick root = Copy save states to Memory Stick root +Copy savestates to memstick root = SaveStateをメモリースティックの直下にコピーする Create/Open textures.ini file for current game = 現在のゲームの textures.ini ファイルを作成する/開く Current = 現在 Dev Tools = 開発用ツール @@ -238,7 +241,7 @@ Save language ini = 言語のiniファイルをセーブする Save new textures = 新しいテクスチャを保存する Shader Viewer = シェーダビューワ Show Developer Menu = 開発者向けメニューを表示する -Show on-screen messages = Show on-screen messages +Show on-screen messages = オンスクリーンメーッセージを表示する Stats = 状況 System Information = システム情報 Texture Replacement = テクスチャの置き換え @@ -254,7 +257,7 @@ Back = 戻る Cancel = キャンセル Center = センタリング ChangingGPUBackends = GPUバックエンドの変更にはPPSSPPの再起動が必要です。今すぐ再起動しますか? -ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? +ChangingInflightFrames = グラフィックスコマンドのバッファリングを変更するにはPPSSPPの再起動が必要です。 再起動しますか? Channel: = Channel: Choose PPSSPP save folder = PPSSPPのセーブ用フォルダを選択する Confirm Overwrite = データを上書きしますか? @@ -274,13 +277,13 @@ DeleteConfirmGameConfig = 本当にこのゲームの設定を削除しますか DeleteFailed = データを削除できませんでした。 Deleting = 削除中です。\nしばらくお待ちください... Disable All = 全て無効にする -Edit = Edit +Edit = 編集 Enable All = 全て有効にする Enter = 決定 Finish = 終了 -Grid = Grid +Grid = グリッド Inactive = 非アクティブ -InternalError = An internal error has occurred. +InternalError = 内部エラーが発生しました。 Load = ロード... Load completed = ロードが完了しました。 Loading = ロード中です。\nしばらくお待ちください... @@ -289,7 +292,7 @@ Move = 移動 Network Connection = ネットワーク接続 NEW DATA = 新しいデータ No = いいえ -ObtainingIP = Obtaining IP address.\nPlease wait... +ObtainingIP = IPアドレスの取得中。 \nしばらくお待ちください... OK = OK Old savedata detected = 古いセーブデータを検出しました Options = オプション @@ -309,7 +312,7 @@ Submit = 決定 Supported = サポートしています There is no data = データがありません。 Toggle All = 全て反転する -Toggle List = Toggle list +Toggle List = 切り替えリスト Unsupported = サポートしていません When you save, it will load on a PSP, but not an older PPSSPP = 保存すると、PSPではロードできますが古いPPSSPPではロードできません When you save, it will not work on outdated PSP Firmware anymore = 保存すると、古いPSPファームウェアでは動作しなくなります @@ -330,13 +333,13 @@ Disk full while writing data = データの書き込み中にディスクが一 ELF file truncated - can't load = ELFファイルが不完全です - ロードできません Error loading file = ゲームをロードできません。 Error reading file = ファイルを読み込めません。 -Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed initializing CPU/Memory = CPUメモリが初期化できません。 Failed to identify file = ファイルを識別できません。 Failed to load executable: = 実行ファイルを読み込めません: File corrupt = ファイルが壊れています Game disc read error - ISO corrupt = ゲームディスクを読み込めません: ISOが壊れています -GenericAllStartupError = PPSSPP failed to start up with any graphics backend. Try upgrading your graphics and other drivers. -GenericBackendSwitchCrash = PPSSPP crashed while starting.\n\nThis usually means a graphics driver problem. Try upgrading your graphics drivers.\n\nGraphics backend has been switched: +GenericAllStartupError = PPSSPPは起動時にクラッシュしました。 可能な場合はグラフィックスドライバーの更新をしてください。 +GenericBackendSwitchCrash = PPSSPPは起動時にクラッシュしました。\n\n グラフィックスドライバーの問題が考えられます。 可能な場合はグラフィックスドライバーの更新をしてください。\n\n グラフィックスバックエンドを変更しました: GenericDirect3D9Error = グラフィックスの初期化に失敗しました。グラフィックドライバとDirectX 9ランタイムを更新してみてください。\n\nOpenGLに切り替えますか?\n\nエラーメッセージ: GenericGraphicsError = グラフィックスエラー GenericOpenGLError = グラフィックスの初期化に失敗しました。グラフィックドライバを更新してみてください。\n\nDirectX 9に切り替えますか?\n\nエラーメッセージ: @@ -345,10 +348,10 @@ InsufficientOpenGLDriver = OpenGLドライバのサポート不足が検出さ Just a directory. = ディレクトリです。 Missing key = キーがありません MsgErrorCode = Error code: -MsgErrorSavedataDataBroken = Save data was corrupt. -MsgErrorSavedataMSFull = Memory Stick full. Check your storage space. -MsgErrorSavedataNoData = Warning: no save data was found. -MsgErrorSavedataNoMS = Memory Stick not inserted. +MsgErrorSavedataDataBroken = セーブデータが破損しています。 +MsgErrorSavedataMSFull = メモリースティックに空きがありません。容量を確認してください。 +MsgErrorSavedataNoData = 警告: セーブデータが見つかりません。 +MsgErrorSavedataNoMS = メモリースティックが挿入されていません。 No EBOOT.PBP, misidentified game = EBOOT.PBPがないのでゲームを識別できません。 Not a valid disc image. = 有効なディスクイメージではありません。 OpenGLDriverError = OpenGLドライバエラー @@ -440,21 +443,21 @@ Both = 両方 Buffer graphics commands (faster, input lag) = グラフィックスコマンドをバッファする (高速, 入力ラグあり) Buffered Rendering = バッファレンダリング BufferedRenderingRequired = 警告: このゲームは「レンダリングモード」を「バッファ」にする必要があります。 -Camera = Camera -Camera Device = Camera device +Camera = カメラの設定 +Camera Device = カメラデバイスの選択 Cardboard Screen Size = 画面のサイズ (in % of the viewport) Cardboard Screen X Shift = X shift (in % of the blank space) Cardboard Screen Y Shift = Y shift (in % of the blank space) Cardboard VR Settings = Google Cardboard VRの設定 Cheats = チート Clear Speedhack = 初回使用時にフレームバッファをクリアする (高速化) -ClearSpeedhack Tip = Sometimes faster (mostly on mobile devices), may cause glitches +ClearSpeedhack Tip = 高速化の可能性 (特にモバイルデバイス)(ただし不具合もあり) CPU Core = CPUコア Debugging = デバッグ DefaultCPUClockRequired = 警告: このゲームではCPUクロックをデフォルトに設定する必要があります。 Deposterize = ポスタライズを解除する Deposterize Tip = アップスケールされたテクスチャのバンディングを修正する -Device = Device +Device = デバイス Direct3D 9 = Direct3D 9 Direct3D 11 = Direct3D 11 Disable slower effects (speedup) = 重いエフェクトを無効にする (高速化) @@ -662,8 +665,8 @@ Wlan = WLAN [Networking] Adhoc Multiplayer forum = アドホックマルチプレイのフォーラムに行く AdHoc Server = アドホックサーバ -AdhocServer Failed to Bind Port = Ad hoc server failed to bind port -Auto = Auto +AdhocServer Failed to Bind Port = アドホックサーバーがポートのバインドに失敗しました +Auto = 自動 Bottom Center = 下中央 Bottom Left = 左下 Bottom Right = 右下 @@ -675,8 +678,8 @@ Chat = チャット Chat Button Position = チャットボタンの位置 Chat Here = ここにチャットを入力する Chat Screen Position = チャット画面の位置 -Disconnected from AdhocServer = Disconnected from ad hoc server -DNS Error Resolving = DNS error resolving +Disconnected from AdhocServer = アドホックサーバーから切断する +DNS Error Resolving = DNSエラーの解決 Enable built-in PRO Adhoc Server = 内蔵PROアドホックサーバを有効にする Enable network chat = ネットワークチャットを有効にする Enable networking = ネットワーク/WLANを有効にする (ベータ版) @@ -688,18 +691,19 @@ Enter Quick Chat 2 = クイックチャット2を入力する Enter Quick Chat 3 = クイックチャット3を入力する Enter Quick Chat 4 = クイックチャット4を入力する Enter Quick Chat 5 = クイックチャット5を入力する -Error = Error -Failed to Bind Localhost IP = Failed to bind localhost IP -Failed to Bind Port = Failed to bind port -Failed to connect to Adhoc Server = Failed to connect to ad hoc server -Forced First Connect = Forced first connect (faster connect) +Error = エラー +Failed to Bind Localhost IP = ローカルホストIPのバインドに失敗しました +Failed to Bind Port = ポートのバインドに失敗しました +Failed to connect to Adhoc Server = アドホックサーバーに接続できませんでした +Forced First Connect = 強制初期接続 (より速い接続) Invalid IP or hostname = 無効なIPまたはホスト名 Minimum Timeout = 最小タイムアウト (低遅延をオーバーライド、単位ms) -Misc = Miscellaneous (default = PSP compatibility) +Misc = その他 (デフォルト = PSP互換) Network Initialized = ネットワークを初期化 -Please change your Port Offset = Please change your port offset +Please change your Port Offset = ポートオフセットを変更してください Port offset = ポートオフセット (0 = PSP互換) -proAdhocServer Address: = Ad hoc server address: +PPSSPP Ad-Hoc Wiki Page = PPSSPPのアドホック接続Wikiページを開く (英語) +proAdhocServer Address: = アドホックサーバーアドレス: Quick Chat 1 = クイックチャット1 Quick Chat 2 = クイックチャット2 Quick Chat 3 = クイックチャット3 @@ -712,9 +716,9 @@ TCP No Delay = 遅延のないTCP (高速なTCP) Top Center = 上中央 Top Left = 左上 Top Right = 右上 -Unable to find UPnP device = Unable to find UPnP device +Unable to find UPnP device = UPnPデバイスがみつかりません UPnP (port-forwarding) = UPnP(ポートフォワーディング) -UPnP need to be reinitialized = UPnP need to be reinitialized +UPnP need to be reinitialized = UPnPの再初期化が必要です UPnP use original port = UPnPでオリジナルのポートを使用する (有効 = PSP互換) Validating address... = アドレスを検証しています... WLAN Channel = WLANチャネル @@ -806,6 +810,18 @@ Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = ウェブサイトはこちら: written = 速度と移植性を保つためにC++で書かれています +[PSP Memory Stick] +●Data will stay even if you uninstall PPSSPP. = 保存データはPPSSPPをアンインストールしても残る。 +●Data can be shared between PPSSPP regular/Gold. = 通常版/ゴールド間でのデータの共有が可能。 +●Data CANNOT be shared between PPSSPP regular/Gold! = 通常版/ゴールド間でのデータの共有が「できない」。 +●Easy USB Access = PCとのUSB接続でフォルダにアクセスが簡単にできる。 +●USB access through Android/data/org.ppsspp.ppsspp/files = USB接続は Android/data/org.ppsspp.ppsspp/files を通して行う。 +●Warning! Data will be lost when you uninstall PPSSPP! = 警告! PPSSPPをアンインストールすると保存データも削除されます! +Choose PSP data storage(Memory Stick): = PSPデータの保存先の選択(メモリースティック) +Create or Choose a PSP folder = フォルダの新規作成または既存フォルダの選択 +Use App Private Directory = アプリのプライベートフォルダに保存 +Use PSP folder at root of storage = デバイスの内部ストレージのルートに保存 + [RemoteISO] Browse Games = ゲームをブラウズする Local Server Port = ローカルサーバのポート @@ -938,7 +954,7 @@ Driver Version = ドライバのバージョン EGL Extensions = EGL拡張 Frames per buffer = バッファあたりのフレーム数 GPU Information = GPU情報 -High precision float range = High precision float range +High precision float range = 高精度浮動小数点の範囲 High precision int range = 高精度整数の範囲 Lang/Region = 言語/地域 Memory Page Size = メモリページサイズ @@ -978,7 +994,7 @@ AVI Dump stopped. = AVIダンプを停止しました Cache ISO in RAM = ISO全体をキャッシュする Change CPU Clock = CPUクロックを変更する (不安定) Change Memory Stick folder = メモリースティックフォルダを変更する -Change Memory Stick Size = Change Memory Stick size (GB) +Change Memory Stick Size = メモリースティックの容量の変更 (GB) Change Nickname = ニックネームを変更する ChangingMemstickPath = ゲームのセーブ, セーブステート, その他のデータはこのフォルダにコピーされません。\n\nメモリースティックフォルダを変更しますか? ChangingMemstickPathInvalid = そのパスを使用してメモリースティックファイルを保存することができませんでした。 @@ -1018,11 +1034,12 @@ Increase size = サイズを拡大する Interpreter = インタプリタ IO timing method = 入出力のタイミング IR Interpreter = IRインタプリタ -Memory Stick Folder = Memory Stick folder +Memory Stick Folder = メモリースティックフォルダ Memory Stick inserted = メモリースティックを挿入する MHz, 0:default = MHz, 0 = デフォルト MMDDYYYY = 月/日/年 Newest Save = 最も新しいセーブ +No animation = アニメーションなし Not a PSP game = PSPのゲームではありません Off = オフ Oldest Save = 最も古いセーブ @@ -1030,6 +1047,7 @@ PSP Model = PSPのモデル PSP Settings = PSPの設定 PSP-1000 = PSP-1000 PSP-2000/3000 = PSP-2000/3000 +Recent games = プレイ履歴のスライド Record Audio = オーディオを記録する Record Display = 画面を記録する Reset Recording on Save/Load State = ステートをセーブ/ロードしたら記録をリセットする @@ -1053,13 +1071,14 @@ Storage full = ストレージが一杯です Sustained performance mode = パフォーマンス維持モード Time Format = 時刻の形式 UI = ユーザーインターフェース -UI Sound = UI sound +UI Sound = UI操作音 +UI background animation = UIの背景アニメーション undo %c = backup %c Use Lossless Video Codec (FFV1) = ロスレスビデオコーデックを使う (FFV1) -Use O to confirm = Oボタンで決定する +Use O to confirm = ○ボタンで決定する(日本仕様) Use output buffer (with overlay) for recording = 記録時に出力バッファを使用する (オーバーレイ付き) Use system native keyboard = システムネイティブキーボードを使用する -Use X to confirm = Xボタンで決定する +Use X to confirm = ✕ボタンで決定する(海外仕様) VersionCheck = 新バージョンのPPSSPPをチェックする WARNING: Android battery save mode is on = 警告: アンドロイドのバッテリーセーブモードがオンになっています WARNING: Battery save mode is on = 警告: バッテリーセーブモードがオンになっています From bd99574e5ba36bcdde291841d32aeeb82c532285 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 8 Aug 2021 23:01:35 -0700 Subject: [PATCH 131/336] Core: Ensure exception is reset on reset. Otherwise, we hold on and show this during stepping which is confusing. --- Core/Core.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Core/Core.cpp b/Core/Core.cpp index e7d95c685a..4a18bbb03e 100644 --- a/Core/Core.cpp +++ b/Core/Core.cpp @@ -85,6 +85,10 @@ void Core_ListenLifecycle(CoreLifecycleFunc func) { } void Core_NotifyLifecycle(CoreLifecycle stage) { + if (stage == CoreLifecycle::STARTING) { + g_exceptionInfo.type = ExceptionType::NONE; + } + for (auto func : lifecycleFuncs) { func(stage); } From eb8a2396163fb98a51e3dc833f9419ba207522c4 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 8 Aug 2021 23:03:19 -0700 Subject: [PATCH 132/336] UI: Show a reset button on the crash screen. --- UI/EmuScreen.cpp | 19 ++++++++++++++++++- UI/EmuScreen.h | 2 ++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index 13ed2e5d18..e82deba8b9 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -779,10 +779,19 @@ void EmuScreen::CreateViews() { if (g_Config.bShowDeveloperMenu) { root_->Add(new Button(dev->T("DevMenu")))->OnClick.Handle(this, &EmuScreen::OnDevTools); } - resumeButton_ = root_->Add(new Button(dev->T("Resume"), new AnchorLayoutParams(bounds.centerX(), NONE, NONE, 60, true))); + + LinearLayout *buttons = new LinearLayout(Orientation::ORIENT_HORIZONTAL, new AnchorLayoutParams(bounds.centerX(), NONE, NONE, 60, true)); + buttons->SetSpacing(20.0f); + root_->Add(buttons); + + resumeButton_ = buttons->Add(new Button(dev->T("Resume"))); resumeButton_->OnClick.Handle(this, &EmuScreen::OnResume); resumeButton_->SetVisibility(V_GONE); + resetButton_ = buttons->Add(new Button(dev->T("Reset"))); + resetButton_->OnClick.Handle(this, &EmuScreen::OnReset); + resetButton_->SetVisibility(V_GONE); + cardboardDisableButton_ = root_->Add(new Button(sc->T("Cardboard VR OFF"), new AnchorLayoutParams(bounds.centerX(), NONE, NONE, 30, true))); cardboardDisableButton_->OnClick.Handle(this, &EmuScreen::OnDisableCardboard); cardboardDisableButton_->SetVisibility(V_GONE); @@ -914,12 +923,20 @@ UI::EventReturn EmuScreen::OnResume(UI::EventParams ¶ms) { return UI::EVENT_DONE; } +UI::EventReturn EmuScreen::OnReset(UI::EventParams ¶ms) { + if (coreState == CoreState::CORE_RUNTIME_ERROR) { + NativeMessageReceived("reset", ""); + } + return UI::EVENT_DONE; +} + void EmuScreen::update() { using namespace UI; UIScreen::update(); onScreenMessagesView_->SetVisibility(g_Config.bShowOnScreenMessages ? V_VISIBLE : V_GONE); resumeButton_->SetVisibility(coreState == CoreState::CORE_RUNTIME_ERROR && Memory::MemFault_MayBeResumable() ? V_VISIBLE : V_GONE); + resetButton_->SetVisibility(coreState == CoreState::CORE_RUNTIME_ERROR ? V_VISIBLE : V_GONE); if (bootPending_) { bootGame(gamePath_); diff --git a/UI/EmuScreen.h b/UI/EmuScreen.h index acc8be960b..a61d6a2b11 100644 --- a/UI/EmuScreen.h +++ b/UI/EmuScreen.h @@ -57,6 +57,7 @@ private: UI::EventReturn OnDisableCardboard(UI::EventParams ¶ms); UI::EventReturn OnChat(UI::EventParams ¶ms); UI::EventReturn OnResume(UI::EventParams ¶ms); + UI::EventReturn OnReset(UI::EventParams ¶ms); void bootGame(const Path &filename); bool bootAllowStorage(const Path &filename); @@ -98,6 +99,7 @@ private: UI::Spinner *loadingSpinner_ = nullptr; UI::TextView *loadingTextView_ = nullptr; UI::Button *resumeButton_ = nullptr; + UI::Button *resetButton_ = nullptr; UI::View *chatButton_ = nullptr; UI::Button *cardboardDisableButton_ = nullptr; From 32c7ff84360a44124cb7c50920b26efe08c9965c Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 8 Aug 2021 23:15:27 -0700 Subject: [PATCH 133/336] SaveState: Allow loading save state in exception. And allow saving as well, since we can maybe resume. --- Core/Core.cpp | 12 ++++++++---- Core/Core.h | 2 ++ Core/SaveState.cpp | 9 +++++++++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/Core/Core.cpp b/Core/Core.cpp index 4a18bbb03e..b6af6456fd 100644 --- a/Core/Core.cpp +++ b/Core/Core.cpp @@ -86,7 +86,7 @@ void Core_ListenLifecycle(CoreLifecycleFunc func) { void Core_NotifyLifecycle(CoreLifecycle stage) { if (stage == CoreLifecycle::STARTING) { - g_exceptionInfo.type = ExceptionType::NONE; + Core_ResetException(); } for (auto func : lifecycleFuncs) { @@ -99,7 +99,7 @@ void Core_ListenStopRequest(CoreStopRequestFunc func) { } void Core_Stop() { - g_exceptionInfo.type = ExceptionType::NONE; + Core_ResetException(); Core_UpdateState(CORE_POWERDOWN); for (auto func : stopFuncs) { func(); @@ -267,7 +267,7 @@ void Core_UpdateSingleStep() { } void Core_SingleStep() { - g_exceptionInfo.type = ExceptionType::NONE; + Core_ResetException(); currentMIPS->SingleStep(); if (coreState == CORE_STEPPING) steppingCounter++; @@ -366,7 +366,7 @@ void Core_EnableStepping(bool step) { } else { host->SetDebugMode(false); // Clear the exception if we resume. - g_exceptionInfo.type = ExceptionType::NONE; + Core_ResetException(); coreState = CORE_RUNNING; coreStatePending = false; m_StepCond.notify_all(); @@ -489,6 +489,10 @@ void Core_Break() { } } +void Core_ResetException() { + g_exceptionInfo.type = ExceptionType::NONE; +} + const ExceptionInfo &Core_GetExceptionInfo() { return g_exceptionInfo; } diff --git a/Core/Core.h b/Core/Core.h index 21facdb735..a2acc66918 100644 --- a/Core/Core.h +++ b/Core/Core.h @@ -101,6 +101,8 @@ void Core_MemoryExceptionInfo(u32 address, u32 pc, MemoryExceptionType type, std void Core_ExecException(u32 address, u32 pc, ExecExceptionType type); void Core_Break(); +// Call when loading save states, etc. +void Core_ResetException(); enum class ExceptionType { NONE, diff --git a/Core/SaveState.cpp b/Core/SaveState.cpp index c133486442..b58325f9ca 100644 --- a/Core/SaveState.cpp +++ b/Core/SaveState.cpp @@ -335,11 +335,15 @@ namespace SaveState void Load(const Path &filename, int slot, Callback callback, void *cbUserData) { + if (coreState == CoreState::CORE_RUNTIME_ERROR) + Core_EnableStepping(true); Enqueue(Operation(SAVESTATE_LOAD, filename, slot, callback, cbUserData)); } void Save(const Path &filename, int slot, Callback callback, void *cbUserData) { + if (coreState == CoreState::CORE_RUNTIME_ERROR) + Core_EnableStepping(true); Enqueue(Operation(SAVESTATE_SAVE, filename, slot, callback, cbUserData)); } @@ -350,6 +354,8 @@ namespace SaveState void Rewind(Callback callback, void *cbUserData) { + if (coreState == CoreState::CORE_RUNTIME_ERROR) + Core_EnableStepping(true); Enqueue(Operation(SAVESTATE_REWIND, Path(), -1, callback, cbUserData)); } @@ -866,6 +872,7 @@ namespace SaveState callbackMessage = op.slot != LOAD_UNDO_SLOT ? sc->T("Loaded State") : sc->T("State load undone"); callbackResult = TriggerLoadWarnings(callbackMessage); hasLoadedState = true; + Core_ResetException(); if (!slot_prefix.empty()) callbackMessage = slot_prefix + callbackMessage; @@ -944,6 +951,7 @@ namespace SaveState callbackMessage = sc->T("Loaded State"); callbackResult = Status::SUCCESS; hasLoadedState = true; + Core_ResetException(); } else if (result == CChunkFileReader::ERROR_BROKEN_STATE) { // Cripes. Good news is, we might have more. Let's try those too, better than a reset. if (HandleLoadFailure()) { @@ -951,6 +959,7 @@ namespace SaveState callbackMessage = sc->T("Loaded State"); callbackResult = Status::SUCCESS; hasLoadedState = true; + Core_ResetException(); } else { callbackMessage = std::string(i18nLoadFailure) + ": " + errorString; callbackResult = Status::FAILURE; From 75eeb55617e38375b016262bd3c1eb2b2a9cf487 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 8 Aug 2021 23:40:41 -0700 Subject: [PATCH 134/336] UI: Use a UIState for exceptions. This makes it so we can enable Stop/Reset/etc. during them in the menus. --- Core/System.cpp | 1 + Core/System.h | 1 + UI/EmuScreen.cpp | 4 ++-- Windows/Debugger/Debugger_Disasm.cpp | 5 +++-- Windows/MainWindowMenu.cpp | 7 ++++--- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Core/System.cpp b/Core/System.cpp index 87392b22eb..04070c614e 100644 --- a/Core/System.cpp +++ b/Core/System.cpp @@ -131,6 +131,7 @@ void UpdateUIState(GlobalUIState newState) { case UISTATE_INGAME: state = "ingame"; break; case UISTATE_MENU: state = "menu"; break; case UISTATE_PAUSEMENU: state = "pausemenu"; break; + case UISTATE_EXCEPTION: state = "exception"; break; } if (state) { System_SendMessage("uistate", state); diff --git a/Core/System.h b/Core/System.h index 13423a0167..380c9e00f3 100644 --- a/Core/System.h +++ b/Core/System.h @@ -33,6 +33,7 @@ enum GlobalUIState { UISTATE_PAUSEMENU, UISTATE_INGAME, UISTATE_EXIT, + UISTATE_EXCEPTION, }; // Use these in conjunction with GetSysDirectory. diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index e82deba8b9..8161fcd4a0 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -952,8 +952,8 @@ void EmuScreen::update() { PSP_CoreParameter().pixelHeight = pixel_yres * bounds.h / dp_yres; #endif - if (!invalid_ && coreState != CORE_RUNTIME_ERROR) { - UpdateUIState(UISTATE_INGAME); + if (!invalid_) { + UpdateUIState(coreState != CORE_RUNTIME_ERROR ? UISTATE_INGAME : UISTATE_EXCEPTION); } if (errorMessage_.size()) { diff --git a/Windows/Debugger/Debugger_Disasm.cpp b/Windows/Debugger/Debugger_Disasm.cpp index 54af241898..3d802ddeef 100644 --- a/Windows/Debugger/Debugger_Disasm.cpp +++ b/Windows/Debugger/Debugger_Disasm.cpp @@ -791,9 +791,10 @@ void CDisasm::SavePosition() void CDisasm::SetDebugMode(bool _bDebug, bool switchPC) { HWND hDlg = m_hDlg; + bool ingame = (GetUIState() == UISTATE_INGAME || GetUIState() == UISTATE_EXCEPTION) && PSP_IsInited(); // Update Dialog Windows - if (_bDebug && GetUIState() == UISTATE_INGAME && PSP_IsInited()) + if (_bDebug && ingame) { Core_WaitInactive(TEMP_BREAKPOINT_WAIT_MS); breakpointList->reloadBreakpoints(); @@ -827,7 +828,7 @@ void CDisasm::SetDebugMode(bool _bDebug, bool switchPC) { updateThreadLabel(true); - if (GetUIState() == UISTATE_INGAME && PSP_IsInited()) + if (ingame) { SetDlgItemText(m_hDlg, IDC_STOPGO, L"Break"); EnableWindow(GetDlgItem(hDlg, IDC_STOPGO), TRUE); diff --git a/Windows/MainWindowMenu.cpp b/Windows/MainWindowMenu.cpp index c0d790e06f..ac186ad09c 100644 --- a/Windows/MainWindowMenu.cpp +++ b/Windows/MainWindowMenu.cpp @@ -68,7 +68,8 @@ namespace MainWindow { LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM); void SetIngameMenuItemStates(HMENU menu, const GlobalUIState state) { - UINT menuEnable = state == UISTATE_INGAME ? MF_ENABLED : MF_GRAYED; + UINT menuEnable = state == UISTATE_INGAME || state == UISTATE_EXCEPTION ? MF_ENABLED : MF_GRAYED; + UINT menuInGameEnable = state == UISTATE_INGAME ? MF_ENABLED : MF_GRAYED; UINT umdSwitchEnable = state == UISTATE_INGAME && getUMDReplacePermit() ? MF_ENABLED : MF_GRAYED; EnableMenuItem(menu, ID_FILE_SAVESTATEFILE, menuEnable); @@ -86,7 +87,7 @@ namespace MainWindow { EnableMenuItem(menu, ID_DEBUG_SAVESYMFILE, menuEnable); EnableMenuItem(menu, ID_DEBUG_RESETSYMBOLTABLE, menuEnable); EnableMenuItem(menu, ID_DEBUG_TAKESCREENSHOT, menuEnable); - EnableMenuItem(menu, ID_DEBUG_SHOWDEBUGSTATISTICS, menuEnable); + EnableMenuItem(menu, ID_DEBUG_SHOWDEBUGSTATISTICS, menuInGameEnable); EnableMenuItem(menu, ID_DEBUG_EXTRACTFILE, menuEnable); // While playing, this pop up doesn't work - and probably doesn't make sense. @@ -394,7 +395,7 @@ namespace MainWindow { Core_EnableStepping(false); } } else { - if (GetUIState() == UISTATE_INGAME || GetUIState() == UISTATE_PAUSEMENU) { + if (GetUIState() == UISTATE_INGAME || GetUIState() == UISTATE_EXCEPTION || GetUIState() == UISTATE_PAUSEMENU) { Core_EnableStepping(false); } From 641ceff68356836df3ce1f7a6490ffe195d305e9 Mon Sep 17 00:00:00 2001 From: iota97 Date: Mon, 9 Aug 2021 11:24:29 +0200 Subject: [PATCH 135/336] Scoped storage japanese translation fix --- UI/MemStickScreen.cpp | 10 +++++----- assets/lang/ja_JP.ini | 17 +++++++++-------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/UI/MemStickScreen.cpp b/UI/MemStickScreen.cpp index e946768f35..edacb553a8 100644 --- a/UI/MemStickScreen.cpp +++ b/UI/MemStickScreen.cpp @@ -368,6 +368,7 @@ UI::EventReturn ConfirmMemstickMoveScreen::OnMoveDataClick(UI::EventParams ¶ void ConfirmMemstickMoveScreen::update() { UIDialogScreenWithBackground::update(); + auto iz = GetI18NCategory("MemStick"); if (moveDataTask_) { if (progressView_) { @@ -378,7 +379,7 @@ void ConfirmMemstickMoveScreen::update() { if (result) { if (*result) { - progressReporter_.Set("Done!"); + progressReporter_.Set(iz->T("Done!")); INFO_LOG(SYSTEM, "Move data task finished successfully!"); // Succeeded! FinishFolderMove(); @@ -404,7 +405,7 @@ UI::EventReturn ConfirmMemstickMoveScreen::OnConfirm(UI::EventParams ¶ms) { // If the directory itself is called PSP, don't go below. if (moveData_) { - progressReporter_.Set("Starting move..."); + progressReporter_.Set(iz->T("Starting move...")); moveDataTask_ = Promise::Spawn(&g_threadManager, [&]() -> bool * { Path moveSrc = g_Config.memStickDirectory; @@ -428,7 +429,7 @@ UI::EventReturn ConfirmMemstickMoveScreen::OnConfirm(UI::EventParams ¶ms) { // TODO: Handle failure listing files. std::string error = "Failed to read old directory"; INFO_LOG(SYSTEM, "%s", error.c_str()); - progressReporter_.Set(error); + progressReporter_.Set(iz->T(error.c_str())); return new bool(false); } @@ -487,8 +488,7 @@ UI::EventReturn ConfirmMemstickMoveScreen::OnConfirm(UI::EventParams ¶ms) { } if (moveFailures > 0) { - std::string error = "Failed to move some files!"; - progressReporter_.Set(error); + progressReporter_.Set(iz->T("Failed to move some files!")); return new bool(false); } diff --git a/assets/lang/ja_JP.ini b/assets/lang/ja_JP.ini index d0bbceb0d7..f6c0052964 100644 --- a/assets/lang/ja_JP.ini +++ b/assets/lang/ja_JP.ini @@ -810,14 +810,15 @@ Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = ウェブサイトはこちら: written = 速度と移植性を保つためにC++で書かれています -[PSP Memory Stick] -●Data will stay even if you uninstall PPSSPP. = 保存データはPPSSPPをアンインストールしても残る。 -●Data can be shared between PPSSPP regular/Gold. = 通常版/ゴールド間でのデータの共有が可能。 -●Data CANNOT be shared between PPSSPP regular/Gold! = 通常版/ゴールド間でのデータの共有が「できない」。 -●Easy USB Access = PCとのUSB接続でフォルダにアクセスが簡単にできる。 -●USB access through Android/data/org.ppsspp.ppsspp/files = USB接続は Android/data/org.ppsspp.ppsspp/files を通して行う。 -●Warning! Data will be lost when you uninstall PPSSPP! = 警告! PPSSPPをアンインストールすると保存データも削除されます! -Choose PSP data storage(Memory Stick): = PSPデータの保存先の選択(メモリースティック) +[MemStick] +DataWillStay = 保存データはPPSSPPをアンインストールしても残る。 +DataCanBeShared = 通常版/ゴールド間でのデータの共有が可能。 +DataCannotBeShared = 通常版/ゴールド間でのデータの共有が「できない」。 +EasyUSBAccess = PCとのUSB接続でフォルダにアクセスが簡単にできる。 +USBAccessThrough = USB接続は Android/data/org.ppsspp.ppsspp/files を通して行う。 +USBAccessThroughGold = USB接続は Android/data/org.ppsspp.ppssppgold/files を通して行う。 +DataWillBeLostOnUninstall = 警告! PPSSPPをアンインストールすると保存データも削除されます! +MemoryStickDescription = PSPデータの保存先の選択(メモリースティック) Create or Choose a PSP folder = フォルダの新規作成または既存フォルダの選択 Use App Private Directory = アプリのプライベートフォルダに保存 Use PSP folder at root of storage = デバイスの内部ストレージのルートに保存 From 379f075c85ffe53397d1350a7603d0d2c818bade Mon Sep 17 00:00:00 2001 From: Brian Blakely Date: Mon, 9 Aug 2021 17:16:30 -0400 Subject: [PATCH 136/336] Do not call methods on gpu if it is null. Fixes #13412 (sans video rewind). (#14674) * Do not call methods on gpu if it is null. Fixes 13412 (sans video rewind). * Do not call methods on gpu if it is null. Fixes #13412 (sans video rewind). * Ensure PSP is init before measuring state size. * Continue running core until GPU is ready. * Libretro: Bypass state measure during init. * Sync ffmpeg version with master. * Do not call methods on gpu if it is null. Fixes #13412 (sans video rewind). * Ensure PSP is init before measuring state size. * Continue running core until GPU is ready. * Libretro: Bypass state measure during init. * Sync ffmpeg version with master. --- libretro/libretro.cpp | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index cd15cb94f0..1e5fcc61e5 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -252,7 +252,7 @@ void retro_set_environment(retro_environment_t cb) vars.push_back(ppsspp_software_skinning.GetOptions()); vars.push_back(ppsspp_lazy_texture_caching.GetOptions()); vars.push_back(ppsspp_retain_changed_textures.GetOptions()); - vars.push_back(ppsspp_force_lag_sync.GetOptions()); + vars.push_back(ppsspp_force_lag_sync.GetOptions()); vars.push_back(ppsspp_disable_slow_framebuffer_effects.GetOptions()); vars.push_back(ppsspp_lower_resolution_for_effects.GetOptions()); vars.push_back(ppsspp_texture_scaling_level.GetOptions()); @@ -343,8 +343,8 @@ static void check_variables(CoreParameter &coreParam) { bool updated = false; - if ( coreState != CORE_POWERUP - && environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) + if ( coreState != CORE_POWERUP + && environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && !updated) return; @@ -638,13 +638,13 @@ bool retro_load_game(const struct retro_game_info *game) g_Config.sNickName = std::string(nickname); - if (environ_cb(RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, &dir_ptr) + if (environ_cb(RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, &dir_ptr) && dir_ptr) { retro_base_dir = Path(dir_ptr); } - if (environ_cb(RETRO_ENVIRONMENT_GET_SAVE_DIRECTORY, &dir_ptr) + if (environ_cb(RETRO_ENVIRONMENT_GET_SAVE_DIRECTORY, &dir_ptr) && dir_ptr) { retro_save_dir = Path(dir_ptr); @@ -827,7 +827,7 @@ void retro_run(void) if (useEmuThread) { - if( emuThreadState == EmuThreadState::PAUSED || + if( emuThreadState == EmuThreadState::PAUSED || emuThreadState == EmuThreadState::PAUSE_REQUESTED) { ctx->SwapBuffers(); @@ -860,17 +860,25 @@ namespace SaveState size_t retro_serialize_size(void) { + if(!gpu) { // The HW renderer isn't ready on first pass. + return 134217728; // 128MB ought to be enough for anybody. + } + SaveState::SaveStart state; // TODO: Libretro API extension to use the savestate queue if (useEmuThread) EmuThreadPause(); - return (CChunkFileReader::MeasurePtr(state) + 0x800000) + return (CChunkFileReader::MeasurePtr(state) + 0x800000) & ~0x7FFFFF; // We don't unpause intentionally } bool retro_serialize(void *data, size_t size) { + if(!gpu) { // The HW renderer isn't ready on first pass. + return false; + } + bool retVal; SaveState::SaveStart state; // TODO: Libretro API extension to use the savestate queue @@ -900,7 +908,7 @@ bool retro_unserialize(const void *data, size_t size) EmuThreadPause(); // Does nothing if already paused std::string errorString; - retVal = CChunkFileReader::LoadPtr((u8 *)data, state, &errorString) + retVal = CChunkFileReader::LoadPtr((u8 *)data, state, &errorString) == CChunkFileReader::ERROR_NONE; if (useEmuThread) From ff9b9f73217cb0c46a845fa17483a87c245f946f Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 9 Aug 2021 20:47:24 -0700 Subject: [PATCH 137/336] Sas: Add option to control reverb volume. This also allows you to turn it off. --- Core/Config.cpp | 3 ++- Core/Config.h | 1 + Core/ConfigValues.h | 2 +- Core/HW/SasAudio.cpp | 2 +- Core/HW/SasReverb.cpp | 15 +++++++++++++-- Core/HW/StereoResampler.cpp | 4 ++-- UI/GameSettingsScreen.cpp | 8 ++++++-- headless/Headless.cpp | 2 ++ libretro/libretro.cpp | 3 ++- 9 files changed, 30 insertions(+), 10 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index d019ae7bfb..a378ceada6 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -904,7 +904,8 @@ static ConfigSetting soundSettings[] = { ConfigSetting("Enable", &g_Config.bEnableSound, true, true, true), ConfigSetting("AudioBackend", &g_Config.iAudioBackend, 0, true, true), ConfigSetting("ExtraAudioBuffering", &g_Config.bExtraAudioBuffering, false, true, false), - ConfigSetting("GlobalVolume", &g_Config.iGlobalVolume, VOLUME_MAX, true, true), + ConfigSetting("GlobalVolume", &g_Config.iGlobalVolume, VOLUME_FULL, true, true), + ConfigSetting("ReverbVolume", &g_Config.iReverbVolume, VOLUME_FULL, true, true), ConfigSetting("AltSpeedVolume", &g_Config.iAltSpeedVolume, -1, true, true), ConfigSetting("AudioDevice", &g_Config.sAudioDevice, "", true, false), ConfigSetting("AutoAudioDevice", &g_Config.bAutoAudioDevice, true, true, false), diff --git a/Core/Config.h b/Core/Config.h index 4ddde8b525..cf0711b139 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -238,6 +238,7 @@ public: bool bEnableSound; int iAudioBackend; int iGlobalVolume; + int iReverbVolume; int iAltSpeedVolume; bool bExtraAudioBuffering; // For bluetooth std::string sAudioDevice; diff --git a/Core/ConfigValues.h b/Core/ConfigValues.h index d55af77964..cbdee70a0b 100644 --- a/Core/ConfigValues.h +++ b/Core/ConfigValues.h @@ -28,7 +28,7 @@ const int PSP_MODEL_FAT = 0; const int PSP_MODEL_SLIM = 1; const int PSP_DEFAULT_FIRMWARE = 660; static const int8_t VOLUME_OFF = 0; -static const int8_t VOLUME_MAX = 10; +static const int8_t VOLUME_FULL = 10; enum class CPUCore { INTERPRETER = 0, diff --git a/Core/HW/SasAudio.cpp b/Core/HW/SasAudio.cpp index 31de118345..2df95195a6 100644 --- a/Core/HW/SasAudio.cpp +++ b/Core/HW/SasAudio.cpp @@ -680,7 +680,7 @@ void SasInstance::ApplyWaveformEffect() { sendBufferDownsampled[i * 2 + 1] = clamp_s16(sendBuffer[i * 4 + 1]); } - // Volume max is 0x1000, while our factor is up to 0x8000. Shifting right by 3 fixes that. + // Volume max is 0x1000, while our factor is up to 0x8000. Shifting left by 3 fixes that. reverb_.ProcessReverb(sendBufferProcessed, sendBufferDownsampled, grainSize / 2, waveformEffect.leftVol << 3, waveformEffect.rightVol << 3); } diff --git a/Core/HW/SasReverb.cpp b/Core/HW/SasReverb.cpp index 14dbc06248..c67de0abdd 100644 --- a/Core/HW/SasReverb.cpp +++ b/Core/HW/SasReverb.cpp @@ -18,6 +18,8 @@ #include #include +#include "Common/Math/math_util.h" +#include "Core/Config.h" #include "Core/HW/SasReverb.h" #include "Core/Util/AudioFormat.h" @@ -219,6 +221,15 @@ void SasReverb::ProcessReverb(int16_t *output, const int16_t *input, size_t inpu return; } + const uint8_t reverbVolume = Clamp(g_Config.iReverbVolume, 0, 25); + // Standard volume is 10, which pairs with a normal shift of 15. + const uint8_t finalShift = 25 - reverbVolume; + if (reverbVolume == 0) { + // Force to zero output, which is not the same as "Off." + memset(output, 0, inputSize * 4); + return; + } + const SasReverbData &d = presets[preset_]; // We put this on the stack instead of in the object to let the compiler optimize better (avoid mem r/w). @@ -255,8 +266,8 @@ void SasReverb::ProcessReverb(int16_t *output, const int16_t *input, size_t inpu b[d.mRAPF2] = clamp_s16(Rout - (d.vAPF2*b[(d.mRAPF2 - d.dAPF2)] >> 15)); Rout = b[(d.mRAPF2 - d.dAPF2)] + (b[d.mRAPF2] * d.vAPF2 >> 15); // ___Output to Mixer(Output volume multiplied with input from APF2)___________ - output[i * 4 + 0] = clamp_s16(Lout * volLeft >> 15); - output[i * 4 + 1] = clamp_s16(Rout * volRight >> 15); + output[i * 4 + 0] = clamp_s16((Lout * volLeft) >> finalShift); + output[i * 4 + 1] = clamp_s16((Rout * volRight) >> finalShift); output[i * 4 + 2] = 0; output[i * 4 + 3] = 0; diff --git a/Core/HW/StereoResampler.cpp b/Core/HW/StereoResampler.cpp index 6f40d310f3..5445984546 100644 --- a/Core/HW/StereoResampler.cpp +++ b/Core/HW/StereoResampler.cpp @@ -149,12 +149,12 @@ inline void ClampBufferToS16WithVolume(s16 *out, const s32 *in, size_t size) { } } - if (volume >= VOLUME_MAX) { + if (volume >= VOLUME_FULL) { ClampBufferToS16(out, in, size, 0); } else if (volume <= VOLUME_OFF) { memset(out, 0, size * sizeof(s16)); } else { - ClampBufferToS16(out, in, size, VOLUME_MAX - (s8)volume); + ClampBufferToS16(out, in, size, VOLUME_FULL - (s8)volume); } } diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 5f35d37b78..441e57ae63 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -609,15 +609,19 @@ void GameSettingsScreen::CreateViews() { audioSettings->Add(new CheckBox(&g_Config.bEnableSound, a->T("Enable Sound"))); - PopupSliderChoice *volume = audioSettings->Add(new PopupSliderChoice(&g_Config.iGlobalVolume, VOLUME_OFF, VOLUME_MAX, a->T("Global volume"), screenManager())); + PopupSliderChoice *volume = audioSettings->Add(new PopupSliderChoice(&g_Config.iGlobalVolume, VOLUME_OFF, VOLUME_FULL, a->T("Global volume"), screenManager())); volume->SetEnabledPtr(&g_Config.bEnableSound); volume->SetZeroLabel(a->T("Mute")); - PopupSliderChoice *altVolume = audioSettings->Add(new PopupSliderChoice(&g_Config.iAltSpeedVolume, VOLUME_OFF, VOLUME_MAX, a->T("Alternate speed volume"), screenManager())); + PopupSliderChoice *altVolume = audioSettings->Add(new PopupSliderChoice(&g_Config.iAltSpeedVolume, VOLUME_OFF, VOLUME_FULL, a->T("Alternate speed volume"), screenManager())); altVolume->SetEnabledPtr(&g_Config.bEnableSound); altVolume->SetZeroLabel(a->T("Mute")); altVolume->SetNegativeDisable(a->T("Use global volume")); + PopupSliderChoice *reverbVolume = audioSettings->Add(new PopupSliderChoice(&g_Config.iReverbVolume, VOLUME_OFF, 2 * VOLUME_FULL, a->T("Reverb volume"), screenManager())); + reverbVolume->SetEnabledPtr(&g_Config.bEnableSound); + reverbVolume->SetZeroLabel(a->T("Disabled")); + // Hide the backend selector in UWP builds (we only support XAudio2 there). #if PPSSPP_PLATFORM(WINDOWS) && !PPSSPP_PLATFORM(UWP) if (IsVistaOrHigher()) { diff --git a/headless/Headless.cpp b/headless/Headless.cpp index a0bc857169..04ba08c333 100644 --- a/headless/Headless.cpp +++ b/headless/Headless.cpp @@ -404,6 +404,8 @@ int main(int argc, const char* argv[]) g_Config.sMACAddress = "12:34:56:78:9A:BC"; g_Config.iFirmwareVersion = PSP_DEFAULT_FIRMWARE; g_Config.iPSPModel = PSP_MODEL_SLIM; + g_Config.iGlobalVolume = VOLUME_FULL; + g_Config.iReverbVolume = VOLUME_FULL; #ifdef _WIN32 g_Config.internalDataDirectory.clear(); diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index 8c6ad684aa..b9bc93fff8 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -420,7 +420,8 @@ void retro_init(void) // libretro does its own timing, so this should stay CONTINUOUS. g_Config.iUnthrottleMode = (int)UnthrottleMode::CONTINUOUS; g_Config.bMemStickInserted = true; - g_Config.iGlobalVolume = VOLUME_MAX - 1; + g_Config.iGlobalVolume = VOLUME_FULL - 1; + g_Config.iReverbVolume = VOLUME_FULL; g_Config.iAltSpeedVolume = -1; g_Config.bEnableSound = true; g_Config.iCwCheatRefreshRate = 60; From 608f9913e967352c7b33e21291a779de203925cd Mon Sep 17 00:00:00 2001 From: nassau-tk <48179091+nassau-tk@users.noreply.github.com> Date: Tue, 10 Aug 2021 20:05:55 +0900 Subject: [PATCH 138/336] Update ja_JP.ini MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix translation below. Ignore camera notch when centering = インカメラ液晶部分を画面センタリング領域に含めない --- assets/lang/ja_JP.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/lang/ja_JP.ini b/assets/lang/ja_JP.ini index f6c0052964..0fe2ef16b1 100644 --- a/assets/lang/ja_JP.ini +++ b/assets/lang/ja_JP.ini @@ -479,7 +479,7 @@ HardwareTessellation Tip = ハードウェアを使用して曲線を作成し High = 高 Hybrid = Hybrid Hybrid + Bicubic = Hybrid + Bicubic -Ignore camera notch when centering = Ignore camera notch when centering +Ignore camera notch when centering = インカメラ液晶部分を画面センタリング領域に含めない Internal Resolution = 内部解像度 Lazy texture caching = テクスチャキャッシュを遅延させる (高速化) Linear = Linear From 5b7557acd49c434f278fcc64ac884fb097f61a4f Mon Sep 17 00:00:00 2001 From: Jan Beich Date: Tue, 10 Aug 2021 16:29:52 +0000 Subject: [PATCH 139/336] Thread: unbreak on BSDs after 50d9d7ea6f2a Common/Thread/ThreadUtil.cpp:149:2: error: use of undeclared identifier 'pthread_threadid_np' pthread_threadid_np(NULL, &tid); ^ --- Common/Thread/ThreadUtil.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Common/Thread/ThreadUtil.cpp b/Common/Thread/ThreadUtil.cpp index 950ef3042a..dd8ea51ed7 100644 --- a/Common/Thread/ThreadUtil.cpp +++ b/Common/Thread/ThreadUtil.cpp @@ -33,6 +33,12 @@ #include #endif +#if defined(__DragonFly__) || defined(__FreeBSD__) +#include +#elif defined(__NetBSD__) +#include +#endif + #ifdef TLS_SUPPORTED static thread_local const char *curThreadName; #endif @@ -144,7 +150,7 @@ int GetCurrentThreadIdForDebug() { return 1; #elif PPSSPP_PLATFORM(WINDOWS) return (int)GetCurrentThreadId(); -#elif PPSSPP_PLATFORM(MAC) || PPSSPP_PLATFORM(IOS) || defined(__OpenBSD__) || defined(__FreeBSD__) +#elif PPSSPP_PLATFORM(MAC) || PPSSPP_PLATFORM(IOS) uint64_t tid = 0; pthread_threadid_np(NULL, &tid); return (int)tid; @@ -152,6 +158,12 @@ int GetCurrentThreadIdForDebug() { // See issue 14545 return (int)syscall(__NR_gettid); // return (int)gettid(); +#elif defined(__DragonFly__) || defined(__FreeBSD__) + return pthread_getthreadid_np(); +#elif defined(__NetBSD__) + return _lwp_self(); +#elif defined(__OpenBSD__) + return getthrid(); #else return 1; #endif From ae399232239db877ff1a67244e602013cce183c0 Mon Sep 17 00:00:00 2001 From: Jan Beich Date: Tue, 10 Aug 2021 16:37:14 +0000 Subject: [PATCH 140/336] Thread: set names on BSDs after 062566b67cb0 --- Common/Thread/ThreadUtil.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Common/Thread/ThreadUtil.cpp b/Common/Thread/ThreadUtil.cpp index dd8ea51ed7..7381279295 100644 --- a/Common/Thread/ThreadUtil.cpp +++ b/Common/Thread/ThreadUtil.cpp @@ -33,7 +33,7 @@ #include #endif -#if defined(__DragonFly__) || defined(__FreeBSD__) +#if defined(__DragonFly__) || defined(__FreeBSD__) || defined(__OpenBSD__) #include #elif defined(__NetBSD__) #include @@ -125,6 +125,10 @@ void SetCurrentThreadName(const char* threadName) { 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 From b543cc69adcc8b4e18c06d56105b08500afa399f Mon Sep 17 00:00:00 2001 From: nassau-tk <48179091+nassau-tk@users.noreply.github.com> Date: Wed, 11 Aug 2021 12:26:17 +0900 Subject: [PATCH 141/336] Update ja_Jp.ini for Reverb volume MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix below. Reverb volume = リバーブボリューム --- assets/lang/ja_JP.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/lang/ja_JP.ini b/assets/lang/ja_JP.ini index 0fe2ef16b1..9abc27eeca 100644 --- a/assets/lang/ja_JP.ini +++ b/assets/lang/ja_JP.ini @@ -10,6 +10,7 @@ Global volume = グローバルボリューム Microphone = マイクの設定 Microphone Device = マイク入力機器の選択 Mute = ミュート +Reverb volume = リバーブボリューム Switch on new audio device = 新しいオーディオデバイスをオンにする Use global volume = グローバルボリュームを使う WASAPI (fast) = WASAPI (高速) From a3a6dcabda10b99eac48d16ff91221e4be181c37 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Tue, 10 Aug 2021 21:42:44 -0700 Subject: [PATCH 142/336] UI: Fix reset of alt speed options in settings. --- UI/GameSettingsScreen.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 441e57ae63..382ca9cbfc 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -1218,9 +1218,6 @@ UI::EventReturn GameSettingsScreen::OnDumpNextFrameToLog(UI::EventParams &e) { void GameSettingsScreen::update() { UIScreen::update(); - g_Config.iFpsLimit1 = iAlternateSpeedPercent1_ < 0 ? -1 : (iAlternateSpeedPercent1_ * 60) / 100; - g_Config.iFpsLimit2 = iAlternateSpeedPercent2_ < 0 ? -1 : (iAlternateSpeedPercent2_ * 60) / 100; - bool vertical = UseVerticalLayout(); if (vertical != lastVertical_) { RecreateViews(); @@ -1266,6 +1263,9 @@ void GameSettingsScreen::sendMessage(const char *message, const char *value) { void GameSettingsScreen::dialogFinished(const Screen *dialog, DialogResult result) { if (result == DialogResult::DR_OK) { + g_Config.iFpsLimit1 = iAlternateSpeedPercent1_ < 0 ? -1 : (iAlternateSpeedPercent1_ * 60) / 100; + g_Config.iFpsLimit2 = iAlternateSpeedPercent2_ < 0 ? -1 : (iAlternateSpeedPercent2_ * 60) / 100; + RecreateViews(); } } From bd0881a0abc9de5dc0156947ef9cc55c5770f747 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Tue, 10 Aug 2021 21:43:04 -0700 Subject: [PATCH 143/336] UI: Fix enable/disable of reporting outside game. --- Core/Reporting.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/Reporting.cpp b/Core/Reporting.cpp index 4e69f353ee..49e9565564 100644 --- a/Core/Reporting.cpp +++ b/Core/Reporting.cpp @@ -523,7 +523,7 @@ namespace Reporting // Don't report from games without a version ID (i.e. random hashed homebrew IDs.) // The problem is, these aren't useful because the hashes end up different for different people. // TODO: Should really hash the ELF instead of the path, but then that affects savestates/cheats. - if (g_paramSFO.GetValueString("DISC_VERSION").empty()) + if (PSP_IsInited() && g_paramSFO.GetValueString("DISC_VERSION").empty()) return false; // Some users run the exe from a zip or something, and don't have fonts. From 0c664aa8205ad7a4b6779c33389e8c0bd3099e7c Mon Sep 17 00:00:00 2001 From: iota97 Date: Wed, 11 Aug 2021 08:35:41 +0200 Subject: [PATCH 144/336] Fix savestate undo consistency --- Core/SaveState.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Core/SaveState.cpp b/Core/SaveState.cpp index 30b09cb5c7..1b02abe199 100644 --- a/Core/SaveState.cpp +++ b/Core/SaveState.cpp @@ -490,6 +490,7 @@ namespace SaveState DeleteIfExists(backup); File::Rename(backup.WithExtraExtension(".tmp"), backup); g_Config.sStateLoadUndoGame = GenerateFullDiscId(gameFilename); + g_Config.Save("Saving config for savestate last load undo"); } else { ERROR_LOG(SAVESTATE, "Saving load undo state failed: %s", message.c_str()); } @@ -547,6 +548,7 @@ namespace SaveState RenameIfExists(fn, fnUndo); g_Config.sStateUndoLastSaveGame = GenerateFullDiscId(gameFilename); g_Config.iStateUndoLastSaveSlot = slot; + g_Config.Save("Saving config for savestate last save undo"); } else { DeleteIfExists(fn); } From 8eb1325ff06721e816d152872d103a0ceb16c0a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 7 Aug 2021 18:02:47 +0200 Subject: [PATCH 145/336] Cleanup --- Core/Loaders.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/Core/Loaders.cpp b/Core/Loaders.cpp index 9eccacc215..cd0667829b 100644 --- a/Core/Loaders.cpp +++ b/Core/Loaders.cpp @@ -344,8 +344,6 @@ bool LoadFile(FileLoader **fileLoaderPtr, std::string *error_string) { case IdentifiedFileType::ERROR_IDENTIFYING: *error_string = *error_string + ": " + (fileLoader ? fileLoader->LatestError() : ""); - if (error_string->empty()) - *error_string = "Error reading file"; ERROR_LOG(LOADER, "Error while identifying file: %s", error_string->c_str()); break; From 5de47c6cf281d9941e3548f07a7d8c3ff29dfb5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 11 Aug 2021 09:07:30 +0200 Subject: [PATCH 146/336] Scoped storage: recognize "wt" and "rt" modes. Should fix the cheat.db issue See #13847 --- Common/File/FileUtil.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Common/File/FileUtil.cpp b/Common/File/FileUtil.cpp index dc8551767f..0123851a48 100644 --- a/Common/File/FileUtil.cpp +++ b/Common/File/FileUtil.cpp @@ -103,7 +103,7 @@ FILE *OpenCFile(const Path &path, const char *mode) { break; case PathType::CONTENT_URI: // We're gonna need some error codes.. - if (!strcmp(mode, "r") || !strcmp(mode, "rb")) { + if (!strcmp(mode, "r") || !strcmp(mode, "rb") || !strcmp(mode, "rt")) { INFO_LOG(COMMON, "Opening content file for read: '%s'", path.c_str()); // Read, let's support this - easy one. int descriptor = Android_OpenContentUriFd(path.ToString(), Android_OpenContentUriMode::READ); @@ -111,7 +111,7 @@ FILE *OpenCFile(const Path &path, const char *mode) { return nullptr; } return fdopen(descriptor, "rb"); - } else if (!strcmp(mode, "w") || !strcmp(mode, "wb")) { + } else if (!strcmp(mode, "w") || !strcmp(mode, "wb") || !strcmp(mode, "wt")) { // Need to be able to create the file here if it doesn't exist. // Not exactly sure which abstractions are best, let's start simple. if (!File::Exists(path)) { From f9c381dfae38e6646a91a4ea3186553666c1a4e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 8 Aug 2021 23:28:37 +0200 Subject: [PATCH 147/336] Narrow the mapping UI, making it a bit less uncomfortable to use. --- UI/ControlMappingScreen.cpp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/UI/ControlMappingScreen.cpp b/UI/ControlMappingScreen.cpp index e66a6f1986..5e83b869de 100644 --- a/UI/ControlMappingScreen.cpp +++ b/UI/ControlMappingScreen.cpp @@ -107,17 +107,20 @@ void SingleControlMapper::Refresh() { float itemH = 45; - LinearLayout *root = Add(new LinearLayout(ORIENT_HORIZONTAL, new LinearLayoutParams(550, WRAP_CONTENT))); + float leftColumnWidth = 200; + float rightColumnWidth = 250; // TODO: Should be flexible somehow. Maybe we need to implement Measure. + + LinearLayout *root = Add(new LinearLayout(ORIENT_HORIZONTAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT))); root->SetSpacing(3.0f); auto iter = keyImages.find(keyName_); // First, look among images. if (iter != keyImages.end()) { - Choice *c = root->Add(new Choice(iter->second, new LinearLayoutParams(200, itemH))); + Choice *c = root->Add(new Choice(iter->second, new LinearLayoutParams(leftColumnWidth, itemH))); c->OnClick.Handle(this, &SingleControlMapper::OnReplaceAll); } else { // No image? Let's translate. - Choice *c = new Choice(mc->T(keyName_.c_str()), new LinearLayoutParams(200, itemH)); + Choice *c = new Choice(mc->T(keyName_.c_str()), new LinearLayoutParams(leftColumnWidth, itemH)); c->SetCentered(true); root->Add(c)->OnClick.Handle(this, &SingleControlMapper::OnReplaceAll); } @@ -129,7 +132,7 @@ void SingleControlMapper::Refresh() { p->OnClick.Handle(this, &SingleControlMapper::OnAddMouse); } - LinearLayout *rightColumn = root->Add(new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT, 1.0f))); + LinearLayout *rightColumn = root->Add(new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(rightColumnWidth, WRAP_CONTENT))); rightColumn->SetSpacing(2.0f); std::vector mappings; KeyMap::KeyFromPspButton(pspKey_, &mappings, false); @@ -141,9 +144,10 @@ void SingleControlMapper::Refresh() { LinearLayout *row = rightColumn->Add(new LinearLayout(ORIENT_HORIZONTAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT))); row->SetSpacing(1.0f); - Choice *c = row->Add(new Choice(deviceName + "." + keyName, new LinearLayoutParams(FILL_PARENT, itemH, 1.0f))); char tagbuf[16]; - sprintf(tagbuf, "%i", (int)i); + sprintf(tagbuf, "%d", (int)i); + + Choice *c = row->Add(new Choice(deviceName + "." + keyName, new LinearLayoutParams(FILL_PARENT, itemH, 1.0f))); c->SetTag(tagbuf); c->OnClick.Handle(this, &SingleControlMapper::OnReplace); @@ -244,7 +248,7 @@ void ControlMappingScreen::CreateViews() { rightScroll_ = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(1.0f)); rightScroll_->SetTag("ControlMapping"); rightScroll_->SetScrollToTop(false); - LinearLayout *rightColumn = new LinearLayoutList(ORIENT_VERTICAL, new LinearLayoutParams(1.0f)); + LinearLayout *rightColumn = new LinearLayoutList(ORIENT_VERTICAL); rightScroll_->Add(rightColumn); root_->Add(leftColumn); @@ -252,7 +256,9 @@ void ControlMappingScreen::CreateViews() { std::vector mappableKeys = KeyMap::GetMappableKeys(); for (size_t i = 0; i < mappableKeys.size(); i++) { - SingleControlMapper *mapper = rightColumn->Add(new SingleControlMapper(this, mappableKeys[i].key, mappableKeys[i].name, screenManager(), new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT))); + SingleControlMapper *mapper = rightColumn->Add( + new SingleControlMapper(this, mappableKeys[i].key, mappableKeys[i].name, screenManager(), + new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT))); mappers_.push_back(mapper); } } From b898e4587f4645550240360e1fe1519506f0118c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 9 Aug 2021 13:03:26 +0200 Subject: [PATCH 148/336] Fix some old bugs where we overrode the device ID to 0 wrongly for back button The checks for pad were wrong, and also the old path simply passed 0. --- .../org/ppsspp/ppsspp/InputDeviceState.java | 2 +- .../src/org/ppsspp/ppsspp/NativeActivity.java | 31 +++++++++++-------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/android/src/org/ppsspp/ppsspp/InputDeviceState.java b/android/src/org/ppsspp/ppsspp/InputDeviceState.java index 89e9d0f016..2e1123dbad 100644 --- a/android/src/org/ppsspp/ppsspp/InputDeviceState.java +++ b/android/src/org/ppsspp/ppsspp/InputDeviceState.java @@ -12,7 +12,7 @@ import android.view.MotionEvent; public class InputDeviceState { private static final String TAG = "InputDeviceState"; - private static final int deviceId = NativeApp.DEVICE_ID_PAD_0; + public static final int deviceId = NativeApp.DEVICE_ID_PAD_0; private InputDevice mDevice; private int[] mAxes; diff --git a/android/src/org/ppsspp/ppsspp/NativeActivity.java b/android/src/org/ppsspp/ppsspp/NativeActivity.java index 6a1b82bf67..be31512fed 100644 --- a/android/src/org/ppsspp/ppsspp/NativeActivity.java +++ b/android/src/org/ppsspp/ppsspp/NativeActivity.java @@ -912,7 +912,6 @@ public abstract class NativeActivity extends Activity { } } - // We simply grab the first input device to produce an event and ignore all others that are connected. @TargetApi(Build.VERSION_CODES.GINGERBREAD) private InputDeviceState getInputDeviceState(InputEvent event) { InputDevice device = event.getDevice(); @@ -967,24 +966,29 @@ public abstract class NativeActivity extends Activity { // Let's let back and menu through to dispatchKeyEvent. boolean passThrough = false; + int sources = event.getSource(); + switch (event.getKeyCode()) { case KeyEvent.KEYCODE_BACK: case KeyEvent.KEYCODE_MENU: passThrough = true; + Log.i(TAG, "Passing through key, source = " + sources); break; default: break; } - // Don't passthrough back button if gamepad. - int sources = event.getSource(); - switch (sources) { - case InputDevice.SOURCE_GAMEPAD: - case InputDevice.SOURCE_JOYSTICK: - case InputDevice.SOURCE_DPAD: + // Don't passthrough back or menu button if from gamepad. + // XInput device on Android returns source 1281 or 0x501, which equals GAMEPAD | KEYBOARD. + // Shield Remote returns 769 or 0x301 which equals DPAD | KEYBOARD. + + if ((sources & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD || + (sources & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK || + (sources & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD) + { passThrough = false; - break; } + Log.i(TAG, "Input event device sources: " + sources); if (!passThrough) { switch (event.getAction()) { @@ -1058,18 +1062,18 @@ public abstract class NativeActivity extends Activity { switch (keyCode) { case KeyEvent.KEYCODE_BACK: if (event.isAltPressed()) { - NativeApp.keyDown(0, 1004, repeat); // special custom keycode for the O button on Xperia Play + NativeApp.keyDown(InputDeviceState.deviceId, 1004, repeat); // special custom keycode for the O button on Xperia Play } else if (NativeApp.isAtTopLevel()) { - Log.i(TAG, "IsAtTopLevel returned true."); + Log.i(TAG, "IsAtTopLevel returned true."); // Pass through the back event. return super.onKeyDown(keyCode, event); } else { - NativeApp.keyDown(0, keyCode, repeat); + NativeApp.keyDown(InputDeviceState.deviceId, keyCode, repeat); } return true; case KeyEvent.KEYCODE_MENU: case KeyEvent.KEYCODE_SEARCH: - NativeApp.keyDown(0, keyCode, repeat); + NativeApp.keyDown(InputDeviceState.deviceId, keyCode, repeat); return true; case KeyEvent.KEYCODE_DPAD_UP: @@ -1078,6 +1082,7 @@ public abstract class NativeActivity extends Activity { case KeyEvent.KEYCODE_DPAD_RIGHT: // Joysticks are supported in Honeycomb MR1 and later via the onGenericMotionEvent method. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1 && event.getSource() == InputDevice.SOURCE_JOYSTICK) { + // Pass through / ignore return super.onKeyDown(keyCode, event); } // Fall through @@ -1085,7 +1090,7 @@ public abstract class NativeActivity extends Activity { // send the rest of the keys through. // TODO: get rid of the three special cases above by adjusting the native side of the code. // Log.d(TAG, "Key down: " + keyCode + ", KeyEvent: " + event); - return NativeApp.keyDown(0, keyCode, repeat); + return NativeApp.keyDown(InputDeviceState.deviceId, keyCode, repeat); } } From e76d994ed59a2112038476dc298fa0ff7353984a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 9 Aug 2021 22:33:53 +0200 Subject: [PATCH 149/336] Improve default pad mapping for Android. Hide irrelevant options on Android TV. --- Core/KeyMap.cpp | 27 +++++++++++++++++---------- UI/GameSettingsScreen.cpp | 21 +++++++++++---------- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/Core/KeyMap.cpp b/Core/KeyMap.cpp index ad3e95cac9..46d39dd51a 100644 --- a/Core/KeyMap.cpp +++ b/Core/KeyMap.cpp @@ -211,22 +211,26 @@ static const DefMappingStruct defaultMOQI7SKeyMap[] = { }; static const DefMappingStruct defaultPadMap[] = { -#if defined(__ANDROID__) +#if PPSSPP_PLATFORM(ANDROID) {CTRL_CROSS , NKCODE_BUTTON_A}, {CTRL_CIRCLE , NKCODE_BUTTON_B}, {CTRL_SQUARE , NKCODE_BUTTON_X}, {CTRL_TRIANGLE , NKCODE_BUTTON_Y}, // The hat for DPAD is standard for bluetooth pads, which is the most likely pads on Android I think. {CTRL_LEFT , JOYSTICK_AXIS_HAT_X, -1}, + {CTRL_LEFT , NKCODE_DPAD_LEFT}, {CTRL_RIGHT , JOYSTICK_AXIS_HAT_X, +1}, + {CTRL_RIGHT , NKCODE_DPAD_RIGHT}, {CTRL_UP , JOYSTICK_AXIS_HAT_Y, -1}, + {CTRL_UP , NKCODE_DPAD_UP}, {CTRL_DOWN , JOYSTICK_AXIS_HAT_Y, +1}, + {CTRL_DOWN , NKCODE_DPAD_DOWN}, {CTRL_START , NKCODE_BUTTON_START}, - {CTRL_SELECT , NKCODE_BUTTON_SELECT}, + {CTRL_SELECT , NKCODE_BACK}, {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, {VIRTKEY_UNTHROTTLE , NKCODE_BUTTON_R2}, - {VIRTKEY_PAUSE , NKCODE_BUTTON_THUMBR}, + {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, {VIRTKEY_SPEED_TOGGLE, NKCODE_BUTTON_L2}, {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, @@ -249,6 +253,7 @@ static const DefMappingStruct defaultPadMap[] = { {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, + {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, #endif }; @@ -936,17 +941,17 @@ void RestoreDefault() { // Autodetect a few common (and less common) devices std::string name = System_GetProperty(SYSPROP_NAME); if (IsNvidiaShield(name) || IsNvidiaShieldTV(name)) { - SetDefaultKeyMap(DEFAULT_MAPPING_SHIELD, true); + SetDefaultKeyMap(DEFAULT_MAPPING_SHIELD, false); } else if (IsOuya(name)) { - SetDefaultKeyMap(DEFAULT_MAPPING_OUYA, true); + SetDefaultKeyMap(DEFAULT_MAPPING_OUYA, false); } else if (IsXperiaPlay(name)) { - SetDefaultKeyMap(DEFAULT_MAPPING_XPERIA_PLAY, true); + SetDefaultKeyMap(DEFAULT_MAPPING_XPERIA_PLAY, false); } else if (IsMOQII7S(name)) { INFO_LOG(SYSTEM, "MOQI pad map"); - SetDefaultKeyMap(DEFAULT_MAPPING_MOQI_I7S, true); + SetDefaultKeyMap(DEFAULT_MAPPING_MOQI_I7S, false); } else { INFO_LOG(SYSTEM, "Default pad map"); - SetDefaultKeyMap(DEFAULT_MAPPING_PAD, true); + SetDefaultKeyMap(DEFAULT_MAPPING_PAD, false); } #else SetDefaultKeyMap(DEFAULT_MAPPING_KEYBOARD, true); @@ -1037,11 +1042,13 @@ void NotifyPadConnected(const std::string &name) { } void AutoConfForPad(const std::string &name) { + g_controllerMap.clear(); + INFO_LOG(SYSTEM, "Autoconfiguring pad for '%s'", name.c_str()); if (name == "Xbox 360 Pad") { - SetDefaultKeyMap(DEFAULT_MAPPING_X360, true); + SetDefaultKeyMap(DEFAULT_MAPPING_X360, false); } else { - SetDefaultKeyMap(DEFAULT_MAPPING_PAD, true); + SetDefaultKeyMap(DEFAULT_MAPPING_PAD, false); } #ifndef MOBILE_DEVICE diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 382ca9cbfc..4f987882cf 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -679,17 +679,18 @@ void GameSettingsScreen::CreateViews() { controlsSettings->Add(new CheckBox(&g_Config.bGamepadOnlyFocused, co->T("Ignore gamepads when not focused"))); #endif -#if defined(MOBILE_DEVICE) - controlsSettings->Add(new CheckBox(&g_Config.bHapticFeedback, co->T("HapticFeedback", "Haptic Feedback (vibration)"))); - static const char *tiltTypes[] = { "None (Disabled)", "Analog Stick", "D-PAD", "PSP Action Buttons", "L/R Trigger Buttons" }; - controlsSettings->Add(new PopupMultiChoice(&g_Config.iTiltInputType, co->T("Tilt Input Type"), tiltTypes, 0, ARRAY_SIZE(tiltTypes), co->GetName(), screenManager()))->OnClick.Handle(this, &GameSettingsScreen::OnTiltTypeChange); + if (System_GetPropertyInt(SYSPROP_DEVICE_TYPE) == DEVICE_TYPE_MOBILE) { + controlsSettings->Add(new CheckBox(&g_Config.bHapticFeedback, co->T("HapticFeedback", "Haptic Feedback (vibration)"))); - Choice *customizeTilt = controlsSettings->Add(new Choice(co->T("Customize tilt"))); - customizeTilt->OnClick.Handle(this, &GameSettingsScreen::OnTiltCustomize); - customizeTilt->SetEnabledFunc([] { - return g_Config.iTiltInputType != 0; - }); -#endif + static const char *tiltTypes[] = { "None (Disabled)", "Analog Stick", "D-PAD", "PSP Action Buttons", "L/R Trigger Buttons" }; + controlsSettings->Add(new PopupMultiChoice(&g_Config.iTiltInputType, co->T("Tilt Input Type"), tiltTypes, 0, ARRAY_SIZE(tiltTypes), co->GetName(), screenManager()))->OnClick.Handle(this, &GameSettingsScreen::OnTiltTypeChange); + + Choice *customizeTilt = controlsSettings->Add(new Choice(co->T("Customize tilt"))); + customizeTilt->OnClick.Handle(this, &GameSettingsScreen::OnTiltCustomize); + customizeTilt->SetEnabledFunc([] { + return g_Config.iTiltInputType != 0; + }); + } // TVs don't have touch control, at least not yet. if (System_GetPropertyInt(SYSPROP_DEVICE_TYPE) != DEVICE_TYPE_TV) { From fc91ff3dbab590f8174cf39109297ea700b6a4f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 9 Aug 2021 22:40:06 +0200 Subject: [PATCH 150/336] Cleanup --- android/src/org/ppsspp/ppsspp/NativeActivity.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/android/src/org/ppsspp/ppsspp/NativeActivity.java b/android/src/org/ppsspp/ppsspp/NativeActivity.java index be31512fed..ef46b87ae8 100644 --- a/android/src/org/ppsspp/ppsspp/NativeActivity.java +++ b/android/src/org/ppsspp/ppsspp/NativeActivity.java @@ -968,27 +968,27 @@ public abstract class NativeActivity extends Activity { int sources = event.getSource(); + // Is this really only for the Xperia Play special handling in OnKeyDown? + // And if so, can we just handle it here instead? switch (event.getKeyCode()) { case KeyEvent.KEYCODE_BACK: - case KeyEvent.KEYCODE_MENU: passThrough = true; - Log.i(TAG, "Passing through key, source = " + sources); break; default: break; } - // Don't passthrough back or menu button if from gamepad. + // Don't passthrough back button if from gamepad. // XInput device on Android returns source 1281 or 0x501, which equals GAMEPAD | KEYBOARD. // Shield Remote returns 769 or 0x301 which equals DPAD | KEYBOARD. - if ((sources & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD || + // Don't disable passthrough if app at top level. + if (((sources & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD || (sources & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK || - (sources & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD) + (sources & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD)) { passThrough = false; } - Log.i(TAG, "Input event device sources: " + sources); if (!passThrough) { switch (event.getAction()) { @@ -1064,7 +1064,7 @@ public abstract class NativeActivity extends Activity { if (event.isAltPressed()) { NativeApp.keyDown(InputDeviceState.deviceId, 1004, repeat); // special custom keycode for the O button on Xperia Play } else if (NativeApp.isAtTopLevel()) { - Log.i(TAG, "IsAtTopLevel returned true."); + Log.i(TAG, "IsAtTopLevel returned true."); // Pass through the back event. return super.onKeyDown(keyCode, event); } else { From 81b4c3b3760d6125fe02eac88a05e3de4b85222f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 11 Aug 2021 09:07:04 +0200 Subject: [PATCH 151/336] Auto-pause on app switch. Will be made conditional in the next commit. --- UI/EmuScreen.cpp | 5 +++++ android/jni/app-android.cpp | 2 ++ 2 files changed, 7 insertions(+) diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index 8161fcd4a0..858f73f5a0 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -505,6 +505,11 @@ void EmuScreen::sendMessage(const char *message, const char *value) { OnChatMenu.Trigger(e); } #endif + } else if (!strcmp(message, "app_resumed") && screenManager()->topScreen() == this) { + // If there's no back button mapped, use this as the way to get into the menu. + + // TODO: Check mappings. + screenManager()->push(new GamePauseScreen(gamePath_)); } } diff --git a/android/jni/app-android.cpp b/android/jni/app-android.cpp index 795ec23f4e..da4d591113 100644 --- a/android/jni/app-android.cpp +++ b/android/jni/app-android.cpp @@ -790,6 +790,8 @@ bool audioRecording_State() { extern "C" void Java_org_ppsspp_ppsspp_NativeApp_resume(JNIEnv *, jclass) { INFO_LOG(SYSTEM, "NativeApp.resume() - resuming audio"); AndroidAudio_Resume(g_audioState); + + NativeMessageReceived("app_resumed", ""); } extern "C" void Java_org_ppsspp_ppsspp_NativeApp_pause(JNIEnv *, jclass) { From aa3daca293656784636ff7ff8e35802afcc7d473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 11 Aug 2021 23:26:39 +0200 Subject: [PATCH 152/336] If it's a TV and VIRTKEY_PAUSE is not mapped to a pad control, pause on app switch. --- Core/KeyMap.cpp | 11 +++++++++++ Core/KeyMap.h | 2 ++ UI/EmuScreen.cpp | 10 +++++++--- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/Core/KeyMap.cpp b/Core/KeyMap.cpp index 46d39dd51a..2015a4c941 100644 --- a/Core/KeyMap.cpp +++ b/Core/KeyMap.cpp @@ -905,6 +905,17 @@ void RemoveButtonMapping(int btn) { } } +bool IsKeyMapped(int device, int key) { + for (auto &iter : g_controllerMap) { + for (auto &mappedKey : iter.second) { + if (mappedKey == KeyDef(device, key)) { + return true; + } + } + } + return false; +} + void SetKeyMapping(int btn, KeyDef key, bool replace) { if (key.keyCode < 0) return; diff --git a/Core/KeyMap.h b/Core/KeyMap.h index f6918ec71b..d8b7a8a710 100644 --- a/Core/KeyMap.h +++ b/Core/KeyMap.h @@ -163,4 +163,6 @@ namespace KeyMap { const std::set &GetSeenPads(); void AutoConfForPad(const std::string &name); + + bool IsKeyMapped(int device, int key); } diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index 858f73f5a0..2490c6abce 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -506,10 +506,14 @@ void EmuScreen::sendMessage(const char *message, const char *value) { } #endif } else if (!strcmp(message, "app_resumed") && screenManager()->topScreen() == this) { - // If there's no back button mapped, use this as the way to get into the menu. + if (System_GetPropertyInt(SYSPROP_DEVICE_TYPE) == DEVICE_TYPE_TV) { + if (!KeyMap::IsKeyMapped(DEVICE_ID_PAD_0, VIRTKEY_PAUSE) || !KeyMap::IsKeyMapped(DEVICE_ID_PAD_1, VIRTKEY_PAUSE)) { + // If it's a TV (so no built-in back button), and there's no back button mapped to a pad, + // use this as the fallback way to get into the menu. - // TODO: Check mappings. - screenManager()->push(new GamePauseScreen(gamePath_)); + screenManager()->push(new GamePauseScreen(gamePath_)); + } + } } } From 22c180ef6ff53e713f87685909cc6065f50dcb96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 9 Aug 2021 09:22:55 +0200 Subject: [PATCH 153/336] Bump maxrecent default to 60. Don't show CPU name if we don't have one. See #14707 and #10620 --- Core/Config.cpp | 4 ++-- UI/DevScreens.cpp | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index a378ceada6..9835597fae 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -1300,12 +1300,12 @@ void Config::Load(const char *iniFileName, const char *controllerIniFilename) { LogManager::GetInstance()->LoadConfig(log, debugDefaults); Section *recent = iniFile.GetOrCreateSection("Recent"); - recent->Get("MaxRecent", &iMaxRecent, 30); + recent->Get("MaxRecent", &iMaxRecent, 60); // Fix issue from switching from uint (hex in .ini) to int (dec) // -1 is okay, though. We'll just ignore recent stuff if it is. if (iMaxRecent == 0) - iMaxRecent = 30; + iMaxRecent = 60; if (iMaxRecent > 0) { recentIsos.clear(); diff --git a/UI/DevScreens.cpp b/UI/DevScreens.cpp index 0342ee1d67..8c366fce52 100644 --- a/UI/DevScreens.cpp +++ b/UI/DevScreens.cpp @@ -480,7 +480,12 @@ void SystemInfoScreen::CreateViews() { #endif deviceSpecs->Add(new ItemHeader(si->T("CPU Information"))); - deviceSpecs->Add(new InfoItem(si->T("CPU Name", "Name"), cpu_info.brand_string)); + + // Don't bother showing the CPU name if we don't have one. + if (cpu_info.brand_string != "Unknown") { + deviceSpecs->Add(new InfoItem(si->T("CPU Name", "Name"), cpu_info.brand_string)); + } + int totalThreads = cpu_info.num_cores * cpu_info.logical_cpu_count; std::string cores = StringFromFormat(si->T("%d (%d per core, %d cores)"), totalThreads, cpu_info.logical_cpu_count, cpu_info.num_cores); deviceSpecs->Add(new InfoItem(si->T("Threads"), cores)); From aab63e82ae970861934b75347ce02aa4d3240bb5 Mon Sep 17 00:00:00 2001 From: iota97 Date: Thu, 12 Aug 2021 11:36:14 +0200 Subject: [PATCH 154/336] Fix layout opacity --- UI/TouchControlLayoutScreen.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/UI/TouchControlLayoutScreen.cpp b/UI/TouchControlLayoutScreen.cpp index 3f040f5ae3..91a304ca25 100644 --- a/UI/TouchControlLayoutScreen.cpp +++ b/UI/TouchControlLayoutScreen.cpp @@ -99,10 +99,8 @@ public: } void Draw(UIContext &dc) override { - float opacity = g_Config.iTouchButtonOpacity / 100.0f; - - uint32_t colorBg = colorAlpha(GetButtonColor(), opacity); - uint32_t color = colorAlpha(0xFFFFFF, opacity); + uint32_t colorBg = colorAlpha(GetButtonColor(), GetButtonOpacity()); + uint32_t color = colorAlpha(0xFFFFFF, GetButtonOpacity()); int centerX = bounds_.centerX(); int centerY = bounds_.centerY(); @@ -160,10 +158,8 @@ public: } void Draw(UIContext &dc) override { - float opacity = g_Config.iTouchButtonOpacity / 100.0f; - - uint32_t colorBg = colorAlpha(GetButtonColor(), opacity); - uint32_t color = colorAlpha(0xFFFFFF, opacity); + uint32_t colorBg = colorAlpha(GetButtonColor(), GetButtonOpacity()); + uint32_t color = colorAlpha(0xFFFFFF, GetButtonOpacity()); static const float xoff[4] = {1, 0, -1, 0}; static const float yoff[4] = {0, 1, 0, -1}; From 1a767f0413b2aac80171d2d80ea9f42fd43889c5 Mon Sep 17 00:00:00 2001 From: Fadhil Mandaga <1750918+firodj@users.noreply.github.com> Date: Fri, 13 Aug 2021 10:05:43 +0700 Subject: [PATCH 155/336] Change ffmpeg include headers priority to avoid collission with system ffmpeg --- CMakeLists.txt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4fe5c18a16..bb83a5b1b1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -188,7 +188,7 @@ else() set(CoreLinkType STATIC) endif() -# Work around for some misfeature of the current glslang build system +# Work around for some misfeature of the current glslang build system include_directories(ext/glslang) # Not sure if this is the best way - what about system glew? @@ -1152,7 +1152,6 @@ if(TARGET SDL2::SDL2 AND NOT IOS) target_link_libraries(Common SDL2::SDL2) endif() - list(APPEND NativeAppSource android/jni/TestRunner.cpp UI/DiscordIntegration.cpp @@ -1986,6 +1985,8 @@ target_link_libraries(${CoreLibName} Common native kirk cityhash sfmt19937 xbrz if(FFmpeg_FOUND) target_compile_definitions(${CoreLibName} PRIVATE USE_FFMPEG=1) + set_target_properties(${CoreLibName} PROPERTIES NO_SYSTEM_FROM_IMPORTED true) + target_include_directories(${CoreLibName} BEFORE PUBLIC ${FFmpeg_INCLUDE_avcodec}) target_link_libraries(${CoreLibName} FFmpeg::avcodec FFmpeg::avformat @@ -2012,7 +2013,7 @@ if(USE_MINIUPNPC) if (NO_GETADDRINFO) add_definitions(-DNO_GETADDRINFO) endif() - + if (NOT WIN32) add_definitions (-DMINIUPNPC_SET_SOCKET_TIMEOUT) add_definitions (-D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112L) @@ -2025,7 +2026,7 @@ if(USE_MINIUPNPC) else() add_definitions(-fPIC) endif() - + add_definitions(-DWITH_UPNP -DMINIUPNP_STATICLIB) set(MINIUPNP_DIR "ext/miniupnp/miniupnpc") include_directories(${CMAKE_CURRENT_BINARY_DIR}) From 32f0c19e7c2003cdf96a09f55e38fb247dfe3bcc Mon Sep 17 00:00:00 2001 From: Fadhil Mandaga <1750918+firodj@users.noreply.github.com> Date: Fri, 13 Aug 2021 17:07:38 -0700 Subject: [PATCH 156/336] UI: Fix typo in using My Documents for data. --- UI/GameSettingsScreen.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 4f987882cf..10b6f00832 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -1110,7 +1110,7 @@ UI::EventReturn GameSettingsScreen::OnChangeMemStickDir(UI::EventParams &e) { UI::EventReturn GameSettingsScreen::OnSavePathMydoc(UI::EventParams &e) { const Path &PPSSPPpath = File::GetExeDirectory(); - const Path installedFile = installedFile / "installed.txt"; + const Path installedFile = PPSSPPpath / "installed.txt"; installed_ = File::Exists(installedFile); if (otherinstalled_) { File::Delete(PPSSPPpath / "installed.txt"); From 69ef21a65c4f76995fdda48ed9e756f55e68c8c7 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 13 Aug 2021 20:45:31 -0700 Subject: [PATCH 157/336] Store: Make description focusable. Descriptions aren't that long currently, but this allows for longer descriptions with controller/keyboard scrolling. --- UI/Store.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/UI/Store.cpp b/UI/Store.cpp index a879c6e5f0..d13b72ed7a 100644 --- a/UI/Store.cpp +++ b/UI/Store.cpp @@ -270,13 +270,16 @@ void ProductView::CreateViews() { cancelButton_->SetVisibility(isDownloading ? V_VISIBLE : V_GONE); // Add star rating, comments etc? - Add(new TextView(entry_.description, ALIGN_LEFT | FLAG_WRAP_TEXT, false)); + + // Draw each line separately so focusing can scroll. + std::vector lines; + SplitString(entry_.description, '\n', lines); + for (auto &line : lines) { + Add(new TextView(line, ALIGN_LEFT | FLAG_WRAP_TEXT, false))->SetFocusable(true); + } float size = entry_.size / (1024.f * 1024.f); - char temp[256]; - sprintf(temp, "%s: %.2f %s", st->T("Size"), size, st->T("MB")); - - Add(new TextView(temp)); + Add(new TextView(StringFromFormat("%s: %.2f %s", st->T("Size"), size, st->T("MB")))); } void ProductView::Update() { From aecb138f905f7a94223426c89ab84f44c162cfc0 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 14 Aug 2021 07:46:38 -0700 Subject: [PATCH 158/336] Dialog: Avoid crash with hacked dialog start. See #14727. If a dialog shutdown is in progress and we incorrectly allow a startup at that time, it breaks other things. This tries to at least work around that. --- Core/Dialog/PSPDialog.cpp | 4 +++- Core/HLE/sceUtility.cpp | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Core/Dialog/PSPDialog.cpp b/Core/Dialog/PSPDialog.cpp index 09257da935..2783d291dd 100644 --- a/Core/Dialog/PSPDialog.cpp +++ b/Core/Dialog/PSPDialog.cpp @@ -121,10 +121,12 @@ void PSPDialog::ChangeStatusInit(int delayUs) { } void PSPDialog::ChangeStatusShutdown(int delayUs) { + // If we're doing shutdown right away and skipped start, we don't run the dialog thread. + bool skipDialogShutdown = status == SCE_UTILITY_STATUS_NONE; ChangeStatus(SCE_UTILITY_STATUS_SHUTDOWN, 0); auto params = GetCommonParam(); - if (params) + if (params && !skipDialogShutdown) UtilityDialogShutdown(DialogType(), delayUs, params->accessThread); else ChangeStatus(SCE_UTILITY_STATUS_NONE, delayUs); diff --git a/Core/HLE/sceUtility.cpp b/Core/HLE/sceUtility.cpp index f7a8d4e53f..f33bbe4a72 100644 --- a/Core/HLE/sceUtility.cpp +++ b/Core/HLE/sceUtility.cpp @@ -37,6 +37,7 @@ #include "Core/HLE/sceKernel.h" #include "Core/HLE/sceKernelMemory.h" #include "Core/HLE/sceKernelThread.h" +#include "Core/HLE/scePower.h" #include "Core/HLE/sceUtility.h" #include "Core/Dialog/PSPSaveDialog.h" @@ -358,6 +359,11 @@ static int sceUtilitySavedataInitStart(u32 paramAddr) { if (currentDialogActive && currentDialogType != UtilityDialogType::SAVEDATA) { if (PSP_CoreParameter().compat.flags().YugiohSaveFix) { WARN_LOG(SCEUTILITY, "Yugioh Savedata Correction"); + if (accessThread) { + accessThread->Terminate(); + // Try to unlock in case other dialog was shutting down. + KernelVolatileMemUnlock(0); + } } else { return hleLogWarning(SCEUTILITY, SCE_ERROR_UTILITY_WRONG_TYPE, "wrong dialog type"); } From e93dc8f2318059ef08e9f40c95a331903d1a61d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 14 Aug 2021 16:57:33 +0200 Subject: [PATCH 159/336] Fix append mode through OpenCFile, fixing cheat import on scoped storage. --- Common/File/FileUtil.cpp | 9 +++++++-- UI/GameSettingsScreen.cpp | 2 +- UI/NativeApp.cpp | 1 + 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Common/File/FileUtil.cpp b/Common/File/FileUtil.cpp index 0123851a48..91c0aee6b6 100644 --- a/Common/File/FileUtil.cpp +++ b/Common/File/FileUtil.cpp @@ -111,7 +111,7 @@ FILE *OpenCFile(const Path &path, const char *mode) { return nullptr; } return fdopen(descriptor, "rb"); - } else if (!strcmp(mode, "w") || !strcmp(mode, "wb") || !strcmp(mode, "wt")) { + } else if (!strcmp(mode, "w") || !strcmp(mode, "wb") || !strcmp(mode, "wt") || !strcmp(mode, "at") || !strcmp(mode, "a")) { // Need to be able to create the file here if it doesn't exist. // Not exactly sure which abstractions are best, let's start simple. if (!File::Exists(path)) { @@ -137,7 +137,12 @@ FILE *OpenCFile(const Path &path, const char *mode) { INFO_LOG(COMMON, "Opening '%s' for write failed", path.ToString().c_str()); return nullptr; } - return fdopen(descriptor, "wb"); + FILE *f = fdopen(descriptor, "wb"); + if (!strcmp(mode, "at") || !strcmp(mode, "a")) { + // Append mode. + fseek(f, 0, SEEK_END); + } + return f; } else { ERROR_LOG(COMMON, "OpenCFile(%s): Mode not yet supported: %s", path.c_str(), mode); return nullptr; diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 4f987882cf..94d83c6223 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -987,7 +987,7 @@ void GameSettingsScreen::CreateViews() { systemSettings->Add(new CheckBox(&g_Config.bCacheFullIsoInRam, sy->T("Cache ISO in RAM", "Cache full ISO in RAM")))->SetEnabled(!PSP_IsInited()); #endif - systemSettings->Add(new ItemHeader(sy->T("Cheats", "Cheats (experimental, see forums)"))); + systemSettings->Add(new ItemHeader(sy->T("Cheats", "Cheats"))); CheckBox *enableCheats = systemSettings->Add(new CheckBox(&g_Config.bEnableCheats, sy->T("Enable Cheats"))); enableCheats->OnClick.Add([&](UI::EventParams &) { enableReportsCheckbox_->SetEnabled(Reporting::IsSupported()); diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index fd11d1ca5f..024b3d3f43 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -362,6 +362,7 @@ bool CreateDirectoriesAndroid() { return false; } + File::CreateFullPath(GetSysDirectory(DIRECTORY_CHEATS)); File::CreateFullPath(GetSysDirectory(DIRECTORY_SAVEDATA)); File::CreateFullPath(GetSysDirectory(DIRECTORY_SAVESTATE)); File::CreateFullPath(GetSysDirectory(DIRECTORY_GAME)); From 9eadeee75ae8e21d078bfc2b3fb91d469760855a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 14 Aug 2021 16:57:59 +0200 Subject: [PATCH 160/336] Clean up a string from translations --- assets/lang/az_AZ.ini | 2 +- assets/lang/ca_ES.ini | 2 +- assets/lang/cz_CZ.ini | 2 +- assets/lang/da_DK.ini | 2 +- assets/lang/dr_ID.ini | 2 +- assets/lang/en_US.ini | 2 +- assets/lang/es_ES.ini | 2 +- assets/lang/es_LA.ini | 2 +- assets/lang/fi_FI.ini | 2 +- assets/lang/fr_FR.ini | 2 +- assets/lang/gl_ES.ini | 2 +- assets/lang/gr_EL.ini | 2 +- assets/lang/hr_HR.ini | 2 +- assets/lang/id_ID.ini | 2 +- assets/lang/it_IT.ini | 2 +- assets/lang/jv_ID.ini | 2 +- assets/lang/lo_LA.ini | 2 +- assets/lang/nl_NL.ini | 2 +- assets/lang/pl_PL.ini | 2 +- assets/lang/pt_BR.ini | 2 +- assets/lang/pt_PT.ini | 2 +- assets/lang/ro_RO.ini | 2 +- assets/lang/ru_RU.ini | 2 +- assets/lang/sv_SE.ini | 2 +- assets/lang/tg_PH.ini | 2 +- assets/lang/th_TH.ini | 2 +- assets/lang/tr_TR.ini | 2 +- assets/lang/vi_VN.ini | 2 +- assets/lang/zh_CN.ini | 2 +- assets/lang/zh_TW.ini | 2 +- 30 files changed, 30 insertions(+), 30 deletions(-) diff --git a/assets/lang/az_AZ.ini b/assets/lang/az_AZ.ini index 19d7c167c4..5b62733d95 100644 --- a/assets/lang/az_AZ.ini +++ b/assets/lang/az_AZ.ini @@ -983,7 +983,7 @@ Change Nickname = Change nickname ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? -Cheats = Cheats (experimental, see forums) +Cheats = Cheats Clear Recent = Clear "Recent" Clear Recent Games List = Clear Recent games list Clear UI background = Clear UI background diff --git a/assets/lang/ca_ES.ini b/assets/lang/ca_ES.ini index 51f07013aa..5f52ea971b 100644 --- a/assets/lang/ca_ES.ini +++ b/assets/lang/ca_ES.ini @@ -983,7 +983,7 @@ Change Nickname = Change nickname ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? -Cheats = Cheats (experimental, see forums) +Cheats = Cheats Clear Recent = Clear "Recent" Clear Recent Games List = Clear Recent games list Clear UI background = Clear UI background diff --git a/assets/lang/cz_CZ.ini b/assets/lang/cz_CZ.ini index 1ee7ff6e71..1bdd328b83 100644 --- a/assets/lang/cz_CZ.ini +++ b/assets/lang/cz_CZ.ini @@ -983,7 +983,7 @@ Change Nickname = Změnit přezdívku ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? -Cheats = Cheaty (experimentální, viz fóra) +Cheats = Cheaty Clear Recent = Clear "Recent" Clear Recent Games List = Vyčistit seznam nedávných her Clear UI background = Clear UI background diff --git a/assets/lang/da_DK.ini b/assets/lang/da_DK.ini index 4ad533794b..215f955fa9 100644 --- a/assets/lang/da_DK.ini +++ b/assets/lang/da_DK.ini @@ -983,7 +983,7 @@ Change Nickname = Ændre kaldenavn ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? -Cheats = Snyd (eksperiment see fora) +Cheats = Snyd Clear Recent = Clear "Recent" Clear Recent Games List = Slet liste over nylige spil Clear UI background = Fjern UI baggrund diff --git a/assets/lang/dr_ID.ini b/assets/lang/dr_ID.ini index 07471fa313..cfab6c9ad1 100644 --- a/assets/lang/dr_ID.ini +++ b/assets/lang/dr_ID.ini @@ -983,7 +983,7 @@ Change Nickname = Sullei Nickname ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? -Cheats = Cheats (dicoba-cobara, kitaki' forum) +Cheats = Cheats Clear Recent = Clear "Recent" Clear Recent Games List = Hapusu'i daftarna to mane' dopaningoanni Clear UI background = Clear UI background diff --git a/assets/lang/en_US.ini b/assets/lang/en_US.ini index 69f055ddb6..7f813f7655 100644 --- a/assets/lang/en_US.ini +++ b/assets/lang/en_US.ini @@ -1008,7 +1008,7 @@ Change Nickname = Change nickname ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? -Cheats = Cheats (experimental, see forums) +Cheats = Cheats Clear Recent = Clear "Recent" Clear Recent Games List = Clear "Recent" list Clear UI background = Clear UI background diff --git a/assets/lang/es_ES.ini b/assets/lang/es_ES.ini index b7dbb6e8ff..1b081bec3d 100644 --- a/assets/lang/es_ES.ini +++ b/assets/lang/es_ES.ini @@ -983,7 +983,7 @@ Change Nickname = Cambiar apodo PSP ChangingMemstickPath = Partidas guardadas, estados y otros datos no serán copiados a este directorio.\n\n¿Cambiar directorio de la Memory Stick? ChangingMemstickPathInvalid = Esa ruta no se pudo utilizar para guardar los archivos de la Memory Stick. ChangingMemstickPathNotExists = Ese directorio todavía no existe.\n\nPartidas guardadas, estados y otros datos no serán copiados a este directorio.\n\n¿Crear nuevo directorio para la Memory Stick? -Cheats = Trucos (beta, ver foros) +Cheats = Trucos Clear Recent = Limpiar "Recientes" Clear Recent Games List = Borrar lista de juegos recientes Clear UI background = Borrar imagen de fondo diff --git a/assets/lang/es_LA.ini b/assets/lang/es_LA.ini index f133bf7928..7632e7b12f 100644 --- a/assets/lang/es_LA.ini +++ b/assets/lang/es_LA.ini @@ -983,7 +983,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 = Trampas (experimental, ver foros) +Cheats = Trampas Clear Recent = Destruir "recientes" Clear Recent Games List = Borrar lista de juegos recientes Clear UI background = Borrar fondo de interfaz diff --git a/assets/lang/fi_FI.ini b/assets/lang/fi_FI.ini index d22ea3f445..10e1c9ad28 100644 --- a/assets/lang/fi_FI.ini +++ b/assets/lang/fi_FI.ini @@ -983,7 +983,7 @@ Change Nickname = Vaihda nimimerkkiä ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? -Cheats = Cheats (experimental, see forums) +Cheats = Cheats Clear Recent = Clear "Recent" Clear Recent Games List = Clear Recent games list Clear UI background = Clear UI background diff --git a/assets/lang/fr_FR.ini b/assets/lang/fr_FR.ini index e93af14827..352aa6da67 100644 --- a/assets/lang/fr_FR.ini +++ b/assets/lang/fr_FR.ini @@ -974,7 +974,7 @@ Change Nickname = Changer de pseudo ChangingMemstickPath = Les sauvegardes, états, et autres données ne peuvent pas être enregistrés dans ce dossier.\n\nChanger le dossier de la Memory Stick ? ChangingMemstickPathInvalid = Ce chemin ne peut pas être utilisé pour enregistrer des fichiers de la Memory Stick. ChangingMemstickPathNotExists = Ce dossier n'existe pas.\n\nLes sauvegardes, états, et autres données ne peuvent pas y être enregistrés.\n\nCréer ce nouveau dossier de la Memory Stick ? -Cheats = Codes de triche (expérimental, voir forum) +Cheats = Codes de triche Clear Recent = Effacer "Récemment" Clear Recent Games List = Effacer la liste "Récemment" Clear UI background = Retirer le fond d'écran diff --git a/assets/lang/gl_ES.ini b/assets/lang/gl_ES.ini index 2fa550630a..a8993b41e4 100644 --- a/assets/lang/gl_ES.ini +++ b/assets/lang/gl_ES.ini @@ -983,7 +983,7 @@ Change Nickname = Cambiar alcume PSP ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? -Cheats = Trucos (beta, ver foros) +Cheats = Trucos Clear Recent = Clear "Recent" Clear Recent Games List = Borrar lista de xogos recentes Clear UI background = Clear UI background diff --git a/assets/lang/gr_EL.ini b/assets/lang/gr_EL.ini index 3983b43c00..ce1fa3018e 100644 --- a/assets/lang/gr_EL.ini +++ b/assets/lang/gr_EL.ini @@ -983,7 +983,7 @@ Change Nickname = Αλλαγή Ψευδωνύμου ChangingMemstickPath = Τα δεδομένα αποθήκευσης παιχνιδιών, καταστάσεων και άλλων δεδομένων δεν θα αντιγραφούν σε αυτόν τον φάκελο.\n\nΑλλαγή του φακέλου Memory Stick; ChangingMemstickPathInvalid = Αυτή η διαδρομή δεν μπορεί να χρησιμοποιηθεί για αποθήκευση αρχείων Memory Stick. ChangingMemstickPathNotExists = Αυτός ο φάκελος δεν υπάρχει ακόμα.\n\nΤα δεδομένα αποθήκευσης παιχνιδιών, καταστάσεων και άλλων δεδομένων δεν θα αντιγραφούν σε αυτόν τον φάκελο.\n\nΔημιουργία νέου φακέλου Memory Stick; -Cheats = Κωδικοί(πειραματικό, δείτε στα forums) +Cheats = Κωδικοί Clear Recent = Clear "Recent" Clear Recent Games List = Καθαρισμός Λίστας Προσφάτων Clear UI background = Εκκαθάριση φόντου UI diff --git a/assets/lang/hr_HR.ini b/assets/lang/hr_HR.ini index e21a56b1af..710f098a7e 100644 --- a/assets/lang/hr_HR.ini +++ b/assets/lang/hr_HR.ini @@ -983,7 +983,7 @@ Change Nickname = Promijeni nadimak ChangingMemstickPath = Spremljene igre, save state-ovi, i drugi podatci neće biti kopirani na ovu mapu.\n\nPromijeni mapu Memorijskoga sticka? ChangingMemstickPathInvalid = Taj put nije mogao biti korišten za spremanje datoteka Memorijskog sticka. ChangingMemstickPathNotExists = Ta mapa još ne postoji.\n\nSpremljene igre, save state-ovi, i drugi podatci neće biti kopirani na ovu mapu.\n\nPromijeni mapu Memorijskoga sticka? -Cheats = Varanje (eksperimentalno, vidite forume) +Cheats = Varanje Clear Recent = Clear "Recent" Clear Recent Games List = Očisti listu igara u Nedavno Clear UI background = Očisti UI pozadinu diff --git a/assets/lang/id_ID.ini b/assets/lang/id_ID.ini index 0341af38e9..47643c793a 100644 --- a/assets/lang/id_ID.ini +++ b/assets/lang/id_ID.ini @@ -983,7 +983,7 @@ Change Nickname = Ganti panggilan ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? -Cheats = Kecurangan (eksperimen, lihat forum) +Cheats = Kecurangan Clear Recent = Clear "Recent" Clear Recent Games List = Bersihkan daftar main terakhir Clear UI background = Hapus latar UI diff --git a/assets/lang/it_IT.ini b/assets/lang/it_IT.ini index c51025a6ea..f2de777318 100644 --- a/assets/lang/it_IT.ini +++ b/assets/lang/it_IT.ini @@ -983,7 +983,7 @@ Change Nickname = Cambia Nick ChangingMemstickPath = I salvataggi, gli stati e altri dati non verranno copiati in questa cartella.\n\nCambiare la cartella del Memory Stick? ChangingMemstickPathInvalid = Quel percorso non può essere usato per salvare i file Memory Stick. ChangingMemstickPathNotExists = Quella cartella non esiste.\n\nI salvataggi, gli stati e altri dati non verranno copiati nella cartella.\n\nCambiare la cartella del Memory Stick? -Cheats = Trucchi (sperimentale, consultare il forum) +Cheats = Trucchi Clear Recent = Svuota "Recenti" Clear Recent Games List = Svuota Lista Giochi Recenti Clear UI background = Svuota fondo UI diff --git a/assets/lang/jv_ID.ini b/assets/lang/jv_ID.ini index 23e3fc59ba..af8b4c292c 100644 --- a/assets/lang/jv_ID.ini +++ b/assets/lang/jv_ID.ini @@ -983,7 +983,7 @@ Change Nickname = Ganti Jeneng ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? -Cheats = Cheat (jajalan, deleng forum) +Cheats = Cheat Clear Recent = Clear "Recent" Clear Recent Games List = Ilangi daftar terakher dimainkan Clear UI background = Clear UI background diff --git a/assets/lang/lo_LA.ini b/assets/lang/lo_LA.ini index 99b35ca5d9..9780085db3 100644 --- a/assets/lang/lo_LA.ini +++ b/assets/lang/lo_LA.ini @@ -983,7 +983,7 @@ Change Nickname = ປ່ຽນຊື່ຫຼິ້ນ ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? -Cheats = ສູດໂກງ (ຂັ້ນທົດລອງ, ເບິ່ງເພີ່ມຕື່ມທີ່ຟໍຣຳ) +Cheats = ສູດໂກງ Clear Recent = Clear "Recent" Clear Recent Games List = ລຶບລາຍການເກມທີ່ຫາກ່ອນຫຼິ້ນໄປຫຼ້າສຸດ Clear UI background = ລຶບພາບພື້ນຫຼັງ diff --git a/assets/lang/nl_NL.ini b/assets/lang/nl_NL.ini index 15c09a55c3..6dcddb76da 100644 --- a/assets/lang/nl_NL.ini +++ b/assets/lang/nl_NL.ini @@ -983,7 +983,7 @@ Change Nickname = Gebruikersnaam wijzigen ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? -Cheats = Cheats (experimenteel, bekijk het forum) +Cheats = Cheats Clear Recent = Clear "Recent" Clear Recent Games List = Lijst met recente games legen Clear UI background = UI-achtergrond legen diff --git a/assets/lang/pl_PL.ini b/assets/lang/pl_PL.ini index 7eaeed02e2..03ea61a9a8 100644 --- a/assets/lang/pl_PL.ini +++ b/assets/lang/pl_PL.ini @@ -983,7 +983,7 @@ Change Nickname = Zmień pseudonim ChangingMemstickPath = Zapisy gier, zapisy stanu i inne dane nie zostaną skopiowane do tego folderu.\n\nZmienić ścieżkę do folderu Karty Pamięci? ChangingMemstickPathInvalid = Ta ścieżka nie może zostać użyta do zapisu plików Karty Pamięci. ChangingMemstickPathNotExists = Folder nie istnieje.\n\nZapisy gier, zapisy stanu i inne dane nie zostaną skopiowane do tego folderu.\n\nUtworzyć nowy folder Karty Pamięci? -Cheats = Kody (eksperymentalne, zobacz forum) +Cheats = Kody Clear Recent = Clear "Recent" Clear Recent Games List = Wyczyść listę ostatnio granych Clear UI background = Przywróć tło interfejsu diff --git a/assets/lang/pt_BR.ini b/assets/lang/pt_BR.ini index c59e37344e..6cc2d12bf2 100644 --- a/assets/lang/pt_BR.ini +++ b/assets/lang/pt_BR.ini @@ -1007,7 +1007,7 @@ Change Nickname = Mudar apelido ChangingMemstickPath = Jogos salvos, states salvos e outros dados não serão copiados pra esta pasta.\n\nMudar a pasta do cartão de memória? ChangingMemstickPathInvalid = Esse caminho não pôde ser usado pra salvar os arquivos do cartão de memória. ChangingMemstickPathNotExists = Essa pasta não existe ainda.\n\nJogos salvos, states salvos e outros dados não serão copiados pra esta pasta.\n\nCriar uma nova pasta do cartão de memória? -Cheats = Trapaças (experimental, veja os fóruns) +Cheats = Trapaças Clear Recent = Limpar "Recentes" Clear Recent Games List = Limpar lista dos "Recentes" Clear UI background = Limpar 2º plano da interface do usuário diff --git a/assets/lang/pt_PT.ini b/assets/lang/pt_PT.ini index 425a0004a0..66c39e4376 100644 --- a/assets/lang/pt_PT.ini +++ b/assets/lang/pt_PT.ini @@ -983,7 +983,7 @@ Change Nickname = Alterar alcunha ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? -Cheats = Cheats (experimental, ver forums) +Cheats = Cheats Clear Recent = Clear "Recent" Clear Recent Games List = Limpar lista de jogos recentes Clear UI background = Clear UI background diff --git a/assets/lang/ro_RO.ini b/assets/lang/ro_RO.ini index 303593cd53..d813cb806c 100644 --- a/assets/lang/ro_RO.ini +++ b/assets/lang/ro_RO.ini @@ -983,7 +983,7 @@ Change Nickname = Schimbă nume ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? -Cheats = Trișare (experimental, vezi forumuri) +Cheats = Trișare Clear Recent = Clear "Recent" Clear Recent Games List = Curată listă jocuri recente Clear UI background = Clear UI background diff --git a/assets/lang/ru_RU.ini b/assets/lang/ru_RU.ini index ad135b285d..9f861e0610 100644 --- a/assets/lang/ru_RU.ini +++ b/assets/lang/ru_RU.ini @@ -984,7 +984,7 @@ Change Nickname = Изменить ник ChangingMemstickPath = Сохранения, состояния и другие данные НЕ будут скопированы в эту папку.\n\nИзменить папку с картой памяти? ChangingMemstickPathInvalid = Этот путь невозможно использовать для файлов карты памяти. ChangingMemstickPathNotExists = Этой папки не существует.\n\nСохранения, состояния и другие данные НЕ будут скопированы в эту папку.\n\nСоздать новую папку для карты памяти? -Cheats = Коды к игре (тестируется, смотрите форум) +Cheats = Коды к игре Clear Recent = Очистить "Недавние" Clear Recent Games List = Очистить список недавно запущенных Clear UI background = Очистить фон интерфейса diff --git a/assets/lang/sv_SE.ini b/assets/lang/sv_SE.ini index 0392412682..4fc64007e9 100644 --- a/assets/lang/sv_SE.ini +++ b/assets/lang/sv_SE.ini @@ -983,7 +983,7 @@ Change Nickname = Ändra nickname ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? -Cheats = Fuskkoder (experimental, see forums) +Cheats = Fuskkoder Clear Recent = Clear "Recent" Clear Recent Games List = Rensa "Senast spelat" Clear UI background = Ta bort UI-bakgrund diff --git a/assets/lang/tg_PH.ini b/assets/lang/tg_PH.ini index cc312a40a6..ca03e1fa4b 100644 --- a/assets/lang/tg_PH.ini +++ b/assets/lang/tg_PH.ini @@ -983,7 +983,7 @@ Change Nickname = Baguhin ang Palayaw ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? -Cheats = Mga Daya (eksperimental, tingnan sa Forums) +Cheats = Mga Daya Clear Recent = Clear "Recent" Clear Recent Games List = Burahin ang Listahan ng Laro Clear UI background = Clear UI background diff --git a/assets/lang/th_TH.ini b/assets/lang/th_TH.ini index ff14bd895b..18b9d725a7 100644 --- a/assets/lang/th_TH.ini +++ b/assets/lang/th_TH.ini @@ -1061,7 +1061,7 @@ Change Nickname = เปลี่ยนชื่อเล่น ChangingMemstickPath = เซฟดาต้า เซฟสเตท และข้อมูลอื่นๆ อาจจะไม่สามารถคัดลอกไปยังโฟลเดอร์นี้ได้\n\nต้องการปรับเปลี่ยนไปใช้แหล่งที่เก็บข้อมูลนี้เลยหรือไม่? ChangingMemstickPathInvalid = เส้นทางนี้ไม่สามารถใช้งานสำหรับการเปลี่ยนแหล่งที่เก็บข้อมูลได้ ChangingMemstickPathNotExists = ไม่พบโฟลเดอร์ดังกล่าว\n\nเซฟเกม, เซฟสเตท และข้อมูลอื่นๆ อาจจะไม่สามารถคัดลอกไปยังโฟลเดอร์นี้ได้\n\nจะให้สร้างโฟลเดอร์สำหรับแหล่งที่เก็บข้อมูลอันใหม่เลยไหม? -Cheats = สูตรโกง (ขั้นทดสอบ, ดูเพิ่มเติมที่ฟอรั่ม) +Cheats = สูตรโกง Clear Recent = ลบรายการเกมที่เล่นล่าสุด Clear Recent Games List = ลบรายการเกมที่พึ่งเล่นไปในครั้งล่าสุด Clear UI background = ลบภาพพื้นหลัง diff --git a/assets/lang/tr_TR.ini b/assets/lang/tr_TR.ini index 8645a76f98..1703a36efe 100644 --- a/assets/lang/tr_TR.ini +++ b/assets/lang/tr_TR.ini @@ -983,7 +983,7 @@ Change Nickname = Kullanıcı adını değiştir ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? -Cheats = Hileler (Deneysel, Forumlara Bakın) +Cheats = Hileler Clear Recent = Clear "Recent" Clear Recent Games List = Geçmiş listesini temizle Clear UI background = Arayüz arkaplanını varsayılana döndür diff --git a/assets/lang/vi_VN.ini b/assets/lang/vi_VN.ini index 1f057f83bf..d906eaa7c6 100644 --- a/assets/lang/vi_VN.ini +++ b/assets/lang/vi_VN.ini @@ -983,7 +983,7 @@ Change Nickname = Đổi nickname ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? -Cheats = Cheat (đang thử nghiệm, xem trong diễn đàn) +Cheats = Cheat Clear Recent = Clear "Recent" Clear Recent Games List = Xóa danh sách trò chơi mới gần đây Clear UI background = Xóa nền UI diff --git a/assets/lang/zh_CN.ini b/assets/lang/zh_CN.ini index 28c4cc6e9f..f31d180ec7 100644 --- a/assets/lang/zh_CN.ini +++ b/assets/lang/zh_CN.ini @@ -983,7 +983,7 @@ Change Nickname = 修改昵称 ChangingMemstickPath = 游戏存档、即时存档及其它数据不会复制到新路径。\n\n确定要修改记忆棒文件夹吗? ChangingMemstickPathInvalid = 目标路径不能用于保存记忆棒数据。 ChangingMemstickPathNotExists = 目标文件夹不存在。\n\n游戏存档、即时存档及其它数据不会复制到新路径。\n\n确定要创建新的记忆棒文件夹吗? -Cheats = 作弊设置 (实验性, 见论坛) +Cheats = 作弊设置 Clear Recent = 清除"最近的游戏" Clear Recent Games List = 清除"最近的游戏"列表 Clear UI background = 清除界面背景 diff --git a/assets/lang/zh_TW.ini b/assets/lang/zh_TW.ini index 16b9196266..4357ab83f4 100644 --- a/assets/lang/zh_TW.ini +++ b/assets/lang/zh_TW.ini @@ -983,7 +983,7 @@ Change Nickname = 更改別名 ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder? ChangingMemstickPathInvalid = That path couldn't be used to save Memory Stick files. ChangingMemstickPathNotExists = That folder doesn't exist yet.\n\nSave games, save states, and other data will not be copied to this folder.\n\nCreate a new Memory Stick folder? -Cheats = 金手指 (實驗性功能,請見官方論壇) +Cheats = 金手指 Clear Recent = Clear "Recent" Clear Recent Games List = 清除最近遊戲清單 Clear UI background = 清除背景 From f530be096982fed5d76eb7f59c886f3089bcf1fa Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 14 Aug 2021 20:15:34 -0700 Subject: [PATCH 161/336] Dialog: Prevent reschedule on shutdown start. This is a bit strange, but tests seem to suggest this is correct. A worse priority thread won't run before savedata shutdown hits 0, but the thread that initiated shutdown runs before shutdown completes. Fixes Freakout Extreme Freeride loading savedata. --- Core/Dialog/PSPDialog.cpp | 2 +- Core/HLE/sceKernelInterrupt.cpp | 4 ---- Core/HLE/sceKernelInterrupt.h | 2 ++ Core/HLE/sceKernelThread.cpp | 3 ++- Core/HLE/sceUtility.cpp | 5 +++++ 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Core/Dialog/PSPDialog.cpp b/Core/Dialog/PSPDialog.cpp index 2783d291dd..3670d15ac8 100644 --- a/Core/Dialog/PSPDialog.cpp +++ b/Core/Dialog/PSPDialog.cpp @@ -122,7 +122,7 @@ void PSPDialog::ChangeStatusInit(int delayUs) { void PSPDialog::ChangeStatusShutdown(int delayUs) { // If we're doing shutdown right away and skipped start, we don't run the dialog thread. - bool skipDialogShutdown = status == SCE_UTILITY_STATUS_NONE; + bool skipDialogShutdown = status == SCE_UTILITY_STATUS_NONE && pendingStatus == SCE_UTILITY_STATUS_NONE; ChangeStatus(SCE_UTILITY_STATUS_SHUTDOWN, 0); auto params = GetCommonParam(); diff --git a/Core/HLE/sceKernelInterrupt.cpp b/Core/HLE/sceKernelInterrupt.cpp index 88a3848be5..cfad674c51 100644 --- a/Core/HLE/sceKernelInterrupt.cpp +++ b/Core/HLE/sceKernelInterrupt.cpp @@ -40,10 +40,6 @@ #include "GPU/GPUCommon.h" #include "GPU/GPUState.h" -void __DisableInterrupts(); -void __EnableInterrupts(); -bool __InterruptsEnabled(); - // Seems like some > 16 are taken but not available. Probably kernel only? static const u32 PSP_NUMBER_SUBINTERRUPTS = 32; diff --git a/Core/HLE/sceKernelInterrupt.h b/Core/HLE/sceKernelInterrupt.h index 013b46585c..3f32e3049b 100644 --- a/Core/HLE/sceKernelInterrupt.h +++ b/Core/HLE/sceKernelInterrupt.h @@ -128,6 +128,8 @@ private: std::map subIntrHandlers; }; +void __DisableInterrupts(); +void __EnableInterrupts(); bool __InterruptsEnabled(); bool __IsInInterrupt(); void __InterruptsInit(); diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 58a9582b7f..b1abcfb08c 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -2063,7 +2063,8 @@ int __KernelStartThread(SceUID threadToStartID, int argSize, u32 argBlockPtr, bo Core_ExecException(startThread->context.pc, currentMIPS->pc, ExecExceptionType::THREAD); } __KernelChangeReadyState(cur, currentThread, true); - hleReSchedule("thread started"); + if (__InterruptsEnabled()) + hleReSchedule("thread started"); } // Starting a thread automatically resumes the dispatch thread if the new thread has worse priority. diff --git a/Core/HLE/sceUtility.cpp b/Core/HLE/sceUtility.cpp index f33bbe4a72..51eaa18a91 100644 --- a/Core/HLE/sceUtility.cpp +++ b/Core/HLE/sceUtility.cpp @@ -35,6 +35,7 @@ #include "Core/System.h" #include "Core/HLE/sceKernel.h" +#include "Core/HLE/sceKernelInterrupt.h" #include "Core/HLE/sceKernelMemory.h" #include "Core/HLE/sceKernelThread.h" #include "Core/HLE/scePower.h" @@ -325,8 +326,12 @@ void UtilityDialogShutdown(UtilityDialogType type, int delayUs, int priority) { CleanupDialogThreads(); _assert_(accessThread == nullptr); + bool prevInterrupts = __InterruptsEnabled(); + __DisableInterrupts(); accessThread = new HLEHelperThread("ScePafJob", insts, (uint32_t)ARRAY_SIZE(insts), priority, 0x200); accessThread->Start(partDelay, 0); + if (prevInterrupts) + __EnableInterrupts(); } static int UtilityWorkUs(int us) { From 6f9f9f5f2a8444eebaa9b8ea0058feec300f13f0 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 14 Aug 2021 20:18:06 -0700 Subject: [PATCH 162/336] HLE: Ignore flip time in syscall stats. Don't want to count flip timing as the slowest thing, when it happens inside sceDisplaySetFramebuf (immediate.) --- Core/HLE/HLE.cpp | 11 +++++++++-- Core/HLE/HLE.h | 2 ++ Core/HLE/sceDisplay.cpp | 7 ++++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/Core/HLE/HLE.cpp b/Core/HLE/HLE.cpp index d31007beff..be27e632c5 100644 --- a/Core/HLE/HLE.cpp +++ b/Core/HLE/HLE.cpp @@ -697,11 +697,15 @@ void *GetQuickSyscallFunc(MIPSOpcode op) { } static double hleSteppingTime = 0.0; -void hleSetSteppingTime(double t) -{ +void hleSetSteppingTime(double t) { hleSteppingTime += t; } +static double hleFlipTime = 0.0; +void hleSetFlipTime(double t) { + hleFlipTime = t; +} + void CallSyscall(MIPSOpcode op) { PROFILE_THIS_SCOPE("syscall"); @@ -734,8 +738,11 @@ void CallSyscall(MIPSOpcode op) int funcnum = callno & 0xFFF; int modulenum = (callno & 0xFF000) >> 12; double total = time_now_d() - start - hleSteppingTime; + if (total >= hleFlipTime) + total -= hleFlipTime; _dbg_assert_msg_(total >= 0.0, "Time spent in syscall became negative"); hleSteppingTime = 0.0; + hleFlipTime = 0.0; updateSyscallStats(modulenum, funcnum, total); } } diff --git a/Core/HLE/HLE.h b/Core/HLE/HLE.h index 4f589aaf23..d2a74f9d43 100644 --- a/Core/HLE/HLE.h +++ b/Core/HLE/HLE.h @@ -117,6 +117,8 @@ void hleDebugBreak(); void hleSkipDeadbeef(); // Set time spent in debugger (for more useful debug stats while debugging.) void hleSetSteppingTime(double t); +// Set time spent in realtime sync. +void hleSetFlipTime(double t); // Check if the current syscall context is kernel. bool hleIsKernelMode(); // Enqueue a MIPS function to be called after this HLE call finishes. diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index b0738bc8f4..eaa44a0f2d 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -972,8 +972,13 @@ void __DisplaySetFramebuf(u32 topaddr, int linesize, int pixelFormat, int sync) // IMMEDIATE means that the buffer is fine. We can just flip immediately. // Doing it in non-buffered though creates problems (black screen) on occasion though // so let's not. - if (!flippedThisFrame && g_Config.iRenderingMode != FB_NON_BUFFERED_MODE) + if (!flippedThisFrame && g_Config.iRenderingMode != FB_NON_BUFFERED_MODE) { + double before_flip = time_now_d(); __DisplayFlip(0); + double after_flip = time_now_d(); + // Ignore for debug stats. + hleSetFlipTime(after_flip - before_flip); + } } else { // Delay the write until vblank latchedFramebuf = fbstate; From 5d17ec70cee3976b0c9b7372dbccb8e9e9a7fb4d Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 14 Aug 2021 20:18:52 -0700 Subject: [PATCH 163/336] Ge: Add measured minimal timing for sceGeDrawSync. --- Core/HLE/sceGe.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Core/HLE/sceGe.cpp b/Core/HLE/sceGe.cpp index 04b2e40831..8c003526ca 100644 --- a/Core/HLE/sceGe.cpp +++ b/Core/HLE/sceGe.cpp @@ -390,6 +390,8 @@ static u32 sceGeDrawSync(u32 mode) { //wait/check entire drawing state if (PSP_CoreParameter().compat.flags().DrawSyncEatCycles) hleEatCycles(500000); //HACK(?) : Potential fix for Crash Tag Team Racing and a few Gundam games + else + hleEatCycles(1240); DEBUG_LOG(SCEGE, "sceGeDrawSync(mode=%d) (0=wait for completion, 1=peek)", mode); return gpu->DrawSync(mode); } From 04828e886b5cc804bd0a6ba5a28fbc8dee5894dd Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 14 Aug 2021 20:55:10 -0700 Subject: [PATCH 164/336] Dialog: Lock volatile when the access thread runs. Further tests show that this should be locked first thing before the delays, it just depends on the thread priorities involved. --- Core/HLE/sceUtility.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/Core/HLE/sceUtility.cpp b/Core/HLE/sceUtility.cpp index f33bbe4a72..4201ea8b20 100644 --- a/Core/HLE/sceUtility.cpp +++ b/Core/HLE/sceUtility.cpp @@ -276,22 +276,23 @@ void __UtilityShutdown() { void UtilityDialogInitialize(UtilityDialogType type, int delayUs, int priority) { int partDelay = delayUs / 4; const u32_le insts[] = { - // Make sure we don't discard/deadbeef 'em. + // Make sure we don't discard/deadbeef a0. (u32_le)MIPS_MAKE_ORI(MIPS_REG_S0, MIPS_REG_A0, 0), - (u32_le)MIPS_MAKE_SYSCALL("sceUtility", "__UtilityWorkUs"), - (u32_le)MIPS_MAKE_ORI(MIPS_REG_A0, MIPS_REG_S0, 0), - (u32_le)MIPS_MAKE_SYSCALL("sceUtility", "__UtilityWorkUs"), - (u32_le)MIPS_MAKE_ORI(MIPS_REG_A0, MIPS_REG_S0, 0), - (u32_le)MIPS_MAKE_SYSCALL("sceUtility", "__UtilityWorkUs"), - (u32_le)MIPS_MAKE_ORI(MIPS_REG_A0, MIPS_REG_S0, 0), - (u32_le)MIPS_MAKE_SYSCALL("sceUtility", "__UtilityWorkUs"), - // Now actually lock the volatile memory. Maybe this should be earlier... (u32_le)MIPS_MAKE_ORI(MIPS_REG_A0, MIPS_REG_ZERO, 0), (u32_le)MIPS_MAKE_ORI(MIPS_REG_A1, MIPS_REG_ZERO, 0), (u32_le)MIPS_MAKE_ORI(MIPS_REG_A2, MIPS_REG_ZERO, 0), (u32_le)MIPS_MAKE_SYSCALL("sceSuspendForUser", "sceKernelVolatileMemLock"), + (u32_le)MIPS_MAKE_ORI(MIPS_REG_A0, MIPS_REG_S0, 0), + (u32_le)MIPS_MAKE_SYSCALL("sceUtility", "__UtilityWorkUs"), + (u32_le)MIPS_MAKE_ORI(MIPS_REG_A0, MIPS_REG_S0, 0), + (u32_le)MIPS_MAKE_SYSCALL("sceUtility", "__UtilityWorkUs"), + (u32_le)MIPS_MAKE_ORI(MIPS_REG_A0, MIPS_REG_S0, 0), + (u32_le)MIPS_MAKE_SYSCALL("sceUtility", "__UtilityWorkUs"), + (u32_le)MIPS_MAKE_ORI(MIPS_REG_A0, MIPS_REG_S0, 0), + (u32_le)MIPS_MAKE_SYSCALL("sceUtility", "__UtilityWorkUs"), + (u32_le)MIPS_MAKE_ORI(MIPS_REG_A0, MIPS_REG_ZERO, (int)type), (u32_le)MIPS_MAKE_JR_RA(), (u32_le)MIPS_MAKE_SYSCALL("sceUtility", "__UtilityInitDialog"), From 23f1443949255f188b1ec5e2ebd38281fadaf948 Mon Sep 17 00:00:00 2001 From: Autechre Date: Sun, 15 Aug 2021 10:03:19 +0200 Subject: [PATCH 165/336] Set base_width/base_height to sane dimensions (480x272) base_width/base_height should be set to the lowest/default PSP internal resolution, which in this case is 480x272. Setting base_width/height the same as max_width/max_height would create problems with windowed mode in RetroArch, it would try to create a huge window (often times far exceeding the desktop size). --- libretro/libretro.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index 66c080d2c0..cab2b7f4a6 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -495,8 +495,8 @@ void retro_get_system_av_info(struct retro_system_av_info *info) info->timing.fps = 60.0f / 1.001f; info->timing.sample_rate = SAMPLERATE; - info->geometry.base_width = g_Config.iInternalResolution * 480; - info->geometry.base_height = g_Config.iInternalResolution * 272; + info->geometry.base_width = 480; + info->geometry.base_height = 272; info->geometry.max_width = g_Config.iInternalResolution * 480; info->geometry.max_height = g_Config.iInternalResolution * 272; info->geometry.aspect_ratio = 480.0 / 272.0; // Not 16:9! But very, very close. From 308f74ddaee52b009063b2651d412b4486a4e909 Mon Sep 17 00:00:00 2001 From: Autechre Date: Tue, 17 Aug 2021 01:13:24 +0200 Subject: [PATCH 166/336] (Libretro) Switch back to earlier base_width/base_height values We decided on fixing this issue at the frontend level instead of the core side. Our apologies for this secondary PR, we'd appreciate if it could be merged quickly. --- libretro/libretro.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index cab2b7f4a6..66c080d2c0 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -495,8 +495,8 @@ void retro_get_system_av_info(struct retro_system_av_info *info) info->timing.fps = 60.0f / 1.001f; info->timing.sample_rate = SAMPLERATE; - info->geometry.base_width = 480; - info->geometry.base_height = 272; + info->geometry.base_width = g_Config.iInternalResolution * 480; + info->geometry.base_height = g_Config.iInternalResolution * 272; info->geometry.max_width = g_Config.iInternalResolution * 480; info->geometry.max_height = g_Config.iInternalResolution * 272; info->geometry.aspect_ratio = 480.0 / 272.0; // Not 16:9! But very, very close. From ad29e5237e34abe19b4510b83879cc4d1e5d9c93 Mon Sep 17 00:00:00 2001 From: iota97 Date: Tue, 17 Aug 2021 09:17:37 +0200 Subject: [PATCH 167/336] Basic mappable gesture --- Core/Config.cpp | 8 +++ Core/Config.h | 10 ++++ UI/GameSettingsScreen.cpp | 33 +++++++++++ UI/GameSettingsScreen.h | 6 ++ UI/GamepadEmu.cpp | 116 ++++++++++++++++++++++++++++++++++++++ UI/GamepadEmu.h | 23 ++++++++ 6 files changed, 196 insertions(+) diff --git a/Core/Config.cpp b/Core/Config.cpp index 9835597fae..f054c2be47 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -551,6 +551,14 @@ static ConfigSetting generalSettings[] = { ConfigSetting("RightAnalogPress", &g_Config.iRightAnalogPress, 0, true, true), ConfigSetting("RightAnalogCustom", &g_Config.bRightAnalogCustom, false, true, true), ConfigSetting("RightAnalogDisableDiagonal", &g_Config.bRightAnalogDisableDiagonal, false, true, true), + ConfigSetting("SwipeUp", &g_Config.iSwipeUp, 0, true, true), + ConfigSetting("SwipeDown", &g_Config.iSwipeDown, 0, true, true), + ConfigSetting("SwipeLeft", &g_Config.iSwipeLeft, 0, true, true), + ConfigSetting("SwipeRight", &g_Config.iSwipeRight, 0, true, true), + ConfigSetting("SwipeSensitivity", &g_Config.fSwipeSensitivity, 1.0f, true, true), + ConfigSetting("SwipeSmoothing", &g_Config.fSwipeSmoothing, 0.3f, true, true), + ConfigSetting("DoubleTapGesture", &g_Config.iDoubleTapGesture, 0, true, true), + ConfigSetting("GestureControlEnabled", &g_Config.bGestureControlEnabled, false, true, true), // "default" means let emulator decide, "" means disable. ConfigSetting("ReportingHost", &g_Config.sReportHost, "default"), diff --git a/Core/Config.h b/Core/Config.h index cf0711b139..092fbabc49 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -320,6 +320,16 @@ public: bool bRightAnalogCustom; bool bRightAnalogDisableDiagonal; + // Motion gesture controller + bool bGestureControlEnabled; + int iSwipeUp; + int iSwipeDown; + int iSwipeLeft; + int iSwipeRight; + float fSwipeSensitivity; + float fSwipeSmoothing; + int iDoubleTapGesture; + // Disable diagonals bool bDisableDpadDiagonals; bool bGamepadOnlyFocused; diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 6ab3c24981..18a884d368 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -729,6 +729,10 @@ void GameSettingsScreen::CreateViews() { static const char *touchControlStyles[] = {"Classic", "Thin borders", "Glowing borders"}; View *style = controlsSettings->Add(new PopupMultiChoice(&g_Config.iTouchButtonStyle, co->T("Button style"), touchControlStyles, 0, ARRAY_SIZE(touchControlStyles), co->GetName(), screenManager())); style->SetEnabledPtr(&g_Config.bShowTouchControls); + controlsSettings->Add(new Choice(co->T("Gesture mapping")))->OnClick.Add([=](EventParams &e) { + screenManager()->push(new GestureMappingScreen()); + return UI::EVENT_DONE; + }); } controlsSettings->Add(new ItemHeader(co->T("Keyboard", "Keyboard Control Settings"))); @@ -1989,3 +1993,32 @@ void HostnameSelectScreen::OnCompleted(DialogResult result) { if (result == DR_OK) *value_ = StripSpaces(addrView_->GetText()); } + +void GestureMappingScreen::CreateViews() { + using namespace UI; + + auto di = GetI18NCategory("Dialog"); + auto co = GetI18NCategory("Controls"); + auto mc = GetI18NCategory("MappableControls"); + + root_ = new AnchorLayout(new LayoutParams(FILL_PARENT, FILL_PARENT)); + Choice *back = new Choice(di->T("Back"), "", false, new AnchorLayoutParams(130, WRAP_CONTENT, 10, NONE, NONE, 10)); + root_->Add(back)->OnClick.Handle(this, &UIScreen::OnBack); + TabHolder *tabHolder = new TabHolder(ORIENT_VERTICAL, 140, new AnchorLayoutParams(10, 0, 10, 0, false)); + root_->Add(tabHolder); + ScrollView *rightPanel = new ScrollView(ORIENT_VERTICAL); + tabHolder->AddTab(co->T("Gesture"), rightPanel); + LinearLayout *vert = rightPanel->Add(new LinearLayout(ORIENT_VERTICAL, new LayoutParams(FILL_PARENT, FILL_PARENT))); + vert->SetSpacing(0); + + static const char *gestureButton[] = {"None", "L", "R", "Square", "Triangle", "Circle", "Cross", "D-pad up", "D-pad down", "D-pad left", "D-pad right", "Start", "Select"}; + vert->Add(new CheckBox(&g_Config.bGestureControlEnabled, co->T("Enable gesture control"))); + vert->Add(new PopupMultiChoice(&g_Config.iSwipeUp, mc->T("Swipe Up"), gestureButton, 0, ARRAY_SIZE(gestureButton), mc->GetName(), screenManager()))->SetEnabledPtr(&g_Config.bGestureControlEnabled); + vert->Add(new PopupMultiChoice(&g_Config.iSwipeDown, mc->T("Swipe Down"), gestureButton, 0, ARRAY_SIZE(gestureButton), mc->GetName(), screenManager()))->SetEnabledPtr(&g_Config.bGestureControlEnabled); + vert->Add(new PopupMultiChoice(&g_Config.iSwipeLeft, mc->T("Swipe Left"), gestureButton, 0, ARRAY_SIZE(gestureButton), mc->GetName(), screenManager()))->SetEnabledPtr(&g_Config.bGestureControlEnabled); + vert->Add(new PopupMultiChoice(&g_Config.iSwipeRight, mc->T("Swipe Right"), gestureButton, 0, ARRAY_SIZE(gestureButton), mc->GetName(), screenManager()))->SetEnabledPtr(&g_Config.bGestureControlEnabled); + vert->Add(new PopupSliderChoiceFloat(&g_Config.fSwipeSensitivity, 0.01f, 1.0f, co->T("Swipe sensitivity"), 0.01f, screenManager(), "x"))->SetEnabledPtr(&g_Config.bGestureControlEnabled); + vert->Add(new PopupSliderChoiceFloat(&g_Config.fSwipeSmoothing, 0.0f, 0.95f, co->T("Swipe smoothing"), 0.05f, screenManager(), "x"))->SetEnabledPtr(&g_Config.bGestureControlEnabled); + vert->Add(new PopupMultiChoice(&g_Config.iDoubleTapGesture, mc->T("Double tap button"), gestureButton, 0, ARRAY_SIZE(gestureButton), mc->GetName(), screenManager()))->SetEnabledPtr(&g_Config.bGestureControlEnabled); +} + diff --git a/UI/GameSettingsScreen.h b/UI/GameSettingsScreen.h index 09127656ec..4346b948fd 100644 --- a/UI/GameSettingsScreen.h +++ b/UI/GameSettingsScreen.h @@ -221,3 +221,9 @@ private: std::string lastResolved_ = ""; bool lastResolvedResult_ = false; }; + + +class GestureMappingScreen : public UIDialogScreenWithBackground { +public: + void CreateViews() override; +}; diff --git a/UI/GamepadEmu.cpp b/UI/GamepadEmu.cpp index 5d18052ed2..e00c8ea35c 100644 --- a/UI/GamepadEmu.cpp +++ b/UI/GamepadEmu.cpp @@ -34,6 +34,8 @@ #include "Core/ControlMapper.h" #include "UI/GamepadEmu.h" +static uint32_t usedPointerMask = 0; + static u32 GetButtonColor() { return g_Config.iTouchButtonStyle != 0 ? 0xFFFFFF : 0xc0b080; } @@ -97,6 +99,7 @@ void MultiTouchButton::Touch(const TouchInput &input) { GamepadView::Touch(input); if ((input.flags & TOUCH_DOWN) && bounds_.Contains(input.x, input.y)) { pointerDownMask_ |= 1 << input.id; + usedPointerMask |= 1 << input.id; } if (input.flags & TOUCH_MOVE) { if (bounds_.Contains(input.x, input.y)) @@ -106,9 +109,11 @@ void MultiTouchButton::Touch(const TouchInput &input) { } if (input.flags & TOUCH_UP) { pointerDownMask_ &= ~(1 << input.id); + usedPointerMask &= ~(1 << input.id); } if (input.flags & TOUCH_RELEASE_ALL) { pointerDownMask_ = 0; + usedPointerMask = 0; } } @@ -231,6 +236,7 @@ void PSPDpad::Touch(const TouchInput &input) { if (input.flags & TOUCH_DOWN) { if (dragPointerId_ == -1 && bounds_.Contains(input.x, input.y)) { dragPointerId_ = input.id; + usedPointerMask |= 1 << input.id; ProcessTouch(input.x, input.y, true); } } @@ -242,6 +248,7 @@ void PSPDpad::Touch(const TouchInput &input) { if (input.flags & TOUCH_UP) { if (input.id == dragPointerId_) { dragPointerId_ = -1; + usedPointerMask &= ~(1 << input.id); ProcessTouch(input.x, input.y, false); } } @@ -389,6 +396,7 @@ void PSPStick::Touch(const TouchInput &input) { centerX_ = bounds_.centerX(); centerY_ = bounds_.centerY(); __CtrlSetAnalogXY(stick_, 0.0f, 0.0f); + usedPointerMask = 0; return; } if (input.flags & TOUCH_DOWN) { @@ -401,6 +409,7 @@ void PSPStick::Touch(const TouchInput &input) { centerY_ = bounds_.centerY(); } dragPointerId_ = input.id; + usedPointerMask |= 1 << input.id; ProcessTouch(input.x, input.y, true); } } @@ -414,6 +423,7 @@ void PSPStick::Touch(const TouchInput &input) { dragPointerId_ = -1; centerX_ = bounds_.centerX(); centerY_ = bounds_.centerY(); + usedPointerMask &= ~(1 << input.id); ProcessTouch(input.x, input.y, false); } } @@ -486,6 +496,7 @@ void PSPCustomStick::Touch(const TouchInput &input) { centerY_ = bounds_.centerY(); posX_ = 0.0f; posY_ = 0.0f; + usedPointerMask = 0; return; } if (input.flags & TOUCH_DOWN) { @@ -498,6 +509,7 @@ void PSPCustomStick::Touch(const TouchInput &input) { centerY_ = bounds_.centerY(); } dragPointerId_ = input.id; + usedPointerMask |= 1 << input.id; ProcessTouch(input.x, input.y, true); } } @@ -511,6 +523,7 @@ void PSPCustomStick::Touch(const TouchInput &input) { dragPointerId_ = -1; centerX_ = bounds_.centerX(); centerY_ = bounds_.centerY(); + usedPointerMask &= ~(1 << input.id); ProcessTouch(input.x, input.y, false); } } @@ -813,5 +826,108 @@ UI::ViewGroup *CreatePadLayout(float xres, float yres, bool *pause, ControlMappe addComboKey(g_Config.CustomKey8, "Custom 9 button", g_Config.touchCombo8); addComboKey(g_Config.CustomKey9, "Custom 10 button", g_Config.touchCombo9); + if (g_Config.bGestureControlEnabled) + root->Add(new GestureGamepad()); + return root; } + + +void GestureGamepad::Touch(const TouchInput &input) { + static const int button[16] = {CTRL_LTRIGGER, CTRL_RTRIGGER, CTRL_SQUARE, CTRL_TRIANGLE, CTRL_CIRCLE, CTRL_CROSS, CTRL_UP, CTRL_DOWN, CTRL_LEFT, CTRL_RIGHT, CTRL_START, CTRL_SELECT}; + + if (usedPointerMask & (1 << input.id)) { + if (input.id == dragPointerId_) + dragPointerId_ = -1; + return; + } + + if (input.flags & TOUCH_RELEASE_ALL) { + dragPointerId_ = -1; + return; + } + + if (input.flags & TOUCH_DOWN) { + if (dragPointerId_ == -1) { + dragPointerId_ = input.id; + lastX_ = input.x; + lastY_ = input.y; + + const float now = time_now_d(); + if (now - lastTapRelease_ < 0.3f && !haveDoubleTapped_) { + if (g_Config.iDoubleTapGesture != 0 ) + __CtrlButtonDown(button[g_Config.iDoubleTapGesture-1]); + haveDoubleTapped_ = true; + } + + lastTouchDown_ = now; + } + } + if (input.flags & TOUCH_MOVE) { + if (input.id == dragPointerId_) { + deltaX_ += input.x - lastX_; + deltaY_ += input.y - lastY_; + lastX_ = input.x; + lastY_ = input.y; + } + } + if (input.flags & TOUCH_UP) { + if (input.id == dragPointerId_) { + dragPointerId_ = -1; + if (time_now_d() - lastTouchDown_ < 0.3f) + lastTapRelease_ = time_now_d(); + + if (haveDoubleTapped_) { + if (g_Config.iDoubleTapGesture != 0) + __CtrlButtonUp(button[g_Config.iDoubleTapGesture-1]); + haveDoubleTapped_ = false; + } + } + } +} + +void GestureGamepad::Update() { + static const int button[16] = {CTRL_LTRIGGER, CTRL_RTRIGGER, CTRL_SQUARE, CTRL_TRIANGLE, CTRL_CIRCLE, CTRL_CROSS, CTRL_UP, CTRL_DOWN, CTRL_LEFT, CTRL_RIGHT, CTRL_START, CTRL_SELECT}; + + const float th = 1.0f; + float dx = deltaX_ * g_dpi_scale_x * g_Config.fSwipeSensitivity; + float dy = deltaY_ * g_dpi_scale_y * g_Config.fSwipeSensitivity; + if (g_Config.iSwipeRight != 0) { + if (dx > th) { + __CtrlButtonDown(button[g_Config.iSwipeRight-1]); + swipeRightReleased_ = false; + } else if (!swipeRightReleased_) { + __CtrlButtonUp(button[g_Config.iSwipeRight-1]); + swipeRightReleased_ = true; + } + } + if (g_Config.iSwipeLeft != 0) { + if (dx < -th) { + __CtrlButtonDown(button[g_Config.iSwipeLeft-1]); + swipeLeftReleased_ = false; + } else if (!swipeLeftReleased_) { + __CtrlButtonUp(button[g_Config.iSwipeLeft-1]); + swipeLeftReleased_ = true; + } + } + if (g_Config.iSwipeUp != 0) { + if (dy < -th) { + __CtrlButtonDown(button[g_Config.iSwipeUp-1]); + swipeUpReleased_ = false; + } else if (!swipeUpReleased_) { + __CtrlButtonUp(button[g_Config.iSwipeUp-1]); + swipeUpReleased_ = true; + } + } + if (g_Config.iSwipeDown != 0) { + if (dy > th) { + __CtrlButtonDown(button[g_Config.iSwipeDown-1]); + swipeDownReleased_ = false; + } else if (!swipeDownReleased_) { + __CtrlButtonUp(button[g_Config.iSwipeDown-1]); + swipeDownReleased_ = true; + } + } + deltaX_ *= g_Config.fSwipeSmoothing; + deltaY_ *= g_Config.fSwipeSmoothing; +} diff --git a/UI/GamepadEmu.h b/UI/GamepadEmu.h index 3e32054964..ac2c4ad541 100644 --- a/UI/GamepadEmu.h +++ b/UI/GamepadEmu.h @@ -288,3 +288,26 @@ namespace CustomKey { }; static_assert(ARRAY_SIZE(comboKeyList) <= 64, "Too many key for a uint64_t bit mask"); }; + +class GestureGamepad : public UI::View { +public: + GestureGamepad() {}; + + void Touch(const TouchInput &input) override; + void Update() override; + +protected: + + float lastX_ = 0.0f; + float lastY_ = 0.0f; + float deltaX_ = 0.0f; + float deltaY_ = 0.0f; + float lastTapRelease_ = 0.0f; + float lastTouchDown_ = 0.0f; + int dragPointerId_ = -1; + bool swipeLeftReleased_ = true; + bool swipeRightReleased_ = true; + bool swipeUpReleased_ = true; + bool swipeDownReleased_ = true; + bool haveDoubleTapped_ = false; +}; From 3c62fbc973186a4d1b5b7ecce16ffa38907296ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 17 Aug 2021 09:19:30 +0200 Subject: [PATCH 168/336] Fix string comparison for hiding "Unknown" CPU name See #10620 --- UI/DevScreens.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UI/DevScreens.cpp b/UI/DevScreens.cpp index 8c366fce52..eac304f5f4 100644 --- a/UI/DevScreens.cpp +++ b/UI/DevScreens.cpp @@ -482,7 +482,7 @@ void SystemInfoScreen::CreateViews() { deviceSpecs->Add(new ItemHeader(si->T("CPU Information"))); // Don't bother showing the CPU name if we don't have one. - if (cpu_info.brand_string != "Unknown") { + if (strcmp(cpu_info.brand_string, "Unknown") != 0) { deviceSpecs->Add(new InfoItem(si->T("CPU Name", "Name"), cpu_info.brand_string)); } From 928bc88b0112b7a4afcc9cb38db3973a6292abdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 17 Aug 2021 16:48:47 +0200 Subject: [PATCH 169/336] Rename Unthrottle to Fast-forward globally --- Common/Input/InputState.h | 2 +- Core/Config.cpp | 32 ++++++++++++++--------------- Core/Config.h | 4 ++-- Core/ConfigValues.h | 2 +- Core/CoreParameter.h | 2 +- Core/HLE/sceDisplay.cpp | 22 ++++++++++---------- Core/HW/StereoResampler.cpp | 8 ++++---- Core/KeyMap.cpp | 20 +++++++++--------- Core/KeyMap.h | 2 +- GPU/GPUCommon.cpp | 2 +- UI/DevScreens.cpp | 1 + UI/EmuScreen.cpp | 8 ++++---- UI/GamepadEmu.cpp | 14 ++++++------- UI/GamepadEmu.h | 2 +- UI/TouchControlLayoutScreen.cpp | 4 ++-- UI/TouchControlVisibilityScreen.cpp | 2 +- Windows/XinputDevice.cpp | 2 +- android/jni/TestRunner.cpp | 2 +- headless/Headless.cpp | 4 ++-- libretro/libretro.cpp | 4 ++-- unittest/JitHarness.cpp | 2 +- 21 files changed, 71 insertions(+), 70 deletions(-) diff --git a/Common/Input/InputState.h b/Common/Input/InputState.h index 02377f3b24..3c917af1b0 100644 --- a/Common/Input/InputState.h +++ b/Common/Input/InputState.h @@ -69,7 +69,7 @@ enum { PAD_BUTTON_LEFT_TRIGGER = 1 << 21, // Click left thumb stick on X360 PAD_BUTTON_RIGHT_TRIGGER = 1 << 22, // Click left thumb stick on X360 - PAD_BUTTON_UNTHROTTLE = 1 << 20, // Click Tab to unthrottle + PAD_BUTTON_FASTFORWARD = 1 << 20, // Click Tab to unthrottle }; #ifndef MAX_KEYQUEUESIZE diff --git a/Core/Config.cpp b/Core/Config.cpp index 9835597fae..023d006c74 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -621,11 +621,11 @@ static int DefaultInternalResolution() { #endif } -static int DefaultUnthrottleMode() { +static int DefaultFastForwardMode() { #if PPSSPP_PLATFORM(ANDROID) || defined(USING_QT_UI) || PPSSPP_PLATFORM(UWP) || PPSSPP_PLATFORM(IOS) - return (int)UnthrottleMode::SKIP_FLIP; + return (int)FastForwardMode::SKIP_FLIP; #else - return (int)UnthrottleMode::CONTINUOUS; + return (int)FastForwardMode::CONTINUOUS; #endif } @@ -792,23 +792,23 @@ struct ConfigTranslator { typedef ConfigTranslator GPUBackendTranslator; -static int UnthrottleModeFromString(const std::string &s) { +static int FastForwardModeFromString(const std::string &s) { if (!strcasecmp(s.c_str(), "CONTINUOUS")) - return (int)UnthrottleMode::CONTINUOUS; + return (int)FastForwardMode::CONTINUOUS; if (!strcasecmp(s.c_str(), "SKIP_DRAW")) - return (int)UnthrottleMode::SKIP_DRAW; + return (int)FastForwardMode::SKIP_DRAW; if (!strcasecmp(s.c_str(), "SKIP_FLIP")) - return (int)UnthrottleMode::SKIP_FLIP; - return DefaultUnthrottleMode(); + return (int)FastForwardMode::SKIP_FLIP; + return DefaultFastForwardMode(); } -std::string UnthrottleModeToString(int v) { - switch (UnthrottleMode(v)) { - case UnthrottleMode::CONTINUOUS: +std::string FastForwardModeToString(int v) { + switch (FastForwardMode(v)) { + case FastForwardMode::CONTINUOUS: return "CONTINUOUS"; - case UnthrottleMode::SKIP_DRAW: + case FastForwardMode::SKIP_DRAW: return "SKIP_DRAW"; - case UnthrottleMode::SKIP_FLIP: + case FastForwardMode::SKIP_FLIP: return "SKIP_FLIP"; } return "CONTINUOUS"; @@ -843,7 +843,7 @@ static ConfigSetting graphicsSettings[] = { ReportedConfigSetting("AutoFrameSkip", &g_Config.bAutoFrameSkip, false, true, true), ConfigSetting("FrameRate", &g_Config.iFpsLimit1, 0, true, true), ConfigSetting("FrameRate2", &g_Config.iFpsLimit2, -1, true, true), - ConfigSetting("UnthrottlingMode", &g_Config.iUnthrottleMode, &DefaultUnthrottleMode, &UnthrottleModeToString, &UnthrottleModeFromString, true, true), + ConfigSetting("UnthrottlingMode", &g_Config.iFastForwardMode, &DefaultFastForwardMode, &FastForwardModeToString, &FastForwardModeFromString, true, true), #if defined(USING_WIN_UI) ConfigSetting("RestartRequired", &g_Config.bRestartRequired, false, false), #endif @@ -999,7 +999,7 @@ static ConfigSetting controlSettings[] = { ConfigSetting("DPadSpacing", &g_Config.fDpadSpacing, 1.0f, true, true), ConfigSetting("StartKeyX", "StartKeyY", "StartKeyScale", "ShowTouchStart", &g_Config.touchStartKey, defaultTouchPosShow, true, true), ConfigSetting("SelectKeyX", "SelectKeyY", "SelectKeyScale", "ShowTouchSelect", &g_Config.touchSelectKey, defaultTouchPosShow, true, true), - ConfigSetting("UnthrottleKeyX", "UnthrottleKeyY", "UnthrottleKeyScale", "ShowTouchUnthrottle", &g_Config.touchUnthrottleKey, defaultTouchPosShow, true, true), + ConfigSetting("UnthrottleKeyX", "UnthrottleKeyY", "UnthrottleKeyScale", "ShowTouchUnthrottle", &g_Config.touchFastForwardKey, defaultTouchPosShow, true, true), ConfigSetting("LKeyX", "LKeyY", "LKeyScale", "ShowTouchLTrigger", &g_Config.touchLKey, defaultTouchPosShow, true, true), ConfigSetting("RKeyX", "RKeyY", "RKeyScale", "ShowTouchRTrigger", &g_Config.touchRKey, defaultTouchPosShow, true, true), ConfigSetting("AnalogStickX", "AnalogStickY", "AnalogStickScale", "ShowAnalogStick", &g_Config.touchAnalogStick, defaultTouchPosShow, true, true), @@ -1834,7 +1834,7 @@ void Config::ResetControlLayout() { g_Config.fDpadSpacing = 1.0f; reset(g_Config.touchStartKey); reset(g_Config.touchSelectKey); - reset(g_Config.touchUnthrottleKey); + reset(g_Config.touchFastForwardKey); reset(g_Config.touchLKey); reset(g_Config.touchRKey); reset(g_Config.touchAnalogStick); diff --git a/Core/Config.h b/Core/Config.h index cf0711b139..06562aa18b 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -173,7 +173,7 @@ public: bool bVSync; int iFrameSkip; int iFrameSkipType; - int iUnthrottleMode; // See UnthrottleMode in ConfigValues.h. + int iFastForwardMode; // See FastForwardMode in ConfigValues.h. bool bAutoFrameSkip; bool bEnableCardboardVR; // Cardboard Master Switch @@ -348,7 +348,7 @@ public: float fDpadSpacing; ConfigTouchPos touchStartKey; ConfigTouchPos touchSelectKey; - ConfigTouchPos touchUnthrottleKey; + ConfigTouchPos touchFastForwardKey; ConfigTouchPos touchLKey; ConfigTouchPos touchRKey; ConfigTouchPos touchAnalogStick; diff --git a/Core/ConfigValues.h b/Core/ConfigValues.h index cbdee70a0b..a3899b0646 100644 --- a/Core/ConfigValues.h +++ b/Core/ConfigValues.h @@ -111,7 +111,7 @@ enum class AutoLoadSaveState { NEWEST = 2, }; -enum class UnthrottleMode { +enum class FastForwardMode { CONTINUOUS = 0, SKIP_DRAW = 1, SKIP_FLIP = 2, diff --git a/Core/CoreParameter.h b/Core/CoreParameter.h index a0589aefc5..1b98277bf5 100644 --- a/Core/CoreParameter.h +++ b/Core/CoreParameter.h @@ -75,7 +75,7 @@ struct CoreParameter { int pixelHeight; // Can be modified at runtime. - bool unthrottle = false; + bool fastForward = false; FPSLimit fpsLimit = FPSLimit::NORMAL; bool updateRecent = true; diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index eaa44a0f2d..279bd2642a 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -518,7 +518,7 @@ static bool FrameTimingThrottled() { if (PSP_CoreParameter().fpsLimit == FPSLimit::CUSTOM2 && g_Config.iFpsLimit2 == 0) { return false; } - return !PSP_CoreParameter().unthrottle; + return !PSP_CoreParameter().fastForward; } static void DoFrameDropLogging(float scaledTimestep) { @@ -557,16 +557,16 @@ static void DoFrameTiming(bool &throttle, bool &skipFrame, float timestep) { // we have nothing to do here. bool doFrameSkip = g_Config.iFrameSkip != 0; - bool unthrottleNeedsSkip = g_Config.iUnthrottleMode == (int)UnthrottleMode::SKIP_DRAW; + bool fastForwardNeedsSkip = g_Config.iFastForwardMode == (int)FastForwardMode::SKIP_DRAW; if (g_Config.bVSync && GetGPUBackend() == GPUBackend::VULKAN) { // Vulkan doesn't support the interval setting, so we force frameskip. - unthrottleNeedsSkip = true; + fastForwardNeedsSkip = true; // If it's not a clean multiple of 60, we may need frameskip to achieve it. if (fpsLimit == 0 || (fpsLimit >= 0 && fpsLimit != 15 && fpsLimit != 30 && fpsLimit != 60)) { doFrameSkip = true; } } - if (!throttle && unthrottleNeedsSkip) { + if (!throttle && fastForwardNeedsSkip) { doFrameSkip = true; skipFrame = true; if (numSkippedFrames >= 7) { @@ -599,7 +599,7 @@ static void DoFrameTiming(bool &throttle, bool &skipFrame, float timestep) { } // Auto-frameskip automatically if speed limit is set differently than the default. - bool forceFrameskip = fpsLimit > 60 && unthrottleNeedsSkip; + bool forceFrameskip = fpsLimit > 60 && fastForwardNeedsSkip; int frameSkipNum = CalculateFrameSkip(); if (g_Config.bAutoFrameSkip || forceFrameskip) { // autoframeskip @@ -622,7 +622,7 @@ static void DoFrameTiming(bool &throttle, bool &skipFrame, float timestep) { // timestamp to push it to display, and sleep in the render thread to achieve that. if (curFrameTime < nextFrameTime && throttle) { - // If time gap is huge just jump (somebody unthrottled) + // If time gap is huge just jump (somebody fast-forwarded) if (nextFrameTime - curFrameTime > 2*scaledTimestep) { nextFrameTime = curFrameTime; } else { @@ -750,14 +750,14 @@ void __DisplayFlip(int cyclesLate) { bool duplicateFrames = g_Config.bRenderDuplicateFrames && g_Config.iFrameSkip == 0; - bool unthrottleNeedsSkip = g_Config.iUnthrottleMode != (int)UnthrottleMode::CONTINUOUS; + bool fastForwardNeedsSkip = g_Config.iFastForwardMode != (int)FastForwardMode::CONTINUOUS; if (g_Config.bVSync && GetGPUBackend() == GPUBackend::VULKAN) { // Vulkan doesn't support the interval setting, so we force frameskip. - unthrottleNeedsSkip = true; + fastForwardNeedsSkip = true; } // postEffectRequiresFlip is not compatible with frameskip unthrottling, see #12325. - if (g_Config.iRenderingMode != FB_NON_BUFFERED_MODE && !(unthrottleNeedsSkip && !FrameTimingThrottled())) { + if (g_Config.iRenderingMode != FB_NON_BUFFERED_MODE && !(fastForwardNeedsSkip && !FrameTimingThrottled())) { postEffectRequiresFlip = duplicateFrames || g_Config.bShaderChainRequires60FPS; } @@ -786,9 +786,9 @@ void __DisplayFlip(int cyclesLate) { } bool forceNoFlip = false; - // Alternative to frameskip unthrottle, where we draw everything. + // Alternative to frameskip fast-forward, where we draw everything. // Useful if skipping a frame breaks graphics or for checking drawing speed. - if (g_Config.iUnthrottleMode == (int)UnthrottleMode::SKIP_FLIP && !FrameTimingThrottled()) { + if (g_Config.iFastForwardMode == (int)FastForwardMode::SKIP_FLIP && !FrameTimingThrottled()) { static double lastFlip = 0; double now = time_now_d(); if ((now - lastFlip) < 1.0f / System_GetPropertyFloat(SYSPROP_DISPLAY_REFRESH_RATE)) { diff --git a/Core/HW/StereoResampler.cpp b/Core/HW/StereoResampler.cpp index 5445984546..09864c98a1 100644 --- a/Core/HW/StereoResampler.cpp +++ b/Core/HW/StereoResampler.cpp @@ -143,7 +143,7 @@ inline void ClampBufferToS16(s16 *out, const s32 *in, size_t size, s8 volShift) inline void ClampBufferToS16WithVolume(s16 *out, const s32 *in, size_t size) { int volume = g_Config.iGlobalVolume; - if (PSP_CoreParameter().fpsLimit != FPSLimit::NORMAL || PSP_CoreParameter().unthrottle) { + if (PSP_CoreParameter().fpsLimit != FPSLimit::NORMAL || PSP_CoreParameter().fastForward) { if (g_Config.iAltSpeedVolume != -1) { volume = g_Config.iAltSpeedVolume; } @@ -266,15 +266,15 @@ void StereoResampler::PushSamples(const s32 *samples, unsigned int numSamples) { u32 indexW = m_indexW.load(); u32 cap = m_maxBufsize * 2; - // If unthrottling, no need to fill up the entire buffer, just screws up timing after releasing unthrottle. - if (PSP_CoreParameter().unthrottle) { + // If unthrottling, no need to fill up the entire buffer, just screws up timing after releasing the fast-forward button. + if (PSP_CoreParameter().fastForward) { cap = m_targetBufsize * 2; } // Check if we have enough free space // indexW == m_indexR results in empty buffer, so indexR must always be smaller than indexW if (numSamples * 2 + ((indexW - m_indexR.load()) & INDEX_MASK) >= cap) { - if (!PSP_CoreParameter().unthrottle) { + if (!PSP_CoreParameter().fastForward) { overrunCount_++; } // TODO: "Timestretch" by doing a windowed overlap with existing buffer content? diff --git a/Core/KeyMap.cpp b/Core/KeyMap.cpp index 2015a4c941..c15f8dc6c7 100644 --- a/Core/KeyMap.cpp +++ b/Core/KeyMap.cpp @@ -77,7 +77,7 @@ static const DefMappingStruct defaultQwertyKeyboardKeyMap[] = { {VIRTKEY_AXIS_X_MIN, NKCODE_J}, {VIRTKEY_AXIS_X_MAX, NKCODE_L}, {VIRTKEY_RAPID_FIRE, NKCODE_SHIFT_LEFT}, - {VIRTKEY_UNTHROTTLE, NKCODE_TAB}, + {VIRTKEY_FASTFORWARD, NKCODE_TAB}, {VIRTKEY_SPEED_TOGGLE, NKCODE_GRAVE}, {VIRTKEY_PAUSE , NKCODE_ESCAPE}, {VIRTKEY_REWIND , NKCODE_DEL}, @@ -107,7 +107,7 @@ static const DefMappingStruct defaultAzertyKeyboardKeyMap[] = { {VIRTKEY_AXIS_X_MIN, NKCODE_J}, {VIRTKEY_AXIS_X_MAX, NKCODE_L}, {VIRTKEY_RAPID_FIRE, NKCODE_SHIFT_LEFT}, - {VIRTKEY_UNTHROTTLE, NKCODE_TAB}, + {VIRTKEY_FASTFORWARD, NKCODE_TAB}, {VIRTKEY_SPEED_TOGGLE, NKCODE_GRAVE}, {VIRTKEY_PAUSE , NKCODE_ESCAPE}, {VIRTKEY_REWIND , NKCODE_DEL}, @@ -137,7 +137,7 @@ static const DefMappingStruct defaultQwertzKeyboardKeyMap[] = { {VIRTKEY_AXIS_X_MIN, NKCODE_J}, {VIRTKEY_AXIS_X_MAX, NKCODE_L}, {VIRTKEY_RAPID_FIRE, NKCODE_SHIFT_LEFT}, - {VIRTKEY_UNTHROTTLE, NKCODE_TAB}, + {VIRTKEY_FASTFORWARD, NKCODE_TAB}, {VIRTKEY_SPEED_TOGGLE, NKCODE_GRAVE}, {VIRTKEY_PAUSE , NKCODE_ESCAPE}, {VIRTKEY_REWIND , NKCODE_DEL}, @@ -161,7 +161,7 @@ static const DefMappingStruct default360KeyMap[] = { {CTRL_SELECT , NKCODE_BUTTON_SELECT}, {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, - {VIRTKEY_UNTHROTTLE , JOYSTICK_AXIS_RTRIGGER, +1}, + {VIRTKEY_FASTFORWARD , JOYSTICK_AXIS_RTRIGGER, +1}, {VIRTKEY_SPEED_TOGGLE, NKCODE_BUTTON_THUMBR}, {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, {VIRTKEY_PAUSE, NKCODE_HOME}, @@ -185,7 +185,7 @@ static const DefMappingStruct defaultShieldKeyMap[] = { {CTRL_UP, JOYSTICK_AXIS_HAT_Y, -1}, {CTRL_DOWN, JOYSTICK_AXIS_HAT_Y, +1}, {VIRTKEY_SPEED_TOGGLE, JOYSTICK_AXIS_LTRIGGER, +1 }, - {VIRTKEY_UNTHROTTLE, JOYSTICK_AXIS_RTRIGGER, +1 }, + {VIRTKEY_FASTFORWARD, JOYSTICK_AXIS_RTRIGGER, +1 }, {VIRTKEY_PAUSE, NKCODE_BACK }, }; @@ -206,7 +206,7 @@ static const DefMappingStruct defaultMOQI7SKeyMap[] = { {CTRL_RIGHT, JOYSTICK_AXIS_HAT_X, +1}, {CTRL_UP, JOYSTICK_AXIS_HAT_Y, -1}, {CTRL_DOWN, JOYSTICK_AXIS_HAT_Y, +1}, - {VIRTKEY_UNTHROTTLE, JOYSTICK_AXIS_RZ, +1 }, + {VIRTKEY_FASTFORWARD, JOYSTICK_AXIS_RZ, +1 }, {VIRTKEY_PAUSE, NKCODE_BACK }, }; @@ -229,7 +229,7 @@ static const DefMappingStruct defaultPadMap[] = { {CTRL_SELECT , NKCODE_BACK}, {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, - {VIRTKEY_UNTHROTTLE , NKCODE_BUTTON_R2}, + {VIRTKEY_FASTFORWARD , NKCODE_BUTTON_R2}, {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, {VIRTKEY_SPEED_TOGGLE, NKCODE_BUTTON_L2}, {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, @@ -270,7 +270,7 @@ static const DefMappingStruct defaultOuyaMap[] = { {CTRL_SELECT , NKCODE_BUTTON_L2}, {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, - {VIRTKEY_UNTHROTTLE , NKCODE_BUTTON_THUMBL}, + {VIRTKEY_FASTFORWARD , NKCODE_BUTTON_THUMBL}, {VIRTKEY_PAUSE , NKCODE_BUTTON_THUMBR}, {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, @@ -689,7 +689,7 @@ const KeyMap_IntStrPair psp_button_names[] = { {VIRTKEY_ANALOG_LIGHTLY, "Analog limiter"}, {VIRTKEY_RAPID_FIRE, "RapidFire"}, - {VIRTKEY_UNTHROTTLE, "Unthrottle"}, + {VIRTKEY_FASTFORWARD, "Fast-forward"}, {VIRTKEY_SPEED_TOGGLE, "SpeedToggle"}, {VIRTKEY_SPEED_CUSTOM1, "Alt speed 1"}, {VIRTKEY_SPEED_CUSTOM2, "Alt speed 2"}, @@ -1065,7 +1065,7 @@ void AutoConfForPad(const std::string &name) { #ifndef MOBILE_DEVICE // Add a couple of convenient keyboard mappings by default, too. g_controllerMap[VIRTKEY_PAUSE].push_back(KeyDef(DEVICE_ID_KEYBOARD, NKCODE_ESCAPE)); - g_controllerMap[VIRTKEY_UNTHROTTLE].push_back(KeyDef(DEVICE_ID_KEYBOARD, NKCODE_TAB)); + g_controllerMap[VIRTKEY_FASTFORWARD].push_back(KeyDef(DEVICE_ID_KEYBOARD, NKCODE_TAB)); g_controllerMapGeneration++; #endif } diff --git a/Core/KeyMap.h b/Core/KeyMap.h index d8b7a8a710..011cf03c54 100644 --- a/Core/KeyMap.h +++ b/Core/KeyMap.h @@ -35,7 +35,7 @@ enum { VIRTKEY_AXIS_X_MAX = 0x40000003, VIRTKEY_AXIS_Y_MAX = 0x40000004, VIRTKEY_RAPID_FIRE = 0x40000005, - VIRTKEY_UNTHROTTLE = 0x40000006, + VIRTKEY_FASTFORWARD = 0x40000006, VIRTKEY_PAUSE = 0x40000007, VIRTKEY_SPEED_TOGGLE = 0x40000008, VIRTKEY_AXIS_RIGHT_X_MIN = 0x40000009, diff --git a/GPU/GPUCommon.cpp b/GPU/GPUCommon.cpp index dfc9365245..efaedbb6a3 100644 --- a/GPU/GPUCommon.cpp +++ b/GPU/GPUCommon.cpp @@ -486,7 +486,7 @@ void GPUCommon::DeviceRestore() { void GPUCommon::UpdateVsyncInterval(bool force) { #if !(PPSSPP_PLATFORM(ANDROID) || defined(USING_QT_UI) || PPSSPP_PLATFORM(UWP) || PPSSPP_PLATFORM(IOS)) int desiredVSyncInterval = g_Config.bVSync ? 1 : 0; - if (PSP_CoreParameter().unthrottle) { + if (PSP_CoreParameter().fastForward) { desiredVSyncInterval = 0; } if (PSP_CoreParameter().fpsLimit != FPSLimit::NORMAL) { diff --git a/UI/DevScreens.cpp b/UI/DevScreens.cpp index eac304f5f4..fdd15ccb42 100644 --- a/UI/DevScreens.cpp +++ b/UI/DevScreens.cpp @@ -16,6 +16,7 @@ // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. #include +#include #include "ppsspp_config.h" diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index 2490c6abce..1d15015f0e 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -553,11 +553,11 @@ void EmuScreen::onVKeyDown(int virtualKeyCode) { auto sc = GetI18NCategory("Screen"); switch (virtualKeyCode) { - case VIRTKEY_UNTHROTTLE: + case VIRTKEY_FASTFORWARD: if (coreState == CORE_STEPPING) { Core_EnableStepping(false); } - PSP_CoreParameter().unthrottle = true; + PSP_CoreParameter().fastForward = true; break; case VIRTKEY_SPEED_TOGGLE: @@ -699,8 +699,8 @@ void EmuScreen::onVKeyUp(int virtualKeyCode) { auto sc = GetI18NCategory("Screen"); switch (virtualKeyCode) { - case VIRTKEY_UNTHROTTLE: - PSP_CoreParameter().unthrottle = false; + case VIRTKEY_FASTFORWARD: + PSP_CoreParameter().fastForward = false; break; case VIRTKEY_SPEED_CUSTOM1: diff --git a/UI/GamepadEmu.cpp b/UI/GamepadEmu.cpp index 5d18052ed2..c5ef3f4cca 100644 --- a/UI/GamepadEmu.cpp +++ b/UI/GamepadEmu.cpp @@ -640,9 +640,9 @@ void InitPadLayout(float xres, float yres, float globalScale) { int select_key_Y = yres - 60 * scale; initTouchPos(g_Config.touchSelectKey, select_key_X, select_key_Y); - int unthrottle_key_X = halfW - bottom_key_spacing * scale; - int unthrottle_key_Y = yres - 60 * scale; - initTouchPos(g_Config.touchUnthrottleKey, unthrottle_key_X, unthrottle_key_Y); + int fast_forward_key_X = halfW - bottom_key_spacing * scale; + int fast_forward_key_Y = yres - 60 * scale; + initTouchPos(g_Config.touchFastForwardKey, fast_forward_key_X, fast_forward_key_Y); // L and R------------------------------------------------------------ // Put them above the analog stick / above the buttons to the right. @@ -773,10 +773,10 @@ UI::ViewGroup *CreatePadLayout(float xres, float yres, bool *pause, ControlMappe addPSPButton(CTRL_START, "Start button", rectImage, ImageID("I_RECT"), ImageID("I_START"), g_Config.touchStartKey); addPSPButton(CTRL_SELECT, "Select button", rectImage, ImageID("I_RECT"), ImageID("I_SELECT"), g_Config.touchSelectKey); - BoolButton *unthrottle = addBoolButton(&PSP_CoreParameter().unthrottle, "Unthrottle button", rectImage, ImageID("I_RECT"), ImageID("I_ARROW"), g_Config.touchUnthrottleKey); - if (unthrottle) { - unthrottle->SetAngle(180.0f); - unthrottle->OnChange.Add([](UI::EventParams &e) { + BoolButton *fastForward = addBoolButton(&PSP_CoreParameter().fastForward, "Fast-forward button", rectImage, ImageID("I_RECT"), ImageID("I_ARROW"), g_Config.touchFastForwardKey); + if (fastForward) { + fastForward->SetAngle(180.0f); + fastForward->OnChange.Add([](UI::EventParams &e) { if (e.a && coreState == CORE_STEPPING) { Core_EnableStepping(false); } diff --git a/UI/GamepadEmu.h b/UI/GamepadEmu.h index 3e32054964..40f92da221 100644 --- a/UI/GamepadEmu.h +++ b/UI/GamepadEmu.h @@ -264,7 +264,7 @@ namespace CustomKey { { "L", ImageID("I_L"), CTRL_LTRIGGER }, { "R", ImageID("I_R"), CTRL_RTRIGGER }, { "RapidFire", ImageID::invalid(), VIRTKEY_RAPID_FIRE }, - { "Unthrottle", ImageID::invalid(), VIRTKEY_UNTHROTTLE }, + { "FastForward", ImageID::invalid(), VIRTKEY_FASTFORWARD }, { "SpeedToggle", ImageID::invalid(), VIRTKEY_SPEED_TOGGLE }, { "Rewind", ImageID::invalid(), VIRTKEY_REWIND }, { "Save State", ImageID::invalid(), VIRTKEY_SAVE_STATE }, diff --git a/UI/TouchControlLayoutScreen.cpp b/UI/TouchControlLayoutScreen.cpp index 91a304ca25..e8bf4d85d7 100644 --- a/UI/TouchControlLayoutScreen.cpp +++ b/UI/TouchControlLayoutScreen.cpp @@ -369,8 +369,8 @@ void ControlLayoutView::CreateViews() { addDragDropButton(g_Config.touchSelectKey, "Select button", rectImage, ImageID("I_SELECT")); addDragDropButton(g_Config.touchStartKey, "Start button", rectImage, ImageID("I_START")); - if (auto *unthrottle = addDragDropButton(g_Config.touchUnthrottleKey, "Unthrottle button", rectImage, ImageID("I_ARROW"))) { - unthrottle->SetAngle(180.0f); + if (auto *fastForward = addDragDropButton(g_Config.touchFastForwardKey, "Fast-forward button", rectImage, ImageID("I_ARROW"))) { + fastForward->SetAngle(180.0f); } addDragDropButton(g_Config.touchLKey, "Left shoulder button", shoulderImage, ImageID("I_L")); if (auto *rbutton = addDragDropButton(g_Config.touchRKey, "Right shoulder button", shoulderImage, ImageID("I_R"))) { diff --git a/UI/TouchControlVisibilityScreen.cpp b/UI/TouchControlVisibilityScreen.cpp index 25c0cc60c3..a9110810ee 100644 --- a/UI/TouchControlVisibilityScreen.cpp +++ b/UI/TouchControlVisibilityScreen.cpp @@ -87,7 +87,7 @@ void TouchControlVisibilityScreen::CreateViews() { screenManager()->push(new RightAnalogMappingScreen()); return UI::EVENT_DONE; }}); - toggles_.push_back({ "Unthrottle", &g_Config.touchUnthrottleKey.show, ImageID::invalid(), nullptr }); + toggles_.push_back({ "Fast-forward", &g_Config.touchFastForwardKey.show, ImageID::invalid(), nullptr }); toggles_.push_back({ "Custom 1", &g_Config.touchCombo0.show, ImageID::invalid(), [=](EventParams &e) { screenManager()->push(new ComboKeyScreen(0)); return UI::EVENT_DONE; diff --git a/Windows/XinputDevice.cpp b/Windows/XinputDevice.cpp index 37128823bc..097fe23ecb 100644 --- a/Windows/XinputDevice.cpp +++ b/Windows/XinputDevice.cpp @@ -250,7 +250,7 @@ void XinputDevice::ApplyVibration(int pad, XINPUT_VIBRATION &vibration) { if (PSP_IsInited()) { newVibrationTime = time_now_d(); // We have to run PPSSPP_XInputSetState at time intervals - // since it bugs otherwise with very high unthrottle speeds + // since it bugs otherwise with very high fast-forward speeds // and freezes at constant vibration or no vibration at all. if (newVibrationTime - prevVibrationTime >= 1.0 / 64.0) { if (GetUIState() == UISTATE_INGAME) { diff --git a/android/jni/TestRunner.cpp b/android/jni/TestRunner.cpp index 281f904fab..6e9c3b792b 100644 --- a/android/jni/TestRunner.cpp +++ b/android/jni/TestRunner.cpp @@ -102,7 +102,7 @@ bool RunTests() { coreParam.pixelWidth = 480; coreParam.pixelHeight = 272; coreParam.collectEmuLog = &output; - coreParam.unthrottle = true; + coreParam.fastForward = true; coreParam.updateRecent = false; // Never report from tests. diff --git a/headless/Headless.cpp b/headless/Headless.cpp index fa433dae54..9a860018e5 100644 --- a/headless/Headless.cpp +++ b/headless/Headless.cpp @@ -370,7 +370,7 @@ int main(int argc, const char* argv[]) coreParameter.renderHeight = 272; coreParameter.pixelWidth = 480; coreParameter.pixelHeight = 272; - coreParameter.unthrottle = true; + coreParameter.fastForward = true; g_Config.bEnableSound = false; g_Config.bFirstRun = false; @@ -391,7 +391,7 @@ int main(int argc, const char* argv[]) g_Config.iButtonPreference = PSP_SYSTEMPARAM_BUTTON_CROSS; g_Config.iLockParentalLevel = 9; g_Config.iInternalResolution = 1; - g_Config.iUnthrottleMode = (int)UnthrottleMode::CONTINUOUS; + g_Config.iFastForwardMode = (int)FastForwardMode::CONTINUOUS; g_Config.bEnableLogging = fullLog; g_Config.bSoftwareSkinning = true; g_Config.bVertexDecoderJit = true; diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index 66c080d2c0..a111c91ece 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -418,7 +418,7 @@ void retro_init(void) g_Config.bEnableLogging = true; // libretro does its own timing, so this should stay CONTINUOUS. - g_Config.iUnthrottleMode = (int)UnthrottleMode::CONTINUOUS; + g_Config.iFastForwardMode = (int)FastForwardMode::CONTINUOUS; g_Config.bMemStickInserted = true; g_Config.iGlobalVolume = VOLUME_FULL - 1; g_Config.iReverbVolume = VOLUME_FULL; @@ -683,7 +683,7 @@ bool retro_load_game(const struct retro_game_info *game) coreParam.startBreak = false; coreParam.printfEmuLog = true; coreParam.headLess = true; - coreParam.unthrottle = true; + coreParam.fastForward = true; coreParam.graphicsContext = ctx; coreParam.gpuCore = ctx->GetGPUCore(); coreParam.cpuCore = CPUCore::JIT; diff --git a/unittest/JitHarness.cpp b/unittest/JitHarness.cpp index 6743a5a62e..6575a1e323 100644 --- a/unittest/JitHarness.cpp +++ b/unittest/JitHarness.cpp @@ -87,7 +87,7 @@ static void SetupJitHarness() { g_symbolMap = new SymbolMap(); Memory::g_MemorySize = Memory::RAM_NORMAL_SIZE; PSP_CoreParameter().cpuCore = CPUCore::INTERPRETER; - PSP_CoreParameter().unthrottle = true; + PSP_CoreParameter().fastForward = true; Memory::Init(); mipsr4k.Reset(); From 923fea5b40e417a936537639f660306c4c66fbf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 17 Aug 2021 16:49:02 +0200 Subject: [PATCH 170/336] Update translations for Unthrottle to Fast-forward --- assets/lang/ar_AE.ini | 2 +- assets/lang/az_AZ.ini | 2 +- assets/lang/bg_BG.ini | 2 +- assets/lang/ca_ES.ini | 2 +- assets/lang/cz_CZ.ini | 2 +- assets/lang/da_DK.ini | 2 +- assets/lang/de_DE.ini | 2 +- assets/lang/dr_ID.ini | 2 +- assets/lang/en_US.ini | 2 +- assets/lang/es_ES.ini | 2 +- assets/lang/es_LA.ini | 2 +- assets/lang/fa_IR.ini | 2 +- assets/lang/fi_FI.ini | 2 +- assets/lang/fr_FR.ini | 2 +- assets/lang/gl_ES.ini | 2 +- assets/lang/gr_EL.ini | 2 +- assets/lang/he_IL.ini | 2 +- assets/lang/he_IL_invert.ini | 2 +- assets/lang/hr_HR.ini | 2 +- assets/lang/hu_HU.ini | 2 +- assets/lang/id_ID.ini | 2 +- assets/lang/it_IT.ini | 2 +- assets/lang/ja_JP.ini | 2 +- assets/lang/jv_ID.ini | 2 +- assets/lang/ko_KR.ini | 2 +- assets/lang/lo_LA.ini | 2 +- assets/lang/lt-LT.ini | 2 +- assets/lang/ms_MY.ini | 2 +- assets/lang/nl_NL.ini | 2 +- assets/lang/no_NO.ini | 2 +- assets/lang/pl_PL.ini | 2 +- assets/lang/pt_BR.ini | 2 +- assets/lang/pt_PT.ini | 2 +- assets/lang/ro_RO.ini | 2 +- assets/lang/ru_RU.ini | 2 +- assets/lang/sv_SE.ini | 2 +- assets/lang/tg_PH.ini | 2 +- assets/lang/th_TH.ini | 2 +- assets/lang/tr_TR.ini | 2 +- assets/lang/uk_UA.ini | 2 +- assets/lang/vi_VN.ini | 2 +- assets/lang/zh_CN.ini | 2 +- assets/lang/zh_TW.ini | 2 +- 43 files changed, 43 insertions(+), 43 deletions(-) diff --git a/assets/lang/ar_AE.ini b/assets/lang/ar_AE.ini index b64a7c54af..4dc4b4c4ee 100644 --- a/assets/lang/ar_AE.ini +++ b/assets/lang/ar_AE.ini @@ -661,7 +661,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = ‎تفعيل وضع الشاشة الكاملة Toggle mode = Toggle mode Triangle = ‎مثلث -Unthrottle = Unthrottle +Fast-forward = Fast-forward Up = Dpad Up Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/az_AZ.ini b/assets/lang/az_AZ.ini index 5b62733d95..5387a6ebc8 100644 --- a/assets/lang/az_AZ.ini +++ b/assets/lang/az_AZ.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen Toggle mode = Toggle mode Triangle = Triangle -Unthrottle = Unthrottle +Fast-forward = Fast-forward Up = Dpad Up Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/bg_BG.ini b/assets/lang/bg_BG.ini index 7e60e60743..64bb02c5c2 100644 --- a/assets/lang/bg_BG.ini +++ b/assets/lang/bg_BG.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen Toggle mode = Toggle mode Triangle = Triangle -Unthrottle = Unthrottle +Fast-forward = Fast-forward Up = Dpad Нагоре Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/ca_ES.ini b/assets/lang/ca_ES.ini index 5f52ea971b..8e385a5f08 100644 --- a/assets/lang/ca_ES.ini +++ b/assets/lang/ca_ES.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen Toggle mode = Toggle mode Triangle = Triangle -Unthrottle = Unthrottle +Fast-forward = Fast-forward Up = Dpad Up Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/cz_CZ.ini b/assets/lang/cz_CZ.ini index 1bdd328b83..6e04f0af57 100644 --- a/assets/lang/cz_CZ.ini +++ b/assets/lang/cz_CZ.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen Toggle mode = Toggle mode Triangle = Triangle -Unthrottle = Odškrcení +Fast-forward = Odškrcení Up = Dpad Nahoru Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/da_DK.ini b/assets/lang/da_DK.ini index 215f955fa9..e6ff6ea9bf 100644 --- a/assets/lang/da_DK.ini +++ b/assets/lang/da_DK.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen Toggle mode = Toggle mode Triangle = Triangle -Unthrottle = Turbo +Fast-forward = Turbo Up = Dpad op Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/de_DE.ini b/assets/lang/de_DE.ini index bafb9ea409..a39f4c9378 100644 --- a/assets/lang/de_DE.ini +++ b/assets/lang/de_DE.ini @@ -653,7 +653,7 @@ Texture Replacement = Texturersetzung Toggle Fullscreen = Vollbild umschalten Toggle mode = Toggle mode Triangle = Dreieck -Unthrottle = Turbo +Fast-forward = Turbo Up = Steuerkreuz Hoch Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/dr_ID.ini b/assets/lang/dr_ID.ini index cfab6c9ad1..d769f85016 100644 --- a/assets/lang/dr_ID.ini +++ b/assets/lang/dr_ID.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen Toggle mode = Toggle mode Triangle = Triangle -Unthrottle = Unthrottle +Fast-forward = Fast-forward Up = Jaoh Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/en_US.ini b/assets/lang/en_US.ini index 7f813f7655..c6c4979f2a 100644 --- a/assets/lang/en_US.ini +++ b/assets/lang/en_US.ini @@ -678,7 +678,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen Toggle mode = Toggle mode Triangle = Triangle -Unthrottle = Unthrottle +Fast-forward = Fast-forward Up = Dpad Up Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/es_ES.ini b/assets/lang/es_ES.ini index 1b081bec3d..211a74da7f 100644 --- a/assets/lang/es_ES.ini +++ b/assets/lang/es_ES.ini @@ -653,7 +653,7 @@ Texture Replacement = Reemplazar texturas Toggle Fullscreen = Cambiar a pantalla completa Toggle mode = Alternar modo Triangle = Triángulo -Unthrottle = Modo turbo +Fast-forward = Modo turbo Up = Cruceta arriba Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/es_LA.ini b/assets/lang/es_LA.ini index 7632e7b12f..c8d0d7bbac 100644 --- a/assets/lang/es_LA.ini +++ b/assets/lang/es_LA.ini @@ -653,7 +653,7 @@ Texture Replacement = Remplazo de textura Toggle Fullscreen = Alternar pantalla completa Toggle mode = Alternar modo Triangle = △ -Unthrottle = Modo turbo +Fast-forward = Modo turbo Up = Arriba Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/fa_IR.ini b/assets/lang/fa_IR.ini index 0a36b43492..bc590e6ce3 100644 --- a/assets/lang/fa_IR.ini +++ b/assets/lang/fa_IR.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen Toggle mode = Toggle mode Triangle = Triangle -Unthrottle = Unthrottle +Fast-forward = Fast-forward Up = Up Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/fi_FI.ini b/assets/lang/fi_FI.ini index 10e1c9ad28..9e77589ad4 100644 --- a/assets/lang/fi_FI.ini +++ b/assets/lang/fi_FI.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen Toggle mode = Toggle mode Triangle = Triangle -Unthrottle = Unthrottle +Fast-forward = Fast-forward Up = Dpad Up Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/fr_FR.ini b/assets/lang/fr_FR.ini index 352aa6da67..0d4fb9dd62 100644 --- a/assets/lang/fr_FR.ini +++ b/assets/lang/fr_FR.ini @@ -653,7 +653,7 @@ Texture Replacement = Remplacer textures Toggle Fullscreen = Plein écran Toggle mode = Mode basculement Triangle = Triangle -Unthrottle = Vitesse max +Fast-forward = Vitesse max Up = Haut Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/gl_ES.ini b/assets/lang/gl_ES.ini index a8993b41e4..a9c9ecbe68 100644 --- a/assets/lang/gl_ES.ini +++ b/assets/lang/gl_ES.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen Toggle mode = Toggle mode Triangle = Triangle -Unthrottle = Modo turbo +Fast-forward = Modo turbo Up = D-Pad Arriba Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/gr_EL.ini b/assets/lang/gr_EL.ini index ce1fa3018e..2b11586f2a 100644 --- a/assets/lang/gr_EL.ini +++ b/assets/lang/gr_EL.ini @@ -653,7 +653,7 @@ Texture Replacement = Αντικατάσταση υφών Toggle Fullscreen = Λειτουργεία πλήρους οθόνης Toggle mode = Toggle mode Triangle = Τρίγωνο -Unthrottle = Απελευθέρωση +Fast-forward = Απελευθέρωση Up = Πάνω Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/he_IL.ini b/assets/lang/he_IL.ini index aa4fe4a6d8..e515f2e6fb 100644 --- a/assets/lang/he_IL.ini +++ b/assets/lang/he_IL.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen Toggle mode = Toggle mode Triangle = Triangle -Unthrottle = Unthrottle +Fast-forward = Fast-forward Up = ^ Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/he_IL_invert.ini b/assets/lang/he_IL_invert.ini index 86944e1517..ec53371f56 100644 --- a/assets/lang/he_IL_invert.ini +++ b/assets/lang/he_IL_invert.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen Toggle mode = Toggle mode Triangle = Triangle -Unthrottle = Unthrottle +Fast-forward = Fast-forward Up = ^ Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/hr_HR.ini b/assets/lang/hr_HR.ini index 710f098a7e..e240529b63 100644 --- a/assets/lang/hr_HR.ini +++ b/assets/lang/hr_HR.ini @@ -653,7 +653,7 @@ Texture Replacement = Mijenjanje tesktura Toggle Fullscreen = Uključi puni zaslon Toggle mode = Toggle mode Triangle = Triangle -Unthrottle = Unthrottle +Fast-forward = Fast-forward Up = Dpad Gore Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/hu_HU.ini b/assets/lang/hu_HU.ini index 7fe19fd7a5..2165c061ec 100644 --- a/assets/lang/hu_HU.ini +++ b/assets/lang/hu_HU.ini @@ -653,7 +653,7 @@ Texture Replacement = Textúra csere Toggle Fullscreen = Teljes képernyő Toggle mode = Üzemmód váltása Triangle = Háromszög -Unthrottle = Gyorsítás +Fast-forward = Gyorsítás Up = D-Pad Fel Vol + = Hangerő + Vol - = Hangerő - diff --git a/assets/lang/id_ID.ini b/assets/lang/id_ID.ini index 47643c793a..c215de9fb4 100644 --- a/assets/lang/id_ID.ini +++ b/assets/lang/id_ID.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen Toggle mode = Toggle mode Triangle = Triangle -Unthrottle = Unthrottle +Fast-forward = Fast-forward Up = Dpad Atas Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/it_IT.ini b/assets/lang/it_IT.ini index f2de777318..95c8409971 100644 --- a/assets/lang/it_IT.ini +++ b/assets/lang/it_IT.ini @@ -653,7 +653,7 @@ Texture Replacement = Sostituzione delle texture Toggle Fullscreen = Passa a Schermo Intero Toggle mode = Modalità Scambio Triangle = Triangolo -Unthrottle = Non velocizzare +Fast-forward = Non velocizzare Up = D-Pad Su Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/ja_JP.ini b/assets/lang/ja_JP.ini index 9abc27eeca..a7134d7b6f 100644 --- a/assets/lang/ja_JP.ini +++ b/assets/lang/ja_JP.ini @@ -657,7 +657,7 @@ Texture Replacement = テクスチャの置換 Toggle Fullscreen = フルスクリーンの切り替え Toggle mode = モードの切り替え Triangle = Triangle -Unthrottle = 速度制限を解除 +Fast-forward = 速度制限を解除 Up = 方向キー 上 Vol + = 音量を上げる Vol - = 音量を下げる diff --git a/assets/lang/jv_ID.ini b/assets/lang/jv_ID.ini index af8b4c292c..a59adaf5a5 100644 --- a/assets/lang/jv_ID.ini +++ b/assets/lang/jv_ID.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen Toggle mode = Toggle mode Triangle = Triangle -Unthrottle = Unthrottle +Fast-forward = Fast-forward Up = Nduwur Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/ko_KR.ini b/assets/lang/ko_KR.ini index 98d8da8214..a4d8de699e 100644 --- a/assets/lang/ko_KR.ini +++ b/assets/lang/ko_KR.ini @@ -653,7 +653,7 @@ Texture Replacement = 텍스처 교체 Toggle Fullscreen = 전체화면 고정 Toggle mode = 토글 모드 Triangle = 세모 -Unthrottle = 터보 +Fast-forward = 터보 Up = 방향 패드.상 Vol + = 볼륨 + Vol - = 볼륨 - diff --git a/assets/lang/lo_LA.ini b/assets/lang/lo_LA.ini index 9780085db3..ac932d04e2 100644 --- a/assets/lang/lo_LA.ini +++ b/assets/lang/lo_LA.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen Toggle mode = Toggle mode Triangle = Triangle -Unthrottle = ເລັ່ງເທີໂບ +Fast-forward = ເລັ່ງເທີໂບ Up = Dpad ຂຶ້ນ Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/lt-LT.ini b/assets/lang/lt-LT.ini index 2181bd8f17..06c4ec327c 100644 --- a/assets/lang/lt-LT.ini +++ b/assets/lang/lt-LT.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen Toggle mode = Toggle mode Triangle = Triangle -Unthrottle = "Unthrottle" +Fast-forward = Fast-forward Up = Krypčių mygtukas aukštyn Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/ms_MY.ini b/assets/lang/ms_MY.ini index 387f9b86f1..e3e64c9f5c 100644 --- a/assets/lang/ms_MY.ini +++ b/assets/lang/ms_MY.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen Toggle mode = Toggle mode Triangle = Triangle -Unthrottle = Unthrottle +Fast-forward = Fast-forward Up = Dpad Atas Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/nl_NL.ini b/assets/lang/nl_NL.ini index 6dcddb76da..4560076ce0 100644 --- a/assets/lang/nl_NL.ini +++ b/assets/lang/nl_NL.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Volledig scherm schakelen Toggle mode = Toggle mode Triangle = Driehoek -Unthrottle = Versnellen +Fast-forward = Versnellen Up = Boven Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/no_NO.ini b/assets/lang/no_NO.ini index 2478c7cf8e..fffd49b03d 100644 --- a/assets/lang/no_NO.ini +++ b/assets/lang/no_NO.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen Toggle mode = Toggle mode Triangle = Triangle -Unthrottle = Unthrottle +Fast-forward = Fast-forward Up = Dpad Up Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/pl_PL.ini b/assets/lang/pl_PL.ini index 03ea61a9a8..5771c811bf 100644 --- a/assets/lang/pl_PL.ini +++ b/assets/lang/pl_PL.ini @@ -653,7 +653,7 @@ Texture Replacement = Podmiana tekstur Toggle Fullscreen = Wł./wył. pełny ekran Toggle mode = Toggle mode Triangle = Triangle -Unthrottle = Pełna prędkość +Fast-forward = Pełna prędkość Up = Strzałka w górę Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/pt_BR.ini b/assets/lang/pt_BR.ini index 6cc2d12bf2..3d62851e6b 100644 --- a/assets/lang/pt_BR.ini +++ b/assets/lang/pt_BR.ini @@ -677,7 +677,7 @@ Texture Replacement = Substituição das texturas Toggle Fullscreen = Alternar pra Tela cheia Toggle mode = Alternar modo Triangle = Triângulo -Unthrottle = Desacelerador +Fast-forward = Desacelerador Up = Direcional pra Cima Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/pt_PT.ini b/assets/lang/pt_PT.ini index 66c39e4376..a7ad7cced6 100644 --- a/assets/lang/pt_PT.ini +++ b/assets/lang/pt_PT.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen Toggle mode = Toggle mode Triangle = Triangle -Unthrottle = Unthrottle +Fast-forward = Fast-forward Up = Dpad Up Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/ro_RO.ini b/assets/lang/ro_RO.ini index d813cb806c..85cfbbe801 100644 --- a/assets/lang/ro_RO.ini +++ b/assets/lang/ro_RO.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen Toggle mode = Toggle mode Triangle = Triangle -Unthrottle = Încetinire +Fast-forward = Încetinire Up = Dpad Sus Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/ru_RU.ini b/assets/lang/ru_RU.ini index 9f861e0610..87d5f8d044 100644 --- a/assets/lang/ru_RU.ini +++ b/assets/lang/ru_RU.ini @@ -654,7 +654,7 @@ Texture Replacement = Подмена текстур Toggle Fullscreen = Полноэкр. режим Toggle mode = Переключить режим Triangle = Треугольник -Unthrottle = Неогр. скор. +Fast-forward = Неогр. скор. Up = Вверх Vol + = Громкость + Vol - = Громкость - diff --git a/assets/lang/sv_SE.ini b/assets/lang/sv_SE.ini index 4fc64007e9..e2dc9a63bd 100644 --- a/assets/lang/sv_SE.ini +++ b/assets/lang/sv_SE.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Växla fullskärm Toggle mode = Toggle mode Triangle = Triangel -Unthrottle = Snabbspola +Fast-forward = Snabbspola Up = Dpad Upp Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/tg_PH.ini b/assets/lang/tg_PH.ini index ca03e1fa4b..3cf91bf450 100644 --- a/assets/lang/tg_PH.ini +++ b/assets/lang/tg_PH.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen Toggle mode = Toggle mode Triangle = Triangle -Unthrottle = Unthrottle +Fast-forward = Fast-forward Up = Taas Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/th_TH.ini b/assets/lang/th_TH.ini index 18b9d725a7..4b7b05c10e 100644 --- a/assets/lang/th_TH.ini +++ b/assets/lang/th_TH.ini @@ -723,7 +723,7 @@ Texture Replacement = แทนที่พื้นผิว Toggle Fullscreen = ปรับเต็มหน้าจอ Toggle mode = โหมดสับเปลี่ยน Triangle = สามเหลี่ยม -Unthrottle = เร่งความเร็ว +Fast-forward = เร่งความเร็ว Up = ลูกศรขึ้น Vertical Rectangle = สี่เหลี่ยมพื้นผ้าแนวตั้ง Vol + = เพิ่มเสียง diff --git a/assets/lang/tr_TR.ini b/assets/lang/tr_TR.ini index 1703a36efe..c5cec029cb 100644 --- a/assets/lang/tr_TR.ini +++ b/assets/lang/tr_TR.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen Toggle mode = Toggle mode Triangle = Üçgen -Unthrottle = Unthrottle +Fast-forward = Fast-forward Up = Dpad Yukarı Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/uk_UA.ini b/assets/lang/uk_UA.ini index 66f55f404f..0a0ab024a6 100644 --- a/assets/lang/uk_UA.ini +++ b/assets/lang/uk_UA.ini @@ -653,7 +653,7 @@ Texture Replacement = Заміна текстури Toggle Fullscreen = Повноекранний режим Toggle mode = Режим перемикання Triangle = Трикутник -Unthrottle = Необм. швидкість +Fast-forward = Необм. швидкість Up = Вгору Vol + = Гучність + Vol - = Гучність - diff --git a/assets/lang/vi_VN.ini b/assets/lang/vi_VN.ini index d906eaa7c6..46f1918b2f 100644 --- a/assets/lang/vi_VN.ini +++ b/assets/lang/vi_VN.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Chuyển toàn màn hình Toggle mode = Toggle mode Triangle = Tam giác -Unthrottle = Unthrottle +Fast-forward = Fast-forward Up = Lên Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/zh_CN.ini b/assets/lang/zh_CN.ini index f31d180ec7..075d237c62 100644 --- a/assets/lang/zh_CN.ini +++ b/assets/lang/zh_CN.ini @@ -653,7 +653,7 @@ Texture Replacement = 纹理替换 Toggle Fullscreen = 切换全屏 Toggle mode = Toggle mode Triangle = 三角 -Unthrottle = 解除限速 +Fast-forward = 解除限速 Up = 方向键:上 Vol + = 音量 + Vol - = 音量 - diff --git a/assets/lang/zh_TW.ini b/assets/lang/zh_TW.ini index 4357ab83f4..4e693aad0e 100644 --- a/assets/lang/zh_TW.ini +++ b/assets/lang/zh_TW.ini @@ -653,7 +653,7 @@ Texture Replacement = 紋理替換 Toggle Fullscreen = 切換全屏 Toggle mode = 切換模式 Triangle = 三角形 -Unthrottle = 解除速限 +Fast-forward = 解除速限 Up = 方向鍵:上 Vol + = Vol + Vol - = Vol - From 2783788bc5b6bb3157ab32d7da3b662624d4f1d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 18 Aug 2021 09:25:29 +0200 Subject: [PATCH 171/336] Fix some bad translations (used Google Translate...) --- assets/lang/cz_CZ.ini | 2 +- assets/lang/gr_EL.ini | 2 +- assets/lang/it_IT.ini | 2 +- assets/lang/pt_BR.ini | 2 +- assets/lang/ro_RO.ini | 2 +- assets/lang/ru_RU.ini | 2 +- assets/lang/uk_UA.ini | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/assets/lang/cz_CZ.ini b/assets/lang/cz_CZ.ini index 6e04f0af57..2fdb0ecfa8 100644 --- a/assets/lang/cz_CZ.ini +++ b/assets/lang/cz_CZ.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen Toggle mode = Toggle mode Triangle = Triangle -Fast-forward = Odškrcení +Fast-forward = Rychle vpřed Up = Dpad Nahoru Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/gr_EL.ini b/assets/lang/gr_EL.ini index 2b11586f2a..418a988740 100644 --- a/assets/lang/gr_EL.ini +++ b/assets/lang/gr_EL.ini @@ -653,7 +653,7 @@ Texture Replacement = Αντικατάσταση υφών Toggle Fullscreen = Λειτουργεία πλήρους οθόνης Toggle mode = Toggle mode Triangle = Τρίγωνο -Fast-forward = Απελευθέρωση +Fast-forward = Γρήγορη προώθηση Up = Πάνω Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/it_IT.ini b/assets/lang/it_IT.ini index 95c8409971..d7db6ddc6a 100644 --- a/assets/lang/it_IT.ini +++ b/assets/lang/it_IT.ini @@ -653,7 +653,7 @@ Texture Replacement = Sostituzione delle texture Toggle Fullscreen = Passa a Schermo Intero Toggle mode = Modalità Scambio Triangle = Triangolo -Fast-forward = Non velocizzare +Fast-forward = Avanti veloce Up = D-Pad Su Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/pt_BR.ini b/assets/lang/pt_BR.ini index 3d62851e6b..fd3443daa6 100644 --- a/assets/lang/pt_BR.ini +++ b/assets/lang/pt_BR.ini @@ -677,7 +677,7 @@ Texture Replacement = Substituição das texturas Toggle Fullscreen = Alternar pra Tela cheia Toggle mode = Alternar modo Triangle = Triângulo -Fast-forward = Desacelerador +Fast-forward = Avanço rápido Up = Direcional pra Cima Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/ro_RO.ini b/assets/lang/ro_RO.ini index 85cfbbe801..76d6dc9d59 100644 --- a/assets/lang/ro_RO.ini +++ b/assets/lang/ro_RO.ini @@ -653,7 +653,7 @@ Texture Replacement = Texture replacement Toggle Fullscreen = Toggle fullscreen Toggle mode = Toggle mode Triangle = Triangle -Fast-forward = Încetinire +Fast-forward = Repede inainte Up = Dpad Sus Vol + = Vol + Vol - = Vol - diff --git a/assets/lang/ru_RU.ini b/assets/lang/ru_RU.ini index 87d5f8d044..1d1bced666 100644 --- a/assets/lang/ru_RU.ini +++ b/assets/lang/ru_RU.ini @@ -654,7 +654,7 @@ Texture Replacement = Подмена текстур Toggle Fullscreen = Полноэкр. режим Toggle mode = Переключить режим Triangle = Треугольник -Fast-forward = Неогр. скор. +Fast-forward = Перемотка вперед Up = Вверх Vol + = Громкость + Vol - = Громкость - diff --git a/assets/lang/uk_UA.ini b/assets/lang/uk_UA.ini index 0a0ab024a6..ee20612102 100644 --- a/assets/lang/uk_UA.ini +++ b/assets/lang/uk_UA.ini @@ -653,7 +653,7 @@ Texture Replacement = Заміна текстури Toggle Fullscreen = Повноекранний режим Toggle mode = Режим перемикання Triangle = Трикутник -Fast-forward = Необм. швидкість +Fast-forward = Швидко вперед Up = Вгору Vol + = Гучність + Vol - = Гучність - From a7859cfd2a410574a99230b835fc3dd0b7e0d7e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 18 Aug 2021 09:27:02 +0200 Subject: [PATCH 172/336] Fix some comments and a string --- Core/HLE/sceDisplay.cpp | 2 +- Core/HW/StereoResampler.cpp | 2 +- UI/GamepadEmu.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index 279bd2642a..98f237b3bc 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -756,7 +756,7 @@ void __DisplayFlip(int cyclesLate) { fastForwardNeedsSkip = true; } - // postEffectRequiresFlip is not compatible with frameskip unthrottling, see #12325. + // postEffectRequiresFlip is not compatible with frameskip fast-forward, see #12325. if (g_Config.iRenderingMode != FB_NON_BUFFERED_MODE && !(fastForwardNeedsSkip && !FrameTimingThrottled())) { postEffectRequiresFlip = duplicateFrames || g_Config.bShaderChainRequires60FPS; } diff --git a/Core/HW/StereoResampler.cpp b/Core/HW/StereoResampler.cpp index 09864c98a1..1705191eef 100644 --- a/Core/HW/StereoResampler.cpp +++ b/Core/HW/StereoResampler.cpp @@ -266,7 +266,7 @@ void StereoResampler::PushSamples(const s32 *samples, unsigned int numSamples) { u32 indexW = m_indexW.load(); u32 cap = m_maxBufsize * 2; - // If unthrottling, no need to fill up the entire buffer, just screws up timing after releasing the fast-forward button. + // If fast-forwarding, no need to fill up the entire buffer, just screws up timing after releasing the fast-forward button. if (PSP_CoreParameter().fastForward) { cap = m_targetBufsize * 2; } diff --git a/UI/GamepadEmu.h b/UI/GamepadEmu.h index 40f92da221..e8d084662b 100644 --- a/UI/GamepadEmu.h +++ b/UI/GamepadEmu.h @@ -264,7 +264,7 @@ namespace CustomKey { { "L", ImageID("I_L"), CTRL_LTRIGGER }, { "R", ImageID("I_R"), CTRL_RTRIGGER }, { "RapidFire", ImageID::invalid(), VIRTKEY_RAPID_FIRE }, - { "FastForward", ImageID::invalid(), VIRTKEY_FASTFORWARD }, + { "Fast-forward", ImageID::invalid(), VIRTKEY_FASTFORWARD }, { "SpeedToggle", ImageID::invalid(), VIRTKEY_SPEED_TOGGLE }, { "Rewind", ImageID::invalid(), VIRTKEY_REWIND }, { "Save State", ImageID::invalid(), VIRTKEY_SAVE_STATE }, From 3e894b0e9cdbd4d9d9daaa19cb26aac90d2212c1 Mon Sep 17 00:00:00 2001 From: iota97 Date: Thu, 19 Aug 2021 20:02:14 +0200 Subject: [PATCH 173/336] Improve touch control layout screen --- UI/TouchControlLayoutScreen.cpp | 52 +++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/UI/TouchControlLayoutScreen.cpp b/UI/TouchControlLayoutScreen.cpp index e8bf4d85d7..469f6cea27 100644 --- a/UI/TouchControlLayoutScreen.cpp +++ b/UI/TouchControlLayoutScreen.cpp @@ -50,6 +50,12 @@ public: return false; }; + void Draw(UIContext &dc) override { + dc.PushScissor(screenBounds_); + MultiTouchButton::Draw(dc); + dc.PopScissor(); + } + virtual void SavePosition() { x_ = (bounds_.centerX() - screenBounds_.x) / screenBounds_.w; y_ = (bounds_.centerY() - screenBounds_.y) / screenBounds_.h; @@ -67,11 +73,11 @@ protected: float opacity = g_Config.iTouchButtonOpacity / 100.0f; return std::max(0.5f, opacity); } + const Bounds &screenBounds_; private: float &x_, &y_; float &theScale_; - const Bounds &screenBounds_; }; class PSPActionButtons : public DragDropButton { @@ -99,6 +105,7 @@ public: } void Draw(UIContext &dc) override { + dc.PushScissor(screenBounds_); uint32_t colorBg = colorAlpha(GetButtonColor(), GetButtonOpacity()); uint32_t color = colorAlpha(0xFFFFFF, GetButtonOpacity()); @@ -127,6 +134,7 @@ public: dc.Draw()->DrawImageRotated(roundId_, centerX - spacing, centerY, scale_, 0, colorBg, false); dc.Draw()->DrawImageRotated(squareId_, centerX - spacing, centerY, scale_, 0, color, false); } + dc.PopScissor(); }; void GetContentDimensions(const UIContext &dc, float &w, float &h) const override { @@ -158,6 +166,7 @@ public: } void Draw(UIContext &dc) override { + dc.PushScissor(screenBounds_); uint32_t colorBg = colorAlpha(GetButtonColor(), GetButtonOpacity()); uint32_t color = colorAlpha(0xFFFFFF, GetButtonOpacity()); @@ -177,9 +186,11 @@ public: dc.Draw()->DrawImageRotated(dirImage, x, y, scale_, angle + PI, colorBg, false); dc.Draw()->DrawImageRotated(ImageID("I_ARROW"), x2, y2, scale_, angle + PI, color); } + dc.PopScissor(); } void GetContentDimensions(const UIContext &dc, float &w, float &h) const override { + // TODO: if not all button are visible this dimension is off const AtlasImage *image = dc.Draw()->GetAtlas()->getImage(ImageID("I_DIR")); w = 2 * D_pad_Radius * spacing_ + image->w * scale_; h = 2 * D_pad_Radius * spacing_ + image->h * scale_; @@ -272,10 +283,11 @@ void ControlLayoutView::Touch(const TouchInput &touch) { validRange.x = 0.0f; validRange.y = 0.0f; - validRange.x += controlBounds.w * 0.5f; - validRange.w -= controlBounds.w; - validRange.y += controlBounds.h * 0.5f; - validRange.h -= controlBounds.h; + // This make cure the controll is all inside the screen (commended out only half) + //validRange.x += controlBounds.w * 0.5f; + //validRange.w -= controlBounds.w; + //validRange.y += controlBounds.h * 0.5f; + //validRange.h -= controlBounds.h; Point newPos; newPos.x = startObjectX_ + (touch.x - startDragX_); @@ -339,13 +351,14 @@ void ControlLayoutView::CreateViews() { // Create all the views. - PSPActionButtons *actionButtons = new PSPActionButtons(g_Config.touchActionButtonCenter, "Action buttons", g_Config.fActionButtonSpacing, bounds); - actionButtons->setCircleVisibility(g_Config.bShowTouchCircle); - actionButtons->setCrossVisibility(g_Config.bShowTouchCross); - actionButtons->setTriangleVisibility(g_Config.bShowTouchTriangle); - actionButtons->setSquareVisibility(g_Config.bShowTouchSquare); - - controls_.push_back(actionButtons); + if (g_Config.bShowTouchCircle || g_Config.bShowTouchCross || g_Config.bShowTouchTriangle || g_Config.bShowTouchSquare) { + PSPActionButtons *actionButtons = new PSPActionButtons(g_Config.touchActionButtonCenter, "Action buttons", g_Config.fActionButtonSpacing, bounds); + actionButtons->setCircleVisibility(g_Config.bShowTouchCircle); + actionButtons->setCrossVisibility(g_Config.bShowTouchCross); + actionButtons->setTriangleVisibility(g_Config.bShowTouchTriangle); + actionButtons->setSquareVisibility(g_Config.bShowTouchSquare); + controls_.push_back(actionButtons); + } ImageID rectImage = g_Config.iTouchButtonStyle ? ImageID("I_RECT_LINE") : ImageID("I_RECT"); ImageID shoulderImage = g_Config.iTouchButtonStyle ? ImageID("I_SHOULDER_LINE") : ImageID("I_SHOULDER"); @@ -415,6 +428,8 @@ DragDropButton *ControlLayoutView::getPickedControl(const int x, const int y) { return pickedControl_; } + DragDropButton *bestMatch = nullptr; + float bestDistance; for (size_t i = 0; i < controls_.size(); i++) { DragDropButton *control = controls_[i]; const Bounds &bounds = control->GetBounds(); @@ -424,11 +439,15 @@ DragDropButton *ControlLayoutView::getPickedControl(const int x, const int y) { Bounds tolerantBounds(bounds.x - thresholdW * 0.5, bounds.y - thresholdH * 0.5 , bounds.w + thresholdW, bounds.h + thresholdH); if (tolerantBounds.Contains(x, y)) { - return control; + float distance = (bounds.centerX()-x)*(bounds.centerX()-x)+(bounds.centerY()-y)*(bounds.centerY()-y); + if (!bestMatch || distance < bestDistance) { + bestDistance = distance; + bestMatch = control; + } } } - return 0; + return bestMatch; } TouchControlLayoutScreen::TouchControlLayoutScreen() {} @@ -533,9 +552,4 @@ void TouchControlLayoutScreen::CreateViews() { auto ms = GetI18NCategory("MainSettings"); //tabHolder->AddTab(ms->T("Controls"), controlsHolder); - - if (!g_Config.bShowTouchControls) { - // Shouldn't even be able to get here as the way into this dialog should be closed. - return; - } } From 36df47d9a1674df1d754d1388eafa7e56d2b661e Mon Sep 17 00:00:00 2001 From: iota97 Date: Thu, 19 Aug 2021 21:47:46 +0200 Subject: [PATCH 174/336] Fix action button size --- UI/TouchControlLayoutScreen.cpp | 86 ++++++++++++++++++++++++++++++--- 1 file changed, 78 insertions(+), 8 deletions(-) diff --git a/UI/TouchControlLayoutScreen.cpp b/UI/TouchControlLayoutScreen.cpp index 469f6cea27..b3e52f4e82 100644 --- a/UI/TouchControlLayoutScreen.cpp +++ b/UI/TouchControlLayoutScreen.cpp @@ -68,6 +68,15 @@ public: virtual float GetSpacing() const { return 1.0f; } virtual void SetSpacing(float s) { } + virtual bool Contains(float x, float y) { + const float thresholdFactor = 0.25f; + const float thresholdW = thresholdFactor * bounds_.w; + const float thresholdH = thresholdFactor * bounds_.h; + + Bounds tolerantBounds(bounds_.x - thresholdW * 0.5, bounds_.y - thresholdH * 0.5 , bounds_.w + thresholdW, bounds_.h + thresholdH); + return tolerantBounds.Contains(x, y); + } + protected: float GetButtonOpacity() override { float opacity = g_Config.iTouchButtonOpacity / 100.0f; @@ -147,6 +156,73 @@ public: float GetSpacing() const override { return spacing_; } void SetSpacing(float s) override { spacing_ = s; } + bool Contains(float x, float y) override { + float xFac = 0.0f; + float wFac = 0.0f; + float yFac = 0.0f; + float hFac = 0.0f; + + // Many cases sadly... + if (circleVisible_ && !squareVisible_) { + if (crossVisible_ || triangleVisible_) { + xFac = 1.0f; + wFac = -1.0f; + } else { + xFac = 2.0f; + wFac = -2.0f; + yFac = 1.0f; + hFac = -2.0f; + } + } else if (!circleVisible_ && squareVisible_) { + if (crossVisible_ || triangleVisible_) { + wFac = -1.0f; + } else { + wFac = -2.0f; + yFac = 1.0f; + hFac = -2.0f; + } + } else if (circleVisible_ && squareVisible_ && !crossVisible_ && !triangleVisible_) { + yFac = 1.0f; + hFac = -2.0f; + } + + // No else here is intentional + if (crossVisible_ && !triangleVisible_) { + if (circleVisible_ || squareVisible_) { + yFac = 1.0f; + hFac = -1.0f; + } else { + yFac = 2.0f; + hFac = -2.0f; + xFac = 1.0f; + wFac = -2.0f; + } + } else if (!crossVisible_ && triangleVisible_) { + if (circleVisible_ || squareVisible_) { + hFac = -1.0f; + } else { + hFac = -2.0f; + xFac = 1.0f; + wFac = -2.0f; + } + } else if (!circleVisible_ && !squareVisible_ && crossVisible_ && triangleVisible_) { + xFac = 1.0f; + wFac = -2.0f; + } + + const float thresholdFactor = 0.25f; + const float thresholdW = thresholdFactor * bounds_.w; + const float thresholdH = thresholdFactor * bounds_.h; + + float tolerantX = bounds_.x - thresholdW*0.5 + xFac*baseActionButtonSpacing*spacing_; + float tolerantY = bounds_.y - thresholdH*0.5 + yFac*baseActionButtonSpacing*spacing_; + float tolerantW = bounds_.w + thresholdW + wFac*baseActionButtonSpacing*spacing_; + float tolerantH = bounds_.h + thresholdH + hFac*baseActionButtonSpacing*spacing_; + + Bounds tolerantBounds(tolerantX, tolerantY, tolerantW, tolerantH); + return tolerantBounds.Contains(x, y); + } + private: bool circleVisible_ = true, crossVisible_ = true, triangleVisible_ = true, squareVisible_ = true; @@ -190,7 +266,6 @@ public: } void GetContentDimensions(const UIContext &dc, float &w, float &h) const override { - // TODO: if not all button are visible this dimension is off const AtlasImage *image = dc.Draw()->GetAtlas()->getImage(ImageID("I_DIR")); w = 2 * D_pad_Radius * spacing_ + image->w * scale_; h = 2 * D_pad_Radius * spacing_ + image->h * scale_; @@ -432,13 +507,8 @@ DragDropButton *ControlLayoutView::getPickedControl(const int x, const int y) { float bestDistance; for (size_t i = 0; i < controls_.size(); i++) { DragDropButton *control = controls_[i]; - const Bounds &bounds = control->GetBounds(); - const float thresholdFactor = 0.25f; - const float thresholdW = thresholdFactor * bounds.w; - const float thresholdH = thresholdFactor * bounds.h; - - Bounds tolerantBounds(bounds.x - thresholdW * 0.5, bounds.y - thresholdH * 0.5 , bounds.w + thresholdW, bounds.h + thresholdH); - if (tolerantBounds.Contains(x, y)) { + if (control->Contains(x, y)) { + const Bounds &bounds = control->GetBounds(); float distance = (bounds.centerX()-x)*(bounds.centerX()-x)+(bounds.centerY()-y)*(bounds.centerY()-y); if (!bestMatch || distance < bestDistance) { bestDistance = distance; From c302ebdd83550f8615d7e603df39c63293150c76 Mon Sep 17 00:00:00 2001 From: iota97 Date: Fri, 20 Aug 2021 00:03:42 +0200 Subject: [PATCH 175/336] Allow no chat button and make quickchat settings disabled when chat is not enabled --- UI/EmuScreen.cpp | 2 +- UI/GameSettingsScreen.cpp | 70 ++++++++++++++++++--------------------- 2 files changed, 34 insertions(+), 38 deletions(-) diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index 1d15015f0e..bb12e63b61 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -806,7 +806,7 @@ void EmuScreen::CreateViews() { cardboardDisableButton_->SetVisibility(V_GONE); cardboardDisableButton_->SetScale(0.65f); // make it smaller - this button can be in the way otherwise. - if (g_Config.bEnableNetworkChat) { + if (g_Config.bEnableNetworkChat && g_Config.iChatButtonPosition != 8) { AnchorLayoutParams *layoutParams = nullptr; switch (g_Config.iChatButtonPosition) { case 0: diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 6ab3c24981..16cd4c4c3c 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -645,7 +645,7 @@ void GameSettingsScreen::CreateViews() { audioSettings->Add(new CheckBox(&g_Config.bAutoAudioDevice, a->T("Use new audio devices automatically"))); } -#if defined(__ANDROID__) +#if PPSSPP_PLATFORM(ANDROID) CheckBox *extraAudio = audioSettings->Add(new CheckBox(&g_Config.bExtraAudioBuffering, a->T("AudioBufferingForBluetooth", "Bluetooth-friendly buffer (slower)"))); extraAudio->SetEnabledPtr(&g_Config.bEnableSound); @@ -785,55 +785,51 @@ void GameSettingsScreen::CreateViews() { networkingSettings->Add(new ItemHeader(n->T("Chat"))); networkingSettings->Add(new CheckBox(&g_Config.bEnableNetworkChat, n->T("Enable network chat", "Enable network chat"))); - static const char *chatButtonPositions[] = { "Bottom Left", "Bottom Center", "Bottom Right", "Top Left", "Top Center", "Top Right", "Center Left", "Center Right" }; + static const char *chatButtonPositions[] = { "Bottom Left", "Bottom Center", "Bottom Right", "Top Left", "Top Center", "Top Right", "Center Left", "Center Right", "None" }; networkingSettings->Add(new PopupMultiChoice(&g_Config.iChatButtonPosition, n->T("Chat Button Position"), chatButtonPositions, 0, ARRAY_SIZE(chatButtonPositions), n->GetName(), screenManager()))->SetEnabledPtr(&g_Config.bEnableNetworkChat); static const char *chatScreenPositions[] = { "Bottom Left", "Bottom Center", "Bottom Right", "Top Left", "Top Center", "Top Right" }; networkingSettings->Add(new PopupMultiChoice(&g_Config.iChatScreenPosition, n->T("Chat Screen Position"), chatScreenPositions, 0, ARRAY_SIZE(chatScreenPositions), n->GetName(), screenManager()))->SetEnabledPtr(&g_Config.bEnableNetworkChat); + +#if (!defined(MOBILE_DEVICE) && !defined(USING_QT_UI)) || defined(USING_QT_UI) || PPSSPP_PLATFORM(ANDROID) // Missing only iOS? networkingSettings->Add(new ItemHeader(n->T("QuickChat", "Quick Chat"))); - networkingSettings->Add(new CheckBox(&g_Config.bEnableQuickChat, n->T("EnableQuickChat", "Enable Quick Chat"))); + CheckBox *qc = networkingSettings->Add(new CheckBox(&g_Config.bEnableQuickChat, n->T("EnableQuickChat", "Enable Quick Chat"))); + qc->SetEnabledPtr(&g_Config.bEnableNetworkChat); +#endif + #if !defined(MOBILE_DEVICE) && !defined(USING_QT_UI) // TODO: Add all platforms where KEY_CHAR support is added PopupTextInputChoice *qc1 = networkingSettings->Add(new PopupTextInputChoice(&g_Config.sQuickChat0, n->T("Quick Chat 1"), "", 32, screenManager())); - qc1->SetEnabledPtr(&g_Config.bEnableQuickChat); PopupTextInputChoice *qc2 = networkingSettings->Add(new PopupTextInputChoice(&g_Config.sQuickChat1, n->T("Quick Chat 2"), "", 32, screenManager())); - qc2->SetEnabledPtr(&g_Config.bEnableQuickChat); PopupTextInputChoice *qc3 = networkingSettings->Add(new PopupTextInputChoice(&g_Config.sQuickChat2, n->T("Quick Chat 3"), "", 32, screenManager())); - qc3->SetEnabledPtr(&g_Config.bEnableQuickChat); PopupTextInputChoice *qc4 = networkingSettings->Add(new PopupTextInputChoice(&g_Config.sQuickChat3, n->T("Quick Chat 4"), "", 32, screenManager())); - qc4->SetEnabledPtr(&g_Config.bEnableQuickChat); PopupTextInputChoice *qc5 = networkingSettings->Add(new PopupTextInputChoice(&g_Config.sQuickChat4, n->T("Quick Chat 5"), "", 32, screenManager())); - qc5->SetEnabledPtr(&g_Config.bEnableQuickChat); #elif defined(USING_QT_UI) Choice *qc1 = networkingSettings->Add(new Choice(n->T("Quick Chat 1"))); - qc1->SetEnabledPtr(&g_Config.bEnableQuickChat); - qc1->OnClick.Handle(this, &GameSettingsScreen::OnChangeQuickChat0); Choice *qc2 = networkingSettings->Add(new Choice(n->T("Quick Chat 2"))); - qc2->SetEnabledPtr(&g_Config.bEnableQuickChat); - qc2->OnClick.Handle(this, &GameSettingsScreen::OnChangeQuickChat1); Choice *qc3 = networkingSettings->Add(new Choice(n->T("Quick Chat 3"))); - qc3->SetEnabledPtr(&g_Config.bEnableQuickChat); - qc3->OnClick.Handle(this, &GameSettingsScreen::OnChangeQuickChat2); Choice *qc4 = networkingSettings->Add(new Choice(n->T("Quick Chat 4"))); - qc4->SetEnabledPtr(&g_Config.bEnableQuickChat); - qc4->OnClick.Handle(this, &GameSettingsScreen::OnChangeQuickChat3); Choice *qc5 = networkingSettings->Add(new Choice(n->T("Quick Chat 5"))); - qc5->SetEnabledPtr(&g_Config.bEnableQuickChat); - qc5->OnClick.Handle(this, &GameSettingsScreen::OnChangeQuickChat4); -#elif defined(__ANDROID__) +#elif PPSSPP_PLATFORM(ANDROID) ChoiceWithValueDisplay *qc1 = networkingSettings->Add(new ChoiceWithValueDisplay(&g_Config.sQuickChat0, n->T("Quick Chat 1"), (const char *)nullptr)); - qc1->OnClick.Handle(this, &GameSettingsScreen::OnChangeQuickChat0); - qc1->SetEnabledPtr(&g_Config.bEnableQuickChat); ChoiceWithValueDisplay *qc2 = networkingSettings->Add(new ChoiceWithValueDisplay(&g_Config.sQuickChat1, n->T("Quick Chat 2"), (const char *)nullptr)); - qc2->OnClick.Handle(this, &GameSettingsScreen::OnChangeQuickChat1); - qc2->SetEnabledPtr(&g_Config.bEnableQuickChat); ChoiceWithValueDisplay *qc3 = networkingSettings->Add(new ChoiceWithValueDisplay(&g_Config.sQuickChat2, n->T("Quick Chat 3"), (const char *)nullptr)); - qc3->OnClick.Handle(this, &GameSettingsScreen::OnChangeQuickChat2); - qc3->SetEnabledPtr(&g_Config.bEnableQuickChat); ChoiceWithValueDisplay *qc4 = networkingSettings->Add(new ChoiceWithValueDisplay(&g_Config.sQuickChat3, n->T("Quick Chat 4"), (const char *)nullptr)); - qc4->OnClick.Handle(this, &GameSettingsScreen::OnChangeQuickChat3); - qc4->SetEnabledPtr(&g_Config.bEnableQuickChat); ChoiceWithValueDisplay *qc5 = networkingSettings->Add(new ChoiceWithValueDisplay(&g_Config.sQuickChat4, n->T("Quick Chat 5"), (const char *)nullptr)); +#endif + +#if (!defined(MOBILE_DEVICE) && !defined(USING_QT_UI)) || defined(USING_QT_UI) || PPSSPP_PLATFORM(ANDROID) + qc1->SetEnabledFunc([] { return g_Config.bEnableQuickChat && g_Config.bEnableNetworkChat; }); + qc2->SetEnabledFunc([] { return g_Config.bEnableQuickChat && g_Config.bEnableNetworkChat; }); + qc3->SetEnabledFunc([] { return g_Config.bEnableQuickChat && g_Config.bEnableNetworkChat; }); + qc4->SetEnabledFunc([] { return g_Config.bEnableQuickChat && g_Config.bEnableNetworkChat; }); + qc5->SetEnabledFunc([] { return g_Config.bEnableQuickChat && g_Config.bEnableNetworkChat; }); +#endif + +#if defined(USING_QT_UI) || PPSSPP_PLATFORM(ANDROID) + qc1->OnClick.Handle(this, &GameSettingsScreen::OnChangeQuickChat0); + qc2->OnClick.Handle(this, &GameSettingsScreen::OnChangeQuickChat1); + qc3->OnClick.Handle(this, &GameSettingsScreen::OnChangeQuickChat2); + qc4->OnClick.Handle(this, &GameSettingsScreen::OnChangeQuickChat3); qc5->OnClick.Handle(this, &GameSettingsScreen::OnChangeQuickChat4); - qc5->SetEnabledPtr(&g_Config.bEnableQuickChat); #endif networkingSettings->Add(new ItemHeader(n->T("Misc", "Misc (default = compatibility)"))); @@ -1002,7 +998,7 @@ void GameSettingsScreen::CreateViews() { // so until then, this is Windows/Desktop only. #if !defined(MOBILE_DEVICE) // TODO: Add all platforms where KEY_CHAR support is added systemSettings->Add(new PopupTextInputChoice(&g_Config.sNickName, sy->T("Change Nickname"), "", 32, screenManager())); -#elif defined(__ANDROID__) +#elif PPSSPP_PLATFORM(ANDROID) systemSettings->Add(new ChoiceWithValueDisplay(&g_Config.sNickName, sy->T("Change Nickname"), (const char *)nullptr))->OnClick.Handle(this, &GameSettingsScreen::OnChangeNickname); #endif @@ -1399,7 +1395,7 @@ UI::EventReturn GameSettingsScreen::OnAudioDevice(UI::EventParams &e) { } UI::EventReturn GameSettingsScreen::OnChangeQuickChat0(UI::EventParams &e) { -#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(__ANDROID__) +#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || PPSSPP_PLATFORM(ANDROID) auto n = GetI18NCategory("Networking"); System_InputBoxGetString(n->T("Enter Quick Chat 1"), g_Config.sQuickChat0, [](bool result, const std::string &value) { if (result) { @@ -1411,7 +1407,7 @@ UI::EventReturn GameSettingsScreen::OnChangeQuickChat0(UI::EventParams &e) { } UI::EventReturn GameSettingsScreen::OnChangeQuickChat1(UI::EventParams &e) { -#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(__ANDROID__) +#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || PPSSPP_PLATFORM(ANDROID) auto n = GetI18NCategory("Networking"); System_InputBoxGetString(n->T("Enter Quick Chat 2"), g_Config.sQuickChat1, [](bool result, const std::string &value) { if (result) { @@ -1423,7 +1419,7 @@ UI::EventReturn GameSettingsScreen::OnChangeQuickChat1(UI::EventParams &e) { } UI::EventReturn GameSettingsScreen::OnChangeQuickChat2(UI::EventParams &e) { -#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(__ANDROID__) +#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || PPSSPP_PLATFORM(ANDROID) auto n = GetI18NCategory("Networking"); System_InputBoxGetString(n->T("Enter Quick Chat 3"), g_Config.sQuickChat2, [](bool result, const std::string &value) { if (result) { @@ -1435,7 +1431,7 @@ UI::EventReturn GameSettingsScreen::OnChangeQuickChat2(UI::EventParams &e) { } UI::EventReturn GameSettingsScreen::OnChangeQuickChat3(UI::EventParams &e) { -#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(__ANDROID__) +#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || PPSSPP_PLATFORM(ANDROID) auto n = GetI18NCategory("Networking"); System_InputBoxGetString(n->T("Enter Quick Chat 4"), g_Config.sQuickChat3, [](bool result, const std::string &value) { if (result) { @@ -1447,7 +1443,7 @@ UI::EventReturn GameSettingsScreen::OnChangeQuickChat3(UI::EventParams &e) { } UI::EventReturn GameSettingsScreen::OnChangeQuickChat4(UI::EventParams &e) { -#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(__ANDROID__) +#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || PPSSPP_PLATFORM(ANDROID) auto n = GetI18NCategory("Networking"); System_InputBoxGetString(n->T("Enter Quick Chat 5"), g_Config.sQuickChat4, [](bool result, const std::string &value) { if (result) { @@ -1459,7 +1455,7 @@ UI::EventReturn GameSettingsScreen::OnChangeQuickChat4(UI::EventParams &e) { } UI::EventReturn GameSettingsScreen::OnChangeNickname(UI::EventParams &e) { -#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(__ANDROID__) +#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || PPSSPP_PLATFORM(ANDROID) auto n = GetI18NCategory("Networking"); System_InputBoxGetString(n->T("Enter a new PSP nickname"), g_Config.sNickName, [](bool result, const std::string &value) { if (result) { @@ -1810,7 +1806,7 @@ void HostnameSelectScreen::CreatePopupContents(UI::ViewGroup *parent) { buttonsRow1->Add(new Spacer(new LinearLayoutParams(1.0, G_RIGHT))); buttonsRow2->Add(new Spacer(new LinearLayoutParams(1.0, G_LEFT))); -#if defined(__ANDROID__) +#if PPSSPP_PLATFORM(ANDROID) buttonsRow2->Add(new Button(di->T("Edit")))->OnClick.Handle(this, &HostnameSelectScreen::OnEditClick); // Since we don't have OnClick Event triggered from TextEdit's Touch().. here we go! #endif buttonsRow2->Add(new Button(di->T("Delete")))->OnClick.Handle(this, &HostnameSelectScreen::OnDeleteClick); @@ -1880,7 +1876,7 @@ UI::EventReturn HostnameSelectScreen::OnDeleteAllClick(UI::EventParams &e) { UI::EventReturn HostnameSelectScreen::OnEditClick(UI::EventParams& e) { auto n = GetI18NCategory("Networking"); -#if defined(__ANDROID__) +#if PPSSPP_PLATFORM(ANDROID) System_InputBoxGetString(n->T("proAdhocServer Address:"), addrView_->GetText(), [this](bool result, const std::string& value) { if (result) { addrView_->SetText(value); From cc00a4132d23db09d5c30a4e47448d02d3824c65 Mon Sep 17 00:00:00 2001 From: Bram Verweij Date: Fri, 20 Aug 2021 11:22:57 +0200 Subject: [PATCH 176/336] Prevent dlopen collisions between ppsspp_libretro.so and libvulkan.so --- Common/GPU/Vulkan/VulkanContext.cpp | 2 + Common/GPU/Vulkan/VulkanImage.cpp | 2 + Common/GPU/Vulkan/VulkanLoader.cpp | 350 +++++++++++----------- Common/GPU/Vulkan/VulkanLoader.h | 339 ++++++++++----------- Common/GPU/Vulkan/VulkanMemory.cpp | 2 + Common/GPU/Vulkan/VulkanQueueRunner.cpp | 2 + Common/GPU/Vulkan/VulkanRenderManager.cpp | 2 + Common/GPU/Vulkan/thin3d_vulkan.cpp | 2 + GPU/Vulkan/DrawEngineVulkan.cpp | 1 + GPU/Vulkan/FramebufferManagerVulkan.cpp | 2 + GPU/Vulkan/PipelineManagerVulkan.cpp | 2 + GPU/Vulkan/TextureCacheVulkan.cpp | 2 + GPU/Vulkan/VulkanUtil.cpp | 2 + libretro/libretro_vulkan.cpp | 15 +- 14 files changed, 372 insertions(+), 353 deletions(-) diff --git a/Common/GPU/Vulkan/VulkanContext.cpp b/Common/GPU/Vulkan/VulkanContext.cpp index d9db09eed0..d5b581a044 100644 --- a/Common/GPU/Vulkan/VulkanContext.cpp +++ b/Common/GPU/Vulkan/VulkanContext.cpp @@ -27,6 +27,8 @@ #define new DBG_NEW #endif +using namespace PPSSPP; + VulkanLogOptions g_LogOptions; static const char *validationLayers[] = { diff --git a/Common/GPU/Vulkan/VulkanImage.cpp b/Common/GPU/Vulkan/VulkanImage.cpp index 564729a99a..fef88f95cb 100644 --- a/Common/GPU/Vulkan/VulkanImage.cpp +++ b/Common/GPU/Vulkan/VulkanImage.cpp @@ -2,6 +2,8 @@ #include "Common/GPU/Vulkan/VulkanMemory.h" #include "Common/Log.h" +using namespace PPSSPP; + void VulkanTexture::Wipe() { if (image_) { vulkan_->Delete().QueueDeleteImage(image_); diff --git a/Common/GPU/Vulkan/VulkanLoader.cpp b/Common/GPU/Vulkan/VulkanLoader.cpp index b9465f473a..91c58ab363 100644 --- a/Common/GPU/Vulkan/VulkanLoader.cpp +++ b/Common/GPU/Vulkan/VulkanLoader.cpp @@ -28,194 +28,198 @@ #include #endif -PFN_vkCreateInstance vkCreateInstance; -PFN_vkDestroyInstance vkDestroyInstance; -PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices; -PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures; -PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties; -PFN_vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceImageFormatProperties; -PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties; -PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties; -PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties; -PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr; -PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr; -PFN_vkCreateDevice vkCreateDevice; -PFN_vkDestroyDevice vkDestroyDevice; -PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties; -PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties; -PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties; -PFN_vkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerProperties; -PFN_vkGetDeviceQueue vkGetDeviceQueue; -PFN_vkQueueSubmit vkQueueSubmit; -PFN_vkQueueWaitIdle vkQueueWaitIdle; -PFN_vkDeviceWaitIdle vkDeviceWaitIdle; -PFN_vkAllocateMemory vkAllocateMemory; -PFN_vkFreeMemory vkFreeMemory; -PFN_vkMapMemory vkMapMemory; -PFN_vkUnmapMemory vkUnmapMemory; -PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges; -PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges; -PFN_vkGetDeviceMemoryCommitment vkGetDeviceMemoryCommitment; -PFN_vkBindBufferMemory vkBindBufferMemory; -PFN_vkBindImageMemory vkBindImageMemory; -PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements; -PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements; -PFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements; -PFN_vkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatProperties; -PFN_vkQueueBindSparse vkQueueBindSparse; -PFN_vkCreateFence vkCreateFence; -PFN_vkDestroyFence vkDestroyFence; -PFN_vkGetFenceStatus vkGetFenceStatus; -PFN_vkCreateSemaphore vkCreateSemaphore; -PFN_vkDestroySemaphore vkDestroySemaphore; -PFN_vkCreateEvent vkCreateEvent; -PFN_vkDestroyEvent vkDestroyEvent; -PFN_vkGetEventStatus vkGetEventStatus; -PFN_vkSetEvent vkSetEvent; -PFN_vkResetEvent vkResetEvent; -PFN_vkCreateQueryPool vkCreateQueryPool; -PFN_vkDestroyQueryPool vkDestroyQueryPool; -PFN_vkGetQueryPoolResults vkGetQueryPoolResults; -PFN_vkCreateBuffer vkCreateBuffer; -PFN_vkDestroyBuffer vkDestroyBuffer; -PFN_vkCreateBufferView vkCreateBufferView; -PFN_vkDestroyBufferView vkDestroyBufferView; -PFN_vkCreateImage vkCreateImage; -PFN_vkDestroyImage vkDestroyImage; -PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout; -PFN_vkCreateImageView vkCreateImageView; -PFN_vkDestroyImageView vkDestroyImageView; -PFN_vkCreateShaderModule vkCreateShaderModule; -PFN_vkDestroyShaderModule vkDestroyShaderModule; -PFN_vkCreatePipelineCache vkCreatePipelineCache; -PFN_vkDestroyPipelineCache vkDestroyPipelineCache; -PFN_vkGetPipelineCacheData vkGetPipelineCacheData; -PFN_vkMergePipelineCaches vkMergePipelineCaches; -PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines; -PFN_vkCreateComputePipelines vkCreateComputePipelines; -PFN_vkDestroyPipeline vkDestroyPipeline; -PFN_vkCreatePipelineLayout vkCreatePipelineLayout; -PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout; -PFN_vkCreateSampler vkCreateSampler; -PFN_vkDestroySampler vkDestroySampler; -PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout; -PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout; -PFN_vkCreateDescriptorPool vkCreateDescriptorPool; -PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool; -PFN_vkResetDescriptorPool vkResetDescriptorPool; -PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets; -PFN_vkFreeDescriptorSets vkFreeDescriptorSets; -PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets; -PFN_vkCreateFramebuffer vkCreateFramebuffer; -PFN_vkDestroyFramebuffer vkDestroyFramebuffer; -PFN_vkCreateRenderPass vkCreateRenderPass; -PFN_vkDestroyRenderPass vkDestroyRenderPass; -PFN_vkGetRenderAreaGranularity vkGetRenderAreaGranularity; -PFN_vkCreateCommandPool vkCreateCommandPool; -PFN_vkDestroyCommandPool vkDestroyCommandPool; -PFN_vkResetCommandPool vkResetCommandPool; -PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers; -PFN_vkFreeCommandBuffers vkFreeCommandBuffers; - -// Used frequently together -PFN_vkCmdBindPipeline vkCmdBindPipeline; -PFN_vkCmdSetViewport vkCmdSetViewport; -PFN_vkCmdSetScissor vkCmdSetScissor; -PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants; -PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask; -PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask; -PFN_vkCmdSetStencilReference vkCmdSetStencilReference; -PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets; -PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer; -PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers; -PFN_vkCmdDraw vkCmdDraw; -PFN_vkCmdDrawIndexed vkCmdDrawIndexed; -PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier; -PFN_vkCmdPushConstants vkCmdPushConstants; - -// Every frame to a few times per frame -PFN_vkWaitForFences vkWaitForFences; -PFN_vkResetFences vkResetFences; -PFN_vkBeginCommandBuffer vkBeginCommandBuffer; -PFN_vkEndCommandBuffer vkEndCommandBuffer; -PFN_vkResetCommandBuffer vkResetCommandBuffer; -PFN_vkCmdClearAttachments vkCmdClearAttachments; -PFN_vkCmdSetEvent vkCmdSetEvent; -PFN_vkCmdResetEvent vkCmdResetEvent; -PFN_vkCmdWaitEvents vkCmdWaitEvents; -PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass; -PFN_vkCmdEndRenderPass vkCmdEndRenderPass; -PFN_vkCmdCopyBuffer vkCmdCopyBuffer; -PFN_vkCmdCopyImage vkCmdCopyImage; -PFN_vkCmdBlitImage vkCmdBlitImage; -PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage; -PFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer; - -// Rare or not used -PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds; -PFN_vkCmdSetLineWidth vkCmdSetLineWidth; -PFN_vkCmdSetDepthBias vkCmdSetDepthBias; -PFN_vkCmdDrawIndirect vkCmdDrawIndirect; -PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect; -PFN_vkCmdDispatch vkCmdDispatch; -PFN_vkCmdDispatchIndirect vkCmdDispatchIndirect; -PFN_vkCmdUpdateBuffer vkCmdUpdateBuffer; -PFN_vkCmdFillBuffer vkCmdFillBuffer; -PFN_vkCmdClearColorImage vkCmdClearColorImage; -PFN_vkCmdClearDepthStencilImage vkCmdClearDepthStencilImage; -PFN_vkCmdResolveImage vkCmdResolveImage; -PFN_vkCmdBeginQuery vkCmdBeginQuery; -PFN_vkCmdEndQuery vkCmdEndQuery; -PFN_vkCmdResetQueryPool vkCmdResetQueryPool; -PFN_vkCmdWriteTimestamp vkCmdWriteTimestamp; -PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults; -PFN_vkCmdNextSubpass vkCmdNextSubpass; -PFN_vkCmdExecuteCommands vkCmdExecuteCommands; - +namespace PPSSPP { + PFN_vkCreateInstance vkCreateInstance; + PFN_vkDestroyInstance vkDestroyInstance; + PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices; + PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures; + PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties; + PFN_vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceImageFormatProperties; + PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties; + PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties; + PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties; + PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr; + PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr; + PFN_vkCreateDevice vkCreateDevice; + PFN_vkDestroyDevice vkDestroyDevice; + PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties; + PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties; + PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties; + PFN_vkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerProperties; + PFN_vkGetDeviceQueue vkGetDeviceQueue; + PFN_vkQueueSubmit vkQueueSubmit; + PFN_vkQueueWaitIdle vkQueueWaitIdle; + PFN_vkDeviceWaitIdle vkDeviceWaitIdle; + PFN_vkAllocateMemory vkAllocateMemory; + PFN_vkFreeMemory vkFreeMemory; + PFN_vkMapMemory vkMapMemory; + PFN_vkUnmapMemory vkUnmapMemory; + PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges; + PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges; + PFN_vkGetDeviceMemoryCommitment vkGetDeviceMemoryCommitment; + PFN_vkBindBufferMemory vkBindBufferMemory; + PFN_vkBindImageMemory vkBindImageMemory; + PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements; + PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements; + PFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements; + PFN_vkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatProperties; + PFN_vkQueueBindSparse vkQueueBindSparse; + PFN_vkCreateFence vkCreateFence; + PFN_vkDestroyFence vkDestroyFence; + PFN_vkGetFenceStatus vkGetFenceStatus; + PFN_vkCreateSemaphore vkCreateSemaphore; + PFN_vkDestroySemaphore vkDestroySemaphore; + PFN_vkCreateEvent vkCreateEvent; + PFN_vkDestroyEvent vkDestroyEvent; + PFN_vkGetEventStatus vkGetEventStatus; + PFN_vkSetEvent vkSetEvent; + PFN_vkResetEvent vkResetEvent; + PFN_vkCreateQueryPool vkCreateQueryPool; + PFN_vkDestroyQueryPool vkDestroyQueryPool; + PFN_vkGetQueryPoolResults vkGetQueryPoolResults; + PFN_vkCreateBuffer vkCreateBuffer; + PFN_vkDestroyBuffer vkDestroyBuffer; + PFN_vkCreateBufferView vkCreateBufferView; + PFN_vkDestroyBufferView vkDestroyBufferView; + PFN_vkCreateImage vkCreateImage; + PFN_vkDestroyImage vkDestroyImage; + PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout; + PFN_vkCreateImageView vkCreateImageView; + PFN_vkDestroyImageView vkDestroyImageView; + PFN_vkCreateShaderModule vkCreateShaderModule; + PFN_vkDestroyShaderModule vkDestroyShaderModule; + PFN_vkCreatePipelineCache vkCreatePipelineCache; + PFN_vkDestroyPipelineCache vkDestroyPipelineCache; + PFN_vkGetPipelineCacheData vkGetPipelineCacheData; + PFN_vkMergePipelineCaches vkMergePipelineCaches; + PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines; + PFN_vkCreateComputePipelines vkCreateComputePipelines; + PFN_vkDestroyPipeline vkDestroyPipeline; + PFN_vkCreatePipelineLayout vkCreatePipelineLayout; + PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout; + PFN_vkCreateSampler vkCreateSampler; + PFN_vkDestroySampler vkDestroySampler; + PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout; + PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout; + PFN_vkCreateDescriptorPool vkCreateDescriptorPool; + PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool; + PFN_vkResetDescriptorPool vkResetDescriptorPool; + PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets; + PFN_vkFreeDescriptorSets vkFreeDescriptorSets; + PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets; + PFN_vkCreateFramebuffer vkCreateFramebuffer; + PFN_vkDestroyFramebuffer vkDestroyFramebuffer; + PFN_vkCreateRenderPass vkCreateRenderPass; + PFN_vkDestroyRenderPass vkDestroyRenderPass; + PFN_vkGetRenderAreaGranularity vkGetRenderAreaGranularity; + PFN_vkCreateCommandPool vkCreateCommandPool; + PFN_vkDestroyCommandPool vkDestroyCommandPool; + PFN_vkResetCommandPool vkResetCommandPool; + PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers; + PFN_vkFreeCommandBuffers vkFreeCommandBuffers; + + // Used frequently together + PFN_vkCmdBindPipeline vkCmdBindPipeline; + PFN_vkCmdSetViewport vkCmdSetViewport; + PFN_vkCmdSetScissor vkCmdSetScissor; + PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants; + PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask; + PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask; + PFN_vkCmdSetStencilReference vkCmdSetStencilReference; + PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets; + PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer; + PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers; + PFN_vkCmdDraw vkCmdDraw; + PFN_vkCmdDrawIndexed vkCmdDrawIndexed; + PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier; + PFN_vkCmdPushConstants vkCmdPushConstants; + + // Every frame to a few times per frame + PFN_vkWaitForFences vkWaitForFences; + PFN_vkResetFences vkResetFences; + PFN_vkBeginCommandBuffer vkBeginCommandBuffer; + PFN_vkEndCommandBuffer vkEndCommandBuffer; + PFN_vkResetCommandBuffer vkResetCommandBuffer; + PFN_vkCmdClearAttachments vkCmdClearAttachments; + PFN_vkCmdSetEvent vkCmdSetEvent; + PFN_vkCmdResetEvent vkCmdResetEvent; + PFN_vkCmdWaitEvents vkCmdWaitEvents; + PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass; + PFN_vkCmdEndRenderPass vkCmdEndRenderPass; + PFN_vkCmdCopyBuffer vkCmdCopyBuffer; + PFN_vkCmdCopyImage vkCmdCopyImage; + PFN_vkCmdBlitImage vkCmdBlitImage; + PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage; + PFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer; + + // Rare or not used + PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds; + PFN_vkCmdSetLineWidth vkCmdSetLineWidth; + PFN_vkCmdSetDepthBias vkCmdSetDepthBias; + PFN_vkCmdDrawIndirect vkCmdDrawIndirect; + PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect; + PFN_vkCmdDispatch vkCmdDispatch; + PFN_vkCmdDispatchIndirect vkCmdDispatchIndirect; + PFN_vkCmdUpdateBuffer vkCmdUpdateBuffer; + PFN_vkCmdFillBuffer vkCmdFillBuffer; + PFN_vkCmdClearColorImage vkCmdClearColorImage; + PFN_vkCmdClearDepthStencilImage vkCmdClearDepthStencilImage; + PFN_vkCmdResolveImage vkCmdResolveImage; + PFN_vkCmdBeginQuery vkCmdBeginQuery; + PFN_vkCmdEndQuery vkCmdEndQuery; + PFN_vkCmdResetQueryPool vkCmdResetQueryPool; + PFN_vkCmdWriteTimestamp vkCmdWriteTimestamp; + PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults; + PFN_vkCmdNextSubpass vkCmdNextSubpass; + PFN_vkCmdExecuteCommands vkCmdExecuteCommands; + #ifdef __ANDROID__ -PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR; + PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR; #elif defined(_WIN32) -PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR; + PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR; #endif #if defined(VK_USE_PLATFORM_METAL_EXT) -PFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT; + PFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT; #endif #if defined(VK_USE_PLATFORM_XLIB_KHR) -PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR; + PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR; #endif #if defined(VK_USE_PLATFORM_WAYLAND_KHR) -PFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR; + PFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR; #endif #if defined(VK_USE_PLATFORM_DISPLAY_KHR) -PFN_vkCreateDisplayPlaneSurfaceKHR vkCreateDisplayPlaneSurfaceKHR; + PFN_vkCreateDisplayPlaneSurfaceKHR vkCreateDisplayPlaneSurfaceKHR; #endif -PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR; + PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR; -// WSI extension. -PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR; -PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR; -PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR; -PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR; -PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR; -PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR; -PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR; -PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR; -PFN_vkQueuePresentKHR vkQueuePresentKHR; + // WSI extension. + PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR; + PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR; + PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR; + PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR; + PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR; + PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR; + PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR; + PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR; + PFN_vkQueuePresentKHR vkQueuePresentKHR; -PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT; -PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT; -PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT; -PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT; -PFN_vkCmdInsertDebugUtilsLabelEXT vkCmdInsertDebugUtilsLabelEXT; -PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectNameEXT; -PFN_vkSetDebugUtilsObjectTagEXT vkSetDebugUtilsObjectTagEXT; + PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT; + PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT; + PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT; + PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT; + PFN_vkCmdInsertDebugUtilsLabelEXT vkCmdInsertDebugUtilsLabelEXT; + PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectNameEXT; + PFN_vkSetDebugUtilsObjectTagEXT vkSetDebugUtilsObjectTagEXT; -PFN_vkGetMemoryHostPointerPropertiesEXT vkGetMemoryHostPointerPropertiesEXT; -PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR; -PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR; -PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR; -PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR; + PFN_vkGetMemoryHostPointerPropertiesEXT vkGetMemoryHostPointerPropertiesEXT; + PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR; + PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR; + PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR; + PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR; +} + +using namespace PPSSPP; #ifdef _WIN32 static HINSTANCE vulkanLibrary; diff --git a/Common/GPU/Vulkan/VulkanLoader.h b/Common/GPU/Vulkan/VulkanLoader.h index 02a2b947f0..05f9c2e7de 100644 --- a/Common/GPU/Vulkan/VulkanLoader.h +++ b/Common/GPU/Vulkan/VulkanLoader.h @@ -33,189 +33,192 @@ #include "ext/vulkan/vulkan.h" -extern PFN_vkCreateInstance vkCreateInstance; -extern PFN_vkDestroyInstance vkDestroyInstance; -extern PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices; -extern PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures; -extern PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties; -extern PFN_vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceImageFormatProperties; -extern PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties; -extern PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties; -extern PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties; -extern PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr; -extern PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr; -extern PFN_vkCreateDevice vkCreateDevice; -extern PFN_vkDestroyDevice vkDestroyDevice; -extern PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties; -extern PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties; -extern PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties; -extern PFN_vkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerProperties; -extern PFN_vkGetDeviceQueue vkGetDeviceQueue; -extern PFN_vkQueueSubmit vkQueueSubmit; -extern PFN_vkQueueWaitIdle vkQueueWaitIdle; -extern PFN_vkDeviceWaitIdle vkDeviceWaitIdle; -extern PFN_vkAllocateMemory vkAllocateMemory; -extern PFN_vkFreeMemory vkFreeMemory; -extern PFN_vkMapMemory vkMapMemory; -extern PFN_vkUnmapMemory vkUnmapMemory; -extern PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges; -extern PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges; -extern PFN_vkGetDeviceMemoryCommitment vkGetDeviceMemoryCommitment; -extern PFN_vkBindBufferMemory vkBindBufferMemory; -extern PFN_vkBindImageMemory vkBindImageMemory; -extern PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements; -extern PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements; -extern PFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements; -extern PFN_vkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatProperties; -extern PFN_vkQueueBindSparse vkQueueBindSparse; -extern PFN_vkCreateFence vkCreateFence; -extern PFN_vkDestroyFence vkDestroyFence; -extern PFN_vkResetFences vkResetFences; -extern PFN_vkGetFenceStatus vkGetFenceStatus; -extern PFN_vkWaitForFences vkWaitForFences; -extern PFN_vkCreateSemaphore vkCreateSemaphore; -extern PFN_vkDestroySemaphore vkDestroySemaphore; -extern PFN_vkCreateEvent vkCreateEvent; -extern PFN_vkDestroyEvent vkDestroyEvent; -extern PFN_vkGetEventStatus vkGetEventStatus; -extern PFN_vkSetEvent vkSetEvent; -extern PFN_vkResetEvent vkResetEvent; -extern PFN_vkCreateQueryPool vkCreateQueryPool; -extern PFN_vkDestroyQueryPool vkDestroyQueryPool; -extern PFN_vkGetQueryPoolResults vkGetQueryPoolResults; -extern PFN_vkCreateBuffer vkCreateBuffer; -extern PFN_vkDestroyBuffer vkDestroyBuffer; -extern PFN_vkCreateBufferView vkCreateBufferView; -extern PFN_vkDestroyBufferView vkDestroyBufferView; -extern PFN_vkCreateImage vkCreateImage; -extern PFN_vkDestroyImage vkDestroyImage; -extern PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout; -extern PFN_vkCreateImageView vkCreateImageView; -extern PFN_vkDestroyImageView vkDestroyImageView; -extern PFN_vkCreateShaderModule vkCreateShaderModule; -extern PFN_vkDestroyShaderModule vkDestroyShaderModule; -extern PFN_vkCreatePipelineCache vkCreatePipelineCache; -extern PFN_vkDestroyPipelineCache vkDestroyPipelineCache; -extern PFN_vkGetPipelineCacheData vkGetPipelineCacheData; -extern PFN_vkMergePipelineCaches vkMergePipelineCaches; -extern PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines; -extern PFN_vkCreateComputePipelines vkCreateComputePipelines; -extern PFN_vkDestroyPipeline vkDestroyPipeline; -extern PFN_vkCreatePipelineLayout vkCreatePipelineLayout; -extern PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout; -extern PFN_vkCreateSampler vkCreateSampler; -extern PFN_vkDestroySampler vkDestroySampler; -extern PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout; -extern PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout; -extern PFN_vkCreateDescriptorPool vkCreateDescriptorPool; -extern PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool; -extern PFN_vkResetDescriptorPool vkResetDescriptorPool; -extern PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets; -extern PFN_vkFreeDescriptorSets vkFreeDescriptorSets; -extern PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets; -extern PFN_vkCreateFramebuffer vkCreateFramebuffer; -extern PFN_vkDestroyFramebuffer vkDestroyFramebuffer; -extern PFN_vkCreateRenderPass vkCreateRenderPass; -extern PFN_vkDestroyRenderPass vkDestroyRenderPass; -extern PFN_vkGetRenderAreaGranularity vkGetRenderAreaGranularity; -extern PFN_vkCreateCommandPool vkCreateCommandPool; -extern PFN_vkDestroyCommandPool vkDestroyCommandPool; -extern PFN_vkResetCommandPool vkResetCommandPool; -extern PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers; -extern PFN_vkFreeCommandBuffers vkFreeCommandBuffers; -extern PFN_vkBeginCommandBuffer vkBeginCommandBuffer; -extern PFN_vkEndCommandBuffer vkEndCommandBuffer; -extern PFN_vkResetCommandBuffer vkResetCommandBuffer; -extern PFN_vkCmdBindPipeline vkCmdBindPipeline; -extern PFN_vkCmdSetViewport vkCmdSetViewport; -extern PFN_vkCmdSetScissor vkCmdSetScissor; -extern PFN_vkCmdSetLineWidth vkCmdSetLineWidth; -extern PFN_vkCmdSetDepthBias vkCmdSetDepthBias; -extern PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants; -extern PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds; -extern PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask; -extern PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask; -extern PFN_vkCmdSetStencilReference vkCmdSetStencilReference; -extern PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets; -extern PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer; -extern PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers; -extern PFN_vkCmdDraw vkCmdDraw; -extern PFN_vkCmdDrawIndexed vkCmdDrawIndexed; -extern PFN_vkCmdDrawIndirect vkCmdDrawIndirect; -extern PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect; -extern PFN_vkCmdDispatch vkCmdDispatch; -extern PFN_vkCmdDispatchIndirect vkCmdDispatchIndirect; -extern PFN_vkCmdCopyBuffer vkCmdCopyBuffer; -extern PFN_vkCmdCopyImage vkCmdCopyImage; -extern PFN_vkCmdBlitImage vkCmdBlitImage; -extern PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage; -extern PFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer; -extern PFN_vkCmdUpdateBuffer vkCmdUpdateBuffer; -extern PFN_vkCmdFillBuffer vkCmdFillBuffer; -extern PFN_vkCmdClearColorImage vkCmdClearColorImage; -extern PFN_vkCmdClearDepthStencilImage vkCmdClearDepthStencilImage; -extern PFN_vkCmdClearAttachments vkCmdClearAttachments; -extern PFN_vkCmdResolveImage vkCmdResolveImage; -extern PFN_vkCmdSetEvent vkCmdSetEvent; -extern PFN_vkCmdResetEvent vkCmdResetEvent; -extern PFN_vkCmdWaitEvents vkCmdWaitEvents; -extern PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier; -extern PFN_vkCmdBeginQuery vkCmdBeginQuery; -extern PFN_vkCmdEndQuery vkCmdEndQuery; -extern PFN_vkCmdResetQueryPool vkCmdResetQueryPool; -extern PFN_vkCmdWriteTimestamp vkCmdWriteTimestamp; -extern PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults; -extern PFN_vkCmdPushConstants vkCmdPushConstants; -extern PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass; -extern PFN_vkCmdNextSubpass vkCmdNextSubpass; -extern PFN_vkCmdEndRenderPass vkCmdEndRenderPass; -extern PFN_vkCmdExecuteCommands vkCmdExecuteCommands; +namespace PPSSPP { + // Putting our own Vulkan function pointers in a namespace ensures that ppsspp_libretro.so doesn't collide with libvulkan.so. + extern PFN_vkCreateInstance vkCreateInstance; + extern PFN_vkDestroyInstance vkDestroyInstance; + extern PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices; + extern PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures; + extern PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties; + extern PFN_vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceImageFormatProperties; + extern PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties; + extern PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties; + extern PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties; + extern PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr; + extern PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr; + extern PFN_vkCreateDevice vkCreateDevice; + extern PFN_vkDestroyDevice vkDestroyDevice; + extern PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties; + extern PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties; + extern PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties; + extern PFN_vkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerProperties; + extern PFN_vkGetDeviceQueue vkGetDeviceQueue; + extern PFN_vkQueueSubmit vkQueueSubmit; + extern PFN_vkQueueWaitIdle vkQueueWaitIdle; + extern PFN_vkDeviceWaitIdle vkDeviceWaitIdle; + extern PFN_vkAllocateMemory vkAllocateMemory; + extern PFN_vkFreeMemory vkFreeMemory; + extern PFN_vkMapMemory vkMapMemory; + extern PFN_vkUnmapMemory vkUnmapMemory; + extern PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges; + extern PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges; + extern PFN_vkGetDeviceMemoryCommitment vkGetDeviceMemoryCommitment; + extern PFN_vkBindBufferMemory vkBindBufferMemory; + extern PFN_vkBindImageMemory vkBindImageMemory; + extern PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements; + extern PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements; + extern PFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements; + extern PFN_vkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatProperties; + extern PFN_vkQueueBindSparse vkQueueBindSparse; + extern PFN_vkCreateFence vkCreateFence; + extern PFN_vkDestroyFence vkDestroyFence; + extern PFN_vkResetFences vkResetFences; + extern PFN_vkGetFenceStatus vkGetFenceStatus; + extern PFN_vkWaitForFences vkWaitForFences; + extern PFN_vkCreateSemaphore vkCreateSemaphore; + extern PFN_vkDestroySemaphore vkDestroySemaphore; + extern PFN_vkCreateEvent vkCreateEvent; + extern PFN_vkDestroyEvent vkDestroyEvent; + extern PFN_vkGetEventStatus vkGetEventStatus; + extern PFN_vkSetEvent vkSetEvent; + extern PFN_vkResetEvent vkResetEvent; + extern PFN_vkCreateQueryPool vkCreateQueryPool; + extern PFN_vkDestroyQueryPool vkDestroyQueryPool; + extern PFN_vkGetQueryPoolResults vkGetQueryPoolResults; + extern PFN_vkCreateBuffer vkCreateBuffer; + extern PFN_vkDestroyBuffer vkDestroyBuffer; + extern PFN_vkCreateBufferView vkCreateBufferView; + extern PFN_vkDestroyBufferView vkDestroyBufferView; + extern PFN_vkCreateImage vkCreateImage; + extern PFN_vkDestroyImage vkDestroyImage; + extern PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout; + extern PFN_vkCreateImageView vkCreateImageView; + extern PFN_vkDestroyImageView vkDestroyImageView; + extern PFN_vkCreateShaderModule vkCreateShaderModule; + extern PFN_vkDestroyShaderModule vkDestroyShaderModule; + extern PFN_vkCreatePipelineCache vkCreatePipelineCache; + extern PFN_vkDestroyPipelineCache vkDestroyPipelineCache; + extern PFN_vkGetPipelineCacheData vkGetPipelineCacheData; + extern PFN_vkMergePipelineCaches vkMergePipelineCaches; + extern PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines; + extern PFN_vkCreateComputePipelines vkCreateComputePipelines; + extern PFN_vkDestroyPipeline vkDestroyPipeline; + extern PFN_vkCreatePipelineLayout vkCreatePipelineLayout; + extern PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout; + extern PFN_vkCreateSampler vkCreateSampler; + extern PFN_vkDestroySampler vkDestroySampler; + extern PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout; + extern PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout; + extern PFN_vkCreateDescriptorPool vkCreateDescriptorPool; + extern PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool; + extern PFN_vkResetDescriptorPool vkResetDescriptorPool; + extern PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets; + extern PFN_vkFreeDescriptorSets vkFreeDescriptorSets; + extern PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets; + extern PFN_vkCreateFramebuffer vkCreateFramebuffer; + extern PFN_vkDestroyFramebuffer vkDestroyFramebuffer; + extern PFN_vkCreateRenderPass vkCreateRenderPass; + extern PFN_vkDestroyRenderPass vkDestroyRenderPass; + extern PFN_vkGetRenderAreaGranularity vkGetRenderAreaGranularity; + extern PFN_vkCreateCommandPool vkCreateCommandPool; + extern PFN_vkDestroyCommandPool vkDestroyCommandPool; + extern PFN_vkResetCommandPool vkResetCommandPool; + extern PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers; + extern PFN_vkFreeCommandBuffers vkFreeCommandBuffers; + extern PFN_vkBeginCommandBuffer vkBeginCommandBuffer; + extern PFN_vkEndCommandBuffer vkEndCommandBuffer; + extern PFN_vkResetCommandBuffer vkResetCommandBuffer; + extern PFN_vkCmdBindPipeline vkCmdBindPipeline; + extern PFN_vkCmdSetViewport vkCmdSetViewport; + extern PFN_vkCmdSetScissor vkCmdSetScissor; + extern PFN_vkCmdSetLineWidth vkCmdSetLineWidth; + extern PFN_vkCmdSetDepthBias vkCmdSetDepthBias; + extern PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants; + extern PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds; + extern PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask; + extern PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask; + extern PFN_vkCmdSetStencilReference vkCmdSetStencilReference; + extern PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets; + extern PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer; + extern PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers; + extern PFN_vkCmdDraw vkCmdDraw; + extern PFN_vkCmdDrawIndexed vkCmdDrawIndexed; + extern PFN_vkCmdDrawIndirect vkCmdDrawIndirect; + extern PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect; + extern PFN_vkCmdDispatch vkCmdDispatch; + extern PFN_vkCmdDispatchIndirect vkCmdDispatchIndirect; + extern PFN_vkCmdCopyBuffer vkCmdCopyBuffer; + extern PFN_vkCmdCopyImage vkCmdCopyImage; + extern PFN_vkCmdBlitImage vkCmdBlitImage; + extern PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage; + extern PFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer; + extern PFN_vkCmdUpdateBuffer vkCmdUpdateBuffer; + extern PFN_vkCmdFillBuffer vkCmdFillBuffer; + extern PFN_vkCmdClearColorImage vkCmdClearColorImage; + extern PFN_vkCmdClearDepthStencilImage vkCmdClearDepthStencilImage; + extern PFN_vkCmdClearAttachments vkCmdClearAttachments; + extern PFN_vkCmdResolveImage vkCmdResolveImage; + extern PFN_vkCmdSetEvent vkCmdSetEvent; + extern PFN_vkCmdResetEvent vkCmdResetEvent; + extern PFN_vkCmdWaitEvents vkCmdWaitEvents; + extern PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier; + extern PFN_vkCmdBeginQuery vkCmdBeginQuery; + extern PFN_vkCmdEndQuery vkCmdEndQuery; + extern PFN_vkCmdResetQueryPool vkCmdResetQueryPool; + extern PFN_vkCmdWriteTimestamp vkCmdWriteTimestamp; + extern PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults; + extern PFN_vkCmdPushConstants vkCmdPushConstants; + extern PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass; + extern PFN_vkCmdNextSubpass vkCmdNextSubpass; + extern PFN_vkCmdEndRenderPass vkCmdEndRenderPass; + extern PFN_vkCmdExecuteCommands vkCmdExecuteCommands; #ifdef __ANDROID__ -extern PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR; + extern PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR; #elif defined(_WIN32) -extern PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR; + extern PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR; #elif defined(VK_USE_PLATFORM_METAL_EXT) -extern PFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT; + extern PFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT; #endif #if defined(VK_USE_PLATFORM_XLIB_KHR) -extern PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR; + extern PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR; #endif #if defined(VK_USE_PLATFORM_WAYLAND_KHR) -extern PFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR; + extern PFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR; #endif #if defined(VK_USE_PLATFORM_DISPLAY_KHR) -extern PFN_vkCreateDisplayPlaneSurfaceKHR vkCreateDisplayPlaneSurfaceKHR; + extern PFN_vkCreateDisplayPlaneSurfaceKHR vkCreateDisplayPlaneSurfaceKHR; #endif -extern PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR; + extern PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR; -// Simple loader for the WSI extension. -extern PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR; -extern PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR; -extern PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR; -extern PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR; + // Simple loader for the WSI extension. + extern PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR; + extern PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR; + extern PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR; + extern PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR; + + extern PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR; + extern PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR; + extern PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR; + extern PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR; + extern PFN_vkQueuePresentKHR vkQueuePresentKHR; -extern PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR; -extern PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR; -extern PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR; -extern PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR; -extern PFN_vkQueuePresentKHR vkQueuePresentKHR; + extern PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT; + extern PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT; + extern PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT; + extern PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT; + extern PFN_vkCmdInsertDebugUtilsLabelEXT vkCmdInsertDebugUtilsLabelEXT; + extern PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectNameEXT; + extern PFN_vkSetDebugUtilsObjectTagEXT vkSetDebugUtilsObjectTagEXT; -extern PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT; -extern PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT; -extern PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT; -extern PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT; -extern PFN_vkCmdInsertDebugUtilsLabelEXT vkCmdInsertDebugUtilsLabelEXT; -extern PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectNameEXT; -extern PFN_vkSetDebugUtilsObjectTagEXT vkSetDebugUtilsObjectTagEXT; - -// Assorted other extensions. -extern PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR; -extern PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR; -extern PFN_vkGetMemoryHostPointerPropertiesEXT vkGetMemoryHostPointerPropertiesEXT; -extern PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR; -extern PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR; + // Assorted other extensions. + extern PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR; + extern PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR; + extern PFN_vkGetMemoryHostPointerPropertiesEXT vkGetMemoryHostPointerPropertiesEXT; + extern PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR; + extern PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR; +} // For fast extension-enabled checks. struct VulkanExtensions { diff --git a/Common/GPU/Vulkan/VulkanMemory.cpp b/Common/GPU/Vulkan/VulkanMemory.cpp index 77f41732cc..1c8a7da90f 100644 --- a/Common/GPU/Vulkan/VulkanMemory.cpp +++ b/Common/GPU/Vulkan/VulkanMemory.cpp @@ -24,6 +24,8 @@ #include "Common/TimeUtil.h" #include "Common/GPU/Vulkan/VulkanMemory.h" +using namespace PPSSPP; + VulkanPushBuffer::VulkanPushBuffer(VulkanContext *vulkan, size_t size, VkBufferUsageFlags usage, VkMemoryPropertyFlags memoryPropertyMask) : vulkan_(vulkan), memoryPropertyMask_(memoryPropertyMask), size_(size), usage_(usage) { bool res = AddBuffer(); diff --git a/Common/GPU/Vulkan/VulkanQueueRunner.cpp b/Common/GPU/Vulkan/VulkanQueueRunner.cpp index 56fb09dea2..4f3621bee3 100644 --- a/Common/GPU/Vulkan/VulkanQueueRunner.cpp +++ b/Common/GPU/Vulkan/VulkanQueueRunner.cpp @@ -6,6 +6,8 @@ #include "VulkanQueueRunner.h" #include "VulkanRenderManager.h" +using namespace PPSSPP; + // Debug help: adb logcat -s DEBUG PPSSPPNativeActivity PPSSPP NativeGLView NativeRenderer NativeSurfaceView PowerSaveModeReceiver InputDeviceState static void MergeRenderAreaRectInto(VkRect2D *dest, VkRect2D &src) { diff --git a/Common/GPU/Vulkan/VulkanRenderManager.cpp b/Common/GPU/Vulkan/VulkanRenderManager.cpp index 523e88805f..d48ea1ca24 100644 --- a/Common/GPU/Vulkan/VulkanRenderManager.cpp +++ b/Common/GPU/Vulkan/VulkanRenderManager.cpp @@ -20,6 +20,8 @@ #define UINT64_MAX 0xFFFFFFFFFFFFFFFFULL #endif +using namespace PPSSPP; + VKRFramebuffer::VKRFramebuffer(VulkanContext *vk, VkCommandBuffer initCmd, VkRenderPass renderPass, int _width, int _height, const char *tag) : vulkan_(vk) { width = _width; height = _height; diff --git a/Common/GPU/Vulkan/thin3d_vulkan.cpp b/Common/GPU/Vulkan/thin3d_vulkan.cpp index 5946ef0e14..702c4ea755 100644 --- a/Common/GPU/Vulkan/thin3d_vulkan.cpp +++ b/Common/GPU/Vulkan/thin3d_vulkan.cpp @@ -43,6 +43,8 @@ #include "Common/GPU/Vulkan/VulkanLoader.h" +using namespace PPSSPP; + namespace Draw { // This can actually be replaced with a cast as the values are in the right order. diff --git a/GPU/Vulkan/DrawEngineVulkan.cpp b/GPU/Vulkan/DrawEngineVulkan.cpp index 54ebc209ca..187988e08e 100644 --- a/GPU/Vulkan/DrawEngineVulkan.cpp +++ b/GPU/Vulkan/DrawEngineVulkan.cpp @@ -50,6 +50,7 @@ #include "GPU/Vulkan/FramebufferManagerVulkan.h" #include "GPU/Vulkan/GPU_Vulkan.h" +using namespace PPSSPP; enum { VERTEX_CACHE_SIZE = 8192 * 1024 diff --git a/GPU/Vulkan/FramebufferManagerVulkan.cpp b/GPU/Vulkan/FramebufferManagerVulkan.cpp index ac60198cb9..ce22bd499d 100644 --- a/GPU/Vulkan/FramebufferManagerVulkan.cpp +++ b/GPU/Vulkan/FramebufferManagerVulkan.cpp @@ -48,6 +48,8 @@ #include "GPU/Vulkan/ShaderManagerVulkan.h" #include "GPU/Vulkan/VulkanUtil.h" +using namespace PPSSPP; + static const char tex_fs[] = R"(#version 450 #extension GL_ARB_separate_shader_objects : enable #extension GL_ARB_shading_language_420pack : enable diff --git a/GPU/Vulkan/PipelineManagerVulkan.cpp b/GPU/Vulkan/PipelineManagerVulkan.cpp index 5c707baa9f..3d5d3bd02a 100644 --- a/GPU/Vulkan/PipelineManagerVulkan.cpp +++ b/GPU/Vulkan/PipelineManagerVulkan.cpp @@ -16,6 +16,8 @@ #include "Common/GPU/Vulkan/VulkanRenderManager.h" #include "Common/GPU/Vulkan/VulkanQueueRunner.h" +using namespace PPSSPP; + PipelineManagerVulkan::PipelineManagerVulkan(VulkanContext *vulkan) : pipelines_(256), vulkan_(vulkan) { // The pipeline cache is created on demand (or explicitly through Load). } diff --git a/GPU/Vulkan/TextureCacheVulkan.cpp b/GPU/Vulkan/TextureCacheVulkan.cpp index 4158b99c21..c87e19eaa2 100644 --- a/GPU/Vulkan/TextureCacheVulkan.cpp +++ b/GPU/Vulkan/TextureCacheVulkan.cpp @@ -50,6 +50,8 @@ #include "GPU/Vulkan/ShaderManagerVulkan.h" #include "GPU/Vulkan/DrawEngineVulkan.h" +using namespace PPSSPP; + #define TEXCACHE_MIN_SLAB_SIZE (8 * 1024 * 1024) #define TEXCACHE_MAX_SLAB_SIZE (32 * 1024 * 1024) #define TEXCACHE_SLAB_PRESSURE 4 diff --git a/GPU/Vulkan/VulkanUtil.cpp b/GPU/Vulkan/VulkanUtil.cpp index e54c7c4840..4f94daa0fc 100644 --- a/GPU/Vulkan/VulkanUtil.cpp +++ b/GPU/Vulkan/VulkanUtil.cpp @@ -20,6 +20,8 @@ #include "Common/GPU/Vulkan/VulkanContext.h" #include "GPU/Vulkan/VulkanUtil.h" +using namespace PPSSPP; + const VkComponentMapping VULKAN_4444_SWIZZLE = { VK_COMPONENT_SWIZZLE_A, VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B }; const VkComponentMapping VULKAN_1555_SWIZZLE = { VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_A }; const VkComponentMapping VULKAN_565_SWIZZLE = { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY }; diff --git a/libretro/libretro_vulkan.cpp b/libretro/libretro_vulkan.cpp index 8007d31d3f..388c19d3ea 100644 --- a/libretro/libretro_vulkan.cpp +++ b/libretro/libretro_vulkan.cpp @@ -12,12 +12,15 @@ #include #include +#include "Common/GPU/Vulkan/VulkanLoader.h" #include "Common/Log.h" #include "Core/Config.h" #define VK_NO_PROTOTYPES #include "libretro/libretro_vulkan.h" +using namespace PPSSPP; + static retro_hw_render_interface_vulkan *vulkan; static struct { @@ -33,17 +36,6 @@ static struct { } vk_init_info; static bool DEDICATED_ALLOCATION; -extern PFN_vkCreateInstance vkCreateInstance; -extern PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties; -extern PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements; -extern PFN_vkAllocateMemory vkAllocateMemory; -extern PFN_vkBindImageMemory vkBindImageMemory; -extern PFN_vkCreateImage vkCreateImage; -extern PFN_vkDestroyImage vkDestroyImage; -extern PFN_vkCreateImageView vkCreateImageView; -extern PFN_vkDestroyImageView vkDestroyImageView; -extern PFN_vkFreeMemory vkFreeMemory; - #define VULKAN_MAX_SWAPCHAIN_IMAGES 8 struct VkSwapchainKHR_T { uint32_t count; @@ -76,7 +68,6 @@ static VkSwapchainKHR_T chain; LIBRETRO_VK_WARP_FUNC(vkCreateRenderPass); #define LIBRETRO_VK_WARP_FUNC(x) \ - extern PFN_##x x; \ PFN_##x x##_org LIBRETRO_VK_WARP_FUNC(vkGetInstanceProcAddr); From c17c0458498ed89fd4e851bebe9319a6cbf86a68 Mon Sep 17 00:00:00 2001 From: iota97 Date: Fri, 20 Aug 2021 12:46:46 +0200 Subject: [PATCH 177/336] Make touch layout accurate --- UI/TouchControlLayoutScreen.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/UI/TouchControlLayoutScreen.cpp b/UI/TouchControlLayoutScreen.cpp index b3e52f4e82..18fe8a2a5a 100644 --- a/UI/TouchControlLayoutScreen.cpp +++ b/UI/TouchControlLayoutScreen.cpp @@ -32,6 +32,8 @@ #include "UI/TouchControlLayoutScreen.h" #include "UI/TouchControlVisibilityScreen.h" +static float layoutAreaScale = 1.0f; + static u32 GetButtonColor() { return g_Config.iTouchButtonStyle != 0 ? 0xFFFFFF : 0xc0b080; } @@ -51,9 +53,11 @@ public: }; void Draw(UIContext &dc) override { + scale_ = theScale_*layoutAreaScale; // Scale down just for rendering dc.PushScissor(screenBounds_); MultiTouchButton::Draw(dc); dc.PopScissor(); + scale_ = theScale_/layoutAreaScale; // is this is needed? } virtual void SavePosition() { @@ -83,10 +87,8 @@ protected: return std::max(0.5f, opacity); } const Bounds &screenBounds_; - -private: - float &x_, &y_; float &theScale_; + float &x_, &y_; }; class PSPActionButtons : public DragDropButton { @@ -114,6 +116,7 @@ public: } void Draw(UIContext &dc) override { + scale_ = theScale_*layoutAreaScale; dc.PushScissor(screenBounds_); uint32_t colorBg = colorAlpha(GetButtonColor(), GetButtonOpacity()); uint32_t color = colorAlpha(0xFFFFFF, GetButtonOpacity()); @@ -121,7 +124,7 @@ public: int centerX = bounds_.centerX(); int centerY = bounds_.centerY(); - float spacing = spacing_ * baseActionButtonSpacing; + float spacing = spacing_ * baseActionButtonSpacing * layoutAreaScale; if (circleVisible_) { dc.Draw()->DrawImageRotated(roundId_, centerX + spacing, centerY, scale_, 0, colorBg, false); dc.Draw()->DrawImageRotated(circleId_, centerX + spacing, centerY, scale_, 0, color, false); @@ -144,6 +147,7 @@ public: dc.Draw()->DrawImageRotated(squareId_, centerX - spacing, centerY, scale_, 0, color, false); } dc.PopScissor(); + scale_ = theScale_/layoutAreaScale; }; void GetContentDimensions(const UIContext &dc, float &w, float &h) const override { @@ -242,6 +246,7 @@ public: } void Draw(UIContext &dc) override { + scale_ = theScale_*layoutAreaScale; dc.PushScissor(screenBounds_); uint32_t colorBg = colorAlpha(GetButtonColor(), GetButtonOpacity()); uint32_t color = colorAlpha(0xFFFFFF, GetButtonOpacity()); @@ -252,7 +257,7 @@ public: ImageID dirImage = g_Config.iTouchButtonStyle ? ImageID("I_DIR_LINE") : ImageID("I_DIR"); for (int i = 0; i < 4; i++) { - float r = D_pad_Radius * spacing_; + float r = D_pad_Radius * spacing_ * layoutAreaScale; float x = bounds_.centerX() + xoff[i] * r; float y = bounds_.centerY() + yoff[i] * r; float x2 = bounds_.centerX() + xoff[i] * (r + 10.f * scale_); @@ -263,6 +268,7 @@ public: dc.Draw()->DrawImageRotated(ImageID("I_ARROW"), x2, y2, scale_, angle + PI, color); } dc.PopScissor(); + scale_ = theScale_/layoutAreaScale; } void GetContentDimensions(const UIContext &dc, float &w, float &h) const override { @@ -574,6 +580,7 @@ void TouchControlLayoutScreen::CreateViews() { InitPadLayout(bounds.w, bounds.h); const float leftColumnWidth = 140.0f; + layoutAreaScale = 1.0-(leftColumnWidth+10)/bounds.w; using namespace UI; @@ -612,7 +619,8 @@ void TouchControlLayoutScreen::CreateViews() { tabHolder->SetTag("TouchControlLayout"); root_->Add(tabHolder); - layoutView_ = root_->Add(new ControlLayoutView(new AnchorLayoutParams(leftColumnWidth + 10, 0.0f, 0.0f, 0.0f, false))); + root_->Add(new ItemHeader("", new AnchorLayoutParams(leftColumnWidth + 10, bounds.h*(1.0-layoutAreaScale)-40, NONE, NONE, false))); + layoutView_ = root_->Add(new ControlLayoutView(new AnchorLayoutParams(leftColumnWidth + 10, bounds.h*(1.0-layoutAreaScale), 0.0f, 0.0f, false))); // this is more for show than anything else. It's used to provide a boundary // so that buttons like back can be placed within the boundary. From a31cbe42d29610205f370bf656df47fa3b369251 Mon Sep 17 00:00:00 2001 From: Bram Verweij Date: Sat, 21 Aug 2021 12:39:15 +0200 Subject: [PATCH 178/336] Rename namespace to PPSSPP_VK, remove indentation --- Common/GPU/Vulkan/VulkanContext.cpp | 2 +- Common/GPU/Vulkan/VulkanImage.cpp | 2 +- Common/GPU/Vulkan/VulkanLoader.cpp | 344 +++++++++++----------- Common/GPU/Vulkan/VulkanLoader.h | 340 ++++++++++----------- Common/GPU/Vulkan/VulkanMemory.cpp | 2 +- Common/GPU/Vulkan/VulkanQueueRunner.cpp | 2 +- Common/GPU/Vulkan/VulkanRenderManager.cpp | 2 +- Common/GPU/Vulkan/thin3d_vulkan.cpp | 2 +- GPU/Vulkan/DrawEngineVulkan.cpp | 2 +- GPU/Vulkan/FramebufferManagerVulkan.cpp | 2 +- GPU/Vulkan/PipelineManagerVulkan.cpp | 2 +- GPU/Vulkan/TextureCacheVulkan.cpp | 2 +- GPU/Vulkan/VulkanUtil.cpp | 2 +- libretro/libretro_vulkan.cpp | 2 +- 14 files changed, 354 insertions(+), 354 deletions(-) diff --git a/Common/GPU/Vulkan/VulkanContext.cpp b/Common/GPU/Vulkan/VulkanContext.cpp index d5b581a044..c9c53b5503 100644 --- a/Common/GPU/Vulkan/VulkanContext.cpp +++ b/Common/GPU/Vulkan/VulkanContext.cpp @@ -27,7 +27,7 @@ #define new DBG_NEW #endif -using namespace PPSSPP; +using namespace PPSSPP_VK; VulkanLogOptions g_LogOptions; diff --git a/Common/GPU/Vulkan/VulkanImage.cpp b/Common/GPU/Vulkan/VulkanImage.cpp index fef88f95cb..765742af95 100644 --- a/Common/GPU/Vulkan/VulkanImage.cpp +++ b/Common/GPU/Vulkan/VulkanImage.cpp @@ -2,7 +2,7 @@ #include "Common/GPU/Vulkan/VulkanMemory.h" #include "Common/Log.h" -using namespace PPSSPP; +using namespace PPSSPP_VK; void VulkanTexture::Wipe() { if (image_) { diff --git a/Common/GPU/Vulkan/VulkanLoader.cpp b/Common/GPU/Vulkan/VulkanLoader.cpp index 91c58ab363..8c0520b339 100644 --- a/Common/GPU/Vulkan/VulkanLoader.cpp +++ b/Common/GPU/Vulkan/VulkanLoader.cpp @@ -28,198 +28,198 @@ #include #endif -namespace PPSSPP { - PFN_vkCreateInstance vkCreateInstance; - PFN_vkDestroyInstance vkDestroyInstance; - PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices; - PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures; - PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties; - PFN_vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceImageFormatProperties; - PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties; - PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties; - PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties; - PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr; - PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr; - PFN_vkCreateDevice vkCreateDevice; - PFN_vkDestroyDevice vkDestroyDevice; - PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties; - PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties; - PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties; - PFN_vkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerProperties; - PFN_vkGetDeviceQueue vkGetDeviceQueue; - PFN_vkQueueSubmit vkQueueSubmit; - PFN_vkQueueWaitIdle vkQueueWaitIdle; - PFN_vkDeviceWaitIdle vkDeviceWaitIdle; - PFN_vkAllocateMemory vkAllocateMemory; - PFN_vkFreeMemory vkFreeMemory; - PFN_vkMapMemory vkMapMemory; - PFN_vkUnmapMemory vkUnmapMemory; - PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges; - PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges; - PFN_vkGetDeviceMemoryCommitment vkGetDeviceMemoryCommitment; - PFN_vkBindBufferMemory vkBindBufferMemory; - PFN_vkBindImageMemory vkBindImageMemory; - PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements; - PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements; - PFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements; - PFN_vkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatProperties; - PFN_vkQueueBindSparse vkQueueBindSparse; - PFN_vkCreateFence vkCreateFence; - PFN_vkDestroyFence vkDestroyFence; - PFN_vkGetFenceStatus vkGetFenceStatus; - PFN_vkCreateSemaphore vkCreateSemaphore; - PFN_vkDestroySemaphore vkDestroySemaphore; - PFN_vkCreateEvent vkCreateEvent; - PFN_vkDestroyEvent vkDestroyEvent; - PFN_vkGetEventStatus vkGetEventStatus; - PFN_vkSetEvent vkSetEvent; - PFN_vkResetEvent vkResetEvent; - PFN_vkCreateQueryPool vkCreateQueryPool; - PFN_vkDestroyQueryPool vkDestroyQueryPool; - PFN_vkGetQueryPoolResults vkGetQueryPoolResults; - PFN_vkCreateBuffer vkCreateBuffer; - PFN_vkDestroyBuffer vkDestroyBuffer; - PFN_vkCreateBufferView vkCreateBufferView; - PFN_vkDestroyBufferView vkDestroyBufferView; - PFN_vkCreateImage vkCreateImage; - PFN_vkDestroyImage vkDestroyImage; - PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout; - PFN_vkCreateImageView vkCreateImageView; - PFN_vkDestroyImageView vkDestroyImageView; - PFN_vkCreateShaderModule vkCreateShaderModule; - PFN_vkDestroyShaderModule vkDestroyShaderModule; - PFN_vkCreatePipelineCache vkCreatePipelineCache; - PFN_vkDestroyPipelineCache vkDestroyPipelineCache; - PFN_vkGetPipelineCacheData vkGetPipelineCacheData; - PFN_vkMergePipelineCaches vkMergePipelineCaches; - PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines; - PFN_vkCreateComputePipelines vkCreateComputePipelines; - PFN_vkDestroyPipeline vkDestroyPipeline; - PFN_vkCreatePipelineLayout vkCreatePipelineLayout; - PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout; - PFN_vkCreateSampler vkCreateSampler; - PFN_vkDestroySampler vkDestroySampler; - PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout; - PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout; - PFN_vkCreateDescriptorPool vkCreateDescriptorPool; - PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool; - PFN_vkResetDescriptorPool vkResetDescriptorPool; - PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets; - PFN_vkFreeDescriptorSets vkFreeDescriptorSets; - PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets; - PFN_vkCreateFramebuffer vkCreateFramebuffer; - PFN_vkDestroyFramebuffer vkDestroyFramebuffer; - PFN_vkCreateRenderPass vkCreateRenderPass; - PFN_vkDestroyRenderPass vkDestroyRenderPass; - PFN_vkGetRenderAreaGranularity vkGetRenderAreaGranularity; - PFN_vkCreateCommandPool vkCreateCommandPool; - PFN_vkDestroyCommandPool vkDestroyCommandPool; - PFN_vkResetCommandPool vkResetCommandPool; - PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers; - PFN_vkFreeCommandBuffers vkFreeCommandBuffers; +namespace PPSSPP_VK { +PFN_vkCreateInstance vkCreateInstance; +PFN_vkDestroyInstance vkDestroyInstance; +PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices; +PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures; +PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties; +PFN_vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceImageFormatProperties; +PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties; +PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties; +PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties; +PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr; +PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr; +PFN_vkCreateDevice vkCreateDevice; +PFN_vkDestroyDevice vkDestroyDevice; +PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties; +PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties; +PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties; +PFN_vkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerProperties; +PFN_vkGetDeviceQueue vkGetDeviceQueue; +PFN_vkQueueSubmit vkQueueSubmit; +PFN_vkQueueWaitIdle vkQueueWaitIdle; +PFN_vkDeviceWaitIdle vkDeviceWaitIdle; +PFN_vkAllocateMemory vkAllocateMemory; +PFN_vkFreeMemory vkFreeMemory; +PFN_vkMapMemory vkMapMemory; +PFN_vkUnmapMemory vkUnmapMemory; +PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges; +PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges; +PFN_vkGetDeviceMemoryCommitment vkGetDeviceMemoryCommitment; +PFN_vkBindBufferMemory vkBindBufferMemory; +PFN_vkBindImageMemory vkBindImageMemory; +PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements; +PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements; +PFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements; +PFN_vkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatProperties; +PFN_vkQueueBindSparse vkQueueBindSparse; +PFN_vkCreateFence vkCreateFence; +PFN_vkDestroyFence vkDestroyFence; +PFN_vkGetFenceStatus vkGetFenceStatus; +PFN_vkCreateSemaphore vkCreateSemaphore; +PFN_vkDestroySemaphore vkDestroySemaphore; +PFN_vkCreateEvent vkCreateEvent; +PFN_vkDestroyEvent vkDestroyEvent; +PFN_vkGetEventStatus vkGetEventStatus; +PFN_vkSetEvent vkSetEvent; +PFN_vkResetEvent vkResetEvent; +PFN_vkCreateQueryPool vkCreateQueryPool; +PFN_vkDestroyQueryPool vkDestroyQueryPool; +PFN_vkGetQueryPoolResults vkGetQueryPoolResults; +PFN_vkCreateBuffer vkCreateBuffer; +PFN_vkDestroyBuffer vkDestroyBuffer; +PFN_vkCreateBufferView vkCreateBufferView; +PFN_vkDestroyBufferView vkDestroyBufferView; +PFN_vkCreateImage vkCreateImage; +PFN_vkDestroyImage vkDestroyImage; +PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout; +PFN_vkCreateImageView vkCreateImageView; +PFN_vkDestroyImageView vkDestroyImageView; +PFN_vkCreateShaderModule vkCreateShaderModule; +PFN_vkDestroyShaderModule vkDestroyShaderModule; +PFN_vkCreatePipelineCache vkCreatePipelineCache; +PFN_vkDestroyPipelineCache vkDestroyPipelineCache; +PFN_vkGetPipelineCacheData vkGetPipelineCacheData; +PFN_vkMergePipelineCaches vkMergePipelineCaches; +PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines; +PFN_vkCreateComputePipelines vkCreateComputePipelines; +PFN_vkDestroyPipeline vkDestroyPipeline; +PFN_vkCreatePipelineLayout vkCreatePipelineLayout; +PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout; +PFN_vkCreateSampler vkCreateSampler; +PFN_vkDestroySampler vkDestroySampler; +PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout; +PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout; +PFN_vkCreateDescriptorPool vkCreateDescriptorPool; +PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool; +PFN_vkResetDescriptorPool vkResetDescriptorPool; +PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets; +PFN_vkFreeDescriptorSets vkFreeDescriptorSets; +PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets; +PFN_vkCreateFramebuffer vkCreateFramebuffer; +PFN_vkDestroyFramebuffer vkDestroyFramebuffer; +PFN_vkCreateRenderPass vkCreateRenderPass; +PFN_vkDestroyRenderPass vkDestroyRenderPass; +PFN_vkGetRenderAreaGranularity vkGetRenderAreaGranularity; +PFN_vkCreateCommandPool vkCreateCommandPool; +PFN_vkDestroyCommandPool vkDestroyCommandPool; +PFN_vkResetCommandPool vkResetCommandPool; +PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers; +PFN_vkFreeCommandBuffers vkFreeCommandBuffers; - // Used frequently together - PFN_vkCmdBindPipeline vkCmdBindPipeline; - PFN_vkCmdSetViewport vkCmdSetViewport; - PFN_vkCmdSetScissor vkCmdSetScissor; - PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants; - PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask; - PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask; - PFN_vkCmdSetStencilReference vkCmdSetStencilReference; - PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets; - PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer; - PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers; - PFN_vkCmdDraw vkCmdDraw; - PFN_vkCmdDrawIndexed vkCmdDrawIndexed; - PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier; - PFN_vkCmdPushConstants vkCmdPushConstants; +// Used frequently together +PFN_vkCmdBindPipeline vkCmdBindPipeline; +PFN_vkCmdSetViewport vkCmdSetViewport; +PFN_vkCmdSetScissor vkCmdSetScissor; +PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants; +PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask; +PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask; +PFN_vkCmdSetStencilReference vkCmdSetStencilReference; +PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets; +PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer; +PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers; +PFN_vkCmdDraw vkCmdDraw; +PFN_vkCmdDrawIndexed vkCmdDrawIndexed; +PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier; +PFN_vkCmdPushConstants vkCmdPushConstants; - // Every frame to a few times per frame - PFN_vkWaitForFences vkWaitForFences; - PFN_vkResetFences vkResetFences; - PFN_vkBeginCommandBuffer vkBeginCommandBuffer; - PFN_vkEndCommandBuffer vkEndCommandBuffer; - PFN_vkResetCommandBuffer vkResetCommandBuffer; - PFN_vkCmdClearAttachments vkCmdClearAttachments; - PFN_vkCmdSetEvent vkCmdSetEvent; - PFN_vkCmdResetEvent vkCmdResetEvent; - PFN_vkCmdWaitEvents vkCmdWaitEvents; - PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass; - PFN_vkCmdEndRenderPass vkCmdEndRenderPass; - PFN_vkCmdCopyBuffer vkCmdCopyBuffer; - PFN_vkCmdCopyImage vkCmdCopyImage; - PFN_vkCmdBlitImage vkCmdBlitImage; - PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage; - PFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer; +// Every frame to a few times per frame +PFN_vkWaitForFences vkWaitForFences; +PFN_vkResetFences vkResetFences; +PFN_vkBeginCommandBuffer vkBeginCommandBuffer; +PFN_vkEndCommandBuffer vkEndCommandBuffer; +PFN_vkResetCommandBuffer vkResetCommandBuffer; +PFN_vkCmdClearAttachments vkCmdClearAttachments; +PFN_vkCmdSetEvent vkCmdSetEvent; +PFN_vkCmdResetEvent vkCmdResetEvent; +PFN_vkCmdWaitEvents vkCmdWaitEvents; +PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass; +PFN_vkCmdEndRenderPass vkCmdEndRenderPass; +PFN_vkCmdCopyBuffer vkCmdCopyBuffer; +PFN_vkCmdCopyImage vkCmdCopyImage; +PFN_vkCmdBlitImage vkCmdBlitImage; +PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage; +PFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer; - // Rare or not used - PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds; - PFN_vkCmdSetLineWidth vkCmdSetLineWidth; - PFN_vkCmdSetDepthBias vkCmdSetDepthBias; - PFN_vkCmdDrawIndirect vkCmdDrawIndirect; - PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect; - PFN_vkCmdDispatch vkCmdDispatch; - PFN_vkCmdDispatchIndirect vkCmdDispatchIndirect; - PFN_vkCmdUpdateBuffer vkCmdUpdateBuffer; - PFN_vkCmdFillBuffer vkCmdFillBuffer; - PFN_vkCmdClearColorImage vkCmdClearColorImage; - PFN_vkCmdClearDepthStencilImage vkCmdClearDepthStencilImage; - PFN_vkCmdResolveImage vkCmdResolveImage; - PFN_vkCmdBeginQuery vkCmdBeginQuery; - PFN_vkCmdEndQuery vkCmdEndQuery; - PFN_vkCmdResetQueryPool vkCmdResetQueryPool; - PFN_vkCmdWriteTimestamp vkCmdWriteTimestamp; - PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults; - PFN_vkCmdNextSubpass vkCmdNextSubpass; - PFN_vkCmdExecuteCommands vkCmdExecuteCommands; +// Rare or not used +PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds; +PFN_vkCmdSetLineWidth vkCmdSetLineWidth; +PFN_vkCmdSetDepthBias vkCmdSetDepthBias; +PFN_vkCmdDrawIndirect vkCmdDrawIndirect; +PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect; +PFN_vkCmdDispatch vkCmdDispatch; +PFN_vkCmdDispatchIndirect vkCmdDispatchIndirect; +PFN_vkCmdUpdateBuffer vkCmdUpdateBuffer; +PFN_vkCmdFillBuffer vkCmdFillBuffer; +PFN_vkCmdClearColorImage vkCmdClearColorImage; +PFN_vkCmdClearDepthStencilImage vkCmdClearDepthStencilImage; +PFN_vkCmdResolveImage vkCmdResolveImage; +PFN_vkCmdBeginQuery vkCmdBeginQuery; +PFN_vkCmdEndQuery vkCmdEndQuery; +PFN_vkCmdResetQueryPool vkCmdResetQueryPool; +PFN_vkCmdWriteTimestamp vkCmdWriteTimestamp; +PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults; +PFN_vkCmdNextSubpass vkCmdNextSubpass; +PFN_vkCmdExecuteCommands vkCmdExecuteCommands; #ifdef __ANDROID__ - PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR; +PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR; #elif defined(_WIN32) - PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR; +PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR; #endif #if defined(VK_USE_PLATFORM_METAL_EXT) - PFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT; +PFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT; #endif #if defined(VK_USE_PLATFORM_XLIB_KHR) - PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR; +PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR; #endif #if defined(VK_USE_PLATFORM_WAYLAND_KHR) - PFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR; +PFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR; #endif #if defined(VK_USE_PLATFORM_DISPLAY_KHR) - PFN_vkCreateDisplayPlaneSurfaceKHR vkCreateDisplayPlaneSurfaceKHR; +PFN_vkCreateDisplayPlaneSurfaceKHR vkCreateDisplayPlaneSurfaceKHR; #endif - PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR; +PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR; - // WSI extension. - PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR; - PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR; - PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR; - PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR; - PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR; - PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR; - PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR; - PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR; - PFN_vkQueuePresentKHR vkQueuePresentKHR; +// WSI extension. +PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR; +PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR; +PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR; +PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR; +PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR; +PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR; +PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR; +PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR; +PFN_vkQueuePresentKHR vkQueuePresentKHR; - PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT; - PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT; - PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT; - PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT; - PFN_vkCmdInsertDebugUtilsLabelEXT vkCmdInsertDebugUtilsLabelEXT; - PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectNameEXT; - PFN_vkSetDebugUtilsObjectTagEXT vkSetDebugUtilsObjectTagEXT; +PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT; +PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT; +PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT; +PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT; +PFN_vkCmdInsertDebugUtilsLabelEXT vkCmdInsertDebugUtilsLabelEXT; +PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectNameEXT; +PFN_vkSetDebugUtilsObjectTagEXT vkSetDebugUtilsObjectTagEXT; - PFN_vkGetMemoryHostPointerPropertiesEXT vkGetMemoryHostPointerPropertiesEXT; - PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR; - PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR; - PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR; - PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR; -} +PFN_vkGetMemoryHostPointerPropertiesEXT vkGetMemoryHostPointerPropertiesEXT; +PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR; +PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR; +PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR; +PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR; +} // namespace PPSSPP_VK -using namespace PPSSPP; +using namespace PPSSPP_VK; #ifdef _WIN32 static HINSTANCE vulkanLibrary; diff --git a/Common/GPU/Vulkan/VulkanLoader.h b/Common/GPU/Vulkan/VulkanLoader.h index 05f9c2e7de..d5af22c108 100644 --- a/Common/GPU/Vulkan/VulkanLoader.h +++ b/Common/GPU/Vulkan/VulkanLoader.h @@ -33,192 +33,192 @@ #include "ext/vulkan/vulkan.h" -namespace PPSSPP { - // Putting our own Vulkan function pointers in a namespace ensures that ppsspp_libretro.so doesn't collide with libvulkan.so. - extern PFN_vkCreateInstance vkCreateInstance; - extern PFN_vkDestroyInstance vkDestroyInstance; - extern PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices; - extern PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures; - extern PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties; - extern PFN_vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceImageFormatProperties; - extern PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties; - extern PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties; - extern PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties; - extern PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr; - extern PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr; - extern PFN_vkCreateDevice vkCreateDevice; - extern PFN_vkDestroyDevice vkDestroyDevice; - extern PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties; - extern PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties; - extern PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties; - extern PFN_vkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerProperties; - extern PFN_vkGetDeviceQueue vkGetDeviceQueue; - extern PFN_vkQueueSubmit vkQueueSubmit; - extern PFN_vkQueueWaitIdle vkQueueWaitIdle; - extern PFN_vkDeviceWaitIdle vkDeviceWaitIdle; - extern PFN_vkAllocateMemory vkAllocateMemory; - extern PFN_vkFreeMemory vkFreeMemory; - extern PFN_vkMapMemory vkMapMemory; - extern PFN_vkUnmapMemory vkUnmapMemory; - extern PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges; - extern PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges; - extern PFN_vkGetDeviceMemoryCommitment vkGetDeviceMemoryCommitment; - extern PFN_vkBindBufferMemory vkBindBufferMemory; - extern PFN_vkBindImageMemory vkBindImageMemory; - extern PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements; - extern PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements; - extern PFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements; - extern PFN_vkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatProperties; - extern PFN_vkQueueBindSparse vkQueueBindSparse; - extern PFN_vkCreateFence vkCreateFence; - extern PFN_vkDestroyFence vkDestroyFence; - extern PFN_vkResetFences vkResetFences; - extern PFN_vkGetFenceStatus vkGetFenceStatus; - extern PFN_vkWaitForFences vkWaitForFences; - extern PFN_vkCreateSemaphore vkCreateSemaphore; - extern PFN_vkDestroySemaphore vkDestroySemaphore; - extern PFN_vkCreateEvent vkCreateEvent; - extern PFN_vkDestroyEvent vkDestroyEvent; - extern PFN_vkGetEventStatus vkGetEventStatus; - extern PFN_vkSetEvent vkSetEvent; - extern PFN_vkResetEvent vkResetEvent; - extern PFN_vkCreateQueryPool vkCreateQueryPool; - extern PFN_vkDestroyQueryPool vkDestroyQueryPool; - extern PFN_vkGetQueryPoolResults vkGetQueryPoolResults; - extern PFN_vkCreateBuffer vkCreateBuffer; - extern PFN_vkDestroyBuffer vkDestroyBuffer; - extern PFN_vkCreateBufferView vkCreateBufferView; - extern PFN_vkDestroyBufferView vkDestroyBufferView; - extern PFN_vkCreateImage vkCreateImage; - extern PFN_vkDestroyImage vkDestroyImage; - extern PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout; - extern PFN_vkCreateImageView vkCreateImageView; - extern PFN_vkDestroyImageView vkDestroyImageView; - extern PFN_vkCreateShaderModule vkCreateShaderModule; - extern PFN_vkDestroyShaderModule vkDestroyShaderModule; - extern PFN_vkCreatePipelineCache vkCreatePipelineCache; - extern PFN_vkDestroyPipelineCache vkDestroyPipelineCache; - extern PFN_vkGetPipelineCacheData vkGetPipelineCacheData; - extern PFN_vkMergePipelineCaches vkMergePipelineCaches; - extern PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines; - extern PFN_vkCreateComputePipelines vkCreateComputePipelines; - extern PFN_vkDestroyPipeline vkDestroyPipeline; - extern PFN_vkCreatePipelineLayout vkCreatePipelineLayout; - extern PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout; - extern PFN_vkCreateSampler vkCreateSampler; - extern PFN_vkDestroySampler vkDestroySampler; - extern PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout; - extern PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout; - extern PFN_vkCreateDescriptorPool vkCreateDescriptorPool; - extern PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool; - extern PFN_vkResetDescriptorPool vkResetDescriptorPool; - extern PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets; - extern PFN_vkFreeDescriptorSets vkFreeDescriptorSets; - extern PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets; - extern PFN_vkCreateFramebuffer vkCreateFramebuffer; - extern PFN_vkDestroyFramebuffer vkDestroyFramebuffer; - extern PFN_vkCreateRenderPass vkCreateRenderPass; - extern PFN_vkDestroyRenderPass vkDestroyRenderPass; - extern PFN_vkGetRenderAreaGranularity vkGetRenderAreaGranularity; - extern PFN_vkCreateCommandPool vkCreateCommandPool; - extern PFN_vkDestroyCommandPool vkDestroyCommandPool; - extern PFN_vkResetCommandPool vkResetCommandPool; - extern PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers; - extern PFN_vkFreeCommandBuffers vkFreeCommandBuffers; - extern PFN_vkBeginCommandBuffer vkBeginCommandBuffer; - extern PFN_vkEndCommandBuffer vkEndCommandBuffer; - extern PFN_vkResetCommandBuffer vkResetCommandBuffer; - extern PFN_vkCmdBindPipeline vkCmdBindPipeline; - extern PFN_vkCmdSetViewport vkCmdSetViewport; - extern PFN_vkCmdSetScissor vkCmdSetScissor; - extern PFN_vkCmdSetLineWidth vkCmdSetLineWidth; - extern PFN_vkCmdSetDepthBias vkCmdSetDepthBias; - extern PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants; - extern PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds; - extern PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask; - extern PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask; - extern PFN_vkCmdSetStencilReference vkCmdSetStencilReference; - extern PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets; - extern PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer; - extern PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers; - extern PFN_vkCmdDraw vkCmdDraw; - extern PFN_vkCmdDrawIndexed vkCmdDrawIndexed; - extern PFN_vkCmdDrawIndirect vkCmdDrawIndirect; - extern PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect; - extern PFN_vkCmdDispatch vkCmdDispatch; - extern PFN_vkCmdDispatchIndirect vkCmdDispatchIndirect; - extern PFN_vkCmdCopyBuffer vkCmdCopyBuffer; - extern PFN_vkCmdCopyImage vkCmdCopyImage; - extern PFN_vkCmdBlitImage vkCmdBlitImage; - extern PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage; - extern PFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer; - extern PFN_vkCmdUpdateBuffer vkCmdUpdateBuffer; - extern PFN_vkCmdFillBuffer vkCmdFillBuffer; - extern PFN_vkCmdClearColorImage vkCmdClearColorImage; - extern PFN_vkCmdClearDepthStencilImage vkCmdClearDepthStencilImage; - extern PFN_vkCmdClearAttachments vkCmdClearAttachments; - extern PFN_vkCmdResolveImage vkCmdResolveImage; - extern PFN_vkCmdSetEvent vkCmdSetEvent; - extern PFN_vkCmdResetEvent vkCmdResetEvent; - extern PFN_vkCmdWaitEvents vkCmdWaitEvents; - extern PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier; - extern PFN_vkCmdBeginQuery vkCmdBeginQuery; - extern PFN_vkCmdEndQuery vkCmdEndQuery; - extern PFN_vkCmdResetQueryPool vkCmdResetQueryPool; - extern PFN_vkCmdWriteTimestamp vkCmdWriteTimestamp; - extern PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults; - extern PFN_vkCmdPushConstants vkCmdPushConstants; - extern PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass; - extern PFN_vkCmdNextSubpass vkCmdNextSubpass; - extern PFN_vkCmdEndRenderPass vkCmdEndRenderPass; - extern PFN_vkCmdExecuteCommands vkCmdExecuteCommands; +namespace PPSSPP_VK { +// Putting our own Vulkan function pointers in a namespace ensures that ppsspp_libretro.so doesn't collide with libvulkan.so. +extern PFN_vkCreateInstance vkCreateInstance; +extern PFN_vkDestroyInstance vkDestroyInstance; +extern PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices; +extern PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures; +extern PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties; +extern PFN_vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceImageFormatProperties; +extern PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties; +extern PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties; +extern PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties; +extern PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr; +extern PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr; +extern PFN_vkCreateDevice vkCreateDevice; +extern PFN_vkDestroyDevice vkDestroyDevice; +extern PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties; +extern PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties; +extern PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties; +extern PFN_vkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerProperties; +extern PFN_vkGetDeviceQueue vkGetDeviceQueue; +extern PFN_vkQueueSubmit vkQueueSubmit; +extern PFN_vkQueueWaitIdle vkQueueWaitIdle; +extern PFN_vkDeviceWaitIdle vkDeviceWaitIdle; +extern PFN_vkAllocateMemory vkAllocateMemory; +extern PFN_vkFreeMemory vkFreeMemory; +extern PFN_vkMapMemory vkMapMemory; +extern PFN_vkUnmapMemory vkUnmapMemory; +extern PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges; +extern PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges; +extern PFN_vkGetDeviceMemoryCommitment vkGetDeviceMemoryCommitment; +extern PFN_vkBindBufferMemory vkBindBufferMemory; +extern PFN_vkBindImageMemory vkBindImageMemory; +extern PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements; +extern PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements; +extern PFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements; +extern PFN_vkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatProperties; +extern PFN_vkQueueBindSparse vkQueueBindSparse; +extern PFN_vkCreateFence vkCreateFence; +extern PFN_vkDestroyFence vkDestroyFence; +extern PFN_vkResetFences vkResetFences; +extern PFN_vkGetFenceStatus vkGetFenceStatus; +extern PFN_vkWaitForFences vkWaitForFences; +extern PFN_vkCreateSemaphore vkCreateSemaphore; +extern PFN_vkDestroySemaphore vkDestroySemaphore; +extern PFN_vkCreateEvent vkCreateEvent; +extern PFN_vkDestroyEvent vkDestroyEvent; +extern PFN_vkGetEventStatus vkGetEventStatus; +extern PFN_vkSetEvent vkSetEvent; +extern PFN_vkResetEvent vkResetEvent; +extern PFN_vkCreateQueryPool vkCreateQueryPool; +extern PFN_vkDestroyQueryPool vkDestroyQueryPool; +extern PFN_vkGetQueryPoolResults vkGetQueryPoolResults; +extern PFN_vkCreateBuffer vkCreateBuffer; +extern PFN_vkDestroyBuffer vkDestroyBuffer; +extern PFN_vkCreateBufferView vkCreateBufferView; +extern PFN_vkDestroyBufferView vkDestroyBufferView; +extern PFN_vkCreateImage vkCreateImage; +extern PFN_vkDestroyImage vkDestroyImage; +extern PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout; +extern PFN_vkCreateImageView vkCreateImageView; +extern PFN_vkDestroyImageView vkDestroyImageView; +extern PFN_vkCreateShaderModule vkCreateShaderModule; +extern PFN_vkDestroyShaderModule vkDestroyShaderModule; +extern PFN_vkCreatePipelineCache vkCreatePipelineCache; +extern PFN_vkDestroyPipelineCache vkDestroyPipelineCache; +extern PFN_vkGetPipelineCacheData vkGetPipelineCacheData; +extern PFN_vkMergePipelineCaches vkMergePipelineCaches; +extern PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines; +extern PFN_vkCreateComputePipelines vkCreateComputePipelines; +extern PFN_vkDestroyPipeline vkDestroyPipeline; +extern PFN_vkCreatePipelineLayout vkCreatePipelineLayout; +extern PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout; +extern PFN_vkCreateSampler vkCreateSampler; +extern PFN_vkDestroySampler vkDestroySampler; +extern PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout; +extern PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout; +extern PFN_vkCreateDescriptorPool vkCreateDescriptorPool; +extern PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool; +extern PFN_vkResetDescriptorPool vkResetDescriptorPool; +extern PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets; +extern PFN_vkFreeDescriptorSets vkFreeDescriptorSets; +extern PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets; +extern PFN_vkCreateFramebuffer vkCreateFramebuffer; +extern PFN_vkDestroyFramebuffer vkDestroyFramebuffer; +extern PFN_vkCreateRenderPass vkCreateRenderPass; +extern PFN_vkDestroyRenderPass vkDestroyRenderPass; +extern PFN_vkGetRenderAreaGranularity vkGetRenderAreaGranularity; +extern PFN_vkCreateCommandPool vkCreateCommandPool; +extern PFN_vkDestroyCommandPool vkDestroyCommandPool; +extern PFN_vkResetCommandPool vkResetCommandPool; +extern PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers; +extern PFN_vkFreeCommandBuffers vkFreeCommandBuffers; +extern PFN_vkBeginCommandBuffer vkBeginCommandBuffer; +extern PFN_vkEndCommandBuffer vkEndCommandBuffer; +extern PFN_vkResetCommandBuffer vkResetCommandBuffer; +extern PFN_vkCmdBindPipeline vkCmdBindPipeline; +extern PFN_vkCmdSetViewport vkCmdSetViewport; +extern PFN_vkCmdSetScissor vkCmdSetScissor; +extern PFN_vkCmdSetLineWidth vkCmdSetLineWidth; +extern PFN_vkCmdSetDepthBias vkCmdSetDepthBias; +extern PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants; +extern PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds; +extern PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask; +extern PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask; +extern PFN_vkCmdSetStencilReference vkCmdSetStencilReference; +extern PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets; +extern PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer; +extern PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers; +extern PFN_vkCmdDraw vkCmdDraw; +extern PFN_vkCmdDrawIndexed vkCmdDrawIndexed; +extern PFN_vkCmdDrawIndirect vkCmdDrawIndirect; +extern PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect; +extern PFN_vkCmdDispatch vkCmdDispatch; +extern PFN_vkCmdDispatchIndirect vkCmdDispatchIndirect; +extern PFN_vkCmdCopyBuffer vkCmdCopyBuffer; +extern PFN_vkCmdCopyImage vkCmdCopyImage; +extern PFN_vkCmdBlitImage vkCmdBlitImage; +extern PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage; +extern PFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer; +extern PFN_vkCmdUpdateBuffer vkCmdUpdateBuffer; +extern PFN_vkCmdFillBuffer vkCmdFillBuffer; +extern PFN_vkCmdClearColorImage vkCmdClearColorImage; +extern PFN_vkCmdClearDepthStencilImage vkCmdClearDepthStencilImage; +extern PFN_vkCmdClearAttachments vkCmdClearAttachments; +extern PFN_vkCmdResolveImage vkCmdResolveImage; +extern PFN_vkCmdSetEvent vkCmdSetEvent; +extern PFN_vkCmdResetEvent vkCmdResetEvent; +extern PFN_vkCmdWaitEvents vkCmdWaitEvents; +extern PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier; +extern PFN_vkCmdBeginQuery vkCmdBeginQuery; +extern PFN_vkCmdEndQuery vkCmdEndQuery; +extern PFN_vkCmdResetQueryPool vkCmdResetQueryPool; +extern PFN_vkCmdWriteTimestamp vkCmdWriteTimestamp; +extern PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults; +extern PFN_vkCmdPushConstants vkCmdPushConstants; +extern PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass; +extern PFN_vkCmdNextSubpass vkCmdNextSubpass; +extern PFN_vkCmdEndRenderPass vkCmdEndRenderPass; +extern PFN_vkCmdExecuteCommands vkCmdExecuteCommands; #ifdef __ANDROID__ - extern PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR; +extern PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR; #elif defined(_WIN32) - extern PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR; +extern PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR; #elif defined(VK_USE_PLATFORM_METAL_EXT) - extern PFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT; +extern PFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT; #endif #if defined(VK_USE_PLATFORM_XLIB_KHR) - extern PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR; +extern PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR; #endif #if defined(VK_USE_PLATFORM_WAYLAND_KHR) - extern PFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR; +extern PFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR; #endif #if defined(VK_USE_PLATFORM_DISPLAY_KHR) - extern PFN_vkCreateDisplayPlaneSurfaceKHR vkCreateDisplayPlaneSurfaceKHR; +extern PFN_vkCreateDisplayPlaneSurfaceKHR vkCreateDisplayPlaneSurfaceKHR; #endif - extern PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR; +extern PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR; - // Simple loader for the WSI extension. - extern PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR; - extern PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR; - extern PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR; - extern PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR; +// Simple loader for the WSI extension. +extern PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR; +extern PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR; +extern PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR; +extern PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR; - extern PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR; - extern PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR; - extern PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR; - extern PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR; - extern PFN_vkQueuePresentKHR vkQueuePresentKHR; +extern PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR; +extern PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR; +extern PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR; +extern PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR; +extern PFN_vkQueuePresentKHR vkQueuePresentKHR; - extern PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT; - extern PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT; - extern PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT; - extern PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT; - extern PFN_vkCmdInsertDebugUtilsLabelEXT vkCmdInsertDebugUtilsLabelEXT; - extern PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectNameEXT; - extern PFN_vkSetDebugUtilsObjectTagEXT vkSetDebugUtilsObjectTagEXT; +extern PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT; +extern PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT; +extern PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT; +extern PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT; +extern PFN_vkCmdInsertDebugUtilsLabelEXT vkCmdInsertDebugUtilsLabelEXT; +extern PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectNameEXT; +extern PFN_vkSetDebugUtilsObjectTagEXT vkSetDebugUtilsObjectTagEXT; - // Assorted other extensions. - extern PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR; - extern PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR; - extern PFN_vkGetMemoryHostPointerPropertiesEXT vkGetMemoryHostPointerPropertiesEXT; - extern PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR; - extern PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR; -} +// Assorted other extensions. +extern PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR; +extern PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR; +extern PFN_vkGetMemoryHostPointerPropertiesEXT vkGetMemoryHostPointerPropertiesEXT; +extern PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR; +extern PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR; +} // namespace PPSSPP_VK // For fast extension-enabled checks. struct VulkanExtensions { diff --git a/Common/GPU/Vulkan/VulkanMemory.cpp b/Common/GPU/Vulkan/VulkanMemory.cpp index 1c8a7da90f..b80adb269a 100644 --- a/Common/GPU/Vulkan/VulkanMemory.cpp +++ b/Common/GPU/Vulkan/VulkanMemory.cpp @@ -24,7 +24,7 @@ #include "Common/TimeUtil.h" #include "Common/GPU/Vulkan/VulkanMemory.h" -using namespace PPSSPP; +using namespace PPSSPP_VK; VulkanPushBuffer::VulkanPushBuffer(VulkanContext *vulkan, size_t size, VkBufferUsageFlags usage, VkMemoryPropertyFlags memoryPropertyMask) : vulkan_(vulkan), memoryPropertyMask_(memoryPropertyMask), size_(size), usage_(usage) { diff --git a/Common/GPU/Vulkan/VulkanQueueRunner.cpp b/Common/GPU/Vulkan/VulkanQueueRunner.cpp index 4f3621bee3..584600e45b 100644 --- a/Common/GPU/Vulkan/VulkanQueueRunner.cpp +++ b/Common/GPU/Vulkan/VulkanQueueRunner.cpp @@ -6,7 +6,7 @@ #include "VulkanQueueRunner.h" #include "VulkanRenderManager.h" -using namespace PPSSPP; +using namespace PPSSPP_VK; // Debug help: adb logcat -s DEBUG PPSSPPNativeActivity PPSSPP NativeGLView NativeRenderer NativeSurfaceView PowerSaveModeReceiver InputDeviceState diff --git a/Common/GPU/Vulkan/VulkanRenderManager.cpp b/Common/GPU/Vulkan/VulkanRenderManager.cpp index d48ea1ca24..e19c085b09 100644 --- a/Common/GPU/Vulkan/VulkanRenderManager.cpp +++ b/Common/GPU/Vulkan/VulkanRenderManager.cpp @@ -20,7 +20,7 @@ #define UINT64_MAX 0xFFFFFFFFFFFFFFFFULL #endif -using namespace PPSSPP; +using namespace PPSSPP_VK; VKRFramebuffer::VKRFramebuffer(VulkanContext *vk, VkCommandBuffer initCmd, VkRenderPass renderPass, int _width, int _height, const char *tag) : vulkan_(vk) { width = _width; diff --git a/Common/GPU/Vulkan/thin3d_vulkan.cpp b/Common/GPU/Vulkan/thin3d_vulkan.cpp index 702c4ea755..807d7ecebf 100644 --- a/Common/GPU/Vulkan/thin3d_vulkan.cpp +++ b/Common/GPU/Vulkan/thin3d_vulkan.cpp @@ -43,7 +43,7 @@ #include "Common/GPU/Vulkan/VulkanLoader.h" -using namespace PPSSPP; +using namespace PPSSPP_VK; namespace Draw { diff --git a/GPU/Vulkan/DrawEngineVulkan.cpp b/GPU/Vulkan/DrawEngineVulkan.cpp index 187988e08e..7a679a8566 100644 --- a/GPU/Vulkan/DrawEngineVulkan.cpp +++ b/GPU/Vulkan/DrawEngineVulkan.cpp @@ -50,7 +50,7 @@ #include "GPU/Vulkan/FramebufferManagerVulkan.h" #include "GPU/Vulkan/GPU_Vulkan.h" -using namespace PPSSPP; +using namespace PPSSPP_VK; enum { VERTEX_CACHE_SIZE = 8192 * 1024 diff --git a/GPU/Vulkan/FramebufferManagerVulkan.cpp b/GPU/Vulkan/FramebufferManagerVulkan.cpp index ce22bd499d..c1a9dd7287 100644 --- a/GPU/Vulkan/FramebufferManagerVulkan.cpp +++ b/GPU/Vulkan/FramebufferManagerVulkan.cpp @@ -48,7 +48,7 @@ #include "GPU/Vulkan/ShaderManagerVulkan.h" #include "GPU/Vulkan/VulkanUtil.h" -using namespace PPSSPP; +using namespace PPSSPP_VK; static const char tex_fs[] = R"(#version 450 #extension GL_ARB_separate_shader_objects : enable diff --git a/GPU/Vulkan/PipelineManagerVulkan.cpp b/GPU/Vulkan/PipelineManagerVulkan.cpp index 3d5d3bd02a..69ac5ee2cc 100644 --- a/GPU/Vulkan/PipelineManagerVulkan.cpp +++ b/GPU/Vulkan/PipelineManagerVulkan.cpp @@ -16,7 +16,7 @@ #include "Common/GPU/Vulkan/VulkanRenderManager.h" #include "Common/GPU/Vulkan/VulkanQueueRunner.h" -using namespace PPSSPP; +using namespace PPSSPP_VK; PipelineManagerVulkan::PipelineManagerVulkan(VulkanContext *vulkan) : pipelines_(256), vulkan_(vulkan) { // The pipeline cache is created on demand (or explicitly through Load). diff --git a/GPU/Vulkan/TextureCacheVulkan.cpp b/GPU/Vulkan/TextureCacheVulkan.cpp index c87e19eaa2..f39c43a730 100644 --- a/GPU/Vulkan/TextureCacheVulkan.cpp +++ b/GPU/Vulkan/TextureCacheVulkan.cpp @@ -50,7 +50,7 @@ #include "GPU/Vulkan/ShaderManagerVulkan.h" #include "GPU/Vulkan/DrawEngineVulkan.h" -using namespace PPSSPP; +using namespace PPSSPP_VK; #define TEXCACHE_MIN_SLAB_SIZE (8 * 1024 * 1024) #define TEXCACHE_MAX_SLAB_SIZE (32 * 1024 * 1024) diff --git a/GPU/Vulkan/VulkanUtil.cpp b/GPU/Vulkan/VulkanUtil.cpp index 4f94daa0fc..aa905d46e6 100644 --- a/GPU/Vulkan/VulkanUtil.cpp +++ b/GPU/Vulkan/VulkanUtil.cpp @@ -20,7 +20,7 @@ #include "Common/GPU/Vulkan/VulkanContext.h" #include "GPU/Vulkan/VulkanUtil.h" -using namespace PPSSPP; +using namespace PPSSPP_VK; const VkComponentMapping VULKAN_4444_SWIZZLE = { VK_COMPONENT_SWIZZLE_A, VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B }; const VkComponentMapping VULKAN_1555_SWIZZLE = { VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_A }; diff --git a/libretro/libretro_vulkan.cpp b/libretro/libretro_vulkan.cpp index 388c19d3ea..99fe6ee1ee 100644 --- a/libretro/libretro_vulkan.cpp +++ b/libretro/libretro_vulkan.cpp @@ -19,7 +19,7 @@ #define VK_NO_PROTOTYPES #include "libretro/libretro_vulkan.h" -using namespace PPSSPP; +using namespace PPSSPP_VK; static retro_hw_render_interface_vulkan *vulkan; From f1f5fbd3bbf9a6e1c72e280cd09121ad0e386781 Mon Sep 17 00:00:00 2001 From: Bram Verweij Date: Sat, 21 Aug 2021 12:44:25 +0200 Subject: [PATCH 179/336] Remove unintended whitespace changes --- Common/GPU/Vulkan/VulkanLoader.cpp | 8 ++++---- Common/GPU/Vulkan/VulkanLoader.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Common/GPU/Vulkan/VulkanLoader.cpp b/Common/GPU/Vulkan/VulkanLoader.cpp index 8c0520b339..3666fc72e7 100644 --- a/Common/GPU/Vulkan/VulkanLoader.cpp +++ b/Common/GPU/Vulkan/VulkanLoader.cpp @@ -117,7 +117,7 @@ PFN_vkDestroyCommandPool vkDestroyCommandPool; PFN_vkResetCommandPool vkResetCommandPool; PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers; PFN_vkFreeCommandBuffers vkFreeCommandBuffers; - + // Used frequently together PFN_vkCmdBindPipeline vkCmdBindPipeline; PFN_vkCmdSetViewport vkCmdSetViewport; @@ -133,7 +133,7 @@ PFN_vkCmdDraw vkCmdDraw; PFN_vkCmdDrawIndexed vkCmdDrawIndexed; PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier; PFN_vkCmdPushConstants vkCmdPushConstants; - + // Every frame to a few times per frame PFN_vkWaitForFences vkWaitForFences; PFN_vkResetFences vkResetFences; @@ -151,7 +151,7 @@ PFN_vkCmdCopyImage vkCmdCopyImage; PFN_vkCmdBlitImage vkCmdBlitImage; PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage; PFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer; - + // Rare or not used PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds; PFN_vkCmdSetLineWidth vkCmdSetLineWidth; @@ -172,7 +172,7 @@ PFN_vkCmdWriteTimestamp vkCmdWriteTimestamp; PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults; PFN_vkCmdNextSubpass vkCmdNextSubpass; PFN_vkCmdExecuteCommands vkCmdExecuteCommands; - + #ifdef __ANDROID__ PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR; #elif defined(_WIN32) diff --git a/Common/GPU/Vulkan/VulkanLoader.h b/Common/GPU/Vulkan/VulkanLoader.h index d5af22c108..5808ae8076 100644 --- a/Common/GPU/Vulkan/VulkanLoader.h +++ b/Common/GPU/Vulkan/VulkanLoader.h @@ -197,7 +197,7 @@ extern PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSuppor extern PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR; extern PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR; extern PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR; - + extern PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR; extern PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR; extern PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR; From a74e1a422d2d7b93707a9ded7baa9a5d5a8b1989 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 21 Aug 2021 20:58:25 +0200 Subject: [PATCH 180/336] GameScreen: Minor logic cleanup, remove Calculate CRC button when not needed. --- Core/MIPS/fake/FakeJit.h | 140 +++++++++++++++++++-------------------- Core/Reporting.cpp | 17 ++++- Core/Reporting.h | 2 + UI/GameScreen.cpp | 16 ++++- UI/GameScreen.h | 25 ++++--- 5 files changed, 115 insertions(+), 85 deletions(-) diff --git a/Core/MIPS/fake/FakeJit.h b/Core/MIPS/fake/FakeJit.h index 8c3403d566..42aa342c67 100644 --- a/Core/MIPS/fake/FakeJit.h +++ b/Core/MIPS/fake/FakeJit.h @@ -35,16 +35,16 @@ class FakeJit : public FakeGen::FakeXCodeBlock, public JitInterface, public MIPS public: FakeJit(MIPSState *mipsState); - void DoState(PointerWrap &p); + void DoState(PointerWrap &p) override; static void DoDummyState(PointerWrap &p); const JitOptions &GetJitOptions() { return jo; } - void Comp_Generic(MIPSOpcode op); + void Comp_Generic(MIPSOpcode op) override; - void RunLoopUntil(u64 globalticks); + void RunLoopUntil(u64 globalticks) override; - void Compile(u32 em_address); // Compiles a block at current MIPS PC + void Compile(u32 em_address) override; // Compiles a block at current MIPS PC const u8 *DoJit(u32 em_address, JitBlock *b); const u8 *GetCrashHandler() const override { return nullptr; } @@ -55,80 +55,80 @@ public: void EatInstruction(MIPSOpcode op); void AddContinuedBlock(u32 dest); - void Comp_RunBlock(MIPSOpcode op); - void Comp_ReplacementFunc(MIPSOpcode op); + void Comp_RunBlock(MIPSOpcode op) override; + void Comp_ReplacementFunc(MIPSOpcode op) override; // Ops - void Comp_ITypeMem(MIPSOpcode op) {} - void Comp_Cache(MIPSOpcode op) {} + void Comp_ITypeMem(MIPSOpcode op) override {} + void Comp_Cache(MIPSOpcode op) override {} - void Comp_RelBranch(MIPSOpcode op) {} - void Comp_RelBranchRI(MIPSOpcode op) {} - void Comp_FPUBranch(MIPSOpcode op) {} - void Comp_FPULS(MIPSOpcode op) {} - void Comp_FPUComp(MIPSOpcode op) {} - void Comp_Jump(MIPSOpcode op) {} - void Comp_JumpReg(MIPSOpcode op) {} - void Comp_Syscall(MIPSOpcode op) {} - void Comp_Break(MIPSOpcode op) {} + void Comp_RelBranch(MIPSOpcode op) override {} + void Comp_RelBranchRI(MIPSOpcode op) override {} + void Comp_FPUBranch(MIPSOpcode op) override {} + void Comp_FPULS(MIPSOpcode op) override {} + void Comp_FPUComp(MIPSOpcode op) override {} + void Comp_Jump(MIPSOpcode op) override {} + void Comp_JumpReg(MIPSOpcode op) override {} + void Comp_Syscall(MIPSOpcode op) override {} + void Comp_Break(MIPSOpcode op) override {} - void Comp_IType(MIPSOpcode op) {} - void Comp_RType2(MIPSOpcode op) {} - void Comp_RType3(MIPSOpcode op) {} - void Comp_ShiftType(MIPSOpcode op) {} - void Comp_Allegrex(MIPSOpcode op) {} - void Comp_Allegrex2(MIPSOpcode op) {} - void Comp_VBranch(MIPSOpcode op) {} - void Comp_MulDivType(MIPSOpcode op) {} - void Comp_Special3(MIPSOpcode op) {} + void Comp_IType(MIPSOpcode op) override {} + void Comp_RType2(MIPSOpcode op) override {} + void Comp_RType3(MIPSOpcode op) override {} + void Comp_ShiftType(MIPSOpcode op) override {} + void Comp_Allegrex(MIPSOpcode op) override {} + void Comp_Allegrex2(MIPSOpcode op) override {} + void Comp_VBranch(MIPSOpcode op) override {} + void Comp_MulDivType(MIPSOpcode op) override {} + void Comp_Special3(MIPSOpcode op) override {} - void Comp_FPU3op(MIPSOpcode op) {} - void Comp_FPU2op(MIPSOpcode op) {} - void Comp_mxc1(MIPSOpcode op) {} + void Comp_FPU3op(MIPSOpcode op) override {} + void Comp_FPU2op(MIPSOpcode op) override {} + void Comp_mxc1(MIPSOpcode op) override {} - void Comp_DoNothing(MIPSOpcode op) {} + void Comp_DoNothing(MIPSOpcode op) override {} - void Comp_SV(MIPSOpcode op) {} - void Comp_SVQ(MIPSOpcode op) {} - void Comp_VPFX(MIPSOpcode op) {} - void Comp_VVectorInit(MIPSOpcode op) {} - void Comp_VMatrixInit(MIPSOpcode op) {} - void Comp_VDot(MIPSOpcode op) {} - void Comp_VecDo3(MIPSOpcode op) {} - void Comp_VV2Op(MIPSOpcode op) {} - void Comp_Mftv(MIPSOpcode op) {} - void Comp_Vmfvc(MIPSOpcode op) {} - void Comp_Vmtvc(MIPSOpcode op) {} - void Comp_Vmmov(MIPSOpcode op) {} - void Comp_VScl(MIPSOpcode op) {} - void Comp_Vmmul(MIPSOpcode op) {} - void Comp_Vmscl(MIPSOpcode op) {} - void Comp_Vtfm(MIPSOpcode op) {} - void Comp_VHdp(MIPSOpcode op) {} - void Comp_VCrs(MIPSOpcode op) {} - void Comp_VDet(MIPSOpcode op) {} - void Comp_Vi2x(MIPSOpcode op) {} - void Comp_Vx2i(MIPSOpcode op) {} - void Comp_Vf2i(MIPSOpcode op) {} - void Comp_Vi2f(MIPSOpcode op) {} - void Comp_Vh2f(MIPSOpcode op) {} - void Comp_Vcst(MIPSOpcode op) {} - void Comp_Vhoriz(MIPSOpcode op) {} - void Comp_VRot(MIPSOpcode op) {} - void Comp_VIdt(MIPSOpcode op) {} - void Comp_Vcmp(MIPSOpcode op) {} - void Comp_Vcmov(MIPSOpcode op) {} - void Comp_Viim(MIPSOpcode op) {} - void Comp_Vfim(MIPSOpcode op) {} - void Comp_VCrossQuat(MIPSOpcode op) {} - void Comp_Vsgn(MIPSOpcode op) {} - void Comp_Vocp(MIPSOpcode op) {} - void Comp_ColorConv(MIPSOpcode op) {} - void Comp_Vbfy(MIPSOpcode op) {} + void Comp_SV(MIPSOpcode op) override {} + void Comp_SVQ(MIPSOpcode op) override {} + void Comp_VPFX(MIPSOpcode op) override {} + void Comp_VVectorInit(MIPSOpcode op) override {} + void Comp_VMatrixInit(MIPSOpcode op) override {} + void Comp_VDot(MIPSOpcode op) override {} + void Comp_VecDo3(MIPSOpcode op) override {} + void Comp_VV2Op(MIPSOpcode op) override {} + void Comp_Mftv(MIPSOpcode op) override {} + void Comp_Vmfvc(MIPSOpcode op) override {} + void Comp_Vmtvc(MIPSOpcode op) override {} + void Comp_Vmmov(MIPSOpcode op) override {} + void Comp_VScl(MIPSOpcode op) override {} + void Comp_Vmmul(MIPSOpcode op) override {} + void Comp_Vmscl(MIPSOpcode op) override {} + void Comp_Vtfm(MIPSOpcode op) override {} + void Comp_VHdp(MIPSOpcode op) override {} + void Comp_VCrs(MIPSOpcode op) override {} + void Comp_VDet(MIPSOpcode op) override {} + void Comp_Vi2x(MIPSOpcode op) override {} + void Comp_Vx2i(MIPSOpcode op) override {} + void Comp_Vf2i(MIPSOpcode op) override {} + void Comp_Vi2f(MIPSOpcode op) override {} + void Comp_Vh2f(MIPSOpcode op) override {} + void Comp_Vcst(MIPSOpcode op) override {} + void Comp_Vhoriz(MIPSOpcode op) override {} + void Comp_VRot(MIPSOpcode op) override {} + void Comp_VIdt(MIPSOpcode op) override {} + void Comp_Vcmp(MIPSOpcode op) override {} + void Comp_Vcmov(MIPSOpcode op) override {} + void Comp_Viim(MIPSOpcode op) override {} + void Comp_Vfim(MIPSOpcode op) override {} + void Comp_VCrossQuat(MIPSOpcode op) override {} + void Comp_Vsgn(MIPSOpcode op) override {} + void Comp_Vocp(MIPSOpcode op) override {} + void Comp_ColorConv(MIPSOpcode op) override {} + void Comp_Vbfy(MIPSOpcode op) override {} - int Replace_fabsf() { return 0; } + int Replace_fabsf() override { return 0; } - JitBlockCache *GetBlockCache() { return &blocks; } + JitBlockCache *GetBlockCache() override { return &blocks; } JitBlockCacheDebugInterface *GetBlockCacheDebugInterface() override { return &blocks; } MIPSOpcode GetOriginalOp(MIPSOpcode op) override { return op; } @@ -147,7 +147,7 @@ public: void LinkBlock(u8 *exitPoint, const u8 *checkedEntry) override {} void UnlinkBlock(u8 *checkedEntry, u32 originalAddress) override {} - void EatPrefix() { js.EatPrefix(); } + void EatPrefix() override { js.EatPrefix(); } private: void GenerateFixedCode(); diff --git a/Core/Reporting.cpp b/Core/Reporting.cpp index 49e9565564..c5bab7ac6e 100644 --- a/Core/Reporting.cpp +++ b/Core/Reporting.cpp @@ -138,9 +138,11 @@ namespace Reporting if (crcPending) { // Already in process. + INFO_LOG(SYSTEM, "CRC already pending"); return; } + INFO_LOG(SYSTEM, "Starting CRC calculation"); crcFilename = gamePath; crcPending = true; crcCancel = false; @@ -178,15 +180,24 @@ namespace Reporting static void PurgeCRC() { std::unique_lock guard(crcLock); - crcCancel = true; - while (crcPending) { - crcCond.wait(guard); + if (crcPending) { + INFO_LOG(SYSTEM, "Cancelling CRC calculation"); + crcCancel = true; + while (crcPending) { + crcCond.wait(guard); + } + } else { + INFO_LOG(SYSTEM, "no CRC pending"); } if (crcThread.joinable()) crcThread.join(); } + void CancelCRC() { + PurgeCRC(); + } + // Returns the full host (e.g. report.ppsspp.org:80.) std::string ServerHost() { diff --git a/Core/Reporting.h b/Core/Reporting.h index fb16689bf8..4971d4b489 100644 --- a/Core/Reporting.h +++ b/Core/Reporting.h @@ -63,6 +63,8 @@ namespace Reporting // Returns true if the hash is available, does not queue if not. bool HasCRC(const Path &gamePath); + void CancelCRC(); + // Blocks until the CRC hash is available for game, and returns it. // To avoid stalling, call HasCRC() in update() or similar and call this if it returns true. uint32_t RetrieveCRC(const Path &gamePath); diff --git a/UI/GameScreen.cpp b/UI/GameScreen.cpp index 567d06e2c4..02d2c57c25 100644 --- a/UI/GameScreen.cpp +++ b/UI/GameScreen.cpp @@ -49,6 +49,9 @@ GameScreen::GameScreen(const Path &gamePath) : UIDialogScreenWithGameBackground( } GameScreen::~GameScreen() { + if (CRC32string == "...") { + Reporting::CancelCRC(); + } } template std::string int2hexstr(I w, size_t hex_len = sizeof(I) << 1) { @@ -68,6 +71,9 @@ void GameScreen::update() { if (Reporting::HasCRC(gamePath_)) { uint32_t crcvalue = Reporting::RetrieveCRC(gamePath_); CRC32string = int2hexstr(crcvalue); + tvCRC_->SetVisibility(UI::V_VISIBLE); + tvCRC_->SetText(CRC32string); + btnCalcCRC_->SetVisibility(UI::V_GONE); } } } @@ -171,7 +177,13 @@ void GameScreen::CreateViews() { btnSetBackground_ = rightColumnItems->Add(new Choice(ga->T("Use UI background"))); btnSetBackground_->OnClick.Handle(this, &GameScreen::OnSetBackground); btnSetBackground_->SetVisibility(V_GONE); - rightColumnItems->Add(new ChoiceWithValueDisplay(&CRC32string, ga->T("CRC32 CALC"), (const char*)nullptr))->OnClick.Handle(this, &GameScreen::OnDoCRC32); + + if (!Reporting::HasCRC(gamePath_)) { + btnCalcCRC_ = rightColumnItems->Add(new ChoiceWithValueDisplay(&CRC32string, ga->T("Calculate CRC"), (const char*)nullptr)); + btnCalcCRC_->OnClick.Handle(this, &GameScreen::OnDoCRC32); + } else { + btnCalcCRC_ = nullptr; + } } UI::Choice *GameScreen::AddOtherChoice(UI::Choice *choice) { @@ -303,6 +315,8 @@ UI::EventReturn GameScreen::OnCwCheat(UI::EventParams &e) { UI::EventReturn GameScreen::OnDoCRC32(UI::EventParams& e) { CRC32string = "..."; + Reporting::QueueCRC(gamePath_); + btnCalcCRC_->SetEnabled(false); return UI::EVENT_DONE; } diff --git a/UI/GameScreen.h b/UI/GameScreen.h index 974ba8424d..1cae1f79f5 100644 --- a/UI/GameScreen.h +++ b/UI/GameScreen.h @@ -66,18 +66,21 @@ private: UI::EventReturn OnDoCRC32(UI::EventParams& e); // As we load metadata in the background, we need to be able to update these after the fact. - UI::TextView *tvTitle_; - UI::TextView *tvGameSize_; - UI::TextView *tvSaveDataSize_; - UI::TextView *tvInstallDataSize_; - UI::TextView *tvRegion_; - UI::TextView *tvCRC_; + UI::TextView *tvTitle_ = nullptr; + UI::TextView *tvGameSize_ = nullptr; + UI::TextView *tvSaveDataSize_ = nullptr; + UI::TextView *tvInstallDataSize_ = nullptr; + UI::TextView *tvRegion_ = nullptr; + UI::TextView *tvCRC_ = nullptr; + + UI::Choice *btnGameSettings_ = nullptr; + UI::Choice *btnCreateGameConfig_ = nullptr; + UI::Choice *btnDeleteGameConfig_ = nullptr; + UI::Choice *btnDeleteSaveData_ = nullptr; + UI::Choice *btnSetBackground_ = nullptr; + + UI::Choice *btnCalcCRC_ = nullptr; - UI::Choice *btnGameSettings_; - UI::Choice *btnCreateGameConfig_; - UI::Choice *btnDeleteGameConfig_; - UI::Choice *btnDeleteSaveData_; - UI::Choice *btnSetBackground_; std::vector otherChoices_; std::vector saveDirs; std::string CRC32string; From de68436084786708b1e6dee97be3a1ef01916795 Mon Sep 17 00:00:00 2001 From: iota97 Date: Sun, 11 Jul 2021 17:51:10 +0200 Subject: [PATCH 181/336] Configurable analog head size --- Core/Config.cpp | 6 ++++++ Core/Config.h | 4 ++++ UI/GameSettingsScreen.cpp | 4 ++++ UI/GamepadEmu.cpp | 23 +++++++++++++------- UI/TouchControlLayoutScreen.cpp | 37 +++++++++++++++++++++++++++++++-- 5 files changed, 64 insertions(+), 10 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index 6b21897453..e961bb02d9 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -1024,6 +1024,10 @@ static ConfigSetting controlSettings[] = { ConfigSetting("AnalogLimiterDeadzone", &g_Config.fAnalogLimiterDeadzone, 0.6f, true, true), + ConfigSetting("LeftStickHeadScale", &g_Config.fLeftStickHeadScale, 1.0f, true, true), + ConfigSetting("RightStickHeadScale", &g_Config.fRightStickHeadScale, 1.0f, true, true), + ConfigSetting("HideStickBackground", &g_Config.bHideStickBackground, false, true, true), + ConfigSetting("UseMouse", &g_Config.bMouseControl, false, true, true), ConfigSetting("MapMouse", &g_Config.bMapMouse, false, true, true), ConfigSetting("ConfineMap", &g_Config.bMouseConfine, false, true, true), @@ -1850,6 +1854,8 @@ void Config::ResetControlLayout() { reset(g_Config.touchCombo7); reset(g_Config.touchCombo8); reset(g_Config.touchCombo9); + g_Config.fLeftStickHeadScale = 1.0f; + g_Config.fRightStickHeadScale = 1.0f; } void Config::GetReportingInfo(UrlEncoder &data) { diff --git a/Core/Config.h b/Core/Config.h index ce00dafe3c..f3296299f3 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -366,6 +366,10 @@ public: ConfigTouchPos touchCombo8; ConfigTouchPos touchCombo9; + float fLeftStickHeadScale; + float fRightStickHeadScale; + bool bHideStickBackground; + // Controls Visibility bool bShowTouchControls; diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 16cd4c4c3c..f8b633e53b 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -704,6 +704,10 @@ void GameSettingsScreen::CreateViews() { CheckBox *floatingAnalog = controlsSettings->Add(new CheckBox(&g_Config.bAutoCenterTouchAnalog, co->T("Auto-centering analog stick"))); floatingAnalog->SetEnabledPtr(&g_Config.bShowTouchControls); + // Hide stick background, usefull when increasing the size + CheckBox *hideStickBackground = controlsSettings->Add(new CheckBox(&g_Config.bHideStickBackground, co->T("Hide touch analog stick background circle"))); + hideStickBackground->SetEnabledPtr(&g_Config.bShowTouchControls); + // On non iOS systems, offer to let the user see this button. // Some Windows touch devices don't have a back button or other button to call up the menu. if (System_GetPropertyBool(SYSPROP_HAS_BACK_BUTTON)) { diff --git a/UI/GamepadEmu.cpp b/UI/GamepadEmu.cpp index c5ef3f4cca..3985d31242 100644 --- a/UI/GamepadEmu.cpp +++ b/UI/GamepadEmu.cpp @@ -351,6 +351,8 @@ PSPStick::PSPStick(ImageID bgImg, const char *key, ImageID stickImg, ImageID sti void PSPStick::GetContentDimensions(const UIContext &dc, float &w, float &h) const { dc.Draw()->GetAtlas()->measureImage(bgImg_, &w, &h); + w *= scale_; + h *= scale_; } void PSPStick::Draw(UIContext &dc) { @@ -376,10 +378,12 @@ void PSPStick::Draw(UIContext &dc) { float dx, dy; __CtrlPeekAnalog(stick_, &dx, &dy); - dc.Draw()->DrawImage(bgImg_, stickX, stickY, 1.0f * scale_, colorBg, ALIGN_CENTER); + if (!g_Config.bHideStickBackground) + dc.Draw()->DrawImage(bgImg_, stickX, stickY, 1.0f * scale_, colorBg, ALIGN_CENTER); + float headScale = stick_ ? g_Config.fRightStickHeadScale : g_Config.fLeftStickHeadScale; if (dragPointerId_ != -1 && g_Config.iTouchButtonStyle == 2 && stickDownImg_ != stickImageIndex_) - dc.Draw()->DrawImage(stickDownImg_, stickX + dx * stick_size_ * scale_, stickY - dy * stick_size_ * scale_, 1.0f * scale_, downBg, ALIGN_CENTER); - dc.Draw()->DrawImage(stickImageIndex_, stickX + dx * stick_size_ * scale_, stickY - dy * stick_size_ * scale_, 1.0f * scale_, colorBg, ALIGN_CENTER); + dc.Draw()->DrawImage(stickDownImg_, stickX + dx * stick_size_ * scale_, stickY - dy * stick_size_ * scale_, 1.0f * scale_ * headScale, downBg, ALIGN_CENTER); + dc.Draw()->DrawImage(stickImageIndex_, stickX + dx * stick_size_ * scale_, stickY - dy * stick_size_ * scale_, 1.0f * scale_ * headScale, colorBg, ALIGN_CENTER); } void PSPStick::Touch(const TouchInput &input) { @@ -392,7 +396,8 @@ void PSPStick::Touch(const TouchInput &input) { return; } if (input.flags & TOUCH_DOWN) { - if (dragPointerId_ == -1 && bounds_.Contains(input.x, input.y)) { + float fac = 0.5f*(stick_ ? g_Config.fRightStickHeadScale : g_Config.fLeftStickHeadScale)-0.5f; + if (dragPointerId_ == -1 && bounds_.Expand(bounds_.w*fac, bounds_.h*fac).Contains(input.x, input.y)) { if (g_Config.bAutoCenterTouchAnalog) { centerX_ = input.x; centerY_ = input.y; @@ -472,10 +477,11 @@ void PSPCustomStick::Draw(UIContext &dc) { dx = posX_; dy = -posY_; - dc.Draw()->DrawImage(bgImg_, stickX, stickY, 1.0f * scale_, colorBg, ALIGN_CENTER); + if (!g_Config.bHideStickBackground) + dc.Draw()->DrawImage(bgImg_, stickX, stickY, 1.0f * scale_, colorBg, ALIGN_CENTER); if (dragPointerId_ != -1 && g_Config.iTouchButtonStyle == 2 && stickDownImg_ != stickImageIndex_) - dc.Draw()->DrawImage(stickDownImg_, stickX + dx * stick_size_ * scale_, stickY - dy * stick_size_ * scale_, 1.0f * scale_, downBg, ALIGN_CENTER); - dc.Draw()->DrawImage(stickImageIndex_, stickX + dx * stick_size_ * scale_, stickY - dy * stick_size_ * scale_, 1.0f * scale_, colorBg, ALIGN_CENTER); + dc.Draw()->DrawImage(stickDownImg_, stickX + dx * stick_size_ * scale_, stickY - dy * stick_size_ * scale_, 1.0f*scale_*g_Config.fRightStickHeadScale, downBg, ALIGN_CENTER); + dc.Draw()->DrawImage(stickImageIndex_, stickX + dx * stick_size_ * scale_, stickY - dy * stick_size_ * scale_, 1.0f*scale_*g_Config.fRightStickHeadScale, colorBg, ALIGN_CENTER); } void PSPCustomStick::Touch(const TouchInput &input) { @@ -489,7 +495,8 @@ void PSPCustomStick::Touch(const TouchInput &input) { return; } if (input.flags & TOUCH_DOWN) { - if (dragPointerId_ == -1 && bounds_.Contains(input.x, input.y)) { + float fac = 0.5f*g_Config.fRightStickHeadScale-0.5f; + if (dragPointerId_ == -1 && bounds_.Expand(bounds_.w*fac, bounds_.h*fac).Contains(input.x, input.y)) { if (g_Config.bAutoCenterTouchAnalog) { centerX_ = input.x; centerY_ = input.y; diff --git a/UI/TouchControlLayoutScreen.cpp b/UI/TouchControlLayoutScreen.cpp index 18fe8a2a5a..ff3c5c2e27 100644 --- a/UI/TouchControlLayoutScreen.cpp +++ b/UI/TouchControlLayoutScreen.cpp @@ -284,6 +284,35 @@ private: float &spacing_; }; +class PSPStickDragDrop : public DragDropButton { +public: + PSPStickDragDrop(ConfigTouchPos &pos, const char *key, ImageID bgImg, ImageID img, const Bounds &screenBounds, float &spacing) + : DragDropButton(pos, key, bgImg, img, screenBounds), spacing_(spacing) { + } + + void Draw(UIContext &dc) override { + float opacity = g_Config.iTouchButtonOpacity / 100.0f; + + uint32_t colorBg = colorAlpha(GetButtonColor(), opacity); + uint32_t downBg = colorAlpha(0x00FFFFFF, opacity * 0.5f); + + const ImageID stickImage = g_Config.iTouchButtonStyle ? ImageID("I_STICK_LINE") : ImageID("I_STICK"); + const ImageID stickBg = g_Config.iTouchButtonStyle ? ImageID("I_STICK_BG_LINE") : ImageID("I_STICK_BG"); + + dc.Draw()->DrawImage(stickBg, bounds_.centerX(), bounds_.centerY(), scale_, colorBg, ALIGN_CENTER); + dc.Draw()->DrawImage(stickImage, bounds_.centerX(), bounds_.centerY(), scale_ * spacing_, colorBg, ALIGN_CENTER); + } + + float GetSpacing() const override { return spacing_; } + void SetSpacing(float s) override { + // In mapping spacing is clamped between 0.5 and 3.0 and passed to this method + spacing_ = s/3; + } + +private: + float &spacing_; +}; + class SnapGrid : public UI::View { public: SnapGrid(int leftMargin, int rightMargin, int topMargin, int bottomMargin, u32 color) { @@ -471,8 +500,12 @@ void ControlLayoutView::CreateViews() { rbutton->FlipImageH(true); } - addDragDropButton(g_Config.touchAnalogStick, "Left analog stick", stickBg, stickImage); - addDragDropButton(g_Config.touchRightAnalogStick, "Right analog stick", stickBg, stickImage); + if (g_Config.touchAnalogStick.show) { + controls_.push_back(new PSPStickDragDrop(g_Config.touchAnalogStick, "Left analog stick", stickBg, stickImage, bounds, g_Config.fLeftStickHeadScale)); + } + if (g_Config.touchRightAnalogStick.show) { + controls_.push_back(new PSPStickDragDrop(g_Config.touchRightAnalogStick, "Right analog stick", stickBg, stickImage, bounds, g_Config.fRightStickHeadScale)); + } auto addDragComboKey = [&](ConfigTouchPos &pos, const char *key, const ConfigCustomButton& cfg) { DragDropButton *b = nullptr; From d0af5275bae65ef1086c91b6cb7101ff6352ba12 Mon Sep 17 00:00:00 2001 From: iota97 Date: Sat, 21 Aug 2021 21:30:37 +0200 Subject: [PATCH 182/336] Fix opacity --- UI/TouchControlLayoutScreen.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/UI/TouchControlLayoutScreen.cpp b/UI/TouchControlLayoutScreen.cpp index ff3c5c2e27..4cb21ea517 100644 --- a/UI/TouchControlLayoutScreen.cpp +++ b/UI/TouchControlLayoutScreen.cpp @@ -291,10 +291,8 @@ public: } void Draw(UIContext &dc) override { - float opacity = g_Config.iTouchButtonOpacity / 100.0f; - - uint32_t colorBg = colorAlpha(GetButtonColor(), opacity); - uint32_t downBg = colorAlpha(0x00FFFFFF, opacity * 0.5f); + uint32_t colorBg = colorAlpha(GetButtonColor(), GetButtonOpacity()); + uint32_t downBg = colorAlpha(0x00FFFFFF, GetButtonOpacity() * 0.5f); const ImageID stickImage = g_Config.iTouchButtonStyle ? ImageID("I_STICK_LINE") : ImageID("I_STICK"); const ImageID stickBg = g_Config.iTouchButtonStyle ? ImageID("I_STICK_BG_LINE") : ImageID("I_STICK_BG"); From 37b78fd40e6178da4ba9f0da44ef5818d29d1e4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 21 Aug 2021 21:52:28 +0200 Subject: [PATCH 183/336] Don't default to Vulkan on any 32-bit Android devices. See issue #14439 --- Core/Config.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index 6b21897453..ef6b65891d 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -668,11 +668,15 @@ static int DefaultGPUBackend() { return (int)GPUBackend::DIRECT3D11; } #elif PPSSPP_PLATFORM(ANDROID) - // Default to Vulkan only on Oreo 8.1 (level 27) devices or newer. Drivers before - // were generally too unreliable to default to (with some exceptions, of course). + // Default to Vulkan only on Oreo 8.1 (level 27) devices or newer, and only + // on ARM64 and x86-64. Drivers before, and on other archs, are generally too + // unreliable to default to (with some exceptions, of course). +#if PPSSPP_ARCH(64BIT) if (System_GetPropertyInt(SYSPROP_SYSTEMVERSION) >= 27) { return (int)GPUBackend::VULKAN; } +#endif + #endif // TODO: On some additional Linux platforms, we should also default to Vulkan. return (int)GPUBackend::OPENGL; From d27517758ed4dddfc42eabc4b511813ded2f25ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 21 Aug 2021 22:18:25 +0200 Subject: [PATCH 184/336] Auto-default Sony Bravia TVs to OpenGL. --- Core/Config.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Core/Config.cpp b/Core/Config.cpp index ef6b65891d..fa8d232dc6 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -661,6 +661,11 @@ static int DefaultAndroidHwScale() { #endif } +// See issue 14439. Should possibly even block these devices from selecting VK. +const char * const vulkanDefaultBlacklist[] = { + "Sony:BRAVIA VH1", +}; + static int DefaultGPUBackend() { #if PPSSPP_PLATFORM(WINDOWS) // If no Vulkan, use Direct3D 11 on Windows 8+ (most importantly 10.) @@ -668,6 +673,13 @@ static int DefaultGPUBackend() { return (int)GPUBackend::DIRECT3D11; } #elif PPSSPP_PLATFORM(ANDROID) + // Check blacklist. + for (size_t i = 0; i < ARRAY_SIZE(vulkanDefaultBlacklist); i++) { + if (System_GetProperty(SYSPROP_NAME) == vulkanDefaultBlacklist[i]) { + return (int)GPUBackend::OPENGL; + } + } + // Default to Vulkan only on Oreo 8.1 (level 27) devices or newer, and only // on ARM64 and x86-64. Drivers before, and on other archs, are generally too // unreliable to default to (with some exceptions, of course). From 1fc43b4ea2358230a50a8625ebac680d85ae6080 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 21 Aug 2021 23:44:02 +0200 Subject: [PATCH 185/336] Android: Remove the old limitation of 3 registered input devices. --- .../src/org/ppsspp/ppsspp/NativeActivity.java | 42 +++++-------------- 1 file changed, 11 insertions(+), 31 deletions(-) diff --git a/android/src/org/ppsspp/ppsspp/NativeActivity.java b/android/src/org/ppsspp/ppsspp/NativeActivity.java index ef46b87ae8..cd03716ae3 100644 --- a/android/src/org/ppsspp/ppsspp/NativeActivity.java +++ b/android/src/org/ppsspp/ppsspp/NativeActivity.java @@ -108,10 +108,7 @@ public abstract class NativeActivity extends Activity { // Allow for multiple connected gamepads but just consider them the same for now. // Actually this is not entirely true, see the code. - private InputDeviceState inputPlayerA; - private InputDeviceState inputPlayerB; - private InputDeviceState inputPlayerC; - private String inputPlayerADesc; + private ArrayList inputPlayers; private PowerSaveModeReceiver mPowerSaveModeReceiver = null; private SizeManager sizeManager = null; @@ -918,35 +915,18 @@ public abstract class NativeActivity extends Activity { if (device == null) { return null; } - if (inputPlayerA == null) { - inputPlayerADesc = getInputDesc(device); - Log.i(TAG, "Input player A registered: desc = " + inputPlayerADesc); - inputPlayerA = new InputDeviceState(device); + + for (InputDeviceState input : inputPlayers) { + if (input.getDevice() == device) { + return input; + } } - if (inputPlayerA.getDevice() == device) { - return inputPlayerA; - } - - if (inputPlayerB == null) { - Log.i(TAG, "Input player B registered: desc = " + getInputDesc(device)); - inputPlayerB = new InputDeviceState(device); - } - - if (inputPlayerB.getDevice() == device) { - return inputPlayerB; - } - - if (inputPlayerC == null) { - Log.i(TAG, "Input player C registered"); - inputPlayerC = new InputDeviceState(device); - } - - if (inputPlayerC.getDevice() == device) { - return inputPlayerC; - } - - return inputPlayerA; + // None was found, just add and return it. + InputDeviceState state = new InputDeviceState(device); + inputPlayers.add(state); + Log.i(TAG, "Input player registered: desc = " + getInputDesc(device)); + return state; } public boolean IsXperiaPlay() { From c151b7858bc82f0233b029e9a10afa0a83e30629 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 22 Aug 2021 00:12:47 +0200 Subject: [PATCH 186/336] Bugfix --- android/src/org/ppsspp/ppsspp/NativeActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/src/org/ppsspp/ppsspp/NativeActivity.java b/android/src/org/ppsspp/ppsspp/NativeActivity.java index cd03716ae3..6808ce1161 100644 --- a/android/src/org/ppsspp/ppsspp/NativeActivity.java +++ b/android/src/org/ppsspp/ppsspp/NativeActivity.java @@ -108,7 +108,7 @@ public abstract class NativeActivity extends Activity { // Allow for multiple connected gamepads but just consider them the same for now. // Actually this is not entirely true, see the code. - private ArrayList inputPlayers; + private ArrayList inputPlayers = new ArrayList(); private PowerSaveModeReceiver mPowerSaveModeReceiver = null; private SizeManager sizeManager = null; From c8081f7f449d78822fd1f8c57477ee4bfa4c514b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 22 Aug 2021 00:13:01 +0200 Subject: [PATCH 187/336] Fix navigating the analog stick calibration screen with just a gamepad --- UI/ControlMappingScreen.cpp | 8 +++++--- UI/ControlMappingScreen.h | 1 - 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/UI/ControlMappingScreen.cpp b/UI/ControlMappingScreen.cpp index 5e83b869de..574e795ddd 100644 --- a/UI/ControlMappingScreen.cpp +++ b/UI/ControlMappingScreen.cpp @@ -579,15 +579,17 @@ void AnalogSetupScreen::update() { } bool AnalogSetupScreen::key(const KeyInput &key) { - // Allow testing auto-rotation + bool retval = UIScreen::key(key); + + // Allow testing auto-rotation. If it collides with UI keys, too bad. bool pauseTrigger = false; mapper_.Key(key, &pauseTrigger); if (UI::IsEscapeKey(key)) { TriggerFinish(DR_BACK); - return true; + return retval; } - return true; + return retval; } bool AnalogSetupScreen::axis(const AxisInput &axis) { diff --git a/UI/ControlMappingScreen.h b/UI/ControlMappingScreen.h index c8dc1adbe5..025d4bc40c 100644 --- a/UI/ControlMappingScreen.h +++ b/UI/ControlMappingScreen.h @@ -44,7 +44,6 @@ private: UI::EventReturn OnDefaultMapping(UI::EventParams ¶ms); UI::EventReturn OnClearMapping(UI::EventParams ¶ms); UI::EventReturn OnAutoConfigure(UI::EventParams ¶ms); - UI::EventReturn OnTestAnalogs(UI::EventParams ¶ms); virtual void dialogFinished(const Screen *dialog, DialogResult result) override; From 2e621a25a0ebe7f82dc90a2415796f33bb132bca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 22 Aug 2021 12:13:09 +0200 Subject: [PATCH 188/336] Keyboard/gamepad navigation: Change the formula for scoring neighbors. Better behavior in the control mapping screen. Seems the distance bonus is no longer required, the overlap is enough, especially if you boost it a little. --- Common/UI/ViewGroup.cpp | 59 +++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 35 deletions(-) diff --git a/Common/UI/ViewGroup.cpp b/Common/UI/ViewGroup.cpp index 55d1cbe5ef..e2802aeb2f 100644 --- a/Common/UI/ViewGroup.cpp +++ b/Common/UI/ViewGroup.cpp @@ -253,6 +253,7 @@ bool ViewGroup::SubviewFocused(View *view) { return false; } +// Returns the percentage the smaller one overlaps the bigger one. static float HorizontalOverlap(const Bounds &a, const Bounds &b) { if (a.x2() < b.x || b.x2() < a.x) return 0.0f; @@ -366,29 +367,15 @@ float GetTargetScore(const Point &originPos, int originIndex, View *origin, View break; } - // Add a small bonus if the views are the same size. This prioritizes moving to the next item - // upwards in a scroll view instead of moving up to the top bar. - float distanceBonus = 0.0f; - if (vertical) { - float widthDifference = origin->GetBounds().w - destination->GetBounds().w; - if (widthDifference == 0) { - distanceBonus = 40; - } - } else { - float heightDifference = origin->GetBounds().h - destination->GetBounds().h; - if (heightDifference == 0) { - distanceBonus = 40; - } - } - // At large distances, ignore overlap. - if (distance > 2 * originSize) - overlap = 0; + if (distance > 2.0 * originSize) + overlap = 0.0f; - if (wrongDirection) + if (wrongDirection) { return 0.0f; - else - return 10.0f / std::max(1.0f, distance - distanceBonus) + overlap; + } else { + return 10.0f / std::max(1.0f, distance) + overlap * 2.0; + } } float GetDirectionScore(int originIndex, View *origin, View *destination, FocusDirection direction) { @@ -411,22 +398,25 @@ NeighborResult ViewGroup::FindNeighbor(View *view, FocusDirection direction, Nei } } - // TODO: Do the cardinal directions right. Now we just map to - // prev/next. + if (direction == FOCUS_PREV || direction == FOCUS_NEXT) { + switch (direction) { + case FOCUS_PREV: + // If view not found, no neighbor to find. + if (num == -1) + return NeighborResult(0, 0.0f); + return NeighborResult(views_[(num + views_.size() - 1) % views_.size()], 0.0f); + + case FOCUS_NEXT: + // If view not found, no neighbor to find. + if (num == -1) + return NeighborResult(0, 0.0f); + return NeighborResult(views_[(num + 1) % views_.size()], 0.0f); + default: + return NeighborResult(nullptr, 0.0f); + } + } switch (direction) { - case FOCUS_PREV: - // If view not found, no neighbor to find. - if (num == -1) - return NeighborResult(0, 0.0f); - return NeighborResult(views_[(num + views_.size() - 1) % views_.size()], 0.0f); - - case FOCUS_NEXT: - // If view not found, no neighbor to find. - if (num == -1) - return NeighborResult(0, 0.0f); - return NeighborResult(views_[(num + 1) % views_.size()], 0.0f); - case FOCUS_UP: case FOCUS_LEFT: case FOCUS_RIGHT: @@ -459,7 +449,6 @@ NeighborResult ViewGroup::FindNeighbor(View *view, FocusDirection direction, Nei if (num != -1) { //result.score += 100.0f; } - return result; } From 821a6a60aaa838318798e1619409f3a6a1d254ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 22 Aug 2021 12:21:44 +0200 Subject: [PATCH 189/336] Store: Display the error code in case of error downloading the json. See #14572 --- Common/Net/HTTPClient.h | 1 + UI/Store.cpp | 5 +++-- UI/Store.h | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Common/Net/HTTPClient.h b/Common/Net/HTTPClient.h index 0924d4b9b7..dd8933c1b6 100644 --- a/Common/Net/HTTPClient.h +++ b/Common/Net/HTTPClient.h @@ -144,6 +144,7 @@ private: int PerformGET(const std::string &url); std::string RedirectLocation(const std::string &baseUrl); void SetFailed(int code); + RequestProgress progress_; Buffer buffer_; std::vector responseHeaders_; diff --git a/UI/Store.cpp b/UI/Store.cpp index d13b72ed7a..4f029d9738 100644 --- a/UI/Store.cpp +++ b/UI/Store.cpp @@ -381,6 +381,7 @@ void StoreScreen::update() { g_DownloadManager.Update(); if (listing_.get() != 0 && listing_->Done()) { + resultCode_ = listing_->ResultCode(); if (listing_->ResultCode() == 200) { std::string listingJson; listing_->buffer().TakeAll(&listingJson); @@ -392,7 +393,7 @@ void StoreScreen::update() { RecreateViews(); } else { // Failed to contact store. Don't do anything. - ERROR_LOG(IO, "Download failed : error code %d", listing_->ResultCode()); + ERROR_LOG(IO, "Download failed : error code %d", resultCode_); connectionError_ = true; loading_ = false; RecreateViews(); @@ -468,7 +469,7 @@ void StoreScreen::CreateViews() { LinearLayout *content; if (connectionError_ || loading_) { content = new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, FILL_PARENT, 1.0f)); - content->Add(new TextView(loading_ ? st->T("Loading...") : st->T("Connection Error"))); + content->Add(new TextView(loading_ ? std::string(st->T("Loading...")) : StringFromFormat("%s: %d", st->T("Connection Error"), resultCode_))); content->Add(new Button(di->T("Retry")))->OnClick.Handle(this, &StoreScreen::OnRetry); content->Add(new Button(di->T("Back")))->OnClick.Handle(this, &UIScreen::OnBack); diff --git a/UI/Store.h b/UI/Store.h index d2d15a809f..263e5dbde1 100644 --- a/UI/Store.h +++ b/UI/Store.h @@ -92,6 +92,7 @@ private: bool loading_ = true; bool connectionError_ = false; + int resultCode_ = 0; std::map categories_; From 4c51f4761d05d9501c6767b03b660d0d1b9eee21 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 22 Aug 2021 08:17:26 -0700 Subject: [PATCH 190/336] http: Add Accept header as a parameter in requests. --- Common/File/PathBrowser.cpp | 3 ++- Common/Net/HTTPClient.cpp | 30 +++++++++++++++-------------- Common/Net/HTTPClient.h | 21 ++++++++++++++------ Core/FileLoaders/HTTPFileLoader.cpp | 6 ++++-- Core/Reporting.cpp | 2 +- Core/WebServer.cpp | 6 +++--- UI/RemoteISOScreen.cpp | 4 ++-- 7 files changed, 43 insertions(+), 29 deletions(-) diff --git a/Common/File/PathBrowser.cpp b/Common/File/PathBrowser.cpp index 756f0f74b3..64dff74057 100644 --- a/Common/File/PathBrowser.cpp +++ b/Common/File/PathBrowser.cpp @@ -38,10 +38,11 @@ bool LoadRemoteFileList(const Path &url, bool *cancel, std::vector &responseHeaders, RequestProgress *progress) { +int Client::GET(const RequestParams &req, Buffer *output, std::vector &responseHeaders, RequestProgress *progress) { const char *otherHeaders = - "Accept: */*\r\n" "Accept-Encoding: gzip\r\n"; - int err = SendRequest("GET", resource, otherHeaders, progress); + int err = SendRequest("GET", req, otherHeaders, progress); if (err < 0) { return err; } @@ -265,20 +264,20 @@ int Client::GET(const char *resource, Buffer *output, std::vector & return code; } -int Client::GET(const char *resource, Buffer *output, RequestProgress *progress) { +int Client::GET(const RequestParams &req, Buffer *output, RequestProgress *progress) { std::vector responseHeaders; - int code = GET(resource, output, responseHeaders, progress); + int code = GET(req, output, responseHeaders, progress); return code; } -int Client::POST(const char *resource, const std::string &data, const std::string &mime, Buffer *output, RequestProgress *progress) { +int Client::POST(const RequestParams &req, const std::string &data, const std::string &mime, Buffer *output, RequestProgress *progress) { char otherHeaders[2048]; if (mime.empty()) { snprintf(otherHeaders, sizeof(otherHeaders), "Content-Length: %lld\r\n", (long long)data.size()); } else { snprintf(otherHeaders, sizeof(otherHeaders), "Content-Length: %lld\r\nContent-Type: %s\r\n", (long long)data.size(), mime.c_str()); } - int err = SendRequestWithData("POST", resource, data, otherHeaders, progress); + int err = SendRequestWithData("POST", req, data, otherHeaders, progress); if (err < 0) { return err; } @@ -297,15 +296,15 @@ int Client::POST(const char *resource, const std::string &data, const std::strin return code; } -int Client::POST(const char *resource, const std::string &data, Buffer *output, RequestProgress *progress) { - return POST(resource, data, "", output, progress); +int Client::POST(const RequestParams &req, const std::string &data, Buffer *output, RequestProgress *progress) { + return POST(req, data, "", output, progress); } -int Client::SendRequest(const char *method, const char *resource, const char *otherHeaders, RequestProgress *progress) { - return SendRequestWithData(method, resource, "", otherHeaders, progress); +int Client::SendRequest(const char *method, const RequestParams &req, const char *otherHeaders, RequestProgress *progress) { + return SendRequestWithData(method, req, "", otherHeaders, progress); } -int Client::SendRequestWithData(const char *method, const char *resource, const std::string &data, const char *otherHeaders, RequestProgress *progress) { +int Client::SendRequestWithData(const char *method, const RequestParams &req, const std::string &data, const char *otherHeaders, RequestProgress *progress) { progress->progress = 0.01f; net::Buffer buffer; @@ -313,14 +312,16 @@ int Client::SendRequestWithData(const char *method, const char *resource, const "%s %s HTTP/%s\r\n" "Host: %s\r\n" "User-Agent: %s\r\n" + "Accept: %s\r\n" "Connection: close\r\n" "%s" "\r\n"; buffer.Printf(tpl, - method, resource, httpVersion_, + method, req.resource.c_str(), httpVersion_, host_.c_str(), userAgent_.c_str(), + req.acceptMime, otherHeaders ? otherHeaders : ""); buffer.Append(data); bool flushed = buffer.FlushSocket(sock(), dataTimeout_, progress->cancelled); @@ -508,7 +509,8 @@ int Download::PerformGET(const std::string &url) { return -1; } - return client.GET(fileUrl.Resource().c_str(), &buffer_, responseHeaders_, &progress_); + RequestParams req(fileUrl.Resource(), "*/*"); + return client.GET(req, &buffer_, responseHeaders_, &progress_); } std::string Download::RedirectLocation(const std::string &baseUrl) { diff --git a/Common/Net/HTTPClient.h b/Common/Net/HTTPClient.h index dd8933c1b6..8146353b2f 100644 --- a/Common/Net/HTTPClient.h +++ b/Common/Net/HTTPClient.h @@ -53,23 +53,32 @@ struct RequestProgress { bool *cancelled = nullptr; }; +struct RequestParams { + RequestParams() {} + explicit RequestParams(const char *r) : resource(r) {} + RequestParams(const std::string &r, const char *a) : resource(r), acceptMime(a) {} + + std::string resource; + const char *acceptMime = "*/*"; +}; + class Client : public net::Connection { public: Client(); ~Client(); // Return value is the HTTP return code. 200 means OK. < 0 means some local error. - int GET(const char *resource, Buffer *output, RequestProgress *progress); - int GET(const char *resource, Buffer *output, std::vector &responseHeaders, RequestProgress *progress); + int GET(const RequestParams &req, Buffer *output, RequestProgress *progress); + int GET(const RequestParams &req, Buffer *output, std::vector &responseHeaders, RequestProgress *progress); // Return value is the HTTP return code. - int POST(const char *resource, const std::string &data, const std::string &mime, Buffer *output, RequestProgress *progress); - int POST(const char *resource, const std::string &data, Buffer *output, RequestProgress *progress); + int POST(const RequestParams &req, const std::string &data, const std::string &mime, Buffer *output, RequestProgress *progress); + int POST(const RequestParams &req, const std::string &data, Buffer *output, RequestProgress *progress); // HEAD, PUT, DELETE aren't implemented yet, but can be done with SendRequest. - int SendRequest(const char *method, const char *resource, const char *otherHeaders, RequestProgress *progress); - int SendRequestWithData(const char *method, const char *resource, const std::string &data, const char *otherHeaders, RequestProgress *progress); + int SendRequest(const char *method, const RequestParams &req, const char *otherHeaders, RequestProgress *progress); + int SendRequestWithData(const char *method, const RequestParams &req, const std::string &data, const char *otherHeaders, RequestProgress *progress); int ReadResponseHeaders(net::Buffer *readbuf, std::vector &responseHeaders, RequestProgress *progress); // If your response contains a response, you must read it. int ReadResponseEntity(net::Buffer *readbuf, const std::vector &responseHeaders, Buffer *output, RequestProgress *progress); diff --git a/Core/FileLoaders/HTTPFileLoader.cpp b/Core/FileLoaders/HTTPFileLoader.cpp index 5078dcc4a3..a2d4080844 100644 --- a/Core/FileLoaders/HTTPFileLoader.cpp +++ b/Core/FileLoaders/HTTPFileLoader.cpp @@ -137,7 +137,8 @@ int HTTPFileLoader::SendHEAD(const Url &url, std::vector &responseH return -400; } - int err = client_.SendRequest("HEAD", url.Resource().c_str(), nullptr, &progress_); + http::RequestParams req(url.Resource(), "*/*"); + int err = client_.SendRequest("HEAD", req, nullptr, &progress_); if (err < 0) { ERROR_LOG(LOADER, "HTTP request failed, failed to send request: %s port %d", url.Host().c_str(), url.Port()); latestError_ = "Could not connect (could not request data)"; @@ -196,7 +197,8 @@ size_t HTTPFileLoader::ReadAt(s64 absolutePos, size_t bytes, void *data, Flags f snprintf(requestHeaders, sizeof(requestHeaders), "Range: bytes=%lld-%lld\r\n", absolutePos, absoluteEnd - 1); - int err = client_.SendRequest("GET", url_.Resource().c_str(), requestHeaders, &progress_); + http::RequestParams req(url_.Resource(), "*/*"); + int err = client_.SendRequest("GET", req, requestHeaders, &progress_); if (err < 0) { latestError_ = "Invalid response reading data"; Disconnect(); diff --git a/Core/Reporting.cpp b/Core/Reporting.cpp index c5bab7ac6e..ec66977c36 100644 --- a/Core/Reporting.cpp +++ b/Core/Reporting.cpp @@ -282,7 +282,7 @@ namespace Reporting if (http.Resolve(serverHost, ServerPort())) { http.Connect(); - int result = http.POST(uri, data, mimeType, output, &progress); + int result = http.POST(http::RequestParams(uri), data, mimeType, output, &progress); http.Disconnect(); return result >= 200 && result < 300; diff --git a/Core/WebServer.cpp b/Core/WebServer.cpp index b3b1b9b333..e84de770f1 100644 --- a/Core/WebServer.cpp +++ b/Core/WebServer.cpp @@ -74,7 +74,7 @@ static bool RegisterServer(int port) { std::string ip = fd_util::GetLocalIP(http.sock()); snprintf(resource4, sizeof(resource4) - 1, "/match/update?local=%s&port=%d", ip.c_str(), port); - if (http.GET(resource4, &theVoid, &progress) > 0) + if (http.GET(http::RequestParams(resource4), &theVoid, &progress) > 0) success = true; theVoid.Skip(theVoid.size()); http.Disconnect(); @@ -87,7 +87,7 @@ static bool RegisterServer(int port) { // We register both IPv4 and IPv6 in case the other client is using a different one. if (resource4[0] != 0 && http.Connect(timeout)) { - if (http.GET(resource4, &theVoid, &progress) > 0) + if (http.GET(http::RequestParams(resource4), &theVoid, &progress) > 0) success = true; theVoid.Skip(theVoid.size()); http.Disconnect(); @@ -99,7 +99,7 @@ static bool RegisterServer(int port) { std::string ip = fd_util::GetLocalIP(http.sock()); snprintf(resource6, sizeof(resource6) - 1, "/match/update?local=%s&port=%d", ip.c_str(), port); - if (http.GET(resource6, &theVoid, &progress) > 0) + if (http.GET(http::RequestParams(resource6), &theVoid, &progress) > 0) success = true; theVoid.Skip(theVoid.size()); http.Disconnect(); diff --git a/UI/RemoteISOScreen.cpp b/UI/RemoteISOScreen.cpp index b5d80bf76d..d67783e4e7 100644 --- a/UI/RemoteISOScreen.cpp +++ b/UI/RemoteISOScreen.cpp @@ -137,7 +137,7 @@ bool RemoteISOConnectScreen::FindServer(std::string &resultHost, int &resultPort SetStatus("Loading game list from [URL]...", host, port); http::RequestProgress progress(&scanCancelled); - code = http.GET(subdir.c_str(), &result, &progress); + code = http.GET(http::RequestParams(subdir.c_str()), &result, &progress); http.Disconnect(); if (code != 200) { @@ -191,7 +191,7 @@ bool RemoteISOConnectScreen::FindServer(std::string &resultHost, int &resultPort if (http.Resolve(REPORT_HOSTNAME, REPORT_PORT)) { if (http.Connect(2, 20.0, &scanCancelled)) { http::RequestProgress progress(&scanCancelled); - code = http.GET("/match/list", &result, &progress); + code = http.GET(http::RequestParams("/match/list"), &result, &progress); http.Disconnect(); } } From afcf6d8e6541106bbded7b43ded66859709bd143 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 22 Aug 2021 08:29:48 -0700 Subject: [PATCH 191/336] http: Specify expected mime types in downloads. --- Common/Net/HTTPClient.cpp | 11 ++++++++--- Common/Net/HTTPClient.h | 10 ++++++++-- Core/Config.cpp | 5 +++-- Core/Util/GameManager.cpp | 3 ++- UI/DevScreens.cpp | 3 ++- UI/Store.cpp | 8 +++++--- 6 files changed, 28 insertions(+), 12 deletions(-) diff --git a/Common/Net/HTTPClient.cpp b/Common/Net/HTTPClient.cpp index 786975bb33..142f41426d 100644 --- a/Common/Net/HTTPClient.cpp +++ b/Common/Net/HTTPClient.cpp @@ -509,7 +509,7 @@ int Download::PerformGET(const std::string &url) { return -1; } - RequestParams req(fileUrl.Resource(), "*/*"); + RequestParams req(fileUrl.Resource(), acceptMime_); return client.GET(req, &buffer_, responseHeaders_, &progress_); } @@ -571,8 +571,10 @@ void Download::Do() { completed_ = true; } -std::shared_ptr Downloader::StartDownload(const std::string &url, const Path &outfile) { +std::shared_ptr Downloader::StartDownload(const std::string &url, const Path &outfile, const char *acceptMime) { std::shared_ptr dl(new Download(url, outfile)); + if (acceptMime) + dl->SetAccept(acceptMime); downloads_.push_back(dl); dl->Start(); return dl; @@ -581,8 +583,11 @@ std::shared_ptr Downloader::StartDownload(const std::string &url, cons std::shared_ptr Downloader::StartDownloadWithCallback( const std::string &url, const Path &outfile, - std::function callback) { + std::function callback, + const char *acceptMime) { std::shared_ptr dl(new Download(url, outfile)); + if (acceptMime) + dl->SetAccept(acceptMime); dl->SetCallback(callback); downloads_.push_back(dl); dl->Start(); diff --git a/Common/Net/HTTPClient.h b/Common/Net/HTTPClient.h index 8146353b2f..e96102ce05 100644 --- a/Common/Net/HTTPClient.h +++ b/Common/Net/HTTPClient.h @@ -120,6 +120,10 @@ public: std::string url() const { return url_; } const Path &outfile() const { return outfile_; } + void SetAccept(const char *mime) { + acceptMime_ = mime; + } + // If not downloading to a file, access this to get the result. Buffer &buffer() { return buffer_; } const Buffer &buffer() const { return buffer_; } @@ -160,6 +164,7 @@ private: std::string url_; Path outfile_; std::thread thread_; + const char *acceptMime_ = "*/*"; int resultCode_ = 0; bool completed_ = false; bool failed_ = false; @@ -177,12 +182,13 @@ public: CancelAll(); } - std::shared_ptr StartDownload(const std::string &url, const Path &outfile); + std::shared_ptr StartDownload(const std::string &url, const Path &outfile, const char *acceptMime = nullptr); std::shared_ptr StartDownloadWithCallback( const std::string &url, const Path &outfile, - std::function callback); + std::function callback, + const char *acceptMime = nullptr); // Drops finished downloads from the list. void Update(); diff --git a/Core/Config.cpp b/Core/Config.cpp index fa8d232dc6..bb956d8c86 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -1393,8 +1393,9 @@ void Config::Load(const char *iniFileName, const char *controllerIniFilename) { // splash screen quickly), but then we'll just show the notification next time instead, we store the // upgrade number in the ini. if (iRunCount % 10 == 0 && bCheckForNewVersion) { - std::shared_ptr dl = g_DownloadManager.StartDownloadWithCallback( - "http://www.ppsspp.org/version.json", Path(), &DownloadCompletedCallback); + const char *versionUrl = "http://www.ppsspp.org/version.json"; + const char *acceptMime = "application/json, text/*; q=0.9, */*; q=0.8"; + auto dl = g_DownloadManager.StartDownloadWithCallback(versionUrl, Path(), &DownloadCompletedCallback, acceptMime); dl->SetHidden(true); } diff --git a/Core/Util/GameManager.cpp b/Core/Util/GameManager.cpp index 26b0581c95..bb658b2219 100644 --- a/Core/Util/GameManager.cpp +++ b/Core/Util/GameManager.cpp @@ -100,7 +100,8 @@ bool GameManager::DownloadAndInstall(std::string storeFileUrl) { } Path filename = GetTempFilename(); - curDownload_ = g_DownloadManager.StartDownload(storeFileUrl, filename); + const char *acceptMime = "application/zip, application/x-cso, application/x-iso9660-image, application/octet-stream; q=0.9, */*; q=0.8"; + curDownload_ = g_DownloadManager.StartDownload(storeFileUrl, filename, acceptMime); return true; } diff --git a/UI/DevScreens.cpp b/UI/DevScreens.cpp index fdd15ccb42..389fdf0967 100644 --- a/UI/DevScreens.cpp +++ b/UI/DevScreens.cpp @@ -1206,7 +1206,8 @@ void FrameDumpTestScreen::update() { UIScreen::update(); if (!listing_) { - listing_ = g_DownloadManager.StartDownload(framedumpsBaseUrl, Path()); + const char *acceptMime = "text/html, */*; q=0.8"; + listing_ = g_DownloadManager.StartDownload(framedumpsBaseUrl, Path(), acceptMime); } if (listing_ && listing_->Done() && files_.empty()) { diff --git a/UI/Store.cpp b/UI/Store.cpp index 4f029d9738..ab40825e93 100644 --- a/UI/Store.cpp +++ b/UI/Store.cpp @@ -134,7 +134,9 @@ void HttpImageFileView::DownloadCompletedCallback(http::Download &download) { void HttpImageFileView::Draw(UIContext &dc) { using namespace Draw; if (!texture_ && !textureFailed_ && !path_.empty() && !download_) { - download_ = downloader_->StartDownloadWithCallback(path_, Path(), std::bind(&HttpImageFileView::DownloadCompletedCallback, this, std::placeholders::_1)); + auto cb = std::bind(&HttpImageFileView::DownloadCompletedCallback, this, std::placeholders::_1); + const char *acceptMime = "image/png, image/jpeg, image/*; q=0.9, */*; q=0.8"; + download_ = downloader_->StartDownloadWithCallback(path_, Path(), cb, acceptMime); download_->SetHidden(true); } @@ -366,8 +368,8 @@ StoreScreen::StoreScreen() { loading_ = true; std::string indexPath = storeBaseUrl + "index.json"; - - listing_ = g_DownloadManager.StartDownload(indexPath, Path()); + const char *acceptMime = "application/json, */*; q=0.8"; + listing_ = g_DownloadManager.StartDownload(indexPath, Path(), acceptMime); } StoreScreen::~StoreScreen() { From 8c085186172e8175c3151e7abdab4d8f7e8c1c2c Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 22 Aug 2021 11:23:02 -0700 Subject: [PATCH 192/336] gason: Allow tagged pointers. --- ext/gason/gason.h | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/ext/gason/gason.h b/ext/gason/gason.h index 1f1cd976a2..922751099f 100644 --- a/ext/gason/gason.h +++ b/ext/gason/gason.h @@ -16,35 +16,32 @@ enum JsonTag { struct JsonNode; -#define JSON_VALUE_PAYLOAD_MASK 0x00007FFFFFFFFFFFULL -#define JSON_VALUE_NAN_MASK 0x7FF8000000000000ULL -#define JSON_VALUE_TAG_MASK 0xF -#define JSON_VALUE_TAG_SHIFT 47 - -union JsonValue { - uint64_t ival; - double fval; +struct JsonValue { + union { + uint64_t ival_; + double fval_; + }; + uint8_t tag_ = JSON_NULL; JsonValue(double x) - : fval(x) { + : fval_(x), tag_(JSON_NUMBER) { } - JsonValue(JsonTag tag = JSON_NULL, void *payload = nullptr) { - assert((uint64_t)payload <= JSON_VALUE_PAYLOAD_MASK); - ival = JSON_VALUE_NAN_MASK | ((uint64_t)tag << JSON_VALUE_TAG_SHIFT) | (uintptr_t)payload; + JsonValue(JsonTag tag = JSON_NULL, void *payload = nullptr) + : ival_((uintptr_t)payload), tag_(tag) { } bool isDouble() const { - return (int64_t)ival <= (int64_t)JSON_VALUE_NAN_MASK; + return tag_ == JSON_NUMBER; } JsonTag getTag() const { - return isDouble() ? JSON_NUMBER : JsonTag((ival >> JSON_VALUE_TAG_SHIFT) & JSON_VALUE_TAG_MASK); + return JsonTag(tag_); } uint64_t getPayload() const { assert(!isDouble()); - return ival & JSON_VALUE_PAYLOAD_MASK; + return ival_; } double toNumber() const { assert(getTag() == JSON_NUMBER); - return fval; + return fval_; } char *toString() const { assert(getTag() == JSON_STRING); From 52e9856b4b30651cc3343a79904e1f9386efe840 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 23 Aug 2021 23:00:30 -0700 Subject: [PATCH 193/336] Debugger: Fix breakpoints on delay slots. --- Core/MIPS/ARM/ArmJit.cpp | 9 +++++---- Core/MIPS/ARM64/Arm64Jit.cpp | 10 +++++++--- Core/MIPS/x86/Jit.cpp | 9 +++++---- Core/MIPS/x86/Jit.h | 3 --- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/Core/MIPS/ARM/ArmJit.cpp b/Core/MIPS/ARM/ArmJit.cpp index d8557da697..9977ca0c43 100644 --- a/Core/MIPS/ARM/ArmJit.cpp +++ b/Core/MIPS/ARM/ArmJit.cpp @@ -72,12 +72,12 @@ void DisassembleArm(const u8 *data, int size) { } } -static u32 JitBreakpoint() { +static u32 JitBreakpoint(uint32_t addr) { // Should we skip this breakpoint? - if (CBreakPoints::CheckSkipFirst() == currentMIPS->pc) + if (CBreakPoints::CheckSkipFirst() == currentMIPS->pc || CBreakPoints::CheckSkipFirst() == addr) return 0; - BreakAction result = CBreakPoints::ExecBreakPoint(currentMIPS->pc); + BreakAction result = CBreakPoints::ExecBreakPoint(addr); if ((result & BREAK_ACTION_PAUSE) == 0) return 0; @@ -746,7 +746,8 @@ bool ArmJit::CheckJitBreakpoint(u32 addr, int downcountOffset) { MOVI2R(SCRATCHREG1, GetCompilerPC()); MovToPC(SCRATCHREG1); RestoreRoundingMode(); - QuickCallFunction(SCRATCHREG1, &JitBreakpoint); + MOVI2R(R0, addr); + QuickCallFunction(SCRATCHREG2, &JitBreakpoint); // If 0, the conditional breakpoint wasn't taken. CMPI2R(R0, 0, SCRATCHREG2); diff --git a/Core/MIPS/ARM64/Arm64Jit.cpp b/Core/MIPS/ARM64/Arm64Jit.cpp index 1b989a8d6c..8fb4c512d8 100644 --- a/Core/MIPS/ARM64/Arm64Jit.cpp +++ b/Core/MIPS/ARM64/Arm64Jit.cpp @@ -62,12 +62,12 @@ static void DisassembleArm64Print(const u8 *data, int size) { INFO_LOG(JIT, "===");*/ } -static u32 JitBreakpoint() { +static u32 JitBreakpoint(uint32_t addr) { // Should we skip this breakpoint? - if (CBreakPoints::CheckSkipFirst() == currentMIPS->pc) + if (CBreakPoints::CheckSkipFirst() == currentMIPS->pc || CBreakPoints::CheckSkipFirst() == addr) return 0; - BreakAction result = CBreakPoints::ExecBreakPoint(currentMIPS->pc); + BreakAction result = CBreakPoints::ExecBreakPoint(addr); if ((result & BREAK_ACTION_PAUSE) == 0) return 0; @@ -720,7 +720,9 @@ bool Arm64Jit::CheckJitBreakpoint(u32 addr, int downcountOffset) { FlushAll(); MOVI2R(SCRATCH1, GetCompilerPC()); MovToPC(SCRATCH1); + SaveStaticRegisters(); RestoreRoundingMode(); + MOVI2R(W0, addr); QuickCallFunction(SCRATCH1_64, &JitBreakpoint); // If 0, the conditional breakpoint wasn't taken. @@ -728,10 +730,12 @@ bool Arm64Jit::CheckJitBreakpoint(u32 addr, int downcountOffset) { FixupBranch skip = B(CC_EQ); WriteDownCount(downcountOffset); ApplyRoundingMode(); + LoadStaticRegisters(); B((const void *)dispatcherCheckCoreState); SetJumpTarget(skip); ApplyRoundingMode(); + LoadStaticRegisters(); _MSR(FIELD_NZCV, FLAGTEMPREG); return true; } diff --git a/Core/MIPS/x86/Jit.cpp b/Core/MIPS/x86/Jit.cpp index 44e95ca2e5..5c3f2121f9 100644 --- a/Core/MIPS/x86/Jit.cpp +++ b/Core/MIPS/x86/Jit.cpp @@ -57,13 +57,14 @@ std::pair flip_pair(const std::pair &p) { return std::pair(p.second, p.first); } -u32 JitBreakpoint() +// This is called when Jit hits a breakpoint. Returns 1 when hit. +u32 JitBreakpoint(uint32_t addr) { // Should we skip this breakpoint? - if (CBreakPoints::CheckSkipFirst() == currentMIPS->pc) + if (CBreakPoints::CheckSkipFirst() == currentMIPS->pc || CBreakPoints::CheckSkipFirst() == addr) return 0; - BreakAction result = CBreakPoints::ExecBreakPoint(currentMIPS->pc); + BreakAction result = CBreakPoints::ExecBreakPoint(addr); if ((result & BREAK_ACTION_PAUSE) == 0) return 0; @@ -795,7 +796,7 @@ bool Jit::CheckJitBreakpoint(u32 addr, int downcountOffset) { FlushAll(); MOV(32, MIPSSTATE_VAR(pc), Imm32(GetCompilerPC())); RestoreRoundingMode(); - ABI_CallFunction(&JitBreakpoint); + ABI_CallFunctionC(&JitBreakpoint, addr); // If 0, the conditional breakpoint wasn't taken. CMP(32, R(EAX), Imm32(0)); diff --git a/Core/MIPS/x86/Jit.h b/Core/MIPS/x86/Jit.h index e6e11ac899..4cfd12bdf2 100644 --- a/Core/MIPS/x86/Jit.h +++ b/Core/MIPS/x86/Jit.h @@ -36,9 +36,6 @@ class PointerWrap; namespace MIPSComp { -// This is called when Jit hits a breakpoint. Returns 1 when hit. -u32 JitBreakpoint(); - struct RegCacheState { GPRRegCacheState gpr; FPURegCacheState fpr; From a5fce6d0b2b7970c4c3cd27c09da3ff795950ae0 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 23 Aug 2021 23:01:02 -0700 Subject: [PATCH 194/336] Savedata: Use PARAM.SFO constant properly. --- Core/Dialog/SavedataParam.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index 0558dacc60..6af370b696 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -1192,7 +1192,7 @@ bool SavedataParam::GetList(SceUtilitySavedataParam *param) for (size_t i = 0; i < validDir.size(); ++i) { // GetFileName(param) == NUll here // so use sfo files to set the date. - sfoFile = pspFileSystem.GetFileInfo(savePath + validDir[i].name + "/" + "PARAM.SFO"); + sfoFile = pspFileSystem.GetFileInfo(savePath + validDir[i].name + "/" + SFO_FILENAME); sfoFiles.push_back(sfoFile); } @@ -1262,7 +1262,7 @@ int SavedataParam::GetFilesList(SceUtilitySavedataParam *param) fileList->resultNumNormalEntries = 0; fileList->resultNumSystemEntries = 0; - // We need PARAMS.SFO's SAVEDATA_FILE_LIST to determine which entries are secure. + // We need PARAM.SFO's SAVEDATA_FILE_LIST to determine which entries are secure. PSPFileInfo sfoFileInfo = pspFileSystem.GetFileInfo(dirPath + "/" + SFO_FILENAME); std::set secureFilenames; From 7adcc2b30d2cd226200099ef1ea77fd1ffa2cdaa Mon Sep 17 00:00:00 2001 From: Benjamin Benda Gates Date: Fri, 27 Aug 2021 00:25:23 +0700 Subject: [PATCH 195/336] Update th_TH.ini --- assets/lang/th_TH.ini | 85 +++++++++++++++++++++++++++---------------- 1 file changed, 53 insertions(+), 32 deletions(-) diff --git a/assets/lang/th_TH.ini b/assets/lang/th_TH.ini index 4b7b05c10e..6fc59dc420 100644 --- a/assets/lang/th_TH.ini +++ b/assets/lang/th_TH.ini @@ -4,12 +4,14 @@ Audio backend = รูปแบบเสียงที่สนับสนุ AudioBufferingForBluetooth = บลูทูธ-เฟรนด์ลี่ บัฟเฟอร์ (ช้ากว่า) Auto = อัตโนมัติ Device = อุปกรณ์ +Disabled = ปิดการใช้งาน DSound (compatible) = DSound (เสถียร) Enable Sound = เปิดการใช้งานเสียง Global volume = ระดับเสียงหลัก Microphone = ไมโครโฟน Microphone Device = อุปกรณ์ไมโครโฟน Mute = เงียบ +Reverb volume = ระดับเสียงก้อง Use global volume = ใช้ตามระดับเสียงหลัก Use new audio devices automatically = สลับไปใช้อุปกรณ์เสียงอันใหม่อัตโนมัติ WASAPI (fast) = WASAPI (เร็ว) @@ -30,6 +32,8 @@ Auto = อัตโนมัติ Auto-centering analog stick = อนาล็อกกลับคืนจุดศูนย์กลางอัตโนมัติ Auto-hide buttons after seconds = ซ่อนปุ่มทันทีหลังจาก/วินาที Auto-rotation speed = ความเร็วหมุนอัตโนมัติ +Auto-switch = สลับอัตโนมัติ +Base tilt position = ตำแหน่งฐานของการเอียง Binds = เซ็ตปุ่ม Button Binding = เซ็ตปุ่มควบคุม Button Opacity = ความชัดของปุ่มกด @@ -45,14 +49,14 @@ Combo Key Setting = ตั้งค่าปุ่มคอมโบ Combo Key Setup = ติดตั้งปุ่มคอมโบ Confine Mouse = จำกัดเมาส์ภายในหน้าต่าง/พื้นที่แสดงผล Control Mapping = เปลี่ยนแปลงค่าควบคุม -Custom Key Setting = ติดตั้งปุ่มปรับแต่ง +Custom Key Setting = ติดตั้งปุ่มคอมโบปรับแต่ง Custom layout... = ปรับเปลี่ยนการควบคุมแบบสัมผัส... Customize = ปรับแต่ง Customize tilt = ปรับแต่งการเอียงโดยใช้เซ็นเซอร์ควบคุม... Customize Touch Controls = ปรับแต่งปุ่มควบคุมสัมผัสหน้าจอ D-PAD = ปุ่มลูกศร -Deadzone radius = ขอบเขต Deadzone -Deadzone Radius = ขอบเขต Deadzone +Deadzone radius = รัศมีของ Deadzone +Deadzone Radius = รัศมีของ Deadzone DInput Analog Settings = ตั้งค่าอนาล็อกของจอย DInput Disable D-Pad diagonals (4-way touch) = ปิดการใช้งานปุ่มลูกศรในแนวทแยง (สัมผัส 4 ทิศทาง) Disable diagonal input = ปิดการใช้งานอนาล็อกในแนวทแยง @@ -71,7 +75,7 @@ L/R Trigger Buttons = ปุ่มตัวหน่วงนำโดยใช Landscape = แนวนอน Landscape Auto = แนวนอนกลับด้านอัตโนมัติ Landscape Reversed = แนวนอนกลับด้าน -Low end radius = ขอบเขต Low end +Low end radius = รัศมีของ Low end Mouse = การตั้งค่าเมาส์ Mouse sensitivity = ความไวต่อการตอบสนองของเมาส์ Mouse smoothing = ความลื่นไหลของเมาส์ @@ -84,6 +88,8 @@ Portrait Reversed = แนวตั้งกลับด้าน PSP Action Buttons = ปุ่มแอ็คชั่นของ PSP Raw input = ค่าตั้งต้น Reset to defaults = คืนค่าเริ่มต้น +Screen aligned to ground = หน้าจอชิดกับพื้น +Screen at right angle to ground = หน้าจอที่มุมขวากับพื้น Screen Rotation = การหมุนหน้าจอ seconds, 0 : off = วินาที, 0 = ปิด Sensitivity = ความไวต่อการตอบสนอง @@ -253,6 +259,7 @@ No block = ไม่ต้องบล็อค Prev = ถอยกลับ Random = สุ่ม Replace textures = แทนที่พื้นผิวจากแหล่งที่เก็บข้อมูล +Reset = คืนค่า Reset limited logging = รีเซ็ตขีดจำกัดของการบันทึกค่า RestoreDefaultSettings = คุณแน่ใจรึว่าต้องการรีเซ็ตกลับไปเป็นค่าเริ่มต้น?\nการตั้งค่าของปุ่มต่างๆ จะไม่ถูกลบ\n\nคุณสามารถกดยกเลิกได้\nแต่ถ้าหากกดตกลงแล้วไม่เห็นผลการเปลี่ยนแปลง\nโปรดเริ่ม PPSSPP ใหม่อีกครั้งนึง RestoreGameDefaultSettings = คุณแน่ใจรึว่าต้องการรีเซ็ตตั้งค่าเฉพาะเกม?\nการตั้งค่าของเกมนี้จะกลับไปใช้ค่าเริ่มต้นของ PPSSPP? @@ -403,6 +410,7 @@ ZIP file detected (Require WINRAR) = ไฟล์นี้ถูกบีบอ [Game] Asia = AS (โซนเอเชีย) +Calculate CRC = คำนวณค่า CRC ConfirmDelete = ยืนยันการลบ Create Game Config = สร้างการตั้งค่าเฉพาะเกม Create Shortcut = สร้างทางลัด @@ -570,35 +578,12 @@ Window Size = ขนาดของหน้าจอ xBRZ = xBRZ [InstallZip] -Already contains data. = มีข้อมูลอยู่ข้างในนั้น -Create or Choose a PSP folder = สร้างหรือเลือกโฟลเดอร์ PSP -DataCanBeShared = ข้อมูลสามารถใช้งานร่วมกันได้ ทั้งใน PPSSPP ตัวสีฟ้า/สีทอง -DataCannotBeShared = ข้อมูลไม่สามารถใช้งานร่วมกันได้ ทั้งใน PPSSPP ตัวสีฟ้า/สีทอง! -DataWillStay = ข้อมูลจะยังคงอยู่ ถึงแม้ว่าจะถอนการติดตั้ง PPSSPP ออกไปแล้ว -DataWillBeLostOnUninstall = คำเตือน! ข้อมูลอาจจะสูญหาย เมื่อคุณถอนการติดตั้ง PPSSPP! Delete ZIP file = ลบไฟล์ ZIP -EasyUSBAccess = การเข้าถึงข้อมูลทำได้ง่าย -Failed to save config = ล้มเหลวในการบันทึกตั้งค่า -Free space = พื้นที่ว่าง Install = ติดตั้ง Install game from ZIP file? = ต้องการติดตั้งเกมจากไฟล์ ZIP เลยหรือไม่? Install textures from ZIP file? = ต้องการติดตั้งเท็คเจอร์จากไฟล์ ZIP เลยหรือไม่? Installed! = ติดตั้งเสร็จสิ้น! -MemoryStickDescription = เลือกแหล่งที่เก็บข้อมูล PSP (เม็มโมรี่ สติ๊ก) -Move Data = ย้ายข้อมูล -No data will be changed. = ไม่มีข้อมูลอะไรถูกเปลี่ยนแปลง -New PSP Data Folder = โฟลเดอร์เก็บข้อมูล PSP อันใหม่ -Old PSP Data Folder = โฟลเดอร์เก็บข้อมูล PSP อันเก่า -PPSSPP will restart after the change. = PPSSPP จะรีสตาร์ทใหม่หลังจากปรับเปลี่ยนตั้งค่า -ScopedStorageWarning = คำเตือน: รองรับแอนดรอยด์ที่ใช้ Scoped Storage ขั้นทดสอบ\nอาจจะเขมือบข้อมูลของคุณ Texture pack doesn't support install = เท็คเจอร์แพ็คนี้ไม่รองรับการติดตั้ง -That folder doesn't work as a memstick folder. = โฟลเดอร์นั้นไม่สามารถนำมาใช้เป็นโฟลเดอร์แหล่งที่เก็บข้อมูลได้ -That's the folder being used! = อันนั้นคือโฟลเดอร์ที่ใช้งานอยู่ -USBAccessThrough = การเข้าถึงข้อมูล ผ่านใน Android/data/org.ppsspp.ppsspp/files -USBAccessThroughGold = การเข้าถึงข้อมูล ผ่านใน Android/data/org.ppsspp.ppssppgold/files -Use App Private Directory = ใช้แหล่งเก็บข้อมูลแบบส่วนบุคคล -Use PSP folder at root of storage = ใช้โฟลเดอร์ PSP ที่อยู่ในแหล่งเก็บข้อมูลของเครื่อง -Welcome to PPSSPP! = ยินดีต้อนรับสู่ PPSSPP! Zip archive corrupt = ไฟล์ ZIP ไม่สมบูรณ์ (เสียจ้า) Zip file does not contain PSP software = ไฟล์ ZIP นี้ ไม่มีข้อมูลซอฟแวร์ของเกม PSP @@ -681,8 +666,11 @@ D-pad right = ปุ่มลูกศรขวา D-pad up = ปุ่มลูกศรขึ้น DevMenu = เมนูผู้พัฒนา Down = ลูกศรลง +Down Triangle = สามเหลี่ยมกลับหัว Dpad = ลูกศร +Fast-forward = เร่งความเร็ว Frame Advance = เฟรมขั้นสูง +Gear = ฟันเฟือง Hold = ระงับ Home = หน้าหลัก L = แอล @@ -695,6 +683,7 @@ None = ไม่มี Note = หมายเหตุ OpenChat = เปิดแชท Pause = หยุดชั่วคราว +Plus = บวก R = อาร์ R button = ปุ่มอาร์ RapidFire = กดรัวต่อเนื่อง @@ -702,6 +691,7 @@ Record = บันทึกหน้าจอ Rectangle = สี่เหลี่ยมพื้นผ้า Remote hold = หยุดการใช้รีโมท Rewind = โหลดสเตทพื้นหลัง +Rhombus = สี่เหลี่ยมเปียกปูน Right = ลูกศรขวา Right Analog Stick = ปุ่มอนาล็อกขวา RightAn.Down = อนาล็อก(ขวา)ลง @@ -723,7 +713,6 @@ Texture Replacement = แทนที่พื้นผิว Toggle Fullscreen = ปรับเต็มหน้าจอ Toggle mode = โหมดสับเปลี่ยน Triangle = สามเหลี่ยม -Fast-forward = เร่งความเร็ว Up = ลูกศรขึ้น Vertical Rectangle = สี่เหลี่ยมพื้นผ้าแนวตั้ง Vol + = เพิ่มเสียง @@ -767,6 +756,7 @@ Invalid IP or hostname = ไอพี หรือ ชื่อโฮสต์ Minimum Timeout = เวลาขั้นต่ำที่ใช้เชื่อมต่อ (แทนที่ค่าความหน่วงในมิลลิวินาที) Misc = อื่นๆ (ค่าดั้งเดิม = ดีสุดแล้ว) Network Initialized = เริ่มการทำงานของเครือข่ายเรียบร้อย +None = ไม่มี Please change your Port Offset = กรุณาเปลี่ยนค่าของพอร์ตชดเชย Port offset = พอร์ตชดเชย (0 = ค่าเริ่มต้นของ PSP) PPSSPP Ad-Hoc Wiki Page = ไปที่หน้าเว็บ PPSSPP Ad-Hoc Wiki @@ -803,8 +793,8 @@ Rewind = โหลดสเตทพื้นหลัง Save State = เซฟสเตทเกม Settings = การตั้งค่า Switch UMD = สลับแผ่น UMD -Undo last load = เลิกทำการโหลดครั้งล่าสุด -Undo last save = เลิกทำการเซฟครั้งล่าสุด +Undo last load = เลิกทำโหลดครั้งล่าสุด +Undo last save = เลิกทำเซฟครั้งล่าสุด [PostShaders] (duplicated setting, previous slider will be used) = (การตั้งค่าที่ซ้ำซ้อนกัน อาจจะใช้แถบเลื่อนก่อนหน้า) @@ -880,6 +870,34 @@ Twitter @PPSSPP_emu = ไปที่ Twitter website = เพิ่มเติมข้อมูลได้ที่เว็บไซต์: written = เขียนโดยใช้ภาษา C++ เพื่อความรวดเร็ว และความเสถียร +[MemStick] +Already contains data. = มีข้อมูลอยู่ข้างในนั้น +Create or Choose a PSP folder = สร้างหรือเลือกโฟลเดอร์เก็บข้อมูล PSP +DataCanBeShared = ข้อมูลสามารถใช้งานร่วมกันได้ ทั้งใน PPSSPP ตัวสีฟ้า/สีทอง +DataCannotBeShared = ข้อมูลไม่สามารถใช้งานร่วมกันได้ ทั้งใน PPSSPP ตัวสีฟ้า/สีทอง! +DataWillBeLostOnUninstall = คำเตือน! ข้อมูลอาจจะสูญหาย เมื่อคุณถอนการติดตั้ง PPSSPP! +DataWillStay = ข้อมูลจะยังคงอยู่ ถึงแม้ว่าจะถอนการติดตั้ง PPSSPP ออกไปแล้ว +Done! = เรียบร้อย! +EasyUSBAccess = การเข้าถึงข้อมูลทำได้ง่าย +Failed to move some files! = ล้มเหลวในย้ายบางไฟล์! +Failed to save config = ล้มเหลวในการบันทึกตั้งค่า +Free space = พื้นที่ว่าง +MemoryStickDescription = เลือกแหล่งที่เก็บข้อมูล PSP (เม็มโมรี่ สติ๊ก) +Move Data = ย้ายข้อมูล +New PSP Data Folder = โฟลเดอร์เก็บข้อมูล PSP อันใหม่ +No data will be changed. = ไม่มีข้อมูลอะไรถูกเปลี่ยนแปลง +Old PSP Data Folder = โฟลเดอร์เก็บข้อมูล PSP อันเก่า +PPSSPP will restart after the change. = PPSSPP จะรีสตาร์ทใหม่หลังจากปรับเปลี่ยนตั้งค่า +ScopedStorageWarning = คำเตือน: การรองรับแอนดรอยด์ที่ใช้ Scoped Storage ยังอยู่ในขั้นทดสอบ\nเพราะฉะนั้นอาจจะเขมือบข้อมูลของคุณ +Starting move... = กำลังเริ่มการย้าย... +That folder doesn't work as a memstick folder. = โฟลเดอร์นั้นไม่สามารถนำมาใช้เป็นโฟลเดอร์แหล่งที่เก็บข้อมูลได้ +That's the folder being used! = อันนั้นคือโฟลเดอร์ที่ปรับใช้งานอยู่แล้ว! +USBAccessThrough = การเข้าถึงข้อมูล ผ่านใน Android/data/org.ppsspp.ppsspp/files +USBAccessThroughGold = การเข้าถึงข้อมูล ผ่านใน Android/data/org.ppsspp.ppssppgold/files +Use App Private Directory = ใช้แหล่งเก็บข้อมูลแอพแบบส่วนบุคคล +Use PSP folder at root of storage = ใช้โฟลเดอร์ PSP ที่อยู่ต้นทางของแหล่งเก็บข้อมูลในเครื่อง +Welcome to PPSSPP! = ยินดีต้อนรับสู่ PPSSPP! + [RemoteISO] Browse Games = ค้นหาไปยังเกม Local Server Port = พอร์ตเซิร์ฟเวอร์แหล่งภายใน @@ -902,6 +920,8 @@ Stopping.. = กำลังหยุด... [Reporting] Bad = แย่ +FeedbackCRCCalculating = ค่า CRC ของไฟล์เกม: กำลังคำนวณ... +FeedbackCRCValue = ค่า CRC ของไฟล์เกม: [VALUE] FeedbackDelayInfo = กำลังทำการส่งข้อมูลของคุณอยู่... FeedbackDesc = อีมูเลเตอร์ PPSSPP เจ๋งแค่ไหน? มาสิ ช่วยบอกให้พวกเราทราบด้วย! FeedbackDisabled = ต้องเปิดการใช้งานรายงานข้อมูลเกมไปยังเซิร์ฟเวอร์เสียก่อน @@ -927,6 +947,7 @@ Perfect Description = ประมวลผลได้ไร้ที่ติ Plays = ขณะเล่น Plays Description = เล่นได้ตลอดทั้งเกม แต่ยังมีปัญหาอยู่ในบางจุด ReportButton = รายงานการตอบกลับ +Show disc CRC = แสดงค่า CRC ไฟล์เกม Speed = ความเร็ว Submit Feedback = ยืนยันการตอบกลับ SuggestionConfig = ให้เข้าไปดูที่เว็บไซต์รายงานสำหรับการปรับตั้งค่าที่แนะนำ @@ -1015,8 +1036,8 @@ Driver Version = เวอร์ชั่นของไดรเวอร์ EGL Extensions = ส่วนขยายอีจีแอล Frames per buffer = จำนวนเฟรมต่อบัฟเฟอร์ GPU Information = ข้อมูลของหน่วยประมวลผลกราฟิก -High precision float range = High precision float range -High precision int range = High precision int range +High precision float range = ขอบเขตจำนวนทศนิยมช่วงค่าความแม่นยำสูง +High precision int range = ขอบเขตจำนวนเต็มช่วงค่าความแม่นยำสูง Lang/Region = ภาษา/ภูมิภาค Memory Page Size = ขนาดหน้าของหน่วยความจำ Native Resolution = ความละเอียดดั้งเดิม From 527ec8eff282e573bfaa8f8f92cbf5d2d4eb58df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 28 Aug 2021 14:07:22 +0200 Subject: [PATCH 196/336] Fix bug with device IDs on Android, causing the on-screen back button to be misinterpreted. --- .../src/org/ppsspp/ppsspp/InputDeviceState.java | 15 ++++++++++++++- .../src/org/ppsspp/ppsspp/NativeActivity.java | 16 ++++++++-------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/android/src/org/ppsspp/ppsspp/InputDeviceState.java b/android/src/org/ppsspp/ppsspp/InputDeviceState.java index 2e1123dbad..3bbebdf975 100644 --- a/android/src/org/ppsspp/ppsspp/InputDeviceState.java +++ b/android/src/org/ppsspp/ppsspp/InputDeviceState.java @@ -12,7 +12,7 @@ import android.view.MotionEvent; public class InputDeviceState { private static final String TAG = "InputDeviceState"; - public static final int deviceId = NativeApp.DEVICE_ID_PAD_0; + private int deviceId = NativeApp.DEVICE_ID_DEFAULT; private InputDevice mDevice; private int[] mAxes; @@ -27,6 +27,19 @@ public class InputDeviceState { } public InputDeviceState(InputDevice device) { + int sources = device.getSources(); + if ((sources & InputDevice.SOURCE_KEYBOARD) == InputDevice.SOURCE_KEYBOARD) { + this.deviceId = NativeApp.DEVICE_ID_KEYBOARD; + } else if ((sources & InputDevice.SOURCE_MOUSE) == InputDevice.SOURCE_MOUSE) { + this.deviceId = NativeApp.DEVICE_ID_MOUSE; + } else if (((sources & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD || + (sources & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK || + (sources & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD)) { + this.deviceId = NativeApp.DEVICE_ID_PAD_0; + } else { + this.deviceId = NativeApp.DEVICE_ID_DEFAULT; + } + mDevice = device; int numAxes = 0; for (MotionRange range : device.getMotionRanges()) { diff --git a/android/src/org/ppsspp/ppsspp/NativeActivity.java b/android/src/org/ppsspp/ppsspp/NativeActivity.java index 6808ce1161..b7df0bca47 100644 --- a/android/src/org/ppsspp/ppsspp/NativeActivity.java +++ b/android/src/org/ppsspp/ppsspp/NativeActivity.java @@ -1042,18 +1042,18 @@ public abstract class NativeActivity extends Activity { switch (keyCode) { case KeyEvent.KEYCODE_BACK: if (event.isAltPressed()) { - NativeApp.keyDown(InputDeviceState.deviceId, 1004, repeat); // special custom keycode for the O button on Xperia Play + NativeApp.keyDown(NativeApp.DEVICE_ID_PAD_0, 1004, repeat); // special custom keycode for the O button on Xperia Play } else if (NativeApp.isAtTopLevel()) { Log.i(TAG, "IsAtTopLevel returned true."); // Pass through the back event. return super.onKeyDown(keyCode, event); } else { - NativeApp.keyDown(InputDeviceState.deviceId, keyCode, repeat); + NativeApp.keyDown(NativeApp.DEVICE_ID_DEFAULT, keyCode, repeat); } return true; case KeyEvent.KEYCODE_MENU: case KeyEvent.KEYCODE_SEARCH: - NativeApp.keyDown(InputDeviceState.deviceId, keyCode, repeat); + NativeApp.keyDown(NativeApp.DEVICE_ID_DEFAULT, keyCode, repeat); return true; case KeyEvent.KEYCODE_DPAD_UP: @@ -1070,7 +1070,7 @@ public abstract class NativeActivity extends Activity { // send the rest of the keys through. // TODO: get rid of the three special cases above by adjusting the native side of the code. // Log.d(TAG, "Key down: " + keyCode + ", KeyEvent: " + event); - return NativeApp.keyDown(InputDeviceState.deviceId, keyCode, repeat); + return NativeApp.keyDown(NativeApp.DEVICE_ID_DEFAULT, keyCode, repeat); } } @@ -1080,18 +1080,18 @@ public abstract class NativeActivity extends Activity { switch (keyCode) { case KeyEvent.KEYCODE_BACK: if (event.isAltPressed()) { - NativeApp.keyUp(0, 1004); // special custom keycode + NativeApp.keyUp(NativeApp.DEVICE_ID_PAD_0, 1004); // special custom keycode } else if (NativeApp.isAtTopLevel()) { Log.i(TAG, "IsAtTopLevel returned true."); return super.onKeyUp(keyCode, event); } else { - NativeApp.keyUp(0, keyCode); + NativeApp.keyUp(NativeApp.DEVICE_ID_DEFAULT, keyCode); } return true; case KeyEvent.KEYCODE_MENU: case KeyEvent.KEYCODE_SEARCH: // Search probably should also be ignored. We send it to the app. - NativeApp.keyUp(0, keyCode); + NativeApp.keyUp(NativeApp.DEVICE_ID_DEFAULT, keyCode); return true; case KeyEvent.KEYCODE_DPAD_UP: @@ -1106,7 +1106,7 @@ public abstract class NativeActivity extends Activity { default: // send the rest of the keys through. // Log.d(TAG, "Key down: " + keyCode + ", KeyEvent: " + event); - return NativeApp.keyUp(0, keyCode); + return NativeApp.keyUp(NativeApp.DEVICE_ID_DEFAULT, keyCode); } } From 8f86ddba2aa574d0f77c470b1bfd9c455fc9ab68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 28 Aug 2021 14:47:40 +0200 Subject: [PATCH 197/336] Android: More strict identification of keyboard events. --- android/src/org/ppsspp/ppsspp/InputDeviceState.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/android/src/org/ppsspp/ppsspp/InputDeviceState.java b/android/src/org/ppsspp/ppsspp/InputDeviceState.java index 3bbebdf975..8141e2b0b0 100644 --- a/android/src/org/ppsspp/ppsspp/InputDeviceState.java +++ b/android/src/org/ppsspp/ppsspp/InputDeviceState.java @@ -28,15 +28,16 @@ public class InputDeviceState { public InputDeviceState(InputDevice device) { int sources = device.getSources(); - if ((sources & InputDevice.SOURCE_KEYBOARD) == InputDevice.SOURCE_KEYBOARD) { + if ((sources & InputDevice.SOURCE_KEYBOARD) == InputDevice.SOURCE_KEYBOARD && device.getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC) { this.deviceId = NativeApp.DEVICE_ID_KEYBOARD; - } else if ((sources & InputDevice.SOURCE_MOUSE) == InputDevice.SOURCE_MOUSE) { + } else if ((sources & InputDevice.SOURCE_CLASS_POINTER) == InputDevice.SOURCE_CLASS_POINTER) { this.deviceId = NativeApp.DEVICE_ID_MOUSE; } else if (((sources & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD || (sources & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK || (sources & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD)) { this.deviceId = NativeApp.DEVICE_ID_PAD_0; } else { + // Built-in buttons like Back etc. this.deviceId = NativeApp.DEVICE_ID_DEFAULT; } From 8cab56c948ad4d341e4e019b434512df1058de42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 28 Aug 2021 15:12:10 +0200 Subject: [PATCH 198/336] Move keymap defaults to a separate file. Not exactly a clean separation though. --- CMakeLists.txt | 2 + Core/ControlMapper.cpp | 3 + Core/Core.vcxproj | 2 + Core/Core.vcxproj.filters | 6 + Core/KeyMap.cpp | 325 +------------------------- Core/KeyMap.h | 11 +- Core/KeyMapDefaults.cpp | 341 ++++++++++++++++++++++++++++ Core/KeyMapDefaults.h | 13 ++ UWP/CoreUWP/CoreUWP.vcxproj | 2 + UWP/CoreUWP/CoreUWP.vcxproj.filters | 2 + android/jni/Android.mk | 1 + libretro/Makefile.common | 1 + 12 files changed, 376 insertions(+), 333 deletions(-) create mode 100644 Core/KeyMapDefaults.cpp create mode 100644 Core/KeyMapDefaults.h diff --git a/CMakeLists.txt b/CMakeLists.txt index bb83a5b1b1..4f9a8ce17b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1604,6 +1604,8 @@ add_library(${CoreLibName} ${CoreLinkType} Core/Instance.h Core/KeyMap.cpp Core/KeyMap.h + Core/KeyMapDefaults.cpp + Core/KeyMapDefaults.h Core/ThreadEventQueue.h Core/WebServer.cpp Core/WebServer.h diff --git a/Core/ControlMapper.cpp b/Core/ControlMapper.cpp index de71298e87..c0ff50c76a 100644 --- a/Core/ControlMapper.cpp +++ b/Core/ControlMapper.cpp @@ -2,6 +2,7 @@ #include "Common/Math/math_util.h" #include "Common/TimeUtil.h" +#include "Common/Log.h" #include "Core/KeyMap.h" #include "Core/ControlMapper.h" @@ -79,6 +80,8 @@ bool ControlMapper::Key(const KeyInput &key, bool *pauseTrigger) { pspKey(pspKeys[i], key.flags); } + INFO_LOG(SYSTEM, "Key: %d DeviceId: %d", key.keyCode, key.deviceId); + if (!pspKeys.size() || key.deviceId == DEVICE_ID_DEFAULT) { if ((key.flags & KEY_DOWN) && key.keyCode == NKCODE_BACK) { *pauseTrigger = true; diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index d8d96a3f31..ee2b8a5f72 100644 --- a/Core/Core.vcxproj +++ b/Core/Core.vcxproj @@ -541,6 +541,7 @@ + @@ -1098,6 +1099,7 @@ + diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters index 486f2a2e10..3d3b1e9853 100644 --- a/Core/Core.vcxproj.filters +++ b/Core/Core.vcxproj.filters @@ -1178,6 +1178,9 @@ Core + + Core + @@ -1898,6 +1901,9 @@ Core + + Core + diff --git a/Core/KeyMap.cpp b/Core/KeyMap.cpp index c15f8dc6c7..b192fc2bdb 100644 --- a/Core/KeyMap.cpp +++ b/Core/KeyMap.cpp @@ -36,267 +36,19 @@ #include "Core/HLE/sceUtility.h" #include "Core/Config.h" #include "Core/KeyMap.h" +#include "Core/KeyMapDefaults.h" namespace KeyMap { KeyDef AxisDef(int deviceId, int axisId, int direction); -struct DefMappingStruct { - int pspKey; - int key; - int direction; -}; - KeyMapping g_controllerMap; int g_controllerMapGeneration = 0; std::set g_seenPads; -static std::set g_seenDeviceIds; +std::set g_seenDeviceIds; bool g_swapped_keys = false; -static const DefMappingStruct defaultQwertyKeyboardKeyMap[] = { - {CTRL_SQUARE, NKCODE_A}, - {CTRL_TRIANGLE, NKCODE_S}, - {CTRL_CIRCLE, NKCODE_X}, - {CTRL_CROSS, NKCODE_Z}, - {CTRL_LTRIGGER, NKCODE_Q}, - {CTRL_RTRIGGER, NKCODE_W}, - - {CTRL_START, NKCODE_SPACE}, -#ifdef _WIN32 - {CTRL_SELECT, NKCODE_V}, -#else - {CTRL_SELECT, NKCODE_ENTER}, -#endif - {CTRL_UP , NKCODE_DPAD_UP}, - {CTRL_DOWN , NKCODE_DPAD_DOWN}, - {CTRL_LEFT , NKCODE_DPAD_LEFT}, - {CTRL_RIGHT, NKCODE_DPAD_RIGHT}, - {VIRTKEY_AXIS_Y_MAX, NKCODE_I}, - {VIRTKEY_AXIS_Y_MIN, NKCODE_K}, - {VIRTKEY_AXIS_X_MIN, NKCODE_J}, - {VIRTKEY_AXIS_X_MAX, NKCODE_L}, - {VIRTKEY_RAPID_FIRE, NKCODE_SHIFT_LEFT}, - {VIRTKEY_FASTFORWARD, NKCODE_TAB}, - {VIRTKEY_SPEED_TOGGLE, NKCODE_GRAVE}, - {VIRTKEY_PAUSE , NKCODE_ESCAPE}, - {VIRTKEY_REWIND , NKCODE_DEL}, - {VIRTKEY_ANALOG_LIGHTLY, NKCODE_SHIFT_RIGHT}, -}; - -static const DefMappingStruct defaultAzertyKeyboardKeyMap[] = { - {CTRL_SQUARE, NKCODE_Q}, - {CTRL_TRIANGLE, NKCODE_S}, - {CTRL_CIRCLE, NKCODE_X}, - {CTRL_CROSS, NKCODE_W}, - {CTRL_LTRIGGER, NKCODE_A}, - {CTRL_RTRIGGER, NKCODE_Z}, - - {CTRL_START, NKCODE_SPACE}, -#ifdef _WIN32 - {CTRL_SELECT, NKCODE_V}, -#else - {CTRL_SELECT, NKCODE_ENTER}, -#endif - {CTRL_UP , NKCODE_DPAD_UP}, - {CTRL_DOWN , NKCODE_DPAD_DOWN}, - {CTRL_LEFT , NKCODE_DPAD_LEFT}, - {CTRL_RIGHT, NKCODE_DPAD_RIGHT}, - {VIRTKEY_AXIS_Y_MAX, NKCODE_I}, - {VIRTKEY_AXIS_Y_MIN, NKCODE_K}, - {VIRTKEY_AXIS_X_MIN, NKCODE_J}, - {VIRTKEY_AXIS_X_MAX, NKCODE_L}, - {VIRTKEY_RAPID_FIRE, NKCODE_SHIFT_LEFT}, - {VIRTKEY_FASTFORWARD, NKCODE_TAB}, - {VIRTKEY_SPEED_TOGGLE, NKCODE_GRAVE}, - {VIRTKEY_PAUSE , NKCODE_ESCAPE}, - {VIRTKEY_REWIND , NKCODE_DEL}, - {VIRTKEY_ANALOG_LIGHTLY, NKCODE_SHIFT_RIGHT}, -}; - -static const DefMappingStruct defaultQwertzKeyboardKeyMap[] = { - {CTRL_SQUARE, NKCODE_A}, - {CTRL_TRIANGLE, NKCODE_S}, - {CTRL_CIRCLE, NKCODE_X}, - {CTRL_CROSS, NKCODE_Y}, - {CTRL_LTRIGGER, NKCODE_Q}, - {CTRL_RTRIGGER, NKCODE_W}, - - {CTRL_START, NKCODE_SPACE}, -#ifdef _WIN32 - {CTRL_SELECT, NKCODE_V}, -#else - {CTRL_SELECT, NKCODE_ENTER}, -#endif - {CTRL_UP , NKCODE_DPAD_UP}, - {CTRL_DOWN , NKCODE_DPAD_DOWN}, - {CTRL_LEFT , NKCODE_DPAD_LEFT}, - {CTRL_RIGHT, NKCODE_DPAD_RIGHT}, - {VIRTKEY_AXIS_Y_MAX, NKCODE_I}, - {VIRTKEY_AXIS_Y_MIN, NKCODE_K}, - {VIRTKEY_AXIS_X_MIN, NKCODE_J}, - {VIRTKEY_AXIS_X_MAX, NKCODE_L}, - {VIRTKEY_RAPID_FIRE, NKCODE_SHIFT_LEFT}, - {VIRTKEY_FASTFORWARD, NKCODE_TAB}, - {VIRTKEY_SPEED_TOGGLE, NKCODE_GRAVE}, - {VIRTKEY_PAUSE , NKCODE_ESCAPE}, - {VIRTKEY_REWIND , NKCODE_DEL}, - {VIRTKEY_ANALOG_LIGHTLY, NKCODE_SHIFT_RIGHT}, -}; - -static const DefMappingStruct default360KeyMap[] = { - {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, - {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, - {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, -1}, - {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, +1}, - {CTRL_CROSS , NKCODE_BUTTON_A}, - {CTRL_CIRCLE , NKCODE_BUTTON_B}, - {CTRL_SQUARE , NKCODE_BUTTON_X}, - {CTRL_TRIANGLE , NKCODE_BUTTON_Y}, - {CTRL_UP , NKCODE_DPAD_UP}, - {CTRL_RIGHT , NKCODE_DPAD_RIGHT}, - {CTRL_DOWN , NKCODE_DPAD_DOWN}, - {CTRL_LEFT , NKCODE_DPAD_LEFT}, - {CTRL_START , NKCODE_BUTTON_START}, - {CTRL_SELECT , NKCODE_BUTTON_SELECT}, - {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, - {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, - {VIRTKEY_FASTFORWARD , JOYSTICK_AXIS_RTRIGGER, +1}, - {VIRTKEY_SPEED_TOGGLE, NKCODE_BUTTON_THUMBR}, - {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, - {VIRTKEY_PAUSE, NKCODE_HOME}, -}; - -static const DefMappingStruct defaultShieldKeyMap[] = { - {CTRL_CROSS, NKCODE_BUTTON_A}, - {CTRL_CIRCLE ,NKCODE_BUTTON_B}, - {CTRL_SQUARE ,NKCODE_BUTTON_X}, - {CTRL_TRIANGLE ,NKCODE_BUTTON_Y}, - {CTRL_START, NKCODE_BUTTON_START}, - {CTRL_SELECT, JOYSTICK_AXIS_LTRIGGER, +1}, - {CTRL_LTRIGGER, NKCODE_BUTTON_L1}, - {CTRL_RTRIGGER, NKCODE_BUTTON_R1}, - {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, - {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, - {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, - {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, - {CTRL_LEFT, JOYSTICK_AXIS_HAT_X, -1}, - {CTRL_RIGHT, JOYSTICK_AXIS_HAT_X, +1}, - {CTRL_UP, JOYSTICK_AXIS_HAT_Y, -1}, - {CTRL_DOWN, JOYSTICK_AXIS_HAT_Y, +1}, - {VIRTKEY_SPEED_TOGGLE, JOYSTICK_AXIS_LTRIGGER, +1 }, - {VIRTKEY_FASTFORWARD, JOYSTICK_AXIS_RTRIGGER, +1 }, - {VIRTKEY_PAUSE, NKCODE_BACK }, -}; - -static const DefMappingStruct defaultMOQI7SKeyMap[] = { - {CTRL_CROSS, NKCODE_BUTTON_A}, - {CTRL_CIRCLE, NKCODE_BUTTON_B}, - {CTRL_SQUARE, NKCODE_BUTTON_X}, - {CTRL_TRIANGLE, NKCODE_BUTTON_Y}, - {CTRL_START, JOYSTICK_AXIS_Z, +1}, - {CTRL_SELECT, JOYSTICK_AXIS_Z, -1}, - {CTRL_LTRIGGER, NKCODE_BUTTON_L1}, - {CTRL_RTRIGGER, NKCODE_BUTTON_R1}, - {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, - {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, - {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, - {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, - {CTRL_LEFT, JOYSTICK_AXIS_HAT_X, -1}, - {CTRL_RIGHT, JOYSTICK_AXIS_HAT_X, +1}, - {CTRL_UP, JOYSTICK_AXIS_HAT_Y, -1}, - {CTRL_DOWN, JOYSTICK_AXIS_HAT_Y, +1}, - {VIRTKEY_FASTFORWARD, JOYSTICK_AXIS_RZ, +1 }, - {VIRTKEY_PAUSE, NKCODE_BACK }, -}; - -static const DefMappingStruct defaultPadMap[] = { -#if PPSSPP_PLATFORM(ANDROID) - {CTRL_CROSS , NKCODE_BUTTON_A}, - {CTRL_CIRCLE , NKCODE_BUTTON_B}, - {CTRL_SQUARE , NKCODE_BUTTON_X}, - {CTRL_TRIANGLE , NKCODE_BUTTON_Y}, - // The hat for DPAD is standard for bluetooth pads, which is the most likely pads on Android I think. - {CTRL_LEFT , JOYSTICK_AXIS_HAT_X, -1}, - {CTRL_LEFT , NKCODE_DPAD_LEFT}, - {CTRL_RIGHT , JOYSTICK_AXIS_HAT_X, +1}, - {CTRL_RIGHT , NKCODE_DPAD_RIGHT}, - {CTRL_UP , JOYSTICK_AXIS_HAT_Y, -1}, - {CTRL_UP , NKCODE_DPAD_UP}, - {CTRL_DOWN , JOYSTICK_AXIS_HAT_Y, +1}, - {CTRL_DOWN , NKCODE_DPAD_DOWN}, - {CTRL_START , NKCODE_BUTTON_START}, - {CTRL_SELECT , NKCODE_BACK}, - {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, - {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, - {VIRTKEY_FASTFORWARD , NKCODE_BUTTON_R2}, - {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, - {VIRTKEY_SPEED_TOGGLE, NKCODE_BUTTON_L2}, - {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, - {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, - {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, - {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, -#else - {CTRL_CROSS , NKCODE_BUTTON_2}, - {CTRL_CIRCLE , NKCODE_BUTTON_3}, - {CTRL_SQUARE , NKCODE_BUTTON_4}, - {CTRL_TRIANGLE , NKCODE_BUTTON_1}, - {CTRL_UP , NKCODE_DPAD_UP}, - {CTRL_RIGHT , NKCODE_DPAD_RIGHT}, - {CTRL_DOWN , NKCODE_DPAD_DOWN}, - {CTRL_LEFT , NKCODE_DPAD_LEFT}, - {CTRL_START , NKCODE_BUTTON_10}, - {CTRL_SELECT , NKCODE_BUTTON_9}, - {CTRL_LTRIGGER , NKCODE_BUTTON_7}, - {CTRL_RTRIGGER , NKCODE_BUTTON_8}, - {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, - {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, - {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, - {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, - {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, -#endif -}; - -static const DefMappingStruct defaultOuyaMap[] = { - {CTRL_CROSS , NKCODE_BUTTON_A}, - {CTRL_CIRCLE , NKCODE_BUTTON_B}, - {CTRL_SQUARE , NKCODE_BUTTON_X}, - {CTRL_TRIANGLE , NKCODE_BUTTON_Y}, - {CTRL_UP , NKCODE_DPAD_UP}, - {CTRL_RIGHT , NKCODE_DPAD_RIGHT}, - {CTRL_DOWN , NKCODE_DPAD_DOWN}, - {CTRL_LEFT , NKCODE_DPAD_LEFT}, - {CTRL_START , NKCODE_BUTTON_R2}, - {CTRL_SELECT , NKCODE_BUTTON_L2}, - {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, - {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, - {VIRTKEY_FASTFORWARD , NKCODE_BUTTON_THUMBL}, - {VIRTKEY_PAUSE , NKCODE_BUTTON_THUMBR}, - {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, - {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, - {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, - {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, -}; - -static const DefMappingStruct defaultXperiaPlay[] = { - {CTRL_CROSS , NKCODE_BUTTON_CROSS}, - {CTRL_CIRCLE , NKCODE_BUTTON_CIRCLE}, - {CTRL_SQUARE , NKCODE_BUTTON_X}, - {CTRL_TRIANGLE , NKCODE_BUTTON_Y}, - {CTRL_UP , NKCODE_DPAD_UP}, - {CTRL_RIGHT , NKCODE_DPAD_RIGHT}, - {CTRL_DOWN , NKCODE_DPAD_DOWN}, - {CTRL_LEFT , NKCODE_DPAD_LEFT}, - {CTRL_START , NKCODE_BUTTON_START}, - {CTRL_SELECT , NKCODE_BUTTON_SELECT}, - {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, - {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, - {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, - {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, - {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, -1}, - {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, +1}, -}; - void KeyCodesFromPspButton(int btn, std::vector *keycodes) { for (auto i = g_controllerMap[btn].begin(), end = g_controllerMap[btn].end(); i != end; ++i) { keycodes->push_back((keycode_t)i->keyCode); @@ -368,79 +120,6 @@ void UpdateNativeMenuKeys() { SetAnalogFlipY(flipYByDeviceId); } -static void SetDefaultKeyMap(int deviceId, const DefMappingStruct *array, size_t count, bool replace) { - for (size_t i = 0; i < count; i++) { - if (array[i].direction == 0) - SetKeyMapping(array[i].pspKey, KeyDef(deviceId, array[i].key), replace); - else - SetAxisMapping(array[i].pspKey, deviceId, array[i].key, array[i].direction, replace); - } - g_seenDeviceIds.insert(deviceId); -} - -void SetDefaultKeyMap(DefaultMaps dmap, bool replace) { - switch (dmap) { - case DEFAULT_MAPPING_KEYBOARD: - { - bool azerty = false; - bool qwertz = false; -#if defined(SDL) - char q, w, y; - q = SDL_GetKeyFromScancode(SDL_SCANCODE_Q); - w = SDL_GetKeyFromScancode(SDL_SCANCODE_W); - y = SDL_GetKeyFromScancode(SDL_SCANCODE_Y); - if (q == 'a' && w == 'z' && y == 'y') - azerty = true; - else if (q == 'q' && w == 'w' && y == 'z') - qwertz = true; -#elif defined(USING_WIN_UI) - HKL localeId = GetKeyboardLayout(0); - // TODO: Is this list complete enough? - switch ((int)(intptr_t)localeId & 0xFFFF) { - case 0x407: - qwertz = true; - break; - case 0x040c: - case 0x080c: - case 0x1009: - azerty = true; - break; - default: - break; - } -#endif - if (azerty) { - SetDefaultKeyMap(DEVICE_ID_KEYBOARD, defaultAzertyKeyboardKeyMap, ARRAY_SIZE(defaultAzertyKeyboardKeyMap), replace); - } else if (qwertz) { - SetDefaultKeyMap(DEVICE_ID_KEYBOARD, defaultQwertzKeyboardKeyMap, ARRAY_SIZE(defaultQwertzKeyboardKeyMap), replace); - } else { - SetDefaultKeyMap(DEVICE_ID_KEYBOARD, defaultQwertyKeyboardKeyMap, ARRAY_SIZE(defaultQwertyKeyboardKeyMap), replace); - } - } - break; - case DEFAULT_MAPPING_X360: - SetDefaultKeyMap(DEVICE_ID_X360_0, default360KeyMap, ARRAY_SIZE(default360KeyMap), replace); - break; - case DEFAULT_MAPPING_SHIELD: - SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultShieldKeyMap, ARRAY_SIZE(defaultShieldKeyMap), replace); - break; - case DEFAULT_MAPPING_MOQI_I7S: - SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultMOQI7SKeyMap, ARRAY_SIZE(defaultMOQI7SKeyMap), replace); - break; - case DEFAULT_MAPPING_PAD: - SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultPadMap, ARRAY_SIZE(defaultPadMap), replace); - break; - case DEFAULT_MAPPING_OUYA: - SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultOuyaMap, ARRAY_SIZE(defaultOuyaMap), replace); - break; - case DEFAULT_MAPPING_XPERIA_PLAY: - SetDefaultKeyMap(DEVICE_ID_DEFAULT, defaultXperiaPlay, ARRAY_SIZE(defaultXperiaPlay), replace); - break; - } - - UpdateNativeMenuKeys(); -} - static const KeyMap_IntStrPair key_names[] = { {NKCODE_A, "A"}, {NKCODE_B, "B"}, diff --git a/Core/KeyMap.h b/Core/KeyMap.h index 011cf03c54..b57d505eec 100644 --- a/Core/KeyMap.h +++ b/Core/KeyMap.h @@ -65,16 +65,6 @@ enum { VIRTKEY_COUNT = VIRTKEY_LAST - VIRTKEY_FIRST }; -enum DefaultMaps { - DEFAULT_MAPPING_KEYBOARD, - DEFAULT_MAPPING_PAD, - DEFAULT_MAPPING_X360, - DEFAULT_MAPPING_SHIELD, - DEFAULT_MAPPING_OUYA, - DEFAULT_MAPPING_XPERIA_PLAY, - DEFAULT_MAPPING_MOQI_I7S, -}; - const float AXIS_BIND_THRESHOLD = 0.75f; const float AXIS_BIND_THRESHOLD_MOUSE = 0.01f; @@ -106,6 +96,7 @@ class IniFile; namespace KeyMap { extern KeyMapping g_controllerMap; + extern std::set g_seenDeviceIds; extern int g_controllerMapGeneration; // Key & Button names diff --git a/Core/KeyMapDefaults.cpp b/Core/KeyMapDefaults.cpp new file mode 100644 index 0000000000..7e69932b62 --- /dev/null +++ b/Core/KeyMapDefaults.cpp @@ -0,0 +1,341 @@ +#if defined(SDL) +#include +#elif defined(USING_WIN_UI) +#include "CommonWindows.h" +#endif + +#include "ppsspp_config.h" + +#include "Common/CommonFuncs.h" +#include "Common/Input/KeyCodes.h" +#include "Common/Input/InputState.h" +#include "Core/KeyMapDefaults.h" +#include "Core/KeyMap.h" + +#include "Core/HLE/sceCtrl.h" + +namespace KeyMap { + +struct DefMappingStruct { + int pspKey; + int key; + int direction; +}; + +const DefMappingStruct defaultQwertyKeyboardKeyMap[] = { + {CTRL_SQUARE, NKCODE_A}, + {CTRL_TRIANGLE, NKCODE_S}, + {CTRL_CIRCLE, NKCODE_X}, + {CTRL_CROSS, NKCODE_Z}, + {CTRL_LTRIGGER, NKCODE_Q}, + {CTRL_RTRIGGER, NKCODE_W}, + + {CTRL_START, NKCODE_SPACE}, +#ifdef _WIN32 + {CTRL_SELECT, NKCODE_V}, +#else + {CTRL_SELECT, NKCODE_ENTER}, +#endif + {CTRL_UP , NKCODE_DPAD_UP}, + {CTRL_DOWN , NKCODE_DPAD_DOWN}, + {CTRL_LEFT , NKCODE_DPAD_LEFT}, + {CTRL_RIGHT, NKCODE_DPAD_RIGHT}, + {VIRTKEY_AXIS_Y_MAX, NKCODE_I}, + {VIRTKEY_AXIS_Y_MIN, NKCODE_K}, + {VIRTKEY_AXIS_X_MIN, NKCODE_J}, + {VIRTKEY_AXIS_X_MAX, NKCODE_L}, + {VIRTKEY_RAPID_FIRE, NKCODE_SHIFT_LEFT}, + {VIRTKEY_FASTFORWARD, NKCODE_TAB}, + {VIRTKEY_SPEED_TOGGLE, NKCODE_GRAVE}, + {VIRTKEY_PAUSE , NKCODE_ESCAPE}, + {VIRTKEY_REWIND , NKCODE_DEL}, + {VIRTKEY_ANALOG_LIGHTLY, NKCODE_SHIFT_RIGHT}, +}; + +const DefMappingStruct defaultAzertyKeyboardKeyMap[] = { + {CTRL_SQUARE, NKCODE_Q}, + {CTRL_TRIANGLE, NKCODE_S}, + {CTRL_CIRCLE, NKCODE_X}, + {CTRL_CROSS, NKCODE_W}, + {CTRL_LTRIGGER, NKCODE_A}, + {CTRL_RTRIGGER, NKCODE_Z}, + + {CTRL_START, NKCODE_SPACE}, +#ifdef _WIN32 + {CTRL_SELECT, NKCODE_V}, +#else + {CTRL_SELECT, NKCODE_ENTER}, +#endif + {CTRL_UP , NKCODE_DPAD_UP}, + {CTRL_DOWN , NKCODE_DPAD_DOWN}, + {CTRL_LEFT , NKCODE_DPAD_LEFT}, + {CTRL_RIGHT, NKCODE_DPAD_RIGHT}, + {VIRTKEY_AXIS_Y_MAX, NKCODE_I}, + {VIRTKEY_AXIS_Y_MIN, NKCODE_K}, + {VIRTKEY_AXIS_X_MIN, NKCODE_J}, + {VIRTKEY_AXIS_X_MAX, NKCODE_L}, + {VIRTKEY_RAPID_FIRE, NKCODE_SHIFT_LEFT}, + {VIRTKEY_FASTFORWARD, NKCODE_TAB}, + {VIRTKEY_SPEED_TOGGLE, NKCODE_GRAVE}, + {VIRTKEY_PAUSE , NKCODE_ESCAPE}, + {VIRTKEY_REWIND , NKCODE_DEL}, + {VIRTKEY_ANALOG_LIGHTLY, NKCODE_SHIFT_RIGHT}, +}; + +const DefMappingStruct defaultQwertzKeyboardKeyMap[] = { + {CTRL_SQUARE, NKCODE_A}, + {CTRL_TRIANGLE, NKCODE_S}, + {CTRL_CIRCLE, NKCODE_X}, + {CTRL_CROSS, NKCODE_Y}, + {CTRL_LTRIGGER, NKCODE_Q}, + {CTRL_RTRIGGER, NKCODE_W}, + + {CTRL_START, NKCODE_SPACE}, +#ifdef _WIN32 + {CTRL_SELECT, NKCODE_V}, +#else + {CTRL_SELECT, NKCODE_ENTER}, +#endif + {CTRL_UP , NKCODE_DPAD_UP}, + {CTRL_DOWN , NKCODE_DPAD_DOWN}, + {CTRL_LEFT , NKCODE_DPAD_LEFT}, + {CTRL_RIGHT, NKCODE_DPAD_RIGHT}, + {VIRTKEY_AXIS_Y_MAX, NKCODE_I}, + {VIRTKEY_AXIS_Y_MIN, NKCODE_K}, + {VIRTKEY_AXIS_X_MIN, NKCODE_J}, + {VIRTKEY_AXIS_X_MAX, NKCODE_L}, + {VIRTKEY_RAPID_FIRE, NKCODE_SHIFT_LEFT}, + {VIRTKEY_FASTFORWARD, NKCODE_TAB}, + {VIRTKEY_SPEED_TOGGLE, NKCODE_GRAVE}, + {VIRTKEY_PAUSE , NKCODE_ESCAPE}, + {VIRTKEY_REWIND , NKCODE_DEL}, + {VIRTKEY_ANALOG_LIGHTLY, NKCODE_SHIFT_RIGHT}, +}; + +const DefMappingStruct default360KeyMap[] = { + {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, + {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, + {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, -1}, + {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, +1}, + {CTRL_CROSS , NKCODE_BUTTON_A}, + {CTRL_CIRCLE , NKCODE_BUTTON_B}, + {CTRL_SQUARE , NKCODE_BUTTON_X}, + {CTRL_TRIANGLE , NKCODE_BUTTON_Y}, + {CTRL_UP , NKCODE_DPAD_UP}, + {CTRL_RIGHT , NKCODE_DPAD_RIGHT}, + {CTRL_DOWN , NKCODE_DPAD_DOWN}, + {CTRL_LEFT , NKCODE_DPAD_LEFT}, + {CTRL_START , NKCODE_BUTTON_START}, + {CTRL_SELECT , NKCODE_BUTTON_SELECT}, + {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, + {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, + {VIRTKEY_FASTFORWARD , JOYSTICK_AXIS_RTRIGGER, +1}, + {VIRTKEY_SPEED_TOGGLE, NKCODE_BUTTON_THUMBR}, + {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, + {VIRTKEY_PAUSE, NKCODE_HOME}, +}; + +const DefMappingStruct defaultShieldKeyMap[] = { + {CTRL_CROSS, NKCODE_BUTTON_A}, + {CTRL_CIRCLE ,NKCODE_BUTTON_B}, + {CTRL_SQUARE ,NKCODE_BUTTON_X}, + {CTRL_TRIANGLE ,NKCODE_BUTTON_Y}, + {CTRL_START, NKCODE_BUTTON_START}, + {CTRL_SELECT, JOYSTICK_AXIS_LTRIGGER, +1}, + {CTRL_LTRIGGER, NKCODE_BUTTON_L1}, + {CTRL_RTRIGGER, NKCODE_BUTTON_R1}, + {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, + {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, + {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, + {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, + {CTRL_LEFT, JOYSTICK_AXIS_HAT_X, -1}, + {CTRL_RIGHT, JOYSTICK_AXIS_HAT_X, +1}, + {CTRL_UP, JOYSTICK_AXIS_HAT_Y, -1}, + {CTRL_DOWN, JOYSTICK_AXIS_HAT_Y, +1}, + {VIRTKEY_SPEED_TOGGLE, JOYSTICK_AXIS_LTRIGGER, +1 }, + {VIRTKEY_FASTFORWARD, JOYSTICK_AXIS_RTRIGGER, +1 }, + {VIRTKEY_PAUSE, NKCODE_BACK }, +}; + +const DefMappingStruct defaultMOQI7SKeyMap[] = { + {CTRL_CROSS, NKCODE_BUTTON_A}, + {CTRL_CIRCLE, NKCODE_BUTTON_B}, + {CTRL_SQUARE, NKCODE_BUTTON_X}, + {CTRL_TRIANGLE, NKCODE_BUTTON_Y}, + {CTRL_START, JOYSTICK_AXIS_Z, +1}, + {CTRL_SELECT, JOYSTICK_AXIS_Z, -1}, + {CTRL_LTRIGGER, NKCODE_BUTTON_L1}, + {CTRL_RTRIGGER, NKCODE_BUTTON_R1}, + {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, + {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, + {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, + {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, + {CTRL_LEFT, JOYSTICK_AXIS_HAT_X, -1}, + {CTRL_RIGHT, JOYSTICK_AXIS_HAT_X, +1}, + {CTRL_UP, JOYSTICK_AXIS_HAT_Y, -1}, + {CTRL_DOWN, JOYSTICK_AXIS_HAT_Y, +1}, + {VIRTKEY_FASTFORWARD, JOYSTICK_AXIS_RZ, +1 }, + {VIRTKEY_PAUSE, NKCODE_BACK }, +}; + +const DefMappingStruct defaultPadMap[] = { +#if PPSSPP_PLATFORM(ANDROID) + {CTRL_CROSS , NKCODE_BUTTON_A}, + {CTRL_CIRCLE , NKCODE_BUTTON_B}, + {CTRL_SQUARE , NKCODE_BUTTON_X}, + {CTRL_TRIANGLE , NKCODE_BUTTON_Y}, + // The hat for DPAD is standard for bluetooth pads, which is the most likely pads on Android I think. + {CTRL_LEFT , JOYSTICK_AXIS_HAT_X, -1}, + {CTRL_LEFT , NKCODE_DPAD_LEFT}, + {CTRL_RIGHT , JOYSTICK_AXIS_HAT_X, +1}, + {CTRL_RIGHT , NKCODE_DPAD_RIGHT}, + {CTRL_UP , JOYSTICK_AXIS_HAT_Y, -1}, + {CTRL_UP , NKCODE_DPAD_UP}, + {CTRL_DOWN , JOYSTICK_AXIS_HAT_Y, +1}, + {CTRL_DOWN , NKCODE_DPAD_DOWN}, + {CTRL_START , NKCODE_BUTTON_START}, + {CTRL_SELECT , NKCODE_BACK}, + {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, + {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, + {VIRTKEY_FASTFORWARD , NKCODE_BUTTON_R2}, + {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, + {VIRTKEY_SPEED_TOGGLE, NKCODE_BUTTON_L2}, + {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, + {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, + {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, + {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, +#else + {CTRL_CROSS , NKCODE_BUTTON_2}, + {CTRL_CIRCLE , NKCODE_BUTTON_3}, + {CTRL_SQUARE , NKCODE_BUTTON_4}, + {CTRL_TRIANGLE , NKCODE_BUTTON_1}, + {CTRL_UP , NKCODE_DPAD_UP}, + {CTRL_RIGHT , NKCODE_DPAD_RIGHT}, + {CTRL_DOWN , NKCODE_DPAD_DOWN}, + {CTRL_LEFT , NKCODE_DPAD_LEFT}, + {CTRL_START , NKCODE_BUTTON_10}, + {CTRL_SELECT , NKCODE_BUTTON_9}, + {CTRL_LTRIGGER , NKCODE_BUTTON_7}, + {CTRL_RTRIGGER , NKCODE_BUTTON_8}, + {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, + {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, + {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, + {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, + {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, +#endif +}; + +const DefMappingStruct defaultOuyaMap[] = { + {CTRL_CROSS , NKCODE_BUTTON_A}, + {CTRL_CIRCLE , NKCODE_BUTTON_B}, + {CTRL_SQUARE , NKCODE_BUTTON_X}, + {CTRL_TRIANGLE , NKCODE_BUTTON_Y}, + {CTRL_UP , NKCODE_DPAD_UP}, + {CTRL_RIGHT , NKCODE_DPAD_RIGHT}, + {CTRL_DOWN , NKCODE_DPAD_DOWN}, + {CTRL_LEFT , NKCODE_DPAD_LEFT}, + {CTRL_START , NKCODE_BUTTON_R2}, + {CTRL_SELECT , NKCODE_BUTTON_L2}, + {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, + {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, + {VIRTKEY_FASTFORWARD , NKCODE_BUTTON_THUMBL}, + {VIRTKEY_PAUSE , NKCODE_BUTTON_THUMBR}, + {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, + {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, + {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, + {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, +}; + +const DefMappingStruct defaultXperiaPlay[] = { + {CTRL_CROSS , NKCODE_BUTTON_CROSS}, + {CTRL_CIRCLE , NKCODE_BUTTON_CIRCLE}, + {CTRL_SQUARE , NKCODE_BUTTON_X}, + {CTRL_TRIANGLE , NKCODE_BUTTON_Y}, + {CTRL_UP , NKCODE_DPAD_UP}, + {CTRL_RIGHT , NKCODE_DPAD_RIGHT}, + {CTRL_DOWN , NKCODE_DPAD_DOWN}, + {CTRL_LEFT , NKCODE_DPAD_LEFT}, + {CTRL_START , NKCODE_BUTTON_START}, + {CTRL_SELECT , NKCODE_BUTTON_SELECT}, + {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, + {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, + {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, + {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, + {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, -1}, + {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, +1}, +}; + +static void SetDefaultKeyMap(int deviceId, const DefMappingStruct *array, size_t count, bool replace) { + for (size_t i = 0; i < count; i++) { + if (array[i].direction == 0) + SetKeyMapping(array[i].pspKey, KeyDef(deviceId, array[i].key), replace); + else + SetAxisMapping(array[i].pspKey, deviceId, array[i].key, array[i].direction, replace); + } + g_seenDeviceIds.insert(deviceId); +} + +void SetDefaultKeyMap(DefaultMaps dmap, bool replace) { + switch (dmap) { + case DEFAULT_MAPPING_KEYBOARD: + { + bool azerty = false; + bool qwertz = false; +#if defined(SDL) + char q, w, y; + q = SDL_GetKeyFromScancode(SDL_SCANCODE_Q); + w = SDL_GetKeyFromScancode(SDL_SCANCODE_W); + y = SDL_GetKeyFromScancode(SDL_SCANCODE_Y); + if (q == 'a' && w == 'z' && y == 'y') + azerty = true; + else if (q == 'q' && w == 'w' && y == 'z') + qwertz = true; +#elif defined(USING_WIN_UI) + HKL localeId = GetKeyboardLayout(0); + // TODO: Is this list complete enough? + switch ((int)(intptr_t)localeId & 0xFFFF) { + case 0x407: + qwertz = true; + break; + case 0x040c: + case 0x080c: + case 0x1009: + azerty = true; + break; + default: + break; + } +#endif + if (azerty) { + SetDefaultKeyMap(DEVICE_ID_KEYBOARD, defaultAzertyKeyboardKeyMap, ARRAY_SIZE(defaultAzertyKeyboardKeyMap), replace); + } else if (qwertz) { + SetDefaultKeyMap(DEVICE_ID_KEYBOARD, defaultQwertzKeyboardKeyMap, ARRAY_SIZE(defaultQwertzKeyboardKeyMap), replace); + } else { + SetDefaultKeyMap(DEVICE_ID_KEYBOARD, defaultQwertyKeyboardKeyMap, ARRAY_SIZE(defaultQwertyKeyboardKeyMap), replace); + } + } + break; + case DEFAULT_MAPPING_X360: + SetDefaultKeyMap(DEVICE_ID_X360_0, default360KeyMap, ARRAY_SIZE(default360KeyMap), replace); + break; + case DEFAULT_MAPPING_SHIELD: + SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultShieldKeyMap, ARRAY_SIZE(defaultShieldKeyMap), replace); + break; + case DEFAULT_MAPPING_MOQI_I7S: + SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultMOQI7SKeyMap, ARRAY_SIZE(defaultMOQI7SKeyMap), replace); + break; + case DEFAULT_MAPPING_PAD: + SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultPadMap, ARRAY_SIZE(defaultPadMap), replace); + break; + case DEFAULT_MAPPING_OUYA: + SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultOuyaMap, ARRAY_SIZE(defaultOuyaMap), replace); + break; + case DEFAULT_MAPPING_XPERIA_PLAY: + SetDefaultKeyMap(DEVICE_ID_DEFAULT, defaultXperiaPlay, ARRAY_SIZE(defaultXperiaPlay), replace); + break; + } + + UpdateNativeMenuKeys(); +} + +} // namespace KeyMap diff --git a/Core/KeyMapDefaults.h b/Core/KeyMapDefaults.h new file mode 100644 index 0000000000..a79cbad857 --- /dev/null +++ b/Core/KeyMapDefaults.h @@ -0,0 +1,13 @@ +#pragma once + +enum DefaultMaps { + DEFAULT_MAPPING_KEYBOARD, + DEFAULT_MAPPING_PAD, + DEFAULT_MAPPING_X360, + DEFAULT_MAPPING_SHIELD, + DEFAULT_MAPPING_OUYA, + DEFAULT_MAPPING_XPERIA_PLAY, + DEFAULT_MAPPING_MOQI_I7S, +}; + +void SetDefaultKeyMap(DefaultMaps dmap, bool replace); diff --git a/UWP/CoreUWP/CoreUWP.vcxproj b/UWP/CoreUWP/CoreUWP.vcxproj index dd271d6221..19882bdb05 100644 --- a/UWP/CoreUWP/CoreUWP.vcxproj +++ b/UWP/CoreUWP/CoreUWP.vcxproj @@ -527,6 +527,7 @@ + @@ -757,6 +758,7 @@ + diff --git a/UWP/CoreUWP/CoreUWP.vcxproj.filters b/UWP/CoreUWP/CoreUWP.vcxproj.filters index e59d84f7b3..6a1542dfd1 100644 --- a/UWP/CoreUWP/CoreUWP.vcxproj.filters +++ b/UWP/CoreUWP/CoreUWP.vcxproj.filters @@ -1108,6 +1108,7 @@ + @@ -1747,6 +1748,7 @@ + diff --git a/android/jni/Android.mk b/android/jni/Android.mk index 62df2e1a3f..3e911bb34c 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -387,6 +387,7 @@ EXEC_AND_LIB_FILES := \ $(SRC)/Core/HDRemaster.cpp \ $(SRC)/Core/Instance.cpp \ $(SRC)/Core/KeyMap.cpp \ + $(SRC)/Core/KeyMapDefaults.cpp \ $(SRC)/Core/Host.cpp \ $(SRC)/Core/Loaders.cpp \ $(SRC)/Core/PSPLoaders.cpp \ diff --git a/libretro/Makefile.common b/libretro/Makefile.common index a80ff92847..eb1bd54478 100644 --- a/libretro/Makefile.common +++ b/libretro/Makefile.common @@ -433,6 +433,7 @@ SOURCES_CXX += \ $(COREDIR)/Core.cpp \ $(COREDIR)/WaveFile.cpp \ $(COREDIR)/KeyMap.cpp \ + $(COREDIR)/KeyMapDefaults.cpp \ $(COREDIR)/FileLoaders/HTTPFileLoader.cpp \ $(COREDIR)/FileLoaders/CachingFileLoader.cpp \ $(COREDIR)/FileLoaders/DiskCachingFileLoader.cpp \ From b6228a10369148cffd58ec3f0fb8e9fe4050cd69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 28 Aug 2021 15:38:03 +0200 Subject: [PATCH 199/336] Add additional autoconf layout for xbox pads on Android. Revert the normal pad layout. --- Common/Input/InputState.cpp | 8 ++--- Common/Input/InputState.h | 8 ++--- Common/UI/Root.cpp | 8 ++--- Core/KeyMap.cpp | 23 +++++++++----- Core/KeyMap.h | 4 ++- Core/KeyMapDefaults.cpp | 61 ++++++++++++++++++++++++++++--------- Core/KeyMapDefaults.h | 8 ++++- Windows/XinputDevice.cpp | 6 ++-- 8 files changed, 87 insertions(+), 39 deletions(-) diff --git a/Common/Input/InputState.cpp b/Common/Input/InputState.cpp index 66922ce77f..35a8f8029a 100644 --- a/Common/Input/InputState.cpp +++ b/Common/Input/InputState.cpp @@ -17,10 +17,10 @@ const char *GetDeviceName(int deviceId) { case DEVICE_ID_PAD_7: return "pad8"; case DEVICE_ID_PAD_8: return "pad9"; case DEVICE_ID_PAD_9: return "pad10"; - case DEVICE_ID_X360_0: return "x360"; - case DEVICE_ID_X360_1: return "x360_2"; - case DEVICE_ID_X360_2: return "x360_3"; - case DEVICE_ID_X360_3: return "x360_4"; + case DEVICE_ID_XINPUT_0: return "x360"; // keeping these strings for backward compat + case DEVICE_ID_XINPUT_1: return "x360_2"; + case DEVICE_ID_XINPUT_2: return "x360_3"; + case DEVICE_ID_XINPUT_3: return "x360_4"; case DEVICE_ID_ACCELEROMETER: return "accelerometer"; case DEVICE_ID_MOUSE: return "mouse"; default: diff --git a/Common/Input/InputState.h b/Common/Input/InputState.h index 3c917af1b0..709684a298 100644 --- a/Common/Input/InputState.h +++ b/Common/Input/InputState.h @@ -28,10 +28,10 @@ enum { DEVICE_ID_PAD_7 = 17, DEVICE_ID_PAD_8 = 18, DEVICE_ID_PAD_9 = 19, - DEVICE_ID_X360_0 = 20, // XInput joypads - DEVICE_ID_X360_1 = 21, - DEVICE_ID_X360_2 = 22, - DEVICE_ID_X360_3 = 23, + DEVICE_ID_XINPUT_0 = 20, // XInput joypads + DEVICE_ID_XINPUT_1 = 21, + DEVICE_ID_XINPUT_2 = 22, + DEVICE_ID_XINPUT_3 = 23, DEVICE_ID_ACCELEROMETER = 30, }; diff --git a/Common/UI/Root.cpp b/Common/UI/Root.cpp index ad4b9c2c4c..0e61243ff6 100644 --- a/Common/UI/Root.cpp +++ b/Common/UI/Root.cpp @@ -341,10 +341,10 @@ bool AxisEvent(const AxisInput &axis, ViewGroup *root) { case DEVICE_ID_PAD_1: case DEVICE_ID_PAD_2: case DEVICE_ID_PAD_3: - case DEVICE_ID_X360_0: - case DEVICE_ID_X360_1: - case DEVICE_ID_X360_2: - case DEVICE_ID_X360_3: + case DEVICE_ID_XINPUT_0: + case DEVICE_ID_XINPUT_1: + case DEVICE_ID_XINPUT_2: + case DEVICE_ID_XINPUT_3: { PrevState &old = state[stateKey]; DirState dir = DirState::NONE; diff --git a/Core/KeyMap.cpp b/Core/KeyMap.cpp index b192fc2bdb..06d5e037d8 100644 --- a/Core/KeyMap.cpp +++ b/Core/KeyMap.cpp @@ -43,7 +43,7 @@ namespace KeyMap { KeyDef AxisDef(int deviceId, int axisId, int direction); KeyMapping g_controllerMap; -int g_controllerMapGeneration = 0; +int g_controllerMapGeneration = 0; // Just used to check if we need to update the Windows menu or not. std::set g_seenPads; std::set g_seenDeviceIds; @@ -620,12 +620,11 @@ void SetAxisMapping(int btn, int deviceId, int axisId, int direction, bool repla SetKeyMapping(btn, KeyDef(deviceId, key), replace); } -// Note that it's easy to add other defaults if desired. void RestoreDefault() { g_controllerMap.clear(); #if PPSSPP_PLATFORM(WINDOWS) SetDefaultKeyMap(DEFAULT_MAPPING_KEYBOARD, true); - SetDefaultKeyMap(DEFAULT_MAPPING_X360, false); + SetDefaultKeyMap(DEFAULT_MAPPING_XINPUT, false); SetDefaultKeyMap(DEFAULT_MAPPING_PAD, false); #elif PPSSPP_PLATFORM(ANDROID) // Autodetect a few common (and less common) devices @@ -641,7 +640,7 @@ void RestoreDefault() { SetDefaultKeyMap(DEFAULT_MAPPING_MOQI_I7S, false); } else { INFO_LOG(SYSTEM, "Default pad map"); - SetDefaultKeyMap(DEFAULT_MAPPING_PAD, false); + SetDefaultKeyMap(DEFAULT_MAPPING_ANDROID_PAD, false); } #else SetDefaultKeyMap(DEFAULT_MAPPING_KEYBOARD, true); @@ -735,18 +734,26 @@ void AutoConfForPad(const std::string &name) { g_controllerMap.clear(); INFO_LOG(SYSTEM, "Autoconfiguring pad for '%s'", name.c_str()); - if (name == "Xbox 360 Pad") { - SetDefaultKeyMap(DEFAULT_MAPPING_X360, false); + +#if PPSSPP_PLATFORM(ANDROID) + if (name.find("Xbox") != std::string::npos) { + SetDefaultKeyMap(DEFAULT_MAPPING_ANDROID_XBOX, false); + } else { + SetDefaultKeyMap(DEFAULT_MAPPING_ANDROID_PAD, false); + } +#else + // TODO: Should actually check for XInput? + if (name.find("Xbox") != std::string::npos) { + SetDefaultKeyMap(DEFAULT_MAPPING_XINPUT, false); } else { SetDefaultKeyMap(DEFAULT_MAPPING_PAD, false); } +#endif -#ifndef MOBILE_DEVICE // Add a couple of convenient keyboard mappings by default, too. g_controllerMap[VIRTKEY_PAUSE].push_back(KeyDef(DEVICE_ID_KEYBOARD, NKCODE_ESCAPE)); g_controllerMap[VIRTKEY_FASTFORWARD].push_back(KeyDef(DEVICE_ID_KEYBOARD, NKCODE_TAB)); g_controllerMapGeneration++; -#endif } const std::set &GetSeenPads() { diff --git a/Core/KeyMap.h b/Core/KeyMap.h index b57d505eec..16f4b5d37c 100644 --- a/Core/KeyMap.h +++ b/Core/KeyMap.h @@ -21,9 +21,11 @@ #include #include #include + #include "Common/Input/InputState.h" // KeyDef #include "Common/Input/KeyCodes.h" // keyboard keys -#include "../Core/HLE/sceCtrl.h" // psp keys +#include "Core/HLE/sceCtrl.h" // psp keys +#include "Core/KeyMapDefaults.h" #define KEYMAP_ERROR_KEY_ALREADY_USED -1 #define KEYMAP_ERROR_UNKNOWN_KEY 0 diff --git a/Core/KeyMapDefaults.cpp b/Core/KeyMapDefaults.cpp index 7e69932b62..43bcfbadc3 100644 --- a/Core/KeyMapDefaults.cpp +++ b/Core/KeyMapDefaults.cpp @@ -22,7 +22,7 @@ struct DefMappingStruct { int direction; }; -const DefMappingStruct defaultQwertyKeyboardKeyMap[] = { +static const DefMappingStruct defaultQwertyKeyboardKeyMap[] = { {CTRL_SQUARE, NKCODE_A}, {CTRL_TRIANGLE, NKCODE_S}, {CTRL_CIRCLE, NKCODE_X}, @@ -52,7 +52,7 @@ const DefMappingStruct defaultQwertyKeyboardKeyMap[] = { {VIRTKEY_ANALOG_LIGHTLY, NKCODE_SHIFT_RIGHT}, }; -const DefMappingStruct defaultAzertyKeyboardKeyMap[] = { +static const DefMappingStruct defaultAzertyKeyboardKeyMap[] = { {CTRL_SQUARE, NKCODE_Q}, {CTRL_TRIANGLE, NKCODE_S}, {CTRL_CIRCLE, NKCODE_X}, @@ -82,7 +82,7 @@ const DefMappingStruct defaultAzertyKeyboardKeyMap[] = { {VIRTKEY_ANALOG_LIGHTLY, NKCODE_SHIFT_RIGHT}, }; -const DefMappingStruct defaultQwertzKeyboardKeyMap[] = { +static const DefMappingStruct defaultQwertzKeyboardKeyMap[] = { {CTRL_SQUARE, NKCODE_A}, {CTRL_TRIANGLE, NKCODE_S}, {CTRL_CIRCLE, NKCODE_X}, @@ -112,7 +112,7 @@ const DefMappingStruct defaultQwertzKeyboardKeyMap[] = { {VIRTKEY_ANALOG_LIGHTLY, NKCODE_SHIFT_RIGHT}, }; -const DefMappingStruct default360KeyMap[] = { +static const DefMappingStruct defaultXInputKeyMap[] = { {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, -1}, @@ -135,7 +135,7 @@ const DefMappingStruct default360KeyMap[] = { {VIRTKEY_PAUSE, NKCODE_HOME}, }; -const DefMappingStruct defaultShieldKeyMap[] = { +static const DefMappingStruct defaultShieldKeyMap[] = { {CTRL_CROSS, NKCODE_BUTTON_A}, {CTRL_CIRCLE ,NKCODE_BUTTON_B}, {CTRL_SQUARE ,NKCODE_BUTTON_X}, @@ -157,7 +157,7 @@ const DefMappingStruct defaultShieldKeyMap[] = { {VIRTKEY_PAUSE, NKCODE_BACK }, }; -const DefMappingStruct defaultMOQI7SKeyMap[] = { +static const DefMappingStruct defaultMOQI7SKeyMap[] = { {CTRL_CROSS, NKCODE_BUTTON_A}, {CTRL_CIRCLE, NKCODE_BUTTON_B}, {CTRL_SQUARE, NKCODE_BUTTON_X}, @@ -178,8 +178,7 @@ const DefMappingStruct defaultMOQI7SKeyMap[] = { {VIRTKEY_PAUSE, NKCODE_BACK }, }; -const DefMappingStruct defaultPadMap[] = { -#if PPSSPP_PLATFORM(ANDROID) +static const DefMappingStruct defaultAndroidXboxControllerMap[] = { {CTRL_CROSS , NKCODE_BUTTON_A}, {CTRL_CIRCLE , NKCODE_BUTTON_B}, {CTRL_SQUARE , NKCODE_BUTTON_X}, @@ -204,7 +203,36 @@ const DefMappingStruct defaultPadMap[] = { {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, -#else +}; + +static const DefMappingStruct defaultPadMapAndroid[] = { + {CTRL_CROSS , NKCODE_BUTTON_A}, + {CTRL_CIRCLE , NKCODE_BUTTON_B}, + {CTRL_SQUARE , NKCODE_BUTTON_X}, + {CTRL_TRIANGLE , NKCODE_BUTTON_Y}, + // The hat for DPAD is standard for bluetooth pads, which is the most likely pads on Android I think. + {CTRL_LEFT , JOYSTICK_AXIS_HAT_X, -1}, + {CTRL_LEFT , NKCODE_DPAD_LEFT}, + {CTRL_RIGHT , JOYSTICK_AXIS_HAT_X, +1}, + {CTRL_RIGHT , NKCODE_DPAD_RIGHT}, + {CTRL_UP , JOYSTICK_AXIS_HAT_Y, -1}, + {CTRL_UP , NKCODE_DPAD_UP}, + {CTRL_DOWN , JOYSTICK_AXIS_HAT_Y, +1}, + {CTRL_DOWN , NKCODE_DPAD_DOWN}, + {CTRL_START , NKCODE_BUTTON_START}, + {CTRL_SELECT , NKCODE_BUTTON_SELECT}, + {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, + {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, + {VIRTKEY_FASTFORWARD , NKCODE_BUTTON_R2}, + {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, + {VIRTKEY_SPEED_TOGGLE, NKCODE_BUTTON_L2}, + {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, + {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, + {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, + {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, +}; + +static const DefMappingStruct defaultPadMap[] = { {CTRL_CROSS , NKCODE_BUTTON_2}, {CTRL_CIRCLE , NKCODE_BUTTON_3}, {CTRL_SQUARE , NKCODE_BUTTON_4}, @@ -222,10 +250,9 @@ const DefMappingStruct defaultPadMap[] = { {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, -#endif }; -const DefMappingStruct defaultOuyaMap[] = { +static const DefMappingStruct defaultOuyaMap[] = { {CTRL_CROSS , NKCODE_BUTTON_A}, {CTRL_CIRCLE , NKCODE_BUTTON_B}, {CTRL_SQUARE , NKCODE_BUTTON_X}, @@ -246,7 +273,7 @@ const DefMappingStruct defaultOuyaMap[] = { {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, }; -const DefMappingStruct defaultXperiaPlay[] = { +static const DefMappingStruct defaultXperiaPlay[] = { {CTRL_CROSS , NKCODE_BUTTON_CROSS}, {CTRL_CIRCLE , NKCODE_BUTTON_CIRCLE}, {CTRL_SQUARE , NKCODE_BUTTON_X}, @@ -315,8 +342,8 @@ void SetDefaultKeyMap(DefaultMaps dmap, bool replace) { } } break; - case DEFAULT_MAPPING_X360: - SetDefaultKeyMap(DEVICE_ID_X360_0, default360KeyMap, ARRAY_SIZE(default360KeyMap), replace); + case DEFAULT_MAPPING_XINPUT: + SetDefaultKeyMap(DEVICE_ID_XINPUT_0, defaultXInputKeyMap, ARRAY_SIZE(defaultXInputKeyMap), replace); break; case DEFAULT_MAPPING_SHIELD: SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultShieldKeyMap, ARRAY_SIZE(defaultShieldKeyMap), replace); @@ -327,12 +354,18 @@ void SetDefaultKeyMap(DefaultMaps dmap, bool replace) { case DEFAULT_MAPPING_PAD: SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultPadMap, ARRAY_SIZE(defaultPadMap), replace); break; + case DEFAULT_MAPPING_ANDROID_PAD: + SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultPadMapAndroid, ARRAY_SIZE(defaultPadMapAndroid), replace); + break; case DEFAULT_MAPPING_OUYA: SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultOuyaMap, ARRAY_SIZE(defaultOuyaMap), replace); break; case DEFAULT_MAPPING_XPERIA_PLAY: SetDefaultKeyMap(DEVICE_ID_DEFAULT, defaultXperiaPlay, ARRAY_SIZE(defaultXperiaPlay), replace); break; + case DEFAULT_MAPPING_ANDROID_XBOX: + SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultAndroidXboxControllerMap, ARRAY_SIZE(defaultAndroidXboxControllerMap), replace); + break; } UpdateNativeMenuKeys(); diff --git a/Core/KeyMapDefaults.h b/Core/KeyMapDefaults.h index a79cbad857..ba9c31d022 100644 --- a/Core/KeyMapDefaults.h +++ b/Core/KeyMapDefaults.h @@ -1,9 +1,13 @@ #pragma once +namespace KeyMap { + enum DefaultMaps { DEFAULT_MAPPING_KEYBOARD, DEFAULT_MAPPING_PAD, - DEFAULT_MAPPING_X360, + DEFAULT_MAPPING_ANDROID_PAD, + DEFAULT_MAPPING_XINPUT, + DEFAULT_MAPPING_ANDROID_XBOX, // XBox controller or similar on Android DEFAULT_MAPPING_SHIELD, DEFAULT_MAPPING_OUYA, DEFAULT_MAPPING_XPERIA_PLAY, @@ -11,3 +15,5 @@ enum DefaultMaps { }; void SetDefaultKeyMap(DefaultMaps dmap, bool replace); + +} diff --git a/Windows/XinputDevice.cpp b/Windows/XinputDevice.cpp index 097fe23ecb..6d70816748 100644 --- a/Windows/XinputDevice.cpp +++ b/Windows/XinputDevice.cpp @@ -196,7 +196,7 @@ void XinputDevice::UpdatePad(int pad, const XINPUT_STATE &state, XINPUT_VIBRATIO ApplyVibration(pad, vibration); AxisInput axis; - axis.deviceId = DEVICE_ID_X360_0 + pad; + axis.deviceId = DEVICE_ID_XINPUT_0 + pad; auto sendAxis = [&](AndroidJoystickAxis axisId, float value) { axis.axisId = axisId; axis.value = value; @@ -230,14 +230,14 @@ void XinputDevice::ApplyButtons(int pad, const XINPUT_STATE &state) { for (int i = 0; i < xinput_ctrl_map_size; i++) { if (downMask & xinput_ctrl_map[i].from) { KeyInput key; - key.deviceId = DEVICE_ID_X360_0 + pad; + key.deviceId = DEVICE_ID_XINPUT_0 + pad; key.flags = KEY_DOWN; key.keyCode = xinput_ctrl_map[i].to; NativeKey(key); } if (upMask & xinput_ctrl_map[i].from) { KeyInput key; - key.deviceId = DEVICE_ID_X360_0 + pad; + key.deviceId = DEVICE_ID_XINPUT_0 + pad; key.flags = KEY_UP; key.keyCode = xinput_ctrl_map[i].to; NativeKey(key); From 82087ccbb71b546fd1508c840c075c7366180579 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 28 Aug 2021 09:14:53 -0700 Subject: [PATCH 200/336] Common: Reduce some log levels. Take off a few messages during startup and shutdown. --- Core/Config.cpp | 2 +- Core/ControlMapper.cpp | 2 +- Core/HLE/sceNet.cpp | 2 +- Core/Reporting.cpp | 2 +- UI/NativeApp.cpp | 2 +- Windows/EmuThread.cpp | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index bb956d8c86..69d1b66b81 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -1767,7 +1767,7 @@ bool Config::loadGameConfig(const std::string &pGameId, const std::string &title Path iniFileNameFull = getGameConfigFile(pGameId); if (!hasGameConfig(pGameId)) { - INFO_LOG(LOADER, "Failed to read %s. No game-specific settings found, using global defaults.", iniFileNameFull.c_str()); + DEBUG_LOG(LOADER, "No game-specific settings found in %s. Using global defaults.", iniFileNameFull.c_str()); return false; } diff --git a/Core/ControlMapper.cpp b/Core/ControlMapper.cpp index c0ff50c76a..44d034a2cb 100644 --- a/Core/ControlMapper.cpp +++ b/Core/ControlMapper.cpp @@ -80,7 +80,7 @@ bool ControlMapper::Key(const KeyInput &key, bool *pauseTrigger) { pspKey(pspKeys[i], key.flags); } - INFO_LOG(SYSTEM, "Key: %d DeviceId: %d", key.keyCode, key.deviceId); + DEBUG_LOG(SYSTEM, "Key: %d DeviceId: %d", key.keyCode, key.deviceId); if (!pspKeys.size() || key.deviceId == DEVICE_ID_DEFAULT) { if ((key.flags & KEY_DOWN) && key.keyCode == NKCODE_BACK) { diff --git a/Core/HLE/sceNet.cpp b/Core/HLE/sceNet.cpp index ae7e8af541..a93ed56821 100644 --- a/Core/HLE/sceNet.cpp +++ b/Core/HLE/sceNet.cpp @@ -210,7 +210,7 @@ void __NetInit() { SceNetEtherAddr mac; getLocalMac(&mac); - NOTICE_LOG(SCENET, "LocalHost IP will be %s [%s]", ip2str(g_localhostIP.in.sin_addr).c_str(), mac2str(&mac).c_str()); + INFO_LOG(SCENET, "LocalHost IP will be %s [%s]", ip2str(g_localhostIP.in.sin_addr).c_str(), mac2str(&mac).c_str()); // TODO: May be we should initialize & cleanup somewhere else than here for PortManager to be used as general purpose for whatever port forwarding PPSSPP needed __UPnPInit(); diff --git a/Core/Reporting.cpp b/Core/Reporting.cpp index ec66977c36..9f4d7317b6 100644 --- a/Core/Reporting.cpp +++ b/Core/Reporting.cpp @@ -187,7 +187,7 @@ namespace Reporting crcCond.wait(guard); } } else { - INFO_LOG(SYSTEM, "no CRC pending"); + DEBUG_LOG(SYSTEM, "No CRC pending"); } if (crcThread.joinable()) diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index 3c63e45c35..80e6570850 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -787,7 +787,7 @@ void NativeInit(int argc, const char *argv[], const char *savegame_dir, const ch }); } - INFO_LOG(SYSTEM, "ScreenManager!"); + DEBUG_LOG(SYSTEM, "ScreenManager!"); screenManager = new ScreenManager(); if (g_Config.memStickDirectory.empty()) { INFO_LOG(SYSTEM, "No memstick directory! Asking for one to be configured."); diff --git a/Windows/EmuThread.cpp b/Windows/EmuThread.cpp index c14c9e0ccc..823208c851 100644 --- a/Windows/EmuThread.cpp +++ b/Windows/EmuThread.cpp @@ -230,7 +230,7 @@ void MainThreadFunc() { NativeResized(); } - INFO_LOG(BOOT, "Done."); + DEBUG_LOG(BOOT, "Done."); if (coreState == CORE_POWERDOWN) { INFO_LOG(BOOT, "Exit before core loop."); From 58e7b6bec224195fdeb2e69d95499d7cfccaa978 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 28 Aug 2021 20:06:05 +0200 Subject: [PATCH 201/336] Tweak defaults some more (no L2 on xbox pads..). Minor code cleanup. --- Core/KeyMapDefaults.cpp | 13 ++++++------- UI/EmuScreen.cpp | 7 +++++-- UI/GamepadEmu.cpp | 4 ++-- UI/GamepadEmu.h | 2 +- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/Core/KeyMapDefaults.cpp b/Core/KeyMapDefaults.cpp index 43bcfbadc3..49b520a1e7 100644 --- a/Core/KeyMapDefaults.cpp +++ b/Core/KeyMapDefaults.cpp @@ -184,21 +184,17 @@ static const DefMappingStruct defaultAndroidXboxControllerMap[] = { {CTRL_SQUARE , NKCODE_BUTTON_X}, {CTRL_TRIANGLE , NKCODE_BUTTON_Y}, // The hat for DPAD is standard for bluetooth pads, which is the most likely pads on Android I think. - {CTRL_LEFT , JOYSTICK_AXIS_HAT_X, -1}, {CTRL_LEFT , NKCODE_DPAD_LEFT}, - {CTRL_RIGHT , JOYSTICK_AXIS_HAT_X, +1}, {CTRL_RIGHT , NKCODE_DPAD_RIGHT}, - {CTRL_UP , JOYSTICK_AXIS_HAT_Y, -1}, {CTRL_UP , NKCODE_DPAD_UP}, - {CTRL_DOWN , JOYSTICK_AXIS_HAT_Y, +1}, {CTRL_DOWN , NKCODE_DPAD_DOWN}, {CTRL_START , NKCODE_BUTTON_START}, {CTRL_SELECT , NKCODE_BACK}, {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, - {VIRTKEY_FASTFORWARD , NKCODE_BUTTON_R2}, + {VIRTKEY_FASTFORWARD , JOYSTICK_AXIS_RTRIGGER, +1}, + {VIRTKEY_FASTFORWARD , NKCODE_BUTTON_R2}, {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, - {VIRTKEY_SPEED_TOGGLE, NKCODE_BUTTON_L2}, {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, @@ -219,13 +215,15 @@ static const DefMappingStruct defaultPadMapAndroid[] = { {CTRL_UP , NKCODE_DPAD_UP}, {CTRL_DOWN , JOYSTICK_AXIS_HAT_Y, +1}, {CTRL_DOWN , NKCODE_DPAD_DOWN}, + {CTRL_START , NKCODE_BUTTON_START}, {CTRL_SELECT , NKCODE_BUTTON_SELECT}, {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, + {VIRTKEY_FASTFORWARD , JOYSTICK_AXIS_RTRIGGER, +1}, {VIRTKEY_FASTFORWARD , NKCODE_BUTTON_R2}, {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, - {VIRTKEY_SPEED_TOGGLE, NKCODE_BUTTON_L2}, + {VIRTKEY_PAUSE , NKCODE_BUTTON_L2 }, {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, @@ -250,6 +248,7 @@ static const DefMappingStruct defaultPadMap[] = { {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, + {VIRTKEY_PAUSE , NKCODE_BUTTON_L2 }, }; static const DefMappingStruct defaultOuyaMap[] = { diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index bb12e63b61..6d9f0360cc 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -784,7 +784,11 @@ void EmuScreen::CreateViews() { const Bounds &bounds = screenManager()->getUIContext()->GetLayoutBounds(); InitPadLayout(bounds.w, bounds.h); - root_ = CreatePadLayout(bounds.w, bounds.h, &pauseTrigger_, &controlMapper_); + + // Devices without a back button like iOS need an on-screen touch back button. + bool showPauseButton = !System_GetPropertyBool(SYSPROP_HAS_BACK_BUTTON) || g_Config.bShowTouchPause; + + root_ = CreatePadLayout(bounds.w, bounds.h, &pauseTrigger_, showPauseButton, &controlMapper_); if (g_Config.bShowDeveloperMenu) { root_->Add(new Button(dev->T("DevMenu")))->OnClick.Handle(this, &EmuScreen::OnDevTools); } @@ -983,7 +987,6 @@ void EmuScreen::update() { controlMapper_.Update(); - // This is here to support the iOS on screen back button. if (pauseTrigger_) { pauseTrigger_ = false; screenManager()->push(new GamePauseScreen(gamePath_)); diff --git a/UI/GamepadEmu.cpp b/UI/GamepadEmu.cpp index c5ef3f4cca..f678d2025b 100644 --- a/UI/GamepadEmu.cpp +++ b/UI/GamepadEmu.cpp @@ -698,7 +698,7 @@ void InitPadLayout(float xres, float yres, float globalScale) { initTouchPos(g_Config.touchCombo9, combo9_key_X, combo9_key_Y); } -UI::ViewGroup *CreatePadLayout(float xres, float yres, bool *pause, ControlMapper* controllMapper) { +UI::ViewGroup *CreatePadLayout(float xres, float yres, bool *pause, bool showPauseButton, ControlMapper* controllMapper) { using namespace UI; AnchorLayout *root = new AnchorLayout(new LayoutParams(FILL_PARENT, FILL_PARENT)); @@ -756,7 +756,7 @@ UI::ViewGroup *CreatePadLayout(float xres, float yres, bool *pause, ControlMappe return nullptr; }; - if (!System_GetPropertyBool(SYSPROP_HAS_BACK_BUTTON) || g_Config.bShowTouchPause) { + if (showPauseButton) { root->Add(new BoolButton(pause, "Pause button", roundImage, ImageID("I_ROUND"), ImageID("I_ARROW"), 1.0f, new AnchorLayoutParams(halfW, 20, NONE, NONE, true)))->SetAngle(90); } diff --git a/UI/GamepadEmu.h b/UI/GamepadEmu.h index e8d084662b..8e9978b7d3 100644 --- a/UI/GamepadEmu.h +++ b/UI/GamepadEmu.h @@ -162,7 +162,7 @@ private: //initializes the layout from Config. if a default layout does not exist, //it sets up default values void InitPadLayout(float xres, float yres, float globalScale = 1.15f); -UI::ViewGroup *CreatePadLayout(float xres, float yres, bool *pause, ControlMapper* controllMapper); +UI::ViewGroup *CreatePadLayout(float xres, float yres, bool *pause, bool showPauseButton, ControlMapper* controllMapper); const int D_pad_Radius = 50; const int baseActionButtonSpacing = 60; From 03582b763412b7564cf1adb7c321f6618a3fb478 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 28 Aug 2021 20:17:58 +0200 Subject: [PATCH 202/336] Nonsensical to use the Shield pad map for Shield TV. --- Core/KeyMap.cpp | 2 +- Core/KeyMapDefaults.cpp | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Core/KeyMap.cpp b/Core/KeyMap.cpp index 06d5e037d8..9adb9b0324 100644 --- a/Core/KeyMap.cpp +++ b/Core/KeyMap.cpp @@ -629,7 +629,7 @@ void RestoreDefault() { #elif PPSSPP_PLATFORM(ANDROID) // Autodetect a few common (and less common) devices std::string name = System_GetProperty(SYSPROP_NAME); - if (IsNvidiaShield(name) || IsNvidiaShieldTV(name)) { + if (IsNvidiaShield(name)) { SetDefaultKeyMap(DEFAULT_MAPPING_SHIELD, false); } else if (IsOuya(name)) { SetDefaultKeyMap(DEFAULT_MAPPING_OUYA, false); diff --git a/Core/KeyMapDefaults.cpp b/Core/KeyMapDefaults.cpp index 49b520a1e7..bcd5b541a2 100644 --- a/Core/KeyMapDefaults.cpp +++ b/Core/KeyMapDefaults.cpp @@ -152,7 +152,6 @@ static const DefMappingStruct defaultShieldKeyMap[] = { {CTRL_RIGHT, JOYSTICK_AXIS_HAT_X, +1}, {CTRL_UP, JOYSTICK_AXIS_HAT_Y, -1}, {CTRL_DOWN, JOYSTICK_AXIS_HAT_Y, +1}, - {VIRTKEY_SPEED_TOGGLE, JOYSTICK_AXIS_LTRIGGER, +1 }, {VIRTKEY_FASTFORWARD, JOYSTICK_AXIS_RTRIGGER, +1 }, {VIRTKEY_PAUSE, NKCODE_BACK }, }; @@ -247,7 +246,7 @@ static const DefMappingStruct defaultPadMap[] = { {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, - {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, + {VIRTKEY_PAUSE , NKCODE_BUTTON_SELECT }, {VIRTKEY_PAUSE , NKCODE_BUTTON_L2 }, }; From 82a96dbc86a2c9114241eb22386fc94755029261 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 28 Aug 2021 20:21:09 +0200 Subject: [PATCH 203/336] No R2 on xbox controllers, remove redundant mapping. --- Core/KeyMapDefaults.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Core/KeyMapDefaults.cpp b/Core/KeyMapDefaults.cpp index bcd5b541a2..7862341e36 100644 --- a/Core/KeyMapDefaults.cpp +++ b/Core/KeyMapDefaults.cpp @@ -192,7 +192,6 @@ static const DefMappingStruct defaultAndroidXboxControllerMap[] = { {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, {VIRTKEY_FASTFORWARD , JOYSTICK_AXIS_RTRIGGER, +1}, - {VIRTKEY_FASTFORWARD , NKCODE_BUTTON_R2}, {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, From 51b6c73a2bef5b7b7d5655ef405bc925b8212735 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 28 Aug 2021 20:27:26 +0200 Subject: [PATCH 204/336] Experiment: Remove probably-redundant motionevent class check Could maybe help #14766 --- android/src/org/ppsspp/ppsspp/InputDeviceState.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/android/src/org/ppsspp/ppsspp/InputDeviceState.java b/android/src/org/ppsspp/ppsspp/InputDeviceState.java index 8141e2b0b0..972920712f 100644 --- a/android/src/org/ppsspp/ppsspp/InputDeviceState.java +++ b/android/src/org/ppsspp/ppsspp/InputDeviceState.java @@ -44,18 +44,14 @@ public class InputDeviceState { mDevice = device; int numAxes = 0; for (MotionRange range : device.getMotionRanges()) { - if ((range.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) { - numAxes += 1; - } + numAxes += 1; } mAxes = new int[numAxes]; int i = 0; for (MotionRange range : device.getMotionRanges()) { - if ((range.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) { - mAxes[i++] = range.getAxis(); - } + mAxes[i++] = range.getAxis(); } Log.i(TAG, "Registering input device with " + numAxes + " axes: " + device.getName()); From c0d80b63a9438bae15dd1653ec3457e5cb97ad70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 28 Aug 2021 22:28:02 +0200 Subject: [PATCH 205/336] Hack the math better in cardboard VR mode, to avoid issues with very wide aspect ratios. Fixes #12982 --- GPU/Common/PresentationCommon.cpp | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/GPU/Common/PresentationCommon.cpp b/GPU/Common/PresentationCommon.cpp index 3384302ea6..d834ef3c48 100644 --- a/GPU/Common/PresentationCommon.cpp +++ b/GPU/Common/PresentationCommon.cpp @@ -151,10 +151,11 @@ void PresentationCommon::GetCardboardSettings(CardboardSettings *cardboardSettin cardboardSettings->enabled = false; return; } + // Calculate Cardboard Settings float cardboardScreenScale = g_Config.iCardboardScreenSize / 100.0f; float cardboardScreenWidth = pixelWidth_ / 2.0f * cardboardScreenScale; - float cardboardScreenHeight = pixelHeight_ / 2.0f * cardboardScreenScale; + float cardboardScreenHeight = pixelHeight_ * cardboardScreenScale; float cardboardMaxXShift = (pixelWidth_ / 2.0f - cardboardScreenWidth) / 2.0f; float cardboardUserXShift = g_Config.iCardboardXShift / 100.0f * cardboardMaxXShift; float cardboardLeftEyeX = cardboardMaxXShift + cardboardUserXShift; @@ -563,8 +564,17 @@ void PresentationCommon::CopyToOutput(OutputFlags flags, int uvRotation, float u int lastWidth = srcWidth_; int lastHeight = srcHeight_; + int pixelWidth = pixelWidth_; + int pixelHeight = pixelHeight_; + // These are the output coordinates. - FRect frame = GetScreenFrame((float)pixelWidth_, (float)pixelHeight_); + FRect frame = GetScreenFrame((float)pixelWidth, (float)pixelHeight); + // Note: In cardboard mode, we halve the width here to compensate + // for splitting the window in half, while still reusing normal centering. + if (g_Config.bEnableCardboardVR) { + frame.w /= 2.0; + pixelWidth /= 2; + } FRect rc; CenterDisplayOutputRect(&rc, 480.0f, 272.0f, frame, uvRotation); @@ -587,8 +597,8 @@ void PresentationCommon::CopyToOutput(OutputFlags flags, int uvRotation, float u { rc.x + rc.w, rc.y, 0, u1, v0, 0xFFFFFFFF }, // TR }; - float invDestW = 1.0f / (pixelWidth_ * 0.5f); - float invDestH = 1.0f / (pixelHeight_ * 0.5f); + float invDestW = 2.0f / pixelWidth; + float invDestH = 2.0f / pixelHeight; for (int i = 0; i < 4; i++) { verts[i].x = verts[i].x * invDestW - 1.0f; verts[i].y = verts[i].y * invDestH - 1.0f; @@ -689,9 +699,9 @@ void PresentationCommon::CopyToOutput(OutputFlags flags, int uvRotation, float u float post_v0 = !flipped ? 1.0f : 0.0f; float post_v1 = !flipped ? 0.0f : 1.0f; verts[4] = { -1, -1, 0, 0, post_v1, 0xFFFFFFFF }; // TL - verts[5] = { -1, 1, 0, 0, post_v0, 0xFFFFFFFF }; // BL - verts[6] = { 1, 1, 0, 1, post_v0, 0xFFFFFFFF }; // BR - verts[7] = { 1, -1, 0, 1, post_v1, 0xFFFFFFFF }; // TR + verts[5] = { -1, 1, 0, 0, post_v0, 0xFFFFFFFF }; // BL + verts[6] = { 1, 1, 0, 1, post_v0, 0xFFFFFFFF }; // BR + verts[7] = { 1, -1, 0, 1, post_v1, 0xFFFFFFFF }; // TR draw_->UpdateBuffer(vdata_, (const uint8_t *)verts, 0, sizeof(verts), Draw::UPDATE_DISCARD); for (size_t i = 0; i < postShaderFramebuffers_.size(); ++i) { From 202a9db885a995520b43c94d15bb677a4ff3d93e Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 28 Aug 2021 13:57:22 -0700 Subject: [PATCH 206/336] UI: Add a screen to visualize PSP controls. Currently, doesn't do anything. But looks about right. --- Common/Render/DrawBuffer.cpp | 50 ++++++++ Common/Render/DrawBuffer.h | 1 + Common/UI/ViewGroup.cpp | 3 +- UI/ControlMappingScreen.cpp | 218 +++++++++++++++++++++++++++++++++++ UI/ControlMappingScreen.h | 9 ++ 5 files changed, 280 insertions(+), 1 deletion(-) diff --git a/Common/Render/DrawBuffer.cpp b/Common/Render/DrawBuffer.cpp index b29513d725..b932c62493 100644 --- a/Common/Render/DrawBuffer.cpp +++ b/Common/Render/DrawBuffer.cpp @@ -311,6 +311,56 @@ void DrawBuffer::DrawImageRotated(ImageID atlas_image, float x, float y, float s } } +void DrawBuffer::DrawImageRotatedStretch(ImageID atlas_image, const Bounds &bounds, float scales[2], float angle, Color color, bool mirror_h) { + const AtlasImage *image = atlas->getImage(atlas_image); + if (!image) + return; + + if (scales[0] == 0.0f || scales[1] == 0.0f) { + float rotatedSize[2]{ (float)image->w, (float)image->h }; + rot(rotatedSize, angle, 0.0f, 0.0f); + + // With that, we calculate the scale to stretch to, and rotate it back. + scales[0] = bounds.w / rotatedSize[0]; + scales[1] = bounds.h / rotatedSize[1]; + rot(scales, -angle, 0.0f, 0.0f); + } + + float w = (float)image->w * scales[0]; + float h = (float)image->h * scales[1]; + float x1 = bounds.centerX() - w / 2; + float x2 = bounds.centerX() + w / 2; + float y1 = bounds.centerY() - h / 2; + float y2 = bounds.centerY() + h / 2; + float v[6][2] = { + {x1, y1}, + {x2, y1}, + {x2, y2}, + {x1, y1}, + {x2, y2}, + {x1, y2}, + }; + float u1 = image->u1; + float u2 = image->u2; + if (mirror_h) { + float temp = u1; + u1 = u2; + u2 = temp; + } + const float uv[6][2] = { + {u1, image->v1}, + {u2, image->v1}, + {u2, image->v2}, + {u1, image->v1}, + {u2, image->v2}, + {u1, image->v2}, + }; + for (int i = 0; i < 6; i++) { + rot(v[i], angle, bounds.centerX(), bounds.centerY()); + V(v[i][0], v[i][1], 0, color, uv[i][0], uv[i][1]); + } +} + // TODO: add arc support void DrawBuffer::Circle(float xc, float yc, float radius, float thickness, int segments, float startAngle, uint32_t color, float u_mul) { float angleDelta = PI * 2 / segments; diff --git a/Common/Render/DrawBuffer.h b/Common/Render/DrawBuffer.h index f88308cf97..07aa344ca7 100644 --- a/Common/Render/DrawBuffer.h +++ b/Common/Render/DrawBuffer.h @@ -116,6 +116,7 @@ public: DrawImageStretch(atlas_image, bounds.x, bounds.y, bounds.x2(), bounds.y2(), color); } void DrawImageRotated(ImageID atlas_image, float x, float y, float scale, float angle, Color color = COLOR(0xFFFFFF), bool mirror_h = false); // Always centers + void DrawImageRotatedStretch(ImageID atlas_image, const Bounds &bounds, float scales[2], float angle, Color color = COLOR(0xFFFFFF), bool mirror_h = false); void DrawTexRect(float x1, float y1, float x2, float y2, float u1, float v1, float u2, float v2, Color color); void DrawTexRect(const Bounds &bounds, float u1, float v1, float u2, float v2, Color color) { DrawTexRect(bounds.x, bounds.y, bounds.x2(), bounds.y2(), u1, v1, u2, v2, color); diff --git a/Common/UI/ViewGroup.cpp b/Common/UI/ViewGroup.cpp index e2802aeb2f..2b1ba991bd 100644 --- a/Common/UI/ViewGroup.cpp +++ b/Common/UI/ViewGroup.cpp @@ -1197,7 +1197,8 @@ void AnchorLayout::Layout() { if (vBounds.w > bounds_.w) vBounds.w = bounds_.w; if (vBounds.h > bounds_.h) vBounds.h = bounds_.h; - float left = 0, top = 0, right = 0, bottom = 0, center = false; + float left = 0, top = 0, right = 0, bottom = 0; + bool center = false; if (params) { left = params->left; top = params->top; diff --git a/UI/ControlMappingScreen.cpp b/UI/ControlMappingScreen.cpp index 574e795ddd..1fba4709ab 100644 --- a/UI/ControlMappingScreen.cpp +++ b/UI/ControlMappingScreen.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include "Common/Render/TextureAtlas.h" #include "Common/UI/Root.h" @@ -242,6 +243,8 @@ void ControlMappingScreen::CreateViews() { leftColumn->Add(new Choice(km->T("Autoconfigure")))->OnClick.Handle(this, &ControlMappingScreen::OnAutoConfigure); } + leftColumn->Add(new Choice(km->T("Show PSP")))->OnClick.Handle(this, &ControlMappingScreen::OnVisualizeMapping); + leftColumn->Add(new Spacer(new LinearLayoutParams(1.0f))); AddStandardBack(leftColumn); @@ -289,6 +292,12 @@ UI::EventReturn ControlMappingScreen::OnAutoConfigure(UI::EventParams ¶ms) { return UI::EVENT_DONE; } +UI::EventReturn ControlMappingScreen::OnVisualizeMapping(UI::EventParams ¶ms) { + VisualMappingScreen *visualMapping = new VisualMappingScreen(); + screenManager()->push(visualMapping); + return UI::EVENT_DONE; +} + void ControlMappingScreen::dialogFinished(const Screen *dialog, DialogResult result) { if (result == DR_OK && dialog->tag() == "listpopup") { ListPopupScreen *popup = (ListPopupScreen *)dialog; @@ -840,3 +849,212 @@ UI::EventReturn TouchTestScreen::OnRecreateActivity(UI::EventParams &e) { RecreateActivity(); return UI::EVENT_DONE; } + +class Backplate : public UI::InertView { +public: + Backplate(float scale, UI::LayoutParams *layoutParams = nullptr) : InertView(layoutParams), scale_(scale) { + } + + void Draw(UIContext &dc) override { + using namespace UI; + + const AtlasImage *whiteImage = dc.Draw()->GetAtlas()->getImage(dc.theme->whiteImage); + float centerU = (whiteImage->u1 + whiteImage->u2) * 0.5f; + float centerV = (whiteImage->v1 + whiteImage->v2) * 0.5f; + const uint32_t color = 0xB01C1818; + + auto V = [&](float x, float y) { + dc.Draw()->V(bounds_.x + x * scale_, bounds_.y + y * scale_, color, centerU, centerV); + }; + auto R = [&](float x1, float y1, float x2, float y2) { + V(x1, y1); V(x2, y1); V(x2, y2); + V(x1, y1); V(x2, y2); V(x1, y2); + }; + + // Curved left side. + V(12.0f, 44.0f); V(30.0f, 16.0f); V(30.0f, 44.0f); + V(0.0f, 80.0f); V(12.0f, 44.0f); V(12.0f, 80.0f); + R(12.0f, 44.0f, 30.0f, 80.0f); + R(0.0f, 80.0f, 30.0f, 114.0f); + V(0.0f, 114.0f); V(12.0f, 114.0f); V(12.0f, 154.0f); + R(12.0f, 114.0f, 30.0f, 154.0f); + V(12.0f, 154.0f); V(30.0f, 154.0f); V(30.0f, 180.0f); + // Left side. + V(30.0f, 16.0f); V(64.0f, 13.0f); V(64.0f, 184.0f); + V(30.0f, 16.0f); V(64.0f, 184.0f); V(30.0f, 180.0f); + V(64.0f, 13.0f); V(76.0f, 0.0f); V(76.0f, 13.0f); + V(64.0f, 184.0f); V(76.0f, 200.0f); V(76.0f, 184.0f); + R(64.0f, 13.0f, 76.0f, 184.0f); + // Center. + V(76.0f, 0.0f); V(400.0f, 0.0f); V(400.0f, 200.0f); + V(76.0f, 0.0f); V(400.0f, 200.0f); V(76.0f, 200.0f); + // Right side. + V(400.0f, 0.0f); V(412.0f, 13.0f); V(400.0f, 13.0f); + V(400.0f, 184.0f); V(412.0f, 184.0f); V(400.0f, 200.0f); + R(400.0f, 13.0f, 412.0f, 184.0f); + V(412.0f, 13.0f); V(446.0f, 16.0f); V(446.0f, 180.0f); + V(412.0f, 13.0f); V(446.0f, 180.0f); V(412.0f, 184.0f); + // Curved right side. + V(446.0f, 16.0f); V(462.0f, 44.0f); V(446.0f, 44.0f); + V(462.0f, 44.0f); V(474.0f, 80.0f); V(462.0f, 80.0f); + R(446.0f, 44.0f, 462.0f, 80.0f); + R(446.0f, 80.0f, 474.0f, 114.0f); + V(462.0f, 114.0f); V(474.0f, 114.0f); V(462.0f, 154.0f); + R(446.0f, 114.0f, 462.0f, 154.0f); + V(446.0f, 154.0f); V(462.0f, 154.0f); V(446.0f, 180.0f); + } + + void GetContentDimensions(const UIContext &dc, float &w, float &h) const override { + w = 474.0f * scale_; + h = 200.0f * scale_; + } + +protected: + float scale_ = 1.0f; +}; + +class MockScreen : public UI::InertView { +public: + MockScreen(UI::LayoutParams *layoutParams = nullptr) : InertView(layoutParams) { + } + + void Draw(UIContext &dc) override { + ImageID bg = ImageID("I_BG"); + dc.Draw()->DrawImageStretch(bg, bounds_, 0xFFFFFFFF); + + if (System_GetPropertyBool(SYSPROP_APP_GOLD)) { + dc.Draw()->DrawImage(ImageID("I_ICONGOLD"), bounds_.centerX() - 120, bounds_.centerY() - 30, 1.2f, 0xFFFFFFFF, ALIGN_CENTER); + } else { + dc.Draw()->DrawImage(ImageID("I_ICON"), bounds_.centerX() - 120, bounds_.centerY() - 30, 1.2f, 0xFFFFFFFF, ALIGN_CENTER); + } + dc.Draw()->DrawImage(ImageID("I_LOGO"), bounds_.centerX() + 40, bounds_.centerY() - 30, 1.5f, 0xFFFFFFFF, ALIGN_CENTER); + } +}; + +class MockButton : public UI::View { +public: + MockButton(int button, ImageID img, ImageID bg, float angle, UI::LayoutParams *layoutParams = nullptr) + : View(layoutParams), button_(button), img_(img), bgImg_(bg), angle_(angle) { + } + + void Draw(UIContext &dc) override { + uint32_t c = 0xFFFFFFFF; + if (selected_) { + c = dc.theme->buttonDownStyle.background.color; + } else if (HasFocus()) { + c = dc.theme->buttonFocusedStyle.background.color; + } + + float scales[2]{}; + if (bgImg_.isValid()) + dc.Draw()->DrawImageRotatedStretch(bgImg_, bounds_, scales, angle_, c, flipHBG_); + if (img_.isValid()) { + scales[0] *= scale_; + scales[1] *= scale_; + dc.Draw()->DrawImageRotatedStretch(img_, bounds_.Offset(offsetX_, offsetY_), scales, angle_, c); + } + } + + MockButton *SetScale(float s) { + scale_ = s; + return this; + } + + MockButton *SetFlipHBG(float f) { + flipHBG_ = f; + return this; + } + + MockButton *SetOffset(float x, float y) { + offsetX_ = x; + offsetY_ = y; + return this; + } + + MockButton *SetSelected(bool s) { + selected_ = s; + return this; + } + +protected: + int button_; + ImageID img_; + ImageID bgImg_; + float angle_; + float scale_ = 1.0f; + float flipHBG_ = false; + float offsetX_ = 0.0f; + float offsetY_ = 0.0f; + bool selected_ = false; +}; + +class MockPSP : public UI::AnchorLayout { +public: + static constexpr float SCALE = 1.4f; + + MockPSP(UI::LayoutParams *layoutParams = nullptr) : AnchorLayout(layoutParams) { + Add(new Backplate(SCALE)); + Add(new MockScreen(LayoutAt(99.0f, 13.0f, 97.0f, 33.0f))); + + // Left side. + AddButton(0, ImageID("I_STICK_LINE"), ImageID("I_STICK_BG_LINE"), 0.0f, LayoutSize(34.0f, 34.0f, 35.0f, 133.0f)); + AddButton(CTRL_LEFT, ImageID("I_ARROW"), ImageID("I_DIR_LINE"), M_PI * 0.0f, LayoutSize(28.0f, 20.0f, 14.0f, 75.0f))->SetOffset(-4.0f * SCALE, 0.0f); + AddButton(CTRL_UP, ImageID("I_ARROW"), ImageID("I_DIR_LINE"), M_PI * 0.5f, LayoutSize(20.0f, 28.0f, 40.0f, 50.0f))->SetOffset(0.0f, -4.0f * SCALE); + AddButton(CTRL_RIGHT, ImageID("I_ARROW"), ImageID("I_DIR_LINE"), M_PI * 1.0f, LayoutSize(28.0f, 20.0f, 58.0f, 75.0f))->SetOffset(4.0f * SCALE, 0.0f); + AddButton(CTRL_DOWN, ImageID("I_ARROW"), ImageID("I_DIR_LINE"), M_PI * 1.5f, LayoutSize(20.0f, 28.0f, 40.0f, 92.0f))->SetOffset(0.0f, 4.0f * SCALE); + + // Top. + AddButton(CTRL_LTRIGGER, ImageID("I_L"), ImageID("I_SHOULDER_LINE"), 0.0f, LayoutSize(50.0f, 16.0f, 29.0f, 0.0f)); + AddButton(CTRL_RTRIGGER, ImageID("I_R"), ImageID("I_SHOULDER_LINE"), 0.0f, LayoutSize(50.0f, 16.0f, 397.0f, 0.0f))->SetFlipHBG(true); + + // Bottom. + AddButton(CTRL_HOME, ImageID("I_ICON"), ImageID("I_RECT_LINE"), 0.0f, LayoutSize(28.0f, 14.0f, 88.0f, 181.0f))->SetScale(0.4f); + AddButton(CTRL_SELECT, ImageID("I_SELECT"), ImageID("I_RECT_LINE"), 0.0f, LayoutSize(28.0f, 14.0f, 330.0f, 181.0f)); + AddButton(CTRL_START, ImageID("I_START"), ImageID("I_RECT_LINE"), 0.0f, LayoutSize(28.0f, 14.0f, 361.0f, 181.0f)); + + // Right side. + AddButton(CTRL_TRIANGLE, ImageID("I_TRIANGLE"), ImageID("I_ROUND_LINE"), 0.0f, LayoutSize(23.0f, 23.0f, 419.0f, 46.0f))->SetScale(0.7f)->SetOffset(0.0f, -1.0f * SCALE); + AddButton(CTRL_CIRCLE, ImageID("I_CIRCLE"), ImageID("I_ROUND_LINE"), 0.0f, LayoutSize(23.0f, 23.0f, 446.0f, 74.0f))->SetScale(0.7f); + AddButton(CTRL_CROSS, ImageID("I_CROSS"), ImageID("I_ROUND_LINE"), 0.0f, LayoutSize(23.0f, 23.0f, 419.0f, 102.0f))->SetScale(0.7f); + AddButton(CTRL_SQUARE, ImageID("I_SQUARE"), ImageID("I_ROUND_LINE"), 0.0f, LayoutSize(23.0f, 23.0f, 392.0f, 74.0f))->SetScale(0.7f); + } + +private: + UI::AnchorLayoutParams *LayoutAt(float l, float t, float r, float b) { + return new UI::AnchorLayoutParams(l * SCALE, t * SCALE, r * SCALE, b * SCALE); + } + UI::AnchorLayoutParams *LayoutSize(float w, float h, float l, float t) { + return new UI::AnchorLayoutParams(w * SCALE, h * SCALE, l * SCALE, t * SCALE, UI::NONE, UI::NONE); + } + + MockButton *AddButton(int button, ImageID img, ImageID bg, float angle, UI::LayoutParams *lp) { + buttons_[button] = Add(new MockButton(button, img, bg, angle, lp)); + return buttons_[button]; + } + + std::unordered_map buttons_; +}; + +void VisualMappingScreen::CreateViews() { + using namespace UI; + + auto km = GetI18NCategory("KeyMapping"); + + root_ = new LinearLayout(ORIENT_HORIZONTAL); + + constexpr float leftColumnWidth = 200.0f; + LinearLayout *leftColumn = new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(leftColumnWidth, FILL_PARENT, Margins(10, 0, 0, 10))); + + leftColumn->Add(new Spacer(new LinearLayoutParams(1.0f))); + AddStandardBack(leftColumn); + + Bounds bounds = screenManager()->getUIContext()->GetLayoutBounds(); + // Account for left side. + bounds.w -= leftColumnWidth + 10.0f; + + AnchorLayout *rightColumn = new AnchorLayout(new LinearLayoutParams(bounds.w, FILL_PARENT, 1.0f)); + rightColumn->Add(new MockPSP(new AnchorLayoutParams(bounds.centerX(), bounds.centerY(), NONE, NONE, true))); + + root_->Add(leftColumn); + root_->Add(rightColumn); +} diff --git a/UI/ControlMappingScreen.h b/UI/ControlMappingScreen.h index 025d4bc40c..aa9a51c8b8 100644 --- a/UI/ControlMappingScreen.h +++ b/UI/ControlMappingScreen.h @@ -44,6 +44,7 @@ private: UI::EventReturn OnDefaultMapping(UI::EventParams ¶ms); UI::EventReturn OnClearMapping(UI::EventParams ¶ms); UI::EventReturn OnAutoConfigure(UI::EventParams ¶ms); + UI::EventReturn OnVisualizeMapping(UI::EventParams ¶ms); virtual void dialogFinished(const Screen *dialog, DialogResult result) override; @@ -158,3 +159,11 @@ protected: UI::EventReturn OnRenderingBackend(UI::EventParams &e); UI::EventReturn OnRecreateActivity(UI::EventParams &e); }; + +class VisualMappingScreen : public UIDialogScreenWithBackground { +public: + VisualMappingScreen() {} + +protected: + void CreateViews() override; +}; From d8a7fdf580d8c3e7461fbffca5116b31b8423c30 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 28 Aug 2021 14:24:12 -0700 Subject: [PATCH 207/336] UI: Allow mapping buttons from visual PSP display. --- UI/ControlMappingScreen.cpp | 46 ++++++++++++++++++++++++++----------- UI/ControlMappingScreen.h | 3 +++ 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/UI/ControlMappingScreen.cpp b/UI/ControlMappingScreen.cpp index 1fba4709ab..993c26874d 100644 --- a/UI/ControlMappingScreen.cpp +++ b/UI/ControlMappingScreen.cpp @@ -931,19 +931,16 @@ public: } }; -class MockButton : public UI::View { +class MockButton : public UI::Clickable { public: MockButton(int button, ImageID img, ImageID bg, float angle, UI::LayoutParams *layoutParams = nullptr) - : View(layoutParams), button_(button), img_(img), bgImg_(bg), angle_(angle) { + : Clickable(layoutParams), button_(button), img_(img), bgImg_(bg), angle_(angle) { } void Draw(UIContext &dc) override { uint32_t c = 0xFFFFFFFF; - if (selected_) { - c = dc.theme->buttonDownStyle.background.color; - } else if (HasFocus()) { + if (HasFocus()) c = dc.theme->buttonFocusedStyle.background.color; - } float scales[2]{}; if (bgImg_.isValid()) @@ -971,9 +968,8 @@ public: return this; } - MockButton *SetSelected(bool s) { - selected_ = s; - return this; + int Button() { + return button_; } protected: @@ -985,7 +981,6 @@ protected: float flipHBG_ = false; float offsetX_ = 0.0f; float offsetY_ = 0.0f; - bool selected_ = false; }; class MockPSP : public UI::AnchorLayout { @@ -1019,6 +1014,8 @@ public: AddButton(CTRL_SQUARE, ImageID("I_SQUARE"), ImageID("I_ROUND_LINE"), 0.0f, LayoutSize(23.0f, 23.0f, 392.0f, 74.0f))->SetScale(0.7f); } + UI::Event ButtonClick; + private: UI::AnchorLayoutParams *LayoutAt(float l, float t, float r, float b) { return new UI::AnchorLayoutParams(l * SCALE, t * SCALE, r * SCALE, b * SCALE); @@ -1028,8 +1025,16 @@ private: } MockButton *AddButton(int button, ImageID img, ImageID bg, float angle, UI::LayoutParams *lp) { - buttons_[button] = Add(new MockButton(button, img, bg, angle, lp)); - return buttons_[button]; + MockButton *view = Add(new MockButton(button, img, bg, angle, lp)); + view->OnClick.Handle(this, &MockPSP::OnSelectButton); + buttons_[button] = view; + return view; + } + + UI::EventReturn OnSelectButton(UI::EventParams &e) { + auto view = (MockButton *)e.v; + e.a = view->Button(); + return ButtonClick.Dispatch(e); } std::unordered_map buttons_; @@ -1053,8 +1058,23 @@ void VisualMappingScreen::CreateViews() { bounds.w -= leftColumnWidth + 10.0f; AnchorLayout *rightColumn = new AnchorLayout(new LinearLayoutParams(bounds.w, FILL_PARENT, 1.0f)); - rightColumn->Add(new MockPSP(new AnchorLayoutParams(bounds.centerX(), bounds.centerY(), NONE, NONE, true))); + MockPSP *psp = rightColumn->Add(new MockPSP(new AnchorLayoutParams(bounds.centerX(), bounds.centerY(), NONE, NONE, true))); + psp->ButtonClick.Handle(this, &VisualMappingScreen::OnMapButton); root_->Add(leftColumn); root_->Add(rightColumn); } + +UI::EventReturn VisualMappingScreen::OnMapButton(UI::EventParams &e) { + auto km = GetI18NCategory("KeyMapping"); + + if (e.a == 0) { + // TODO + } else { + auto callback = [=](KeyDef key) { + KeyMap::SetKeyMapping(e.a, key, false); + }; + screenManager()->push(new KeyMappingNewKeyDialog(e.a, true, callback, km)); + } + return UI::EVENT_DONE; +} diff --git a/UI/ControlMappingScreen.h b/UI/ControlMappingScreen.h index aa9a51c8b8..a3e17e2387 100644 --- a/UI/ControlMappingScreen.h +++ b/UI/ControlMappingScreen.h @@ -166,4 +166,7 @@ public: protected: void CreateViews() override; + +private: + UI::EventReturn OnMapButton(UI::EventParams &e); }; From 4e33a1ef078a018d0bc78faaf813fc6ce89f99c2 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 28 Aug 2021 14:37:53 -0700 Subject: [PATCH 208/336] UI: Allow rebinding the analog from PSP view. --- UI/ControlMappingScreen.cpp | 33 +++++++++++++++++++++++++++------ UI/ControlMappingScreen.h | 5 +++++ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/UI/ControlMappingScreen.cpp b/UI/ControlMappingScreen.cpp index 993c26874d..2806f45892 100644 --- a/UI/ControlMappingScreen.cpp +++ b/UI/ControlMappingScreen.cpp @@ -1068,13 +1068,34 @@ void VisualMappingScreen::CreateViews() { UI::EventReturn VisualMappingScreen::OnMapButton(UI::EventParams &e) { auto km = GetI18NCategory("KeyMapping"); + nextKey_ = e.a; if (e.a == 0) { - // TODO - } else { - auto callback = [=](KeyDef key) { - KeyMap::SetKeyMapping(e.a, key, false); - }; - screenManager()->push(new KeyMappingNewKeyDialog(e.a, true, callback, km)); + nextKey_ = VIRTKEY_AXIS_Y_MAX; } + screenManager()->push(new KeyMappingNewKeyDialog(nextKey_, true, std::bind(&VisualMappingScreen::HandleKeyMapping, this, std::placeholders::_1), km)); return UI::EVENT_DONE; } + +void VisualMappingScreen::HandleKeyMapping(KeyDef key) { + KeyMap::SetKeyMapping(nextKey_, key, false); + + // For analog, we do each direction in a row. + if (nextKey_ == VIRTKEY_AXIS_Y_MAX) + nextKey_ = VIRTKEY_AXIS_Y_MIN; + else if (nextKey_ == VIRTKEY_AXIS_Y_MIN) + nextKey_ = VIRTKEY_AXIS_X_MIN; + else if (nextKey_ == VIRTKEY_AXIS_X_MIN) + nextKey_ = VIRTKEY_AXIS_X_MAX; + else + nextKey_ = 0; +} + +void VisualMappingScreen::dialogFinished(const Screen *dialog, DialogResult result) { + auto km = GetI18NCategory("KeyMapping"); + + if (result == DR_OK && nextKey_ != 0) { + screenManager()->push(new KeyMappingNewKeyDialog(nextKey_, true, std::bind(&VisualMappingScreen::HandleKeyMapping, this, std::placeholders::_1), km)); + } else { + nextKey_ = 0; + } +} diff --git a/UI/ControlMappingScreen.h b/UI/ControlMappingScreen.h index a3e17e2387..521aa84081 100644 --- a/UI/ControlMappingScreen.h +++ b/UI/ControlMappingScreen.h @@ -167,6 +167,11 @@ public: protected: void CreateViews() override; + void dialogFinished(const Screen *dialog, DialogResult result) override; + private: UI::EventReturn OnMapButton(UI::EventParams &e); + void HandleKeyMapping(KeyDef key); + + int nextKey_ = 0; }; From efeca78c1ad6d7c1b305c064b1df45842b71c5e6 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 28 Aug 2021 15:04:16 -0700 Subject: [PATCH 209/336] UI: Allow binding all typically buttons in a row. --- UI/ControlMappingScreen.cpp | 204 ++++++++++++++++++++++++------------ UI/ControlMappingScreen.h | 6 ++ 2 files changed, 142 insertions(+), 68 deletions(-) diff --git a/UI/ControlMappingScreen.cpp b/UI/ControlMappingScreen.cpp index 2806f45892..278ef7d800 100644 --- a/UI/ControlMappingScreen.cpp +++ b/UI/ControlMappingScreen.cpp @@ -334,7 +334,7 @@ bool KeyMappingNewKeyDialog::key(const KeyInput &key) { mapped_ = true; KeyDef kdf(key.deviceId, key.keyCode); - TriggerFinish(DR_OK); + TriggerFinish(DR_YES); if (callback_) callback_(kdf); } @@ -361,7 +361,7 @@ bool KeyMappingNewMouseKeyDialog::key(const KeyInput &key) { mapped_ = true; KeyDef kdf(key.deviceId, key.keyCode); - TriggerFinish(DR_OK); + TriggerFinish(DR_YES); g_Config.bMapMouse = false; if (callback_) callback_(kdf); @@ -399,7 +399,7 @@ bool KeyMappingNewKeyDialog::axis(const AxisInput &axis) { if (axis.value > AXIS_BIND_THRESHOLD) { mapped_ = true; KeyDef kdf(axis.deviceId, KeyMap::TranslateKeyCodeFromAxis(axis.axisId, 1)); - TriggerFinish(DR_OK); + TriggerFinish(DR_YES); if (callback_) callback_(kdf); } @@ -407,7 +407,7 @@ bool KeyMappingNewKeyDialog::axis(const AxisInput &axis) { if (axis.value < -AXIS_BIND_THRESHOLD) { mapped_ = true; KeyDef kdf(axis.deviceId, KeyMap::TranslateKeyCodeFromAxis(axis.axisId, -1)); - TriggerFinish(DR_OK); + TriggerFinish(DR_YES); if (callback_) callback_(kdf); } @@ -423,7 +423,7 @@ bool KeyMappingNewMouseKeyDialog::axis(const AxisInput &axis) { if (axis.value > AXIS_BIND_THRESHOLD) { mapped_ = true; KeyDef kdf(axis.deviceId, KeyMap::TranslateKeyCodeFromAxis(axis.axisId, 1)); - TriggerFinish(DR_OK); + TriggerFinish(DR_YES); if (callback_) callback_(kdf); } @@ -431,7 +431,7 @@ bool KeyMappingNewMouseKeyDialog::axis(const AxisInput &axis) { if (axis.value < -AXIS_BIND_THRESHOLD) { mapped_ = true; KeyDef kdf(axis.deviceId, KeyMap::TranslateKeyCodeFromAxis(axis.axisId, -1)); - TriggerFinish(DR_OK); + TriggerFinish(DR_YES); if (callback_) callback_(kdf); } @@ -939,7 +939,7 @@ public: void Draw(UIContext &dc) override { uint32_t c = 0xFFFFFFFF; - if (HasFocus()) + if (HasFocus() || Selected()) c = dc.theme->buttonFocusedStyle.background.color; float scales[2]{}; @@ -968,76 +968,121 @@ public: return this; } + MockButton *SetSelectedButton(int *s) { + selectedButton_ = s; + return this; + } + + bool Selected() { + return selectedButton_ && *selectedButton_ == button_; + } + int Button() { return button_; } -protected: +private: int button_; ImageID img_; ImageID bgImg_; float angle_; float scale_ = 1.0f; - float flipHBG_ = false; float offsetX_ = 0.0f; float offsetY_ = 0.0f; + bool flipHBG_ = false; + int *selectedButton_ = nullptr; }; class MockPSP : public UI::AnchorLayout { public: static constexpr float SCALE = 1.4f; - MockPSP(UI::LayoutParams *layoutParams = nullptr) : AnchorLayout(layoutParams) { - Add(new Backplate(SCALE)); - Add(new MockScreen(LayoutAt(99.0f, 13.0f, 97.0f, 33.0f))); - - // Left side. - AddButton(0, ImageID("I_STICK_LINE"), ImageID("I_STICK_BG_LINE"), 0.0f, LayoutSize(34.0f, 34.0f, 35.0f, 133.0f)); - AddButton(CTRL_LEFT, ImageID("I_ARROW"), ImageID("I_DIR_LINE"), M_PI * 0.0f, LayoutSize(28.0f, 20.0f, 14.0f, 75.0f))->SetOffset(-4.0f * SCALE, 0.0f); - AddButton(CTRL_UP, ImageID("I_ARROW"), ImageID("I_DIR_LINE"), M_PI * 0.5f, LayoutSize(20.0f, 28.0f, 40.0f, 50.0f))->SetOffset(0.0f, -4.0f * SCALE); - AddButton(CTRL_RIGHT, ImageID("I_ARROW"), ImageID("I_DIR_LINE"), M_PI * 1.0f, LayoutSize(28.0f, 20.0f, 58.0f, 75.0f))->SetOffset(4.0f * SCALE, 0.0f); - AddButton(CTRL_DOWN, ImageID("I_ARROW"), ImageID("I_DIR_LINE"), M_PI * 1.5f, LayoutSize(20.0f, 28.0f, 40.0f, 92.0f))->SetOffset(0.0f, 4.0f * SCALE); - - // Top. - AddButton(CTRL_LTRIGGER, ImageID("I_L"), ImageID("I_SHOULDER_LINE"), 0.0f, LayoutSize(50.0f, 16.0f, 29.0f, 0.0f)); - AddButton(CTRL_RTRIGGER, ImageID("I_R"), ImageID("I_SHOULDER_LINE"), 0.0f, LayoutSize(50.0f, 16.0f, 397.0f, 0.0f))->SetFlipHBG(true); - - // Bottom. - AddButton(CTRL_HOME, ImageID("I_ICON"), ImageID("I_RECT_LINE"), 0.0f, LayoutSize(28.0f, 14.0f, 88.0f, 181.0f))->SetScale(0.4f); - AddButton(CTRL_SELECT, ImageID("I_SELECT"), ImageID("I_RECT_LINE"), 0.0f, LayoutSize(28.0f, 14.0f, 330.0f, 181.0f)); - AddButton(CTRL_START, ImageID("I_START"), ImageID("I_RECT_LINE"), 0.0f, LayoutSize(28.0f, 14.0f, 361.0f, 181.0f)); - - // Right side. - AddButton(CTRL_TRIANGLE, ImageID("I_TRIANGLE"), ImageID("I_ROUND_LINE"), 0.0f, LayoutSize(23.0f, 23.0f, 419.0f, 46.0f))->SetScale(0.7f)->SetOffset(0.0f, -1.0f * SCALE); - AddButton(CTRL_CIRCLE, ImageID("I_CIRCLE"), ImageID("I_ROUND_LINE"), 0.0f, LayoutSize(23.0f, 23.0f, 446.0f, 74.0f))->SetScale(0.7f); - AddButton(CTRL_CROSS, ImageID("I_CROSS"), ImageID("I_ROUND_LINE"), 0.0f, LayoutSize(23.0f, 23.0f, 419.0f, 102.0f))->SetScale(0.7f); - AddButton(CTRL_SQUARE, ImageID("I_SQUARE"), ImageID("I_ROUND_LINE"), 0.0f, LayoutSize(23.0f, 23.0f, 392.0f, 74.0f))->SetScale(0.7f); - } + MockPSP(UI::LayoutParams *layoutParams = nullptr); + void SelectButton(int btn); UI::Event ButtonClick; private: - UI::AnchorLayoutParams *LayoutAt(float l, float t, float r, float b) { - return new UI::AnchorLayoutParams(l * SCALE, t * SCALE, r * SCALE, b * SCALE); - } - UI::AnchorLayoutParams *LayoutSize(float w, float h, float l, float t) { - return new UI::AnchorLayoutParams(w * SCALE, h * SCALE, l * SCALE, t * SCALE, UI::NONE, UI::NONE); - } + UI::AnchorLayoutParams *LayoutAt(float l, float t, float r, float b); + UI::AnchorLayoutParams *LayoutSize(float w, float h, float l, float t); + MockButton *AddButton(int button, ImageID img, ImageID bg, float angle, UI::LayoutParams *lp); - MockButton *AddButton(int button, ImageID img, ImageID bg, float angle, UI::LayoutParams *lp) { - MockButton *view = Add(new MockButton(button, img, bg, angle, lp)); - view->OnClick.Handle(this, &MockPSP::OnSelectButton); - buttons_[button] = view; - return view; - } - - UI::EventReturn OnSelectButton(UI::EventParams &e) { - auto view = (MockButton *)e.v; - e.a = view->Button(); - return ButtonClick.Dispatch(e); - } + UI::EventReturn OnSelectButton(UI::EventParams &e); std::unordered_map buttons_; + int selectedButton_ = 0; +}; + +MockPSP::MockPSP(UI::LayoutParams *layoutParams) : AnchorLayout(layoutParams) { + Add(new Backplate(SCALE)); + Add(new MockScreen(LayoutAt(99.0f, 13.0f, 97.0f, 33.0f))); + + // Left side. + AddButton(VIRTKEY_AXIS_Y_MAX, ImageID("I_STICK_LINE"), ImageID("I_STICK_BG_LINE"), 0.0f, LayoutSize(34.0f, 34.0f, 35.0f, 133.0f)); + AddButton(CTRL_LEFT, ImageID("I_ARROW"), ImageID("I_DIR_LINE"), M_PI * 0.0f, LayoutSize(28.0f, 20.0f, 14.0f, 75.0f))->SetOffset(-4.0f * SCALE, 0.0f); + AddButton(CTRL_UP, ImageID("I_ARROW"), ImageID("I_DIR_LINE"), M_PI * 0.5f, LayoutSize(20.0f, 28.0f, 40.0f, 50.0f))->SetOffset(0.0f, -4.0f * SCALE); + AddButton(CTRL_RIGHT, ImageID("I_ARROW"), ImageID("I_DIR_LINE"), M_PI * 1.0f, LayoutSize(28.0f, 20.0f, 58.0f, 75.0f))->SetOffset(4.0f * SCALE, 0.0f); + AddButton(CTRL_DOWN, ImageID("I_ARROW"), ImageID("I_DIR_LINE"), M_PI * 1.5f, LayoutSize(20.0f, 28.0f, 40.0f, 92.0f))->SetOffset(0.0f, 4.0f * SCALE); + + // Top. + AddButton(CTRL_LTRIGGER, ImageID("I_L"), ImageID("I_SHOULDER_LINE"), 0.0f, LayoutSize(50.0f, 16.0f, 29.0f, 0.0f)); + AddButton(CTRL_RTRIGGER, ImageID("I_R"), ImageID("I_SHOULDER_LINE"), 0.0f, LayoutSize(50.0f, 16.0f, 397.0f, 0.0f))->SetFlipHBG(true); + + // Bottom. + AddButton(CTRL_HOME, ImageID("I_ICON"), ImageID("I_RECT_LINE"), 0.0f, LayoutSize(28.0f, 14.0f, 88.0f, 181.0f))->SetScale(0.4f); + AddButton(CTRL_SELECT, ImageID("I_SELECT"), ImageID("I_RECT_LINE"), 0.0f, LayoutSize(28.0f, 14.0f, 330.0f, 181.0f)); + AddButton(CTRL_START, ImageID("I_START"), ImageID("I_RECT_LINE"), 0.0f, LayoutSize(28.0f, 14.0f, 361.0f, 181.0f)); + + // Right side. + AddButton(CTRL_TRIANGLE, ImageID("I_TRIANGLE"), ImageID("I_ROUND_LINE"), 0.0f, LayoutSize(23.0f, 23.0f, 419.0f, 46.0f))->SetScale(0.7f)->SetOffset(0.0f, -1.0f * SCALE); + AddButton(CTRL_CIRCLE, ImageID("I_CIRCLE"), ImageID("I_ROUND_LINE"), 0.0f, LayoutSize(23.0f, 23.0f, 446.0f, 74.0f))->SetScale(0.7f); + AddButton(CTRL_CROSS, ImageID("I_CROSS"), ImageID("I_ROUND_LINE"), 0.0f, LayoutSize(23.0f, 23.0f, 419.0f, 102.0f))->SetScale(0.7f); + AddButton(CTRL_SQUARE, ImageID("I_SQUARE"), ImageID("I_ROUND_LINE"), 0.0f, LayoutSize(23.0f, 23.0f, 392.0f, 74.0f))->SetScale(0.7f); +} + +void MockPSP::SelectButton(int btn) { + selectedButton_ = btn; +} + +UI::AnchorLayoutParams *MockPSP::LayoutAt(float l, float t, float r, float b) { + return new UI::AnchorLayoutParams(l * SCALE, t * SCALE, r * SCALE, b * SCALE); +} +UI::AnchorLayoutParams *MockPSP::LayoutSize(float w, float h, float l, float t) { + return new UI::AnchorLayoutParams(w * SCALE, h * SCALE, l * SCALE, t * SCALE, UI::NONE, UI::NONE); +} + +MockButton *MockPSP::AddButton(int button, ImageID img, ImageID bg, float angle, UI::LayoutParams *lp) { + MockButton *view = Add(new MockButton(button, img, bg, angle, lp)); + view->OnClick.Handle(this, &MockPSP::OnSelectButton); + view->SetSelectedButton(&selectedButton_); + buttons_[button] = view; + return view; +} + +UI::EventReturn MockPSP::OnSelectButton(UI::EventParams &e) { + auto view = (MockButton *)e.v; + e.a = view->Button(); + return ButtonClick.Dispatch(e); +} + +static std::vector bindAllOrder{ + CTRL_LTRIGGER, + CTRL_RTRIGGER, + CTRL_UP, + CTRL_DOWN, + CTRL_LEFT, + CTRL_RIGHT, + VIRTKEY_AXIS_Y_MAX, + VIRTKEY_AXIS_Y_MIN, + VIRTKEY_AXIS_X_MIN, + VIRTKEY_AXIS_X_MAX, + CTRL_HOME, + CTRL_SELECT, + CTRL_START, + CTRL_CROSS, + CTRL_CIRCLE, + CTRL_TRIANGLE, + CTRL_SQUARE, }; void VisualMappingScreen::CreateViews() { @@ -1049,6 +1094,8 @@ void VisualMappingScreen::CreateViews() { constexpr float leftColumnWidth = 200.0f; LinearLayout *leftColumn = new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(leftColumnWidth, FILL_PARENT, Margins(10, 0, 0, 10))); + leftColumn->Add(new Choice(km->T("Bind All")))->OnClick.Handle(this, &VisualMappingScreen::OnBindAll); + leftColumn->Add(new CheckBox(&replace_, km->T("Replace"), "")); leftColumn->Add(new Spacer(new LinearLayoutParams(1.0f))); AddStandardBack(leftColumn); @@ -1058,8 +1105,8 @@ void VisualMappingScreen::CreateViews() { bounds.w -= leftColumnWidth + 10.0f; AnchorLayout *rightColumn = new AnchorLayout(new LinearLayoutParams(bounds.w, FILL_PARENT, 1.0f)); - MockPSP *psp = rightColumn->Add(new MockPSP(new AnchorLayoutParams(bounds.centerX(), bounds.centerY(), NONE, NONE, true))); - psp->ButtonClick.Handle(this, &VisualMappingScreen::OnMapButton); + psp_ = rightColumn->Add(new MockPSP(new AnchorLayoutParams(bounds.centerX(), bounds.centerY(), NONE, NONE, true))); + psp_->ButtonClick.Handle(this, &VisualMappingScreen::OnMapButton); root_->Add(leftColumn); root_->Add(rightColumn); @@ -1069,33 +1116,54 @@ UI::EventReturn VisualMappingScreen::OnMapButton(UI::EventParams &e) { auto km = GetI18NCategory("KeyMapping"); nextKey_ = e.a; - if (e.a == 0) { - nextKey_ = VIRTKEY_AXIS_Y_MAX; - } + psp_->SelectButton(nextKey_); + + screenManager()->push(new KeyMappingNewKeyDialog(nextKey_, true, std::bind(&VisualMappingScreen::HandleKeyMapping, this, std::placeholders::_1), km)); + return UI::EVENT_DONE; +} + +UI::EventReturn VisualMappingScreen::OnBindAll(UI::EventParams &e) { + auto km = GetI18NCategory("KeyMapping"); + + bindAll_ = 0; + nextKey_ = bindAllOrder[bindAll_]; + psp_->SelectButton(nextKey_); + screenManager()->push(new KeyMappingNewKeyDialog(nextKey_, true, std::bind(&VisualMappingScreen::HandleKeyMapping, this, std::placeholders::_1), km)); return UI::EVENT_DONE; } void VisualMappingScreen::HandleKeyMapping(KeyDef key) { - KeyMap::SetKeyMapping(nextKey_, key, false); + KeyMap::SetKeyMapping(nextKey_, key, replace_); - // For analog, we do each direction in a row. - if (nextKey_ == VIRTKEY_AXIS_Y_MAX) - nextKey_ = VIRTKEY_AXIS_Y_MIN; - else if (nextKey_ == VIRTKEY_AXIS_Y_MIN) - nextKey_ = VIRTKEY_AXIS_X_MIN; - else if (nextKey_ == VIRTKEY_AXIS_X_MIN) - nextKey_ = VIRTKEY_AXIS_X_MAX; - else + if (bindAll_ < 0) { + // For analog, we do each direction in a row. + if (nextKey_ == VIRTKEY_AXIS_Y_MAX) + nextKey_ = VIRTKEY_AXIS_Y_MIN; + else if (nextKey_ == VIRTKEY_AXIS_Y_MIN) + nextKey_ = VIRTKEY_AXIS_X_MIN; + else if (nextKey_ == VIRTKEY_AXIS_X_MIN) + nextKey_ = VIRTKEY_AXIS_X_MAX; + else + nextKey_ = 0; + } else if ((size_t)bindAll_ + 1 < bindAllOrder.size()) { + bindAll_++; + nextKey_ = bindAllOrder[bindAll_]; + } else { + bindAll_ = -1; nextKey_ = 0; + } } void VisualMappingScreen::dialogFinished(const Screen *dialog, DialogResult result) { auto km = GetI18NCategory("KeyMapping"); - if (result == DR_OK && nextKey_ != 0) { + if (result == DR_YES && nextKey_ != 0) { screenManager()->push(new KeyMappingNewKeyDialog(nextKey_, true, std::bind(&VisualMappingScreen::HandleKeyMapping, this, std::placeholders::_1), km)); } else { nextKey_ = 0; + bindAll_ = -1; + psp_->SelectButton(0); } + } diff --git a/UI/ControlMappingScreen.h b/UI/ControlMappingScreen.h index 521aa84081..dc0aa61b02 100644 --- a/UI/ControlMappingScreen.h +++ b/UI/ControlMappingScreen.h @@ -160,6 +160,8 @@ protected: UI::EventReturn OnRecreateActivity(UI::EventParams &e); }; +class MockPSP; + class VisualMappingScreen : public UIDialogScreenWithBackground { public: VisualMappingScreen() {} @@ -171,7 +173,11 @@ protected: private: UI::EventReturn OnMapButton(UI::EventParams &e); + UI::EventReturn OnBindAll(UI::EventParams &e); void HandleKeyMapping(KeyDef key); + MockPSP *psp_ = nullptr; int nextKey_ = 0; + int bindAll_ = -1; + bool replace_ = false; }; From f7b92ebb29a48cff59d0358438db716de5faae94 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 28 Aug 2021 15:23:46 -0700 Subject: [PATCH 210/336] UI: Try to keep button visible while mapping. --- Common/UI/UIScreen.cpp | 6 ++++- Common/UI/UIScreen.h | 2 ++ UI/ControlMappingScreen.cpp | 47 +++++++++++++++++++++++++++---------- UI/ControlMappingScreen.h | 2 ++ 4 files changed, 43 insertions(+), 14 deletions(-) diff --git a/Common/UI/UIScreen.cpp b/Common/UI/UIScreen.cpp index 3a852dc2ee..33b49683a4 100644 --- a/Common/UI/UIScreen.cpp +++ b/Common/UI/UIScreen.cpp @@ -296,6 +296,10 @@ void PopupScreen::SetPopupOrigin(const UI::View *view) { popupOrigin_ = view->GetBounds().Center(); } +void PopupScreen::SetPopupOffset(float y) { + offsetY_ = y; +} + void PopupScreen::TriggerFinish(DialogResult result) { if (CanComplete(result)) { finishFrame_ = frames_; @@ -320,7 +324,7 @@ void PopupScreen::CreateViews() { float yres = screenManager()->getUIContext()->GetBounds().h; box_ = new LinearLayout(ORIENT_VERTICAL, - new AnchorLayoutParams(PopupWidth(), FillVertical() ? yres - 30 : WRAP_CONTENT, dc.GetBounds().centerX(), dc.GetBounds().centerY(), NONE, NONE, true)); + new AnchorLayoutParams(PopupWidth(), FillVertical() ? yres - 30 : WRAP_CONTENT, dc.GetBounds().centerX(), dc.GetBounds().centerY() + offsetY_, NONE, NONE, true)); root_->Add(box_); box_->SetBG(dc.theme->popupStyle.background); diff --git a/Common/UI/UIScreen.h b/Common/UI/UIScreen.h index 3e1fa8fdc9..9541309523 100644 --- a/Common/UI/UIScreen.h +++ b/Common/UI/UIScreen.h @@ -81,6 +81,7 @@ public: virtual void TriggerFinish(DialogResult result) override; void SetPopupOrigin(const UI::View *view); + void SetPopupOffset(float y); protected: virtual bool FillVertical() const { return false; } @@ -109,6 +110,7 @@ private: DialogResult finishResult_; bool hasPopupOrigin_ = false; Point popupOrigin_; + float offsetY_ = 0.0f; }; class ListPopupScreen : public PopupScreen { diff --git a/UI/ControlMappingScreen.cpp b/UI/ControlMappingScreen.cpp index 278ef7d800..ebc924604e 100644 --- a/UI/ControlMappingScreen.cpp +++ b/UI/ControlMappingScreen.cpp @@ -999,6 +999,7 @@ public: MockPSP(UI::LayoutParams *layoutParams = nullptr); void SelectButton(int btn); + float GetPopupOffset(); UI::Event ButtonClick; @@ -1044,6 +1045,18 @@ void MockPSP::SelectButton(int btn) { selectedButton_ = btn; } +float MockPSP::GetPopupOffset() { + MockButton *view = buttons_[selectedButton_]; + if (!view) + return 0.0f; + + float ypos = view->GetBounds().centerY(); + if (ypos > bounds_.centerY()) { + return -0.25f; + } + return 0.25f; +} + UI::AnchorLayoutParams *MockPSP::LayoutAt(float l, float t, float r, float b) { return new UI::AnchorLayoutParams(l * SCALE, t * SCALE, r * SCALE, b * SCALE); } @@ -1112,24 +1125,20 @@ void VisualMappingScreen::CreateViews() { root_->Add(rightColumn); } +void VisualMappingScreen::resized() { + RecreateViews(); +} + UI::EventReturn VisualMappingScreen::OnMapButton(UI::EventParams &e) { - auto km = GetI18NCategory("KeyMapping"); - nextKey_ = e.a; - psp_->SelectButton(nextKey_); - - screenManager()->push(new KeyMappingNewKeyDialog(nextKey_, true, std::bind(&VisualMappingScreen::HandleKeyMapping, this, std::placeholders::_1), km)); + MapNext(); return UI::EVENT_DONE; } UI::EventReturn VisualMappingScreen::OnBindAll(UI::EventParams &e) { - auto km = GetI18NCategory("KeyMapping"); - bindAll_ = 0; nextKey_ = bindAllOrder[bindAll_]; - psp_->SelectButton(nextKey_); - - screenManager()->push(new KeyMappingNewKeyDialog(nextKey_, true, std::bind(&VisualMappingScreen::HandleKeyMapping, this, std::placeholders::_1), km)); + MapNext(); return UI::EVENT_DONE; } @@ -1156,14 +1165,26 @@ void VisualMappingScreen::HandleKeyMapping(KeyDef key) { } void VisualMappingScreen::dialogFinished(const Screen *dialog, DialogResult result) { - auto km = GetI18NCategory("KeyMapping"); - if (result == DR_YES && nextKey_ != 0) { - screenManager()->push(new KeyMappingNewKeyDialog(nextKey_, true, std::bind(&VisualMappingScreen::HandleKeyMapping, this, std::placeholders::_1), km)); + MapNext(); } else { nextKey_ = 0; bindAll_ = -1; psp_->SelectButton(0); } +} +void VisualMappingScreen::MapNext() { + auto km = GetI18NCategory("KeyMapping"); + + if (nextKey_ == VIRTKEY_AXIS_Y_MIN || nextKey_ == VIRTKEY_AXIS_X_MIN || nextKey_ == VIRTKEY_AXIS_X_MAX) { + psp_->SelectButton(VIRTKEY_AXIS_Y_MAX); + } else { + psp_->SelectButton(nextKey_); + } + auto dialog = new KeyMappingNewKeyDialog(nextKey_, true, std::bind(&VisualMappingScreen::HandleKeyMapping, this, std::placeholders::_1), km); + + Bounds bounds = screenManager()->getUIContext()->GetLayoutBounds(); + dialog->SetPopupOffset(psp_->GetPopupOffset() * bounds.h); + screenManager()->push(dialog); } diff --git a/UI/ControlMappingScreen.h b/UI/ControlMappingScreen.h index dc0aa61b02..d95818a3cb 100644 --- a/UI/ControlMappingScreen.h +++ b/UI/ControlMappingScreen.h @@ -170,11 +170,13 @@ protected: void CreateViews() override; void dialogFinished(const Screen *dialog, DialogResult result) override; + void resized() override; private: UI::EventReturn OnMapButton(UI::EventParams &e); UI::EventReturn OnBindAll(UI::EventParams &e); void HandleKeyMapping(KeyDef key); + void MapNext(); MockPSP *psp_ = nullptr; int nextKey_ = 0; From 6e8e375eea2d44ba6350513d47f045c7bb669d9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 29 Aug 2021 15:27:51 +0200 Subject: [PATCH 211/336] Increase the range of cardboard setting sliders to 150%. See #14768 --- GPU/Common/PresentationCommon.cpp | 2 +- UI/GameSettingsScreen.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/GPU/Common/PresentationCommon.cpp b/GPU/Common/PresentationCommon.cpp index d834ef3c48..2827988531 100644 --- a/GPU/Common/PresentationCommon.cpp +++ b/GPU/Common/PresentationCommon.cpp @@ -742,7 +742,7 @@ void PresentationCommon::CopyToOutput(OutputFlags flags, int uvRotation, float u performShaderPass(shaderInfo, postShaderFramebuffer, postShaderPipeline); } - Draw::Pipeline *pipeline = flags & OutputFlags::RB_SWIZZLE ? texColorRBSwizzle_ : texColor_; + Draw::Pipeline *pipeline = (flags & OutputFlags::RB_SWIZZLE) ? texColorRBSwizzle_ : texColor_; if (isFinalAtOutputResolution && previousFramebuffers_.empty()) { pipeline = postShaderPipelines_.back(); } diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 16cd4c4c3c..eed19857f8 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -562,9 +562,9 @@ void GameSettingsScreen::CreateViews() { if (showCardboardSettings) { graphicsSettings->Add(new ItemHeader(gr->T("Cardboard VR Settings", "Cardboard VR Settings"))); graphicsSettings->Add(new CheckBox(&g_Config.bEnableCardboardVR, gr->T("Enable Cardboard VR", "Enable Cardboard VR"))); - PopupSliderChoice *cardboardScreenSize = graphicsSettings->Add(new PopupSliderChoice(&g_Config.iCardboardScreenSize, 30, 100, gr->T("Cardboard Screen Size", "Screen Size (in % of the viewport)"), 1, screenManager(), gr->T("% of viewport"))); + PopupSliderChoice *cardboardScreenSize = graphicsSettings->Add(new PopupSliderChoice(&g_Config.iCardboardScreenSize, 30, 150, gr->T("Cardboard Screen Size", "Screen Size (in % of the viewport)"), 1, screenManager(), gr->T("% of viewport"))); cardboardScreenSize->SetEnabledPtr(&g_Config.bEnableCardboardVR); - PopupSliderChoice *cardboardXShift = graphicsSettings->Add(new PopupSliderChoice(&g_Config.iCardboardXShift, -100, 100, gr->T("Cardboard Screen X Shift", "X Shift (in % of the void)"), 1, screenManager(), gr->T("% of the void"))); + PopupSliderChoice *cardboardXShift = graphicsSettings->Add(new PopupSliderChoice(&g_Config.iCardboardXShift, -150, 150, gr->T("Cardboard Screen X Shift", "X Shift (in % of the void)"), 1, screenManager(), gr->T("% of the void"))); cardboardXShift->SetEnabledPtr(&g_Config.bEnableCardboardVR); PopupSliderChoice *cardboardYShift = graphicsSettings->Add(new PopupSliderChoice(&g_Config.iCardboardYShift, -100, 100, gr->T("Cardboard Screen Y Shift", "Y Shift (in % of the void)"), 1, screenManager(), gr->T("% of the void"))); cardboardYShift->SetEnabledPtr(&g_Config.bEnableCardboardVR); From e7666e472f9cb03dfac4dacf0afc25bf57973f1b Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 29 Aug 2021 08:02:52 -0700 Subject: [PATCH 212/336] KeyMap: Simplify UI updates. Better to avoid tightly coupled notifications of updates. --- Core/KeyMap.cpp | 12 +++++++++++- Core/KeyMap.h | 2 ++ UI/ControlMappingScreen.cpp | 15 ++++++++++++--- UI/ControlMappingScreen.h | 5 ++++- Windows/MainWindowMenu.cpp | 2 +- 5 files changed, 30 insertions(+), 6 deletions(-) diff --git a/Core/KeyMap.cpp b/Core/KeyMap.cpp index 9adb9b0324..78efca5c41 100644 --- a/Core/KeyMap.cpp +++ b/Core/KeyMap.cpp @@ -43,7 +43,8 @@ namespace KeyMap { KeyDef AxisDef(int deviceId, int axisId, int direction); KeyMapping g_controllerMap; -int g_controllerMapGeneration = 0; // Just used to check if we need to update the Windows menu or not. +// Incremented on modification, so we know when to update menus. +int g_controllerMapGeneration = 0; std::set g_seenPads; std::set g_seenDeviceIds; @@ -622,6 +623,7 @@ void SetAxisMapping(int btn, int deviceId, int axisId, int direction, bool repla void RestoreDefault() { g_controllerMap.clear(); + g_controllerMapGeneration++; #if PPSSPP_PLATFORM(WINDOWS) SetDefaultKeyMap(DEFAULT_MAPPING_KEYBOARD, true); SetDefaultKeyMap(DEFAULT_MAPPING_XINPUT, false); @@ -765,4 +767,12 @@ void SwapAxis() { g_swapped_keys = !g_swapped_keys; } +bool HasChanged(int &prevGeneration) { + if (prevGeneration != g_controllerMapGeneration) { + prevGeneration = g_controllerMapGeneration; + return true; + } + return false; +} + } // KeyMap diff --git a/Core/KeyMap.h b/Core/KeyMap.h index 16f4b5d37c..01da7e9596 100644 --- a/Core/KeyMap.h +++ b/Core/KeyMap.h @@ -158,4 +158,6 @@ namespace KeyMap { void AutoConfForPad(const std::string &name); bool IsKeyMapped(int device, int key); + + bool HasChanged(int &prevGeneration); } diff --git a/UI/ControlMappingScreen.cpp b/UI/ControlMappingScreen.cpp index ebc924604e..8e0471643b 100644 --- a/UI/ControlMappingScreen.cpp +++ b/UI/ControlMappingScreen.cpp @@ -264,17 +264,26 @@ void ControlMappingScreen::CreateViews() { new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT))); mappers_.push_back(mapper); } + + keyMapGeneration_ = KeyMap::g_controllerMapGeneration; +} + +void ControlMappingScreen::update() { + if (KeyMap::HasChanged(keyMapGeneration_)) { + RecreateViews(); + } + + UIDialogScreenWithBackground::update(); } UI::EventReturn ControlMappingScreen::OnClearMapping(UI::EventParams ¶ms) { KeyMap::g_controllerMap.clear(); - RecreateViews(); + KeyMap::g_controllerMapGeneration++; return UI::EVENT_DONE; } UI::EventReturn ControlMappingScreen::OnDefaultMapping(UI::EventParams ¶ms) { KeyMap::RestoreDefault(); - RecreateViews(); return UI::EVENT_DONE; } @@ -302,7 +311,6 @@ void ControlMappingScreen::dialogFinished(const Screen *dialog, DialogResult res if (result == DR_OK && dialog->tag() == "listpopup") { ListPopupScreen *popup = (ListPopupScreen *)dialog; KeyMap::AutoConfForPad(popup->GetChoiceString()); - RecreateViews(); } } @@ -1126,6 +1134,7 @@ void VisualMappingScreen::CreateViews() { } void VisualMappingScreen::resized() { + UIDialogScreenWithBackground::resized(); RecreateViews(); } diff --git a/UI/ControlMappingScreen.h b/UI/ControlMappingScreen.h index d95818a3cb..496fab41f3 100644 --- a/UI/ControlMappingScreen.h +++ b/UI/ControlMappingScreen.h @@ -39,7 +39,9 @@ public: std::string tag() const override { return "control mapping"; } protected: - virtual void CreateViews() override; + void CreateViews() override; + void update() override; + private: UI::EventReturn OnDefaultMapping(UI::EventParams ¶ms); UI::EventReturn OnClearMapping(UI::EventParams ¶ms); @@ -50,6 +52,7 @@ private: UI::ScrollView *rightScroll_; std::vector mappers_; + int keyMapGeneration_ = -1; }; class KeyMappingNewKeyDialog : public PopupScreen { diff --git a/Windows/MainWindowMenu.cpp b/Windows/MainWindowMenu.cpp index ac186ad09c..026540f443 100644 --- a/Windows/MainWindowMenu.cpp +++ b/Windows/MainWindowMenu.cpp @@ -351,7 +351,7 @@ namespace MainWindow { bool changed = false; const std::string curLanguageID = i18nrepo.LanguageID(); - if (curLanguageID != menuLanguageID || menuKeymapGeneration != KeyMap::g_controllerMapGeneration) { + if (curLanguageID != menuLanguageID || KeyMap::HasChanged(menuKeymapGeneration)) { DoTranslateMenus(hWnd, menu); menuLanguageID = curLanguageID; changed = true; From c48a2033635a0dd6538d5a2b5fb108f6ce8eb272 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 29 Aug 2021 11:11:01 -0700 Subject: [PATCH 213/336] Debugger: Avoid infinite loop in disasm API. This allows for wrap around, but prevents getting stuck looping in out of bound addresses. --- Core/Debugger/WebSocket/DisasmSubscriber.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Core/Debugger/WebSocket/DisasmSubscriber.cpp b/Core/Debugger/WebSocket/DisasmSubscriber.cpp index ab43655d56..c2b55cc78a 100644 --- a/Core/Debugger/WebSocket/DisasmSubscriber.cpp +++ b/Core/Debugger/WebSocket/DisasmSubscriber.cpp @@ -320,8 +320,10 @@ void WebSocketDisasmState::Disasm(DebuggerRequest &req) { req.ParamU32("address", &start); end = disasm_.getNthNextAddress(start, count); } else if (req.ParamU32("end", &end)) { - end = std::min(std::max(start, end), start + MAX_RANGE * 4); - // Let's assume everything is two instructions. + end = std::max(start, end); + if (end - start > MAX_RANGE * 4) + end = start + MAX_RANGE * 4; + // Let's assume everything is two instructions at most. disasm_.analyze(start - 4, end - start + 8); start = disasm_.getStartAddress(start); if (start == -1) @@ -329,8 +331,14 @@ void WebSocketDisasmState::Disasm(DebuggerRequest &req) { // Correct end and calculate count based on it. // This accounts for macros as one line, although two instructions. u32 stop = end; + u32 next = start; count = 0; - for (end = start; end < stop; end = disasm_.getNthNextAddress(end, 1)) { + if (stop < start) { + for (next = start; next > stop; next = disasm_.getNthNextAddress(next, 1)) { + count++; + } + } + for (end = next; end < stop && end >= next; end = disasm_.getNthNextAddress(end, 1)) { count++; } } else { From 68d9372d9f89dc145ce620a9730038dec1d34fb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 29 Aug 2021 21:20:33 +0200 Subject: [PATCH 214/336] Update gradle again. Or at least try to, last time I tried we hit buildbot issues. --- android/build.gradle | 1 - build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 7efbc9d5d9..45217d4303 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -103,7 +103,6 @@ android { assets.srcDirs = [ '../assets', ] - jni.srcDirs = ['..'] } gold { res.srcDirs = ['gold/res'] diff --git a/build.gradle b/build.gradle index c9644d8802..a6beab90bd 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:4.1.3' + classpath 'com.android.tools.build:gradle:7.0.1' } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b145d5dc22..c2bd07f600 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,6 +3,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip android.useAndroidX=true android.enableJetifier=true From 9ca97dfa8e8ee160de6f4d8ba2468dbbd04f7641 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 29 Aug 2021 21:50:43 +0200 Subject: [PATCH 215/336] Handle vertex shader generation failures better. Suspect that this is happening with the HW tesselation crash in KOF '96. Should help #14774 --- GPU/GLES/ShaderManagerGLES.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index 3fcc537d55..44029e691c 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -676,9 +676,9 @@ Shader *ShaderManagerGLES::ApplyVertexShader(bool useHWTransform, bool useHWTess if (!vs) { // Vertex shader not in cache. Let's compile it. vs = CompileVertexShader(*VSID); - if (vs->Failed()) { + if (!vs || vs->Failed()) { auto gr = GetI18NCategory("Graphics"); - ERROR_LOG(G3D, "Shader compilation failed, falling back to software transform"); + ERROR_LOG(G3D, "Vertex shader generation failed, falling back to software transform"); if (!g_Config.bHideSlowWarnings) { host->NotifyUserMessage(gr->T("hardware transform error - falling back to software"), 2.5f, 0xFF3030FF); } @@ -728,6 +728,7 @@ LinkedShader *ShaderManagerGLES::ApplyFragmentShader(VShaderID VSID, Shader *vs, if (!fs) { // Fragment shader not in cache. Let's compile it. // Can't really tell if we succeeded since the compile is on the GPU thread later. + // Could fail to generate, in which case we're kinda screwed. fs = CompileFragmentShader(FSID); fsCache_.Insert(FSID, fs); diskCacheDirty_ = true; From cf22268bc1286609d9ab57d774032d0c5295e079 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 29 Aug 2021 14:10:14 -0700 Subject: [PATCH 216/336] UI: Fix grids in ScrollViews and adjust gravity. --- Common/UI/View.h | 1 + Common/UI/ViewGroup.cpp | 8 ++++++-- Common/UI/ViewGroup.h | 15 +++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/Common/UI/View.h b/Common/UI/View.h index f21f4475fd..8f8cbd4167 100644 --- a/Common/UI/View.h +++ b/Common/UI/View.h @@ -307,6 +307,7 @@ enum LayoutParamsType { LP_PLAIN = 0, LP_LINEAR = 1, LP_ANCHOR = 2, + LP_GRID = 3, }; // Need a virtual destructor so vtables are created, otherwise RTTI can't work diff --git a/Common/UI/ViewGroup.cpp b/Common/UI/ViewGroup.cpp index 2b1ba991bd..defaa7845d 100644 --- a/Common/UI/ViewGroup.cpp +++ b/Common/UI/ViewGroup.cpp @@ -1246,7 +1246,9 @@ void GridLayout::Measure(const UIContext &dc, MeasureSpec horiz, MeasureSpec ver views_[i]->Measure(dc, MeasureSpec(measureType, settings_.columnWidth), MeasureSpec(measureType, settings_.rowHeight)); } - MeasureBySpec(layoutParams_->width, 0.0f, horiz, &measuredWidth_); + // Use the max possible width so AT_MOST gives us the full size. + float maxWidth = (settings_.columnWidth + settings_.spacing) * views_.size() + settings_.spacing; + MeasureBySpec(layoutParams_->width, maxWidth, horiz, &measuredWidth_); // Okay, got the width we are supposed to adjust to. Now we can calculate the number of columns. numColumns_ = (measuredWidth_ - settings_.spacing) / (settings_.columnWidth + settings_.spacing); @@ -1263,7 +1265,9 @@ void GridLayout::Layout() { int x = 0; int count = 0; for (size_t i = 0; i < views_.size(); i++) { + const GridLayoutParams *lp = views_[i]->GetLayoutParams()->As(); Bounds itemBounds, innerBounds; + Gravity grav = lp ? lp->gravity : G_CENTER; itemBounds.x = bounds_.x + x; itemBounds.y = bounds_.y + y; @@ -1272,7 +1276,7 @@ void GridLayout::Layout() { ApplyGravity(itemBounds, Margins(0.0f), views_[i]->GetMeasuredWidth(), views_[i]->GetMeasuredHeight(), - G_HCENTER | G_VCENTER, innerBounds); + grav, innerBounds); views_[i]->SetBounds(innerBounds); views_[i]->Layout(); diff --git a/Common/UI/ViewGroup.h b/Common/UI/ViewGroup.h index 5619d2317b..3460cd7886 100644 --- a/Common/UI/ViewGroup.h +++ b/Common/UI/ViewGroup.h @@ -222,6 +222,21 @@ struct GridLayoutSettings { bool fillCells; }; +class GridLayoutParams : public LayoutParams { +public: + GridLayoutParams() + : LayoutParams(LP_GRID), gravity(G_CENTER) {} + explicit GridLayoutParams(Gravity grav) + : LayoutParams(LP_GRID), gravity(grav) { + } + + Gravity gravity; + + static LayoutParamsType StaticType() { + return LP_GRID; + } +}; + class GridLayout : public ViewGroup { public: GridLayout(GridLayoutSettings settings, LayoutParams *layoutParams = 0); From 5e3ffe94b386bf0375c3afc062924272c171d6f3 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 29 Aug 2021 14:11:32 -0700 Subject: [PATCH 217/336] UI: Allow scoll views to have specific height. --- Common/UI/ViewGroup.cpp | 4 ++-- UI/MainScreen.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Common/UI/ViewGroup.cpp b/Common/UI/ViewGroup.cpp index defaa7845d..9b816f2767 100644 --- a/Common/UI/ViewGroup.cpp +++ b/Common/UI/ViewGroup.cpp @@ -765,10 +765,10 @@ void ScrollView::Measure(const UIContext &dc, MeasureSpec horiz, MeasureSpec ver MeasureBySpec(layoutParams_->width, views_[0]->GetMeasuredWidth(), horiz, &measuredWidth_); } if (orientation_ == ORIENT_VERTICAL && vert.type != EXACTLY) { - if (measuredHeight_ < views_[0]->GetMeasuredHeight()) { + if (measuredHeight_ < views_[0]->GetMeasuredHeight() && layoutParams_->height < 0.0f) { measuredHeight_ = views_[0]->GetMeasuredHeight(); } - if (measuredHeight_ < views_[0]->GetBounds().h) { + if (measuredHeight_ < views_[0]->GetBounds().h && layoutParams_->height < 0.0f) { measuredHeight_ = views_[0]->GetBounds().h; } if (vert.type == AT_MOST && measuredHeight_ > vert.size) { diff --git a/UI/MainScreen.cpp b/UI/MainScreen.cpp index 2bde92b1af..3cb54b58b4 100644 --- a/UI/MainScreen.cpp +++ b/UI/MainScreen.cpp @@ -1535,7 +1535,7 @@ void GridSettingsScreen::CreatePopupContents(UI::ViewGroup *parent) { auto di = GetI18NCategory("Dialog"); auto sy = GetI18NCategory("System"); - ScrollView *scroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, 50, 1.0f)); + ScrollView *scroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT, 1.0f)); LinearLayout *items = new LinearLayoutList(ORIENT_VERTICAL); items->Add(new CheckBox(&g_Config.bGridView1, sy->T("Display Recent on a grid"))); From 7a29a8bd4808402bd6c29e73658fa907e6971ed0 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 29 Aug 2021 16:39:14 -0700 Subject: [PATCH 218/336] UI: Handle WRAP_CONTENT in flexible scroll views. If the scroll view had weight, it'd grow to the max size always. Now it still fits to the container, if that's what it's set to. --- Common/UI/ViewGroup.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Common/UI/ViewGroup.cpp b/Common/UI/ViewGroup.cpp index 9b816f2767..fbff1e3f6c 100644 --- a/Common/UI/ViewGroup.cpp +++ b/Common/UI/ViewGroup.cpp @@ -756,6 +756,8 @@ void ScrollView::Measure(const UIContext &dc, MeasureSpec horiz, MeasureSpec ver } views_[0]->Measure(dc, MeasureSpec(UNSPECIFIED, measuredWidth_), v); MeasureBySpec(layoutParams_->height, views_[0]->GetMeasuredHeight(), vert, &measuredHeight_); + if (layoutParams_->width == WRAP_CONTENT) + MeasureBySpec(layoutParams_->width, views_[0]->GetMeasuredWidth(), horiz, &measuredWidth_); } else { MeasureSpec h = MeasureSpec(AT_MOST, measuredWidth_ - margins.horiz()); if (measuredWidth_ == 0.0f && (horiz.type == UNSPECIFIED || layoutParams_->width == WRAP_CONTENT)) { @@ -763,16 +765,16 @@ void ScrollView::Measure(const UIContext &dc, MeasureSpec horiz, MeasureSpec ver } views_[0]->Measure(dc, h, MeasureSpec(UNSPECIFIED, measuredHeight_)); MeasureBySpec(layoutParams_->width, views_[0]->GetMeasuredWidth(), horiz, &measuredWidth_); + if (layoutParams_->height == WRAP_CONTENT) + MeasureBySpec(layoutParams_->height, views_[0]->GetMeasuredHeight(), vert, &measuredHeight_); } if (orientation_ == ORIENT_VERTICAL && vert.type != EXACTLY) { - if (measuredHeight_ < views_[0]->GetMeasuredHeight() && layoutParams_->height < 0.0f) { - measuredHeight_ = views_[0]->GetMeasuredHeight(); - } - if (measuredHeight_ < views_[0]->GetBounds().h && layoutParams_->height < 0.0f) { - measuredHeight_ = views_[0]->GetBounds().h; - } - if (vert.type == AT_MOST && measuredHeight_ > vert.size) { - measuredHeight_ = vert.size; + float bestHeight = std::max(views_[0]->GetMeasuredHeight(), views_[0]->GetBounds().h); + if (vert.type == AT_MOST) + bestHeight = std::min(bestHeight, vert.size); + + if (measuredHeight_ < bestHeight && layoutParams_->height < 0.0f) { + measuredHeight_ = bestHeight; } } } From 6378cb1693af7771662bb34fd2f9018bd5f2ef3a Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 29 Aug 2021 16:43:15 -0700 Subject: [PATCH 219/336] UI: Fix focus persistence in control mapping. Trying to reset focus from the parent was just complicating things. We persist the focus state when recreating views. --- UI/ControlMappingScreen.cpp | 16 ++++------------ UI/ControlMappingScreen.h | 1 - 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/UI/ControlMappingScreen.cpp b/UI/ControlMappingScreen.cpp index 8e0471643b..a827d9d409 100644 --- a/UI/ControlMappingScreen.cpp +++ b/UI/ControlMappingScreen.cpp @@ -33,6 +33,7 @@ #include "Common/Data/Text/I18n.h" #include "Common/Input/KeyCodes.h" #include "Common/Input/InputState.h" +#include "Common/StringUtils.h" #include "Common/System/Display.h" #include "Common/System/System.h" #include "Core/KeyMap.h" @@ -90,7 +91,6 @@ void SingleControlMapper::Update() { } void SingleControlMapper::Refresh() { - bool hasFocus = UI::GetFocusedView() == this; Clear(); auto mc = GetI18NCategory("MappableControls"); @@ -162,9 +162,6 @@ void SingleControlMapper::Refresh() { Choice *c = rightColumn->Add(new Choice("", new LinearLayoutParams(FILL_PARENT, itemH))); c->OnClick.Handle(this, &SingleControlMapper::OnAdd); } - - if (hasFocus) - this->SetFocus(); } void SingleControlMapper::MappedCallback(KeyDef kdf) { @@ -184,7 +181,7 @@ void SingleControlMapper::MappedCallback(KeyDef kdf) { } g_Config.bMapMouse = false; refresh_ = true; - ctrlScreen_->KeyMapped(pspKey_); + SetFocus(); // After this, we do not exist any more. So the refresh_ = true is probably irrelevant. } @@ -222,6 +219,7 @@ UI::EventReturn SingleControlMapper::OnDelete(UI::EventParams ¶ms) { KeyMap::g_controllerMap[pspKey_].erase(KeyMap::g_controllerMap[pspKey_].begin() + index); KeyMap::g_controllerMapGeneration++; refresh_ = true; + SetFocus(); return UI::EVENT_DONE; } @@ -262,6 +260,7 @@ void ControlMappingScreen::CreateViews() { SingleControlMapper *mapper = rightColumn->Add( new SingleControlMapper(this, mappableKeys[i].key, mappableKeys[i].name, screenManager(), new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT))); + mapper->SetTag(StringFromFormat("KeyMap%s", mappableKeys[i].name)); mappers_.push_back(mapper); } @@ -314,13 +313,6 @@ void ControlMappingScreen::dialogFinished(const Screen *dialog, DialogResult res } } -void ControlMappingScreen::KeyMapped(int pspkey) { // Notification to let us refocus the same one after recreating views. - for (size_t i = 0; i < mappers_.size(); i++) { - if (mappers_[i]->GetPspKey() == pspkey) - SetFocusedView(mappers_[i]); - } -} - void KeyMappingNewKeyDialog::CreatePopupContents(UI::ViewGroup *parent) { using namespace UI; diff --git a/UI/ControlMappingScreen.h b/UI/ControlMappingScreen.h index 496fab41f3..393fb1f18c 100644 --- a/UI/ControlMappingScreen.h +++ b/UI/ControlMappingScreen.h @@ -35,7 +35,6 @@ class SingleControlMapper; class ControlMappingScreen : public UIDialogScreenWithBackground { public: ControlMappingScreen() {} - void KeyMapped(int pspkey); // Notification to let us refocus the same one after recreating views. std::string tag() const override { return "control mapping"; } protected: From 7bb58ce5a01bc2388b6fe22a1f92ff50e4af0577 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 29 Aug 2021 16:59:55 -0700 Subject: [PATCH 220/336] UI: Refocus better on control mapping change. This is less awkward, since it keeps you closer to where you were before. --- UI/ControlMappingScreen.cpp | 54 ++++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/UI/ControlMappingScreen.cpp b/UI/ControlMappingScreen.cpp index a827d9d409..3645747dba 100644 --- a/UI/ControlMappingScreen.cpp +++ b/UI/ControlMappingScreen.cpp @@ -46,7 +46,7 @@ class SingleControlMapper : public UI::LinearLayout { public: - SingleControlMapper(ControlMappingScreen *ctrlScreen, int pspKey, std::string keyName, ScreenManager *scrm, UI::LinearLayoutParams *layoutParams = 0); + SingleControlMapper(int pspKey, std::string keyName, ScreenManager *scrm, UI::LinearLayoutParams *layoutParams = nullptr); void Update() override; int GetPspKey() const { return pspKey_; } @@ -68,17 +68,19 @@ private: ADD, }; - ControlMappingScreen *ctrlScreen_; - Action action_; + UI::Choice *addButton_ = nullptr; + UI::Choice *replaceAllButton_ = nullptr; + std::vector rows_; + Action action_ = NONE; int actionIndex_; int pspKey_; std::string keyName_; ScreenManager *scrm_; - bool refresh_; + bool refresh_ = false; }; -SingleControlMapper::SingleControlMapper(ControlMappingScreen *ctrlScreen, int pspKey, std::string keyName, ScreenManager *scrm, UI::LinearLayoutParams *layoutParams) - : UI::LinearLayout(UI::ORIENT_VERTICAL, layoutParams), ctrlScreen_(ctrlScreen), action_(NONE), pspKey_(pspKey), keyName_(keyName), scrm_(scrm), refresh_(false) { +SingleControlMapper::SingleControlMapper(int pspKey, std::string keyName, ScreenManager *scrm, UI::LinearLayoutParams *layoutParams) + : UI::LinearLayout(UI::ORIENT_VERTICAL, layoutParams), pspKey_(pspKey), keyName_(keyName), scrm_(scrm) { Refresh(); } @@ -117,17 +119,16 @@ void SingleControlMapper::Refresh() { auto iter = keyImages.find(keyName_); // First, look among images. if (iter != keyImages.end()) { - Choice *c = root->Add(new Choice(iter->second, new LinearLayoutParams(leftColumnWidth, itemH))); - c->OnClick.Handle(this, &SingleControlMapper::OnReplaceAll); + replaceAllButton_ = new Choice(iter->second, new LinearLayoutParams(leftColumnWidth, itemH)); } else { // No image? Let's translate. - Choice *c = new Choice(mc->T(keyName_.c_str()), new LinearLayoutParams(leftColumnWidth, itemH)); - c->SetCentered(true); - root->Add(c)->OnClick.Handle(this, &SingleControlMapper::OnReplaceAll); + replaceAllButton_ = new Choice(mc->T(keyName_.c_str()), new LinearLayoutParams(leftColumnWidth, itemH)); + replaceAllButton_->SetCentered(true); } + root->Add(replaceAllButton_)->OnClick.Handle(this, &SingleControlMapper::OnReplaceAll); - Choice *p = root->Add(new Choice(" + ", new LayoutParams(WRAP_CONTENT, itemH))); - p->OnClick.Handle(this, &SingleControlMapper::OnAdd); + addButton_ = root->Add(new Choice(" + ", new LayoutParams(WRAP_CONTENT, itemH))); + addButton_->OnClick.Handle(this, &SingleControlMapper::OnAdd); if (g_Config.bMouseControl) { Choice *p = root->Add(new Choice("M", new LayoutParams(WRAP_CONTENT, itemH))); p->OnClick.Handle(this, &SingleControlMapper::OnAddMouse); @@ -138,22 +139,21 @@ void SingleControlMapper::Refresh() { std::vector mappings; KeyMap::KeyFromPspButton(pspKey_, &mappings, false); + rows_.empty(); for (size_t i = 0; i < mappings.size(); i++) { std::string deviceName = GetDeviceName(mappings[i].deviceId); std::string keyName = KeyMap::GetKeyOrAxisName(mappings[i].keyCode); LinearLayout *row = rightColumn->Add(new LinearLayout(ORIENT_HORIZONTAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT))); row->SetSpacing(1.0f); - - char tagbuf[16]; - sprintf(tagbuf, "%d", (int)i); + rows_.push_back(row); Choice *c = row->Add(new Choice(deviceName + "." + keyName, new LinearLayoutParams(FILL_PARENT, itemH, 1.0f))); - c->SetTag(tagbuf); + c->SetTag(StringFromFormat("%d_Change%d", (int)i, pspKey_)); c->OnClick.Handle(this, &SingleControlMapper::OnReplace); Choice *d = row->Add(new Choice(" X ", new LayoutParams(WRAP_CONTENT, itemH))); - d->SetTag(tagbuf); + d->SetTag(StringFromFormat("%d_Del%d", (int)i, pspKey_)); d->OnClick.Handle(this, &SingleControlMapper::OnDelete); } @@ -168,20 +168,26 @@ void SingleControlMapper::MappedCallback(KeyDef kdf) { switch (action_) { case ADD: KeyMap::SetKeyMapping(pspKey_, kdf, false); + addButton_->SetFocus(); break; case REPLACEALL: KeyMap::SetKeyMapping(pspKey_, kdf, true); + replaceAllButton_->SetFocus(); break; case REPLACEONE: KeyMap::g_controllerMap[pspKey_][actionIndex_] = kdf; KeyMap::g_controllerMapGeneration++; + if (actionIndex_ < rows_.size()) + rows_[actionIndex_]->SetFocus(); + else + SetFocus(); break; default: - ; + SetFocus(); + break; } g_Config.bMapMouse = false; refresh_ = true; - SetFocus(); // After this, we do not exist any more. So the refresh_ = true is probably irrelevant. } @@ -219,7 +225,11 @@ UI::EventReturn SingleControlMapper::OnDelete(UI::EventParams ¶ms) { KeyMap::g_controllerMap[pspKey_].erase(KeyMap::g_controllerMap[pspKey_].begin() + index); KeyMap::g_controllerMapGeneration++; refresh_ = true; - SetFocus(); + + if (index + 1 < rows_.size()) + rows_[index]->SetFocus(); + else + SetFocus(); return UI::EVENT_DONE; } @@ -258,7 +268,7 @@ void ControlMappingScreen::CreateViews() { std::vector mappableKeys = KeyMap::GetMappableKeys(); for (size_t i = 0; i < mappableKeys.size(); i++) { SingleControlMapper *mapper = rightColumn->Add( - new SingleControlMapper(this, mappableKeys[i].key, mappableKeys[i].name, screenManager(), + new SingleControlMapper(mappableKeys[i].key, mappableKeys[i].name, screenManager(), new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT))); mapper->SetTag(StringFromFormat("KeyMap%s", mappableKeys[i].name)); mappers_.push_back(mapper); From 6e4708733cc4ec08670e9ae40f476562eb80fb47 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 29 Aug 2021 17:08:27 -0700 Subject: [PATCH 221/336] UI: Restore focus on PSP view as well. --- UI/ControlMappingScreen.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/UI/ControlMappingScreen.cpp b/UI/ControlMappingScreen.cpp index 3645747dba..3f09c61bdc 100644 --- a/UI/ControlMappingScreen.cpp +++ b/UI/ControlMappingScreen.cpp @@ -1009,6 +1009,7 @@ public: MockPSP(UI::LayoutParams *layoutParams = nullptr); void SelectButton(int btn); + void FocusButton(int btn); float GetPopupOffset(); UI::Event ButtonClick; @@ -1055,6 +1056,12 @@ void MockPSP::SelectButton(int btn) { selectedButton_ = btn; } +void MockPSP::FocusButton(int btn) { + MockButton *view = buttons_[selectedButton_]; + if (view) + view->SetFocus(); +} + float MockPSP::GetPopupOffset() { MockButton *view = buttons_[selectedButton_]; if (!view) @@ -1164,8 +1171,13 @@ void VisualMappingScreen::HandleKeyMapping(KeyDef key) { nextKey_ = VIRTKEY_AXIS_X_MIN; else if (nextKey_ == VIRTKEY_AXIS_X_MIN) nextKey_ = VIRTKEY_AXIS_X_MAX; - else + else { + if (nextKey_ == VIRTKEY_AXIS_X_MAX) + psp_->FocusButton(VIRTKEY_AXIS_Y_MAX); + else + psp_->FocusButton(nextKey_); nextKey_ = 0; + } } else if ((size_t)bindAll_ + 1 < bindAllOrder.size()) { bindAll_++; nextKey_ = bindAllOrder[bindAll_]; @@ -1179,6 +1191,9 @@ void VisualMappingScreen::dialogFinished(const Screen *dialog, DialogResult resu if (result == DR_YES && nextKey_ != 0) { MapNext(); } else { + // This means they canceled. + if (nextKey_ != 0) + psp_->FocusButton(nextKey_); nextKey_ = 0; bindAll_ = -1; psp_->SelectButton(0); From 01edd695c86e022999937016c7a9f4be0dc6a067 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 29 Aug 2021 17:14:08 -0700 Subject: [PATCH 222/336] UI: Fix refocus on no control change. There's no reason to refresh, and since the views are different without PersistData being called, it breaks the focus. Refreshing now handled via the generation value. --- UI/ControlMappingScreen.cpp | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/UI/ControlMappingScreen.cpp b/UI/ControlMappingScreen.cpp index 3f09c61bdc..31f7fe761d 100644 --- a/UI/ControlMappingScreen.cpp +++ b/UI/ControlMappingScreen.cpp @@ -48,8 +48,8 @@ class SingleControlMapper : public UI::LinearLayout { public: SingleControlMapper(int pspKey, std::string keyName, ScreenManager *scrm, UI::LinearLayoutParams *layoutParams = nullptr); - void Update() override; int GetPspKey() const { return pspKey_; } + private: void Refresh(); @@ -76,7 +76,6 @@ private: int pspKey_; std::string keyName_; ScreenManager *scrm_; - bool refresh_ = false; }; SingleControlMapper::SingleControlMapper(int pspKey, std::string keyName, ScreenManager *scrm, UI::LinearLayoutParams *layoutParams) @@ -84,14 +83,6 @@ SingleControlMapper::SingleControlMapper(int pspKey, std::string keyName, Screen Refresh(); } -void SingleControlMapper::Update() { - if (refresh_) { - refresh_ = false; - Refresh(); - host->UpdateUI(); - } -} - void SingleControlMapper::Refresh() { Clear(); auto mc = GetI18NCategory("MappableControls"); @@ -187,8 +178,6 @@ void SingleControlMapper::MappedCallback(KeyDef kdf) { break; } g_Config.bMapMouse = false; - refresh_ = true; - // After this, we do not exist any more. So the refresh_ = true is probably irrelevant. } UI::EventReturn SingleControlMapper::OnReplace(UI::EventParams ¶ms) { @@ -224,7 +213,6 @@ UI::EventReturn SingleControlMapper::OnDelete(UI::EventParams ¶ms) { int index = atoi(params.v->Tag().c_str()); KeyMap::g_controllerMap[pspKey_].erase(KeyMap::g_controllerMap[pspKey_].begin() + index); KeyMap::g_controllerMapGeneration++; - refresh_ = true; if (index + 1 < rows_.size()) rows_[index]->SetFocus(); From e9ebd86439ae03edc41537a95d6c1e34ff9bc2a9 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 29 Aug 2021 17:35:58 -0700 Subject: [PATCH 223/336] UI: Fix scrollview focus scroll before relayout. Need to use the position of the bounds as of last layout, not the new desired position. --- Common/UI/ViewGroup.cpp | 32 +++++++++++++++++--------------- Common/UI/ViewGroup.h | 1 + 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/Common/UI/ViewGroup.cpp b/Common/UI/ViewGroup.cpp index fbff1e3f6c..ba8a9ef1bf 100644 --- a/Common/UI/ViewGroup.cpp +++ b/Common/UI/ViewGroup.cpp @@ -795,7 +795,7 @@ void ScrollView::Layout() { scrolled.w = views_[0]->GetMeasuredWidth() - margins.horiz(); scrolled.h = views_[0]->GetMeasuredHeight() - margins.vert(); - float layoutScrollPos = ClampedScrollPos(scrollPos_); + layoutScrollPos_ = ClampedScrollPos(scrollPos_); switch (orientation_) { case ORIENT_HORIZONTAL: @@ -803,7 +803,7 @@ void ScrollView::Layout() { ScrollTo(0.0f); lastViewSize_ = scrolled.w; } - scrolled.x = bounds_.x - layoutScrollPos; + scrolled.x = bounds_.x - layoutScrollPos_; scrolled.y = bounds_.y + margins.top; break; case ORIENT_VERTICAL: @@ -812,7 +812,7 @@ void ScrollView::Layout() { lastViewSize_ = scrolled.h; } scrolled.x = bounds_.x + margins.left; - scrolled.y = bounds_.y - layoutScrollPos; + scrolled.y = bounds_.y - layoutScrollPos_; break; } @@ -915,25 +915,27 @@ bool ScrollView::SubviewFocused(View *view) { const float overscroll = std::min(view->GetBounds().h / 1.5f, GetBounds().h / 4.0f); float pos = ClampedScrollPos(scrollPos_); + float visibleSize = orientation_ == ORIENT_VERTICAL ? bounds_.h : bounds_.w; + float visibleEnd = scrollPos_ + visibleSize; + + float viewStart, viewEnd; switch (orientation_) { case ORIENT_HORIZONTAL: - if (vBounds.x2() > bounds_.x2()) { - ScrollTo(pos + vBounds.x2() - bounds_.x2() + overscroll); - } - if (vBounds.x < bounds_.x) { - ScrollTo(pos + (vBounds.x - bounds_.x) - overscroll); - } + viewStart = layoutScrollPos_ + vBounds.x - bounds_.x; + viewEnd = layoutScrollPos_ + vBounds.x2() - bounds_.x; break; case ORIENT_VERTICAL: - if (vBounds.y2() > bounds_.y2()) { - ScrollTo(pos + vBounds.y2() - bounds_.y2() + overscroll); - } - if (vBounds.y < bounds_.y) { - ScrollTo(pos + (vBounds.y - bounds_.y) - overscroll); - } + viewStart = layoutScrollPos_ + vBounds.y - bounds_.y; + viewEnd = layoutScrollPos_ + vBounds.y2() - bounds_.y; break; } + if (viewEnd > visibleEnd) { + ScrollTo(viewEnd - visibleSize + overscroll); + } else if (viewStart < pos) { + ScrollTo(viewStart - overscroll); + } + return true; } diff --git a/Common/UI/ViewGroup.h b/Common/UI/ViewGroup.h index 3460cd7886..ad21b08a0f 100644 --- a/Common/UI/ViewGroup.h +++ b/Common/UI/ViewGroup.h @@ -300,6 +300,7 @@ private: float scrollTarget_ = 0.0f; int scrollTouchId_ = -1; bool scrollToTarget_ = false; + float layoutScrollPos_ = 0.0f; float inertia_ = 0.0f; float pull_ = 0.0f; float lastViewSize_ = 0.0f; From 2821035b1dce157184e855fbe82816c029c7117c Mon Sep 17 00:00:00 2001 From: iota97 Date: Mon, 30 Aug 2021 12:26:13 +0200 Subject: [PATCH 224/336] Support virutal button in touch gesture --- UI/GameSettingsScreen.cpp | 15 ++++++- UI/GamepadEmu.cpp | 26 +++++------- UI/GamepadEmu.h | 87 +++++++++++++++++++++++++++++---------- 3 files changed, 89 insertions(+), 39 deletions(-) diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 71dc7dd267..e6618d486e 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -729,10 +729,12 @@ void GameSettingsScreen::CreateViews() { static const char *touchControlStyles[] = {"Classic", "Thin borders", "Glowing borders"}; View *style = controlsSettings->Add(new PopupMultiChoice(&g_Config.iTouchButtonStyle, co->T("Button style"), touchControlStyles, 0, ARRAY_SIZE(touchControlStyles), co->GetName(), screenManager())); style->SetEnabledPtr(&g_Config.bShowTouchControls); - controlsSettings->Add(new Choice(co->T("Gesture mapping")))->OnClick.Add([=](EventParams &e) { + Choice *gesture = controlsSettings->Add(new Choice(co->T("Gesture mapping"))); + gesture->OnClick.Add([=](EventParams &e) { screenManager()->push(new GestureMappingScreen()); return UI::EVENT_DONE; }); + gesture->SetEnabledPtr(&g_Config.bShowTouchControls); } controlsSettings->Add(new ItemHeader(co->T("Keyboard", "Keyboard Control Settings"))); @@ -2007,14 +2009,23 @@ void GestureMappingScreen::CreateViews() { LinearLayout *vert = rightPanel->Add(new LinearLayout(ORIENT_VERTICAL, new LayoutParams(FILL_PARENT, FILL_PARENT))); vert->SetSpacing(0); - static const char *gestureButton[] = {"None", "L", "R", "Square", "Triangle", "Circle", "Cross", "D-pad up", "D-pad down", "D-pad left", "D-pad right", "Start", "Select"}; + static const char *gestureButton[ARRAY_SIZE(GestureKey::keyList)+1]; + gestureButton[0] = "None"; + for (int i = 1; i < ARRAY_SIZE(gestureButton); ++i) { + gestureButton[i] = GestureKey::keyList[i-1].n; + } + vert->Add(new CheckBox(&g_Config.bGestureControlEnabled, co->T("Enable gesture control"))); + + vert->Add(new ItemHeader(co->T("Swipe"))); vert->Add(new PopupMultiChoice(&g_Config.iSwipeUp, mc->T("Swipe Up"), gestureButton, 0, ARRAY_SIZE(gestureButton), mc->GetName(), screenManager()))->SetEnabledPtr(&g_Config.bGestureControlEnabled); vert->Add(new PopupMultiChoice(&g_Config.iSwipeDown, mc->T("Swipe Down"), gestureButton, 0, ARRAY_SIZE(gestureButton), mc->GetName(), screenManager()))->SetEnabledPtr(&g_Config.bGestureControlEnabled); vert->Add(new PopupMultiChoice(&g_Config.iSwipeLeft, mc->T("Swipe Left"), gestureButton, 0, ARRAY_SIZE(gestureButton), mc->GetName(), screenManager()))->SetEnabledPtr(&g_Config.bGestureControlEnabled); vert->Add(new PopupMultiChoice(&g_Config.iSwipeRight, mc->T("Swipe Right"), gestureButton, 0, ARRAY_SIZE(gestureButton), mc->GetName(), screenManager()))->SetEnabledPtr(&g_Config.bGestureControlEnabled); vert->Add(new PopupSliderChoiceFloat(&g_Config.fSwipeSensitivity, 0.01f, 1.0f, co->T("Swipe sensitivity"), 0.01f, screenManager(), "x"))->SetEnabledPtr(&g_Config.bGestureControlEnabled); vert->Add(new PopupSliderChoiceFloat(&g_Config.fSwipeSmoothing, 0.0f, 0.95f, co->T("Swipe smoothing"), 0.05f, screenManager(), "x"))->SetEnabledPtr(&g_Config.bGestureControlEnabled); + + vert->Add(new ItemHeader(co->T("Double tap"))); vert->Add(new PopupMultiChoice(&g_Config.iDoubleTapGesture, mc->T("Double tap button"), gestureButton, 0, ARRAY_SIZE(gestureButton), mc->GetName(), screenManager()))->SetEnabledPtr(&g_Config.bGestureControlEnabled); } diff --git a/UI/GamepadEmu.cpp b/UI/GamepadEmu.cpp index b1f01c485a..b707882e8d 100644 --- a/UI/GamepadEmu.cpp +++ b/UI/GamepadEmu.cpp @@ -827,15 +827,13 @@ UI::ViewGroup *CreatePadLayout(float xres, float yres, bool *pause, bool showPau addComboKey(g_Config.CustomKey9, "Custom 10 button", g_Config.touchCombo9); if (g_Config.bGestureControlEnabled) - root->Add(new GestureGamepad()); + root->Add(new GestureGamepad(controllMapper)); return root; } void GestureGamepad::Touch(const TouchInput &input) { - static const int button[16] = {CTRL_LTRIGGER, CTRL_RTRIGGER, CTRL_SQUARE, CTRL_TRIANGLE, CTRL_CIRCLE, CTRL_CROSS, CTRL_UP, CTRL_DOWN, CTRL_LEFT, CTRL_RIGHT, CTRL_START, CTRL_SELECT}; - if (usedPointerMask & (1 << input.id)) { if (input.id == dragPointerId_) dragPointerId_ = -1; @@ -856,7 +854,7 @@ void GestureGamepad::Touch(const TouchInput &input) { const float now = time_now_d(); if (now - lastTapRelease_ < 0.3f && !haveDoubleTapped_) { if (g_Config.iDoubleTapGesture != 0 ) - __CtrlButtonDown(button[g_Config.iDoubleTapGesture-1]); + controllMapper_->pspKey(GestureKey::keyList[g_Config.iDoubleTapGesture-1].c, KEY_DOWN); haveDoubleTapped_ = true; } @@ -879,7 +877,7 @@ void GestureGamepad::Touch(const TouchInput &input) { if (haveDoubleTapped_) { if (g_Config.iDoubleTapGesture != 0) - __CtrlButtonUp(button[g_Config.iDoubleTapGesture-1]); + controllMapper_->pspKey(GestureKey::keyList[g_Config.iDoubleTapGesture-1].c, KEY_UP); haveDoubleTapped_ = false; } } @@ -887,44 +885,42 @@ void GestureGamepad::Touch(const TouchInput &input) { } void GestureGamepad::Update() { - static const int button[16] = {CTRL_LTRIGGER, CTRL_RTRIGGER, CTRL_SQUARE, CTRL_TRIANGLE, CTRL_CIRCLE, CTRL_CROSS, CTRL_UP, CTRL_DOWN, CTRL_LEFT, CTRL_RIGHT, CTRL_START, CTRL_SELECT}; - const float th = 1.0f; float dx = deltaX_ * g_dpi_scale_x * g_Config.fSwipeSensitivity; float dy = deltaY_ * g_dpi_scale_y * g_Config.fSwipeSensitivity; if (g_Config.iSwipeRight != 0) { if (dx > th) { - __CtrlButtonDown(button[g_Config.iSwipeRight-1]); + controllMapper_->pspKey(GestureKey::keyList[g_Config.iSwipeRight-1].c, KEY_DOWN); swipeRightReleased_ = false; } else if (!swipeRightReleased_) { - __CtrlButtonUp(button[g_Config.iSwipeRight-1]); + controllMapper_->pspKey(GestureKey::keyList[g_Config.iSwipeRight-1].c, KEY_UP); swipeRightReleased_ = true; } } if (g_Config.iSwipeLeft != 0) { if (dx < -th) { - __CtrlButtonDown(button[g_Config.iSwipeLeft-1]); + controllMapper_->pspKey(GestureKey::keyList[g_Config.iSwipeLeft-1].c, KEY_DOWN); swipeLeftReleased_ = false; } else if (!swipeLeftReleased_) { - __CtrlButtonUp(button[g_Config.iSwipeLeft-1]); + controllMapper_->pspKey(GestureKey::keyList[g_Config.iSwipeLeft-1].c, KEY_UP); swipeLeftReleased_ = true; } } if (g_Config.iSwipeUp != 0) { if (dy < -th) { - __CtrlButtonDown(button[g_Config.iSwipeUp-1]); + controllMapper_->pspKey(GestureKey::keyList[g_Config.iSwipeUp-1].c, KEY_DOWN); swipeUpReleased_ = false; } else if (!swipeUpReleased_) { - __CtrlButtonUp(button[g_Config.iSwipeUp-1]); + controllMapper_->pspKey(GestureKey::keyList[g_Config.iSwipeUp-1].c, KEY_UP); swipeUpReleased_ = true; } } if (g_Config.iSwipeDown != 0) { if (dy > th) { - __CtrlButtonDown(button[g_Config.iSwipeDown-1]); + controllMapper_->pspKey(GestureKey::keyList[g_Config.iSwipeDown-1].c, KEY_DOWN); swipeDownReleased_ = false; } else if (!swipeDownReleased_) { - __CtrlButtonUp(button[g_Config.iSwipeDown-1]); + controllMapper_->pspKey(GestureKey::keyList[g_Config.iSwipeDown-1].c, KEY_UP); swipeDownReleased_ = true; } } diff --git a/UI/GamepadEmu.h b/UI/GamepadEmu.h index 7dc4261724..cd7f2658e6 100644 --- a/UI/GamepadEmu.h +++ b/UI/GamepadEmu.h @@ -184,6 +184,30 @@ private: bool invertedContextDimension_; // Swap width and height }; +class GestureGamepad : public UI::View { +public: + GestureGamepad(ControlMapper* controllMapper) : controllMapper_(controllMapper) {}; + + void Touch(const TouchInput &input) override; + void Update() override; + +protected: + + float lastX_ = 0.0f; + float lastY_ = 0.0f; + float deltaX_ = 0.0f; + float deltaY_ = 0.0f; + float lastTapRelease_ = 0.0f; + float lastTouchDown_ = 0.0f; + int dragPointerId_ = -1; + bool swipeLeftReleased_ = true; + bool swipeRightReleased_ = true; + bool swipeUpReleased_ = true; + bool swipeDownReleased_ = true; + bool haveDoubleTapped_ = false; + ControlMapper* controllMapper_; +}; + // Just edit this to add new image, shape or button function namespace CustomKey { // Image list @@ -289,25 +313,44 @@ namespace CustomKey { static_assert(ARRAY_SIZE(comboKeyList) <= 64, "Too many key for a uint64_t bit mask"); }; -class GestureGamepad : public UI::View { -public: - GestureGamepad() {}; - - void Touch(const TouchInput &input) override; - void Update() override; - -protected: - - float lastX_ = 0.0f; - float lastY_ = 0.0f; - float deltaX_ = 0.0f; - float deltaY_ = 0.0f; - float lastTapRelease_ = 0.0f; - float lastTouchDown_ = 0.0f; - int dragPointerId_ = -1; - bool swipeLeftReleased_ = true; - bool swipeRightReleased_ = true; - bool swipeUpReleased_ = true; - bool swipeDownReleased_ = true; - bool haveDoubleTapped_ = false; -}; +// Gesture key only have virtual button that can work without constant press +namespace GestureKey { + struct key { + const char* n; // UI name + uint32_t c; // Key code + }; + static const key keyList[] = { + { "Square", CTRL_SQUARE }, + { "Triangle", CTRL_TRIANGLE }, + { "Circle", CTRL_CIRCLE }, + { "Cross", CTRL_CROSS }, + { "Up", CTRL_UP }, + { "Down", CTRL_DOWN }, + { "Left", CTRL_LEFT }, + { "Right", CTRL_RIGHT }, + { "Start", CTRL_START }, + { "Select", CTRL_SELECT }, + { "L", CTRL_LTRIGGER }, + { "R", CTRL_RTRIGGER }, + { "An.Up", VIRTKEY_AXIS_Y_MAX }, + { "An.Down", VIRTKEY_AXIS_Y_MIN }, + { "An.Left", VIRTKEY_AXIS_X_MIN }, + { "An.Right", VIRTKEY_AXIS_X_MAX }, + { "SpeedToggle", VIRTKEY_SPEED_TOGGLE }, + { "Rewind", VIRTKEY_REWIND }, + { "Save State", VIRTKEY_SAVE_STATE }, + { "Load State", VIRTKEY_LOAD_STATE }, + { "Next Slot", VIRTKEY_NEXT_SLOT }, + { "Toggle Fullscreen", VIRTKEY_TOGGLE_FULLSCREEN }, + { "Texture Dumping", VIRTKEY_TEXTURE_DUMP }, + { "Texture Replacement", VIRTKEY_TEXTURE_REPLACE }, + { "Screenshot", VIRTKEY_SCREENSHOT }, + { "Mute toggle", VIRTKEY_MUTE_TOGGLE }, + { "OpenChat", VIRTKEY_OPENCHAT }, + { "Pause", VIRTKEY_PAUSE }, + { "DevMenu", VIRTKEY_DEVMENU }, +#ifndef MOBILE_DEVICE + { "Record", VIRTKEY_RECORD }, +#endif + }; +} From f417bb93d43a7b323b7ed153f2e091472187d559 Mon Sep 17 00:00:00 2001 From: iota97 Date: Mon, 30 Aug 2021 13:13:09 +0200 Subject: [PATCH 225/336] Reuse translation --- Core/KeyMap.cpp | 7 +++++ Core/KeyMap.h | 1 + UI/GameSettingsScreen.cpp | 2 +- UI/GamepadEmu.cpp | 20 ++++++------ UI/GamepadEmu.h | 66 ++++++++++++++++++--------------------- 5 files changed, 50 insertions(+), 46 deletions(-) diff --git a/Core/KeyMap.cpp b/Core/KeyMap.cpp index 78efca5c41..76b173dab8 100644 --- a/Core/KeyMap.cpp +++ b/Core/KeyMap.cpp @@ -446,6 +446,13 @@ std::string GetPspButtonName(int btn) { return FindName(btn, psp_button_names, ARRAY_SIZE(psp_button_names)); } +const char* GetPspButtonNameCharPointer(int btn) { + for (size_t i = 0; i < ARRAY_SIZE(psp_button_names); i++) + if (psp_button_names[i].key == btn) + return psp_button_names[i].name; + return nullptr; +} + std::vector GetMappableKeys() { std::vector temp; for (size_t i = 0; i < ARRAY_SIZE(psp_button_names); i++) { diff --git a/Core/KeyMap.h b/Core/KeyMap.h index 01da7e9596..2126bcdc82 100644 --- a/Core/KeyMap.h +++ b/Core/KeyMap.h @@ -112,6 +112,7 @@ namespace KeyMap { std::string GetKeyOrAxisName(int keyCode); std::string GetAxisName(int axisId); std::string GetPspButtonName(int btn); + const char* GetPspButtonNameCharPointer(int btn); std::vector GetMappableKeys(); diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index e6618d486e..7c94269ff8 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -2012,7 +2012,7 @@ void GestureMappingScreen::CreateViews() { static const char *gestureButton[ARRAY_SIZE(GestureKey::keyList)+1]; gestureButton[0] = "None"; for (int i = 1; i < ARRAY_SIZE(gestureButton); ++i) { - gestureButton[i] = GestureKey::keyList[i-1].n; + gestureButton[i] = KeyMap::GetPspButtonNameCharPointer(GestureKey::keyList[i-1]); } vert->Add(new CheckBox(&g_Config.bGestureControlEnabled, co->T("Enable gesture control"))); diff --git a/UI/GamepadEmu.cpp b/UI/GamepadEmu.cpp index b707882e8d..b38ec5505f 100644 --- a/UI/GamepadEmu.cpp +++ b/UI/GamepadEmu.cpp @@ -854,7 +854,7 @@ void GestureGamepad::Touch(const TouchInput &input) { const float now = time_now_d(); if (now - lastTapRelease_ < 0.3f && !haveDoubleTapped_) { if (g_Config.iDoubleTapGesture != 0 ) - controllMapper_->pspKey(GestureKey::keyList[g_Config.iDoubleTapGesture-1].c, KEY_DOWN); + controllMapper_->pspKey(GestureKey::keyList[g_Config.iDoubleTapGesture-1], KEY_DOWN); haveDoubleTapped_ = true; } @@ -877,7 +877,7 @@ void GestureGamepad::Touch(const TouchInput &input) { if (haveDoubleTapped_) { if (g_Config.iDoubleTapGesture != 0) - controllMapper_->pspKey(GestureKey::keyList[g_Config.iDoubleTapGesture-1].c, KEY_UP); + controllMapper_->pspKey(GestureKey::keyList[g_Config.iDoubleTapGesture-1], KEY_UP); haveDoubleTapped_ = false; } } @@ -890,37 +890,37 @@ void GestureGamepad::Update() { float dy = deltaY_ * g_dpi_scale_y * g_Config.fSwipeSensitivity; if (g_Config.iSwipeRight != 0) { if (dx > th) { - controllMapper_->pspKey(GestureKey::keyList[g_Config.iSwipeRight-1].c, KEY_DOWN); + controllMapper_->pspKey(GestureKey::keyList[g_Config.iSwipeRight-1], KEY_DOWN); swipeRightReleased_ = false; } else if (!swipeRightReleased_) { - controllMapper_->pspKey(GestureKey::keyList[g_Config.iSwipeRight-1].c, KEY_UP); + controllMapper_->pspKey(GestureKey::keyList[g_Config.iSwipeRight-1], KEY_UP); swipeRightReleased_ = true; } } if (g_Config.iSwipeLeft != 0) { if (dx < -th) { - controllMapper_->pspKey(GestureKey::keyList[g_Config.iSwipeLeft-1].c, KEY_DOWN); + controllMapper_->pspKey(GestureKey::keyList[g_Config.iSwipeLeft-1], KEY_DOWN); swipeLeftReleased_ = false; } else if (!swipeLeftReleased_) { - controllMapper_->pspKey(GestureKey::keyList[g_Config.iSwipeLeft-1].c, KEY_UP); + controllMapper_->pspKey(GestureKey::keyList[g_Config.iSwipeLeft-1], KEY_UP); swipeLeftReleased_ = true; } } if (g_Config.iSwipeUp != 0) { if (dy < -th) { - controllMapper_->pspKey(GestureKey::keyList[g_Config.iSwipeUp-1].c, KEY_DOWN); + controllMapper_->pspKey(GestureKey::keyList[g_Config.iSwipeUp-1], KEY_DOWN); swipeUpReleased_ = false; } else if (!swipeUpReleased_) { - controllMapper_->pspKey(GestureKey::keyList[g_Config.iSwipeUp-1].c, KEY_UP); + controllMapper_->pspKey(GestureKey::keyList[g_Config.iSwipeUp-1], KEY_UP); swipeUpReleased_ = true; } } if (g_Config.iSwipeDown != 0) { if (dy > th) { - controllMapper_->pspKey(GestureKey::keyList[g_Config.iSwipeDown-1].c, KEY_DOWN); + controllMapper_->pspKey(GestureKey::keyList[g_Config.iSwipeDown-1], KEY_DOWN); swipeDownReleased_ = false; } else if (!swipeDownReleased_) { - controllMapper_->pspKey(GestureKey::keyList[g_Config.iSwipeDown-1].c, KEY_UP); + controllMapper_->pspKey(GestureKey::keyList[g_Config.iSwipeDown-1], KEY_UP); swipeDownReleased_ = true; } } diff --git a/UI/GamepadEmu.h b/UI/GamepadEmu.h index cd7f2658e6..2eefabdc29 100644 --- a/UI/GamepadEmu.h +++ b/UI/GamepadEmu.h @@ -315,42 +315,38 @@ namespace CustomKey { // Gesture key only have virtual button that can work without constant press namespace GestureKey { - struct key { - const char* n; // UI name - uint32_t c; // Key code - }; - static const key keyList[] = { - { "Square", CTRL_SQUARE }, - { "Triangle", CTRL_TRIANGLE }, - { "Circle", CTRL_CIRCLE }, - { "Cross", CTRL_CROSS }, - { "Up", CTRL_UP }, - { "Down", CTRL_DOWN }, - { "Left", CTRL_LEFT }, - { "Right", CTRL_RIGHT }, - { "Start", CTRL_START }, - { "Select", CTRL_SELECT }, - { "L", CTRL_LTRIGGER }, - { "R", CTRL_RTRIGGER }, - { "An.Up", VIRTKEY_AXIS_Y_MAX }, - { "An.Down", VIRTKEY_AXIS_Y_MIN }, - { "An.Left", VIRTKEY_AXIS_X_MIN }, - { "An.Right", VIRTKEY_AXIS_X_MAX }, - { "SpeedToggle", VIRTKEY_SPEED_TOGGLE }, - { "Rewind", VIRTKEY_REWIND }, - { "Save State", VIRTKEY_SAVE_STATE }, - { "Load State", VIRTKEY_LOAD_STATE }, - { "Next Slot", VIRTKEY_NEXT_SLOT }, - { "Toggle Fullscreen", VIRTKEY_TOGGLE_FULLSCREEN }, - { "Texture Dumping", VIRTKEY_TEXTURE_DUMP }, - { "Texture Replacement", VIRTKEY_TEXTURE_REPLACE }, - { "Screenshot", VIRTKEY_SCREENSHOT }, - { "Mute toggle", VIRTKEY_MUTE_TOGGLE }, - { "OpenChat", VIRTKEY_OPENCHAT }, - { "Pause", VIRTKEY_PAUSE }, - { "DevMenu", VIRTKEY_DEVMENU }, + static const uint32_t keyList[] = { + CTRL_SQUARE, + CTRL_TRIANGLE, + CTRL_CIRCLE, + CTRL_CROSS, + CTRL_UP, + CTRL_DOWN, + CTRL_LEFT, + CTRL_RIGHT, + CTRL_START, + CTRL_SELECT, + CTRL_LTRIGGER, + CTRL_RTRIGGER, + VIRTKEY_AXIS_Y_MAX, + VIRTKEY_AXIS_Y_MIN, + VIRTKEY_AXIS_X_MIN, + VIRTKEY_AXIS_X_MAX, + VIRTKEY_SPEED_TOGGLE, + VIRTKEY_REWIND, + VIRTKEY_SAVE_STATE, + VIRTKEY_LOAD_STATE, + VIRTKEY_NEXT_SLOT, + VIRTKEY_TOGGLE_FULLSCREEN, + VIRTKEY_TEXTURE_DUMP, + VIRTKEY_TEXTURE_REPLACE, + VIRTKEY_SCREENSHOT, + VIRTKEY_MUTE_TOGGLE, + VIRTKEY_OPENCHAT, + VIRTKEY_PAUSE, + VIRTKEY_DEVMENU, #ifndef MOBILE_DEVICE - { "Record", VIRTKEY_RECORD }, + VIRTKEY_RECORD, #endif }; } From 8f9610d2a021d0ef9e999529849f740effa98482 Mon Sep 17 00:00:00 2001 From: iota97 Date: Mon, 30 Aug 2021 13:17:24 +0200 Subject: [PATCH 226/336] Reuse translation for combo button as well --- UI/ComboKeyMappingScreen.cpp | 4 +-- UI/GamepadEmu.h | 65 ++++++++++++++++++------------------ 2 files changed, 34 insertions(+), 35 deletions(-) diff --git a/UI/ComboKeyMappingScreen.cpp b/UI/ComboKeyMappingScreen.cpp index 3fd324e845..4754c33bd8 100644 --- a/UI/ComboKeyMappingScreen.cpp +++ b/UI/ComboKeyMappingScreen.cpp @@ -178,7 +178,7 @@ void ComboKeyScreen::CreateViews() { gridsettings.fillCells = true; GridLayout *grid = vertLayout->Add(new GridLayout(gridsettings, new LayoutParams(FILL_PARENT, WRAP_CONTENT))); - // Button name, image and action are defined in GamepadEmu.h + // Button image and action are defined in GamepadEmu.h for (int i = 0; i < ARRAY_SIZE(comboKeyList); ++i) { LinearLayout *row = new LinearLayout(ORIENT_HORIZONTAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT)); row->SetSpacing(0); @@ -190,7 +190,7 @@ void ComboKeyScreen::CreateViews() { if (comboKeyList[i].i.isValid()) { choice = new Choice(comboKeyList[i].i, new LinearLayoutParams(1.0f)); } else { - choice = new Choice(mc->T(comboKeyList[i].n), new LinearLayoutParams(1.0f)); + choice = new Choice(mc->T(KeyMap::GetPspButtonNameCharPointer(comboKeyList[i].c)), new LinearLayoutParams(1.0f)); } ChoiceEventHandler *choiceEventHandler = new ChoiceEventHandler(checkbox); diff --git a/UI/GamepadEmu.h b/UI/GamepadEmu.h index 2eefabdc29..03b568ae32 100644 --- a/UI/GamepadEmu.h +++ b/UI/GamepadEmu.h @@ -270,44 +270,43 @@ namespace CustomKey { // Button list struct keyList { - const char* n; // UI name ImageID i; // UI ImageID uint32_t c; // Key code }; static const keyList comboKeyList[] = { - { "Square", ImageID("I_SQUARE"), CTRL_SQUARE }, - { "Triangle", ImageID("I_TRIANGLE"), CTRL_TRIANGLE }, - { "Circle", ImageID("I_CIRCLE"), CTRL_CIRCLE }, - { "Cross", ImageID("I_CROSS"), CTRL_CROSS }, - { "Up", ImageID::invalid(), CTRL_UP }, - { "Down", ImageID::invalid(), CTRL_DOWN }, - { "Left", ImageID::invalid(), CTRL_LEFT }, - { "Right", ImageID::invalid(), CTRL_RIGHT }, - { "Start", ImageID("I_START"), CTRL_START }, - { "Select", ImageID("I_SELECT"), CTRL_SELECT }, - { "L", ImageID("I_L"), CTRL_LTRIGGER }, - { "R", ImageID("I_R"), CTRL_RTRIGGER }, - { "RapidFire", ImageID::invalid(), VIRTKEY_RAPID_FIRE }, - { "Fast-forward", ImageID::invalid(), VIRTKEY_FASTFORWARD }, - { "SpeedToggle", ImageID::invalid(), VIRTKEY_SPEED_TOGGLE }, - { "Rewind", ImageID::invalid(), VIRTKEY_REWIND }, - { "Save State", ImageID::invalid(), VIRTKEY_SAVE_STATE }, - { "Load State", ImageID::invalid(), VIRTKEY_LOAD_STATE }, - { "Next Slot", ImageID::invalid(), VIRTKEY_NEXT_SLOT }, - { "Toggle Fullscreen", ImageID::invalid(), VIRTKEY_TOGGLE_FULLSCREEN }, - { "Alt speed 1", ImageID::invalid(), VIRTKEY_SPEED_CUSTOM1 }, - { "Alt speed 2", ImageID::invalid(), VIRTKEY_SPEED_CUSTOM2 }, - { "Texture Dumping", ImageID::invalid(), VIRTKEY_TEXTURE_DUMP }, - { "Texture Replacement", ImageID::invalid(), VIRTKEY_TEXTURE_REPLACE }, - { "Screenshot", ImageID::invalid(), VIRTKEY_SCREENSHOT }, - { "Mute toggle", ImageID::invalid(), VIRTKEY_MUTE_TOGGLE }, - { "OpenChat", ImageID::invalid(), VIRTKEY_OPENCHAT }, - { "Auto Analog Rotation (CW)", ImageID::invalid(), VIRTKEY_ANALOG_ROTATE_CW }, - { "Auto Analog Rotation (CCW)", ImageID::invalid(), VIRTKEY_ANALOG_ROTATE_CCW }, - { "Pause", ImageID::invalid(), VIRTKEY_PAUSE }, - { "DevMenu", ImageID::invalid(), VIRTKEY_DEVMENU }, + { ImageID("I_SQUARE"), CTRL_SQUARE }, + { ImageID("I_TRIANGLE"), CTRL_TRIANGLE }, + { ImageID("I_CIRCLE"), CTRL_CIRCLE }, + { ImageID("I_CROSS"), CTRL_CROSS }, + { ImageID::invalid(), CTRL_UP }, + { ImageID::invalid(), CTRL_DOWN }, + { ImageID::invalid(), CTRL_LEFT }, + { ImageID::invalid(), CTRL_RIGHT }, + { ImageID("I_START"), CTRL_START }, + { ImageID("I_SELECT"), CTRL_SELECT }, + { ImageID("I_L"), CTRL_LTRIGGER }, + { ImageID("I_R"), CTRL_RTRIGGER }, + { ImageID::invalid(), VIRTKEY_RAPID_FIRE }, + { ImageID::invalid(), VIRTKEY_FASTFORWARD }, + { ImageID::invalid(), VIRTKEY_SPEED_TOGGLE }, + { ImageID::invalid(), VIRTKEY_REWIND }, + { ImageID::invalid(), VIRTKEY_SAVE_STATE }, + { ImageID::invalid(), VIRTKEY_LOAD_STATE }, + { ImageID::invalid(), VIRTKEY_NEXT_SLOT }, + { ImageID::invalid(), VIRTKEY_TOGGLE_FULLSCREEN }, + { ImageID::invalid(), VIRTKEY_SPEED_CUSTOM1 }, + { ImageID::invalid(), VIRTKEY_SPEED_CUSTOM2 }, + { ImageID::invalid(), VIRTKEY_TEXTURE_DUMP }, + { ImageID::invalid(), VIRTKEY_TEXTURE_REPLACE }, + { ImageID::invalid(), VIRTKEY_SCREENSHOT }, + { ImageID::invalid(), VIRTKEY_MUTE_TOGGLE }, + { ImageID::invalid(), VIRTKEY_OPENCHAT }, + { ImageID::invalid(), VIRTKEY_ANALOG_ROTATE_CW }, + { ImageID::invalid(), VIRTKEY_ANALOG_ROTATE_CCW }, + { ImageID::invalid(), VIRTKEY_PAUSE }, + { ImageID::invalid(), VIRTKEY_DEVMENU }, #ifndef MOBILE_DEVICE - { "Record", ImageID::invalid(), VIRTKEY_RECORD }, + { ImageID::invalid(), VIRTKEY_RECORD }, #endif }; static_assert(ARRAY_SIZE(comboKeyList) <= 64, "Too many key for a uint64_t bit mask"); From 5ba544ebabb461330634541bb7c6119034e2bc0b Mon Sep 17 00:00:00 2001 From: bslenul <33353403+bslenul@users.noreply.github.com> Date: Mon, 30 Aug 2021 16:38:37 +0200 Subject: [PATCH 227/336] [Libretro] Small core options cleanup + create a new git-version.cpp instead of appending stuff in it --- libretro/Makefile.common | 2 +- libretro/README_WINDOWS.txt | 9 --------- libretro/libretro.cpp | 8 ++++---- 3 files changed, 5 insertions(+), 14 deletions(-) diff --git a/libretro/Makefile.common b/libretro/Makefile.common index eb1bd54478..519c4f3812 100644 --- a/libretro/Makefile.common +++ b/libretro/Makefile.common @@ -839,7 +839,7 @@ ifneq (,$(findstring $(GIT_VERSION),$(shell grep -s char $(GIT_VERSION_SRC)))) endif ifneq ($(GIT_VERSION_NO_UPDATE),1) - $(shell echo 'const char *PPSSPP_GIT_VERSION = "${GIT_VERSION}";' >> $(GIT_VERSION_SRC)) + $(shell echo 'const char *PPSSPP_GIT_VERSION = "${GIT_VERSION}";' > $(GIT_VERSION_SRC)) $(shell echo '#define PPSSPP_GIT_VERSION_NO_UPDATE 0' >> $(GIT_VERSION_SRC)) endif diff --git a/libretro/README_WINDOWS.txt b/libretro/README_WINDOWS.txt index 5bdc37e135..4e8f6236af 100644 --- a/libretro/README_WINDOWS.txt +++ b/libretro/README_WINDOWS.txt @@ -23,15 +23,6 @@ and adjust -j32 depending on your number of logical CPUs - might not need that m To debug from within MSVC, open retroarch.exe (or retroarch_debug.exe) as a Project/Solution, then open a few of the cpp files, set some breakpoints and just launch using F5. -If you get - -``` -../git-version.cpp(3): error C2374: 'PPSSPP_GIT_VERSION': redefinition; multiple initialization -../git-version.cpp(1): note: see declaration of 'PPSSPP_GIT_VERSION' -``` -just do `rm ../git-version.cpp`. - - Useful libretro/vulkan sample code: https://github.com/libretro/libretro-samples/blob/master/video/vulkan/vk_rendering/libretro-test.c diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index a111c91ece..970e5860cd 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -203,16 +203,16 @@ static RetroOption ppsspp_locked_cpu_speed("ppsspp_locked_cpu_speed", "Lock static RetroOption ppsspp_language("ppsspp_language", "Language", { { "automatic", -1 }, { "english", PSP_SYSTEMPARAM_LANGUAGE_ENGLISH }, { "japanese", PSP_SYSTEMPARAM_LANGUAGE_JAPANESE }, { "french", PSP_SYSTEMPARAM_LANGUAGE_FRENCH }, { "spanish", PSP_SYSTEMPARAM_LANGUAGE_SPANISH }, { "german", PSP_SYSTEMPARAM_LANGUAGE_GERMAN }, { "italian", PSP_SYSTEMPARAM_LANGUAGE_ITALIAN }, { "dutch", PSP_SYSTEMPARAM_LANGUAGE_DUTCH }, { "portuguese", PSP_SYSTEMPARAM_LANGUAGE_PORTUGUESE }, { "russian", PSP_SYSTEMPARAM_LANGUAGE_RUSSIAN }, { "korean", PSP_SYSTEMPARAM_LANGUAGE_KOREAN }, { "chinese_traditional", PSP_SYSTEMPARAM_LANGUAGE_CHINESE_TRADITIONAL }, { "chinese_simplified", PSP_SYSTEMPARAM_LANGUAGE_CHINESE_SIMPLIFIED } }); static RetroOption ppsspp_rendering_mode("ppsspp_rendering_mode", "Rendering Mode", { { "buffered", FB_BUFFERED_MODE }, { "nonbuffered", FB_NON_BUFFERED_MODE } }); static RetroOption ppsspp_auto_frameskip("ppsspp_auto_frameskip", "Auto Frameskip", false); -static RetroOption ppsspp_frameskip("ppsspp_frameskip", "Frameskip", 0, 10); +static RetroOption ppsspp_frameskip("ppsspp_frameskip", "Frameskip", { "off", "1", "2", "3", "4", "5", "6", "7", "8" }); static RetroOption ppsspp_frameskiptype("ppsspp_frameskiptype", "Frameskip Type", { {"number of frames", 0}, {"percent of fps", 1} }); static RetroOption ppsspp_internal_resolution("ppsspp_internal_resolution", "Internal Resolution (restart)", 1, { "480x272", "960x544", "1440x816", "1920x1088", "2400x1360", "2880x1632", "3360x1904", "3840x2176", "4320x2448", "4800x2720" }); static RetroOption ppsspp_button_preference("ppsspp_button_preference", "Confirmation Button", { { "cross", PSP_SYSTEMPARAM_BUTTON_CROSS }, { "circle", PSP_SYSTEMPARAM_BUTTON_CIRCLE } }); static RetroOption ppsspp_fast_memory("ppsspp_fast_memory", "Fast Memory (Speedhack)", true); static RetroOption ppsspp_block_transfer_gpu("ppsspp_block_transfer_gpu", "Block Transfer GPU", true); -static RetroOption ppsspp_texture_scaling_level("ppsspp_texture_scaling_level", "Texture Scaling Level", { { "1", 1 }, { "2", 2 }, { "3", 3 }, { "4", 4 }, { "5", 5 }, { "auto", 0 } }); +static RetroOption ppsspp_texture_scaling_level("ppsspp_texture_scaling_level", "Texture Scaling Level", { { "off", 1 }, { "2x", 2 }, { "3x", 3 }, { "4x", 4 }, { "5x", 5 }, { "auto", 0 } }); static RetroOption ppsspp_texture_scaling_type("ppsspp_texture_scaling_type", "Texture Scaling Type", { { "xbrz", TextureScalerCommon::XBRZ }, { "hybrid", TextureScalerCommon::HYBRID }, { "bicubic", TextureScalerCommon::BICUBIC }, { "hybrid_bicubic", TextureScalerCommon::HYBRID_BICUBIC } }); -static RetroOption ppsspp_texture_filtering("ppsspp_texture_filtering", "Texture Filtering", { { "auto", 1 }, { "nearest", 2 }, { "linear", 3 }, { "linear(FMV)", 4 } }); -static RetroOption ppsspp_texture_anisotropic_filtering("ppsspp_texture_anisotropic_filtering", "Anisotropic Filtering", { "off", "1x", "2x", "4x", "8x", "16x" }); +static RetroOption ppsspp_texture_filtering("ppsspp_texture_filtering", "Texture Filtering", { { "auto", 1 }, { "nearest", 2 }, { "linear", 3 } }); +static RetroOption ppsspp_texture_anisotropic_filtering("ppsspp_texture_anisotropic_filtering", "Anisotropic Filtering", { "off", "2x", "4x", "8x", "16x" }); static RetroOption ppsspp_lower_resolution_for_effects("ppsspp_lower_resolution_for_effects", "Lower resolution for effects", { {"off", 0}, {"safe", 1}, {"balanced", 2}, {"aggressive", 3} }); static RetroOption ppsspp_texture_deposterize("ppsspp_texture_deposterize", "Texture Deposterize", false); static RetroOption ppsspp_texture_replacement("ppsspp_texture_replacement", "Texture Replacement", false); From 567c7f207d9c5a76599599362c3d9410f1383c59 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Tue, 31 Aug 2021 20:18:22 -0700 Subject: [PATCH 228/336] UI: Fix save state scrollview height. Fixes #14785. --- UI/PauseScreen.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UI/PauseScreen.cpp b/UI/PauseScreen.cpp index ce700f32a8..339409ed6e 100644 --- a/UI/PauseScreen.cpp +++ b/UI/PauseScreen.cpp @@ -186,7 +186,7 @@ protected: auto pa = GetI18NCategory("Pause"); auto di = GetI18NCategory("Dialog"); - ScrollView *scroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, 50, 1.0f)); + ScrollView *scroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT, 1.0f)); LinearLayout *content = new LinearLayout(ORIENT_VERTICAL); Margins contentMargins(10, 0); content->Add(new AsyncImageFileView(filename_, IS_KEEP_ASPECT, new LinearLayoutParams(480, 272, contentMargins)))->SetCanBeFocused(false); From f89d5b75a5f6cfcee91c3341f4be9a391e44367a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 1 Sep 2021 09:18:39 +0200 Subject: [PATCH 229/336] Remove old ouya joystick prompt pngs from source_assets --- source_assets/ouya/OUYA_A.png | Bin 2931 -> 0 bytes source_assets/ouya/OUYA_DPAD.png | Bin 713 -> 0 bytes source_assets/ouya/OUYA_DPAD_DOWN.png | Bin 965 -> 0 bytes source_assets/ouya/OUYA_DPAD_LEFT.png | Bin 1033 -> 0 bytes source_assets/ouya/OUYA_DPAD_RIGHT.png | Bin 1001 -> 0 bytes source_assets/ouya/OUYA_DPAD_UP.png | Bin 976 -> 0 bytes source_assets/ouya/OUYA_L1.png | Bin 1856 -> 0 bytes source_assets/ouya/OUYA_L2.png | Bin 2522 -> 0 bytes source_assets/ouya/OUYA_L3.png | Bin 4054 -> 0 bytes source_assets/ouya/OUYA_LS.png | Bin 2265 -> 0 bytes source_assets/ouya/OUYA_LS_DOWN.png | Bin 3870 -> 0 bytes source_assets/ouya/OUYA_LS_LEFT.png | Bin 3744 -> 0 bytes source_assets/ouya/OUYA_LS_RIGHT.png | Bin 3630 -> 0 bytes source_assets/ouya/OUYA_LS_UP.png | Bin 3731 -> 0 bytes source_assets/ouya/OUYA_O.png | Bin 3537 -> 0 bytes source_assets/ouya/OUYA_R1.png | Bin 2275 -> 0 bytes source_assets/ouya/OUYA_R2.png | Bin 2764 -> 0 bytes source_assets/ouya/OUYA_R3.png | Bin 4263 -> 0 bytes source_assets/ouya/OUYA_RS.png | Bin 2546 -> 0 bytes source_assets/ouya/OUYA_RS_DOWN.png | Bin 4095 -> 0 bytes source_assets/ouya/OUYA_RS_LEFT.png | Bin 3986 -> 0 bytes source_assets/ouya/OUYA_RS_RIGHT.png | Bin 4060 -> 0 bytes source_assets/ouya/OUYA_RS_UP.png | Bin 4044 -> 0 bytes source_assets/ouya/OUYA_SYSTEM.png | Bin 3829 -> 0 bytes source_assets/ouya/OUYA_TOUCHPAD.png | Bin 3531 -> 0 bytes source_assets/ouya/OUYA_U.png | Bin 3091 -> 0 bytes source_assets/ouya/OUYA_Y.png | Bin 3080 -> 0 bytes 27 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 source_assets/ouya/OUYA_A.png delete mode 100644 source_assets/ouya/OUYA_DPAD.png delete mode 100644 source_assets/ouya/OUYA_DPAD_DOWN.png delete mode 100644 source_assets/ouya/OUYA_DPAD_LEFT.png delete mode 100644 source_assets/ouya/OUYA_DPAD_RIGHT.png delete mode 100644 source_assets/ouya/OUYA_DPAD_UP.png delete mode 100644 source_assets/ouya/OUYA_L1.png delete mode 100644 source_assets/ouya/OUYA_L2.png delete mode 100644 source_assets/ouya/OUYA_L3.png delete mode 100644 source_assets/ouya/OUYA_LS.png delete mode 100644 source_assets/ouya/OUYA_LS_DOWN.png delete mode 100644 source_assets/ouya/OUYA_LS_LEFT.png delete mode 100644 source_assets/ouya/OUYA_LS_RIGHT.png delete mode 100644 source_assets/ouya/OUYA_LS_UP.png delete mode 100644 source_assets/ouya/OUYA_O.png delete mode 100644 source_assets/ouya/OUYA_R1.png delete mode 100644 source_assets/ouya/OUYA_R2.png delete mode 100644 source_assets/ouya/OUYA_R3.png delete mode 100644 source_assets/ouya/OUYA_RS.png delete mode 100644 source_assets/ouya/OUYA_RS_DOWN.png delete mode 100644 source_assets/ouya/OUYA_RS_LEFT.png delete mode 100644 source_assets/ouya/OUYA_RS_RIGHT.png delete mode 100644 source_assets/ouya/OUYA_RS_UP.png delete mode 100644 source_assets/ouya/OUYA_SYSTEM.png delete mode 100644 source_assets/ouya/OUYA_TOUCHPAD.png delete mode 100644 source_assets/ouya/OUYA_U.png delete mode 100644 source_assets/ouya/OUYA_Y.png diff --git a/source_assets/ouya/OUYA_A.png b/source_assets/ouya/OUYA_A.png deleted file mode 100644 index ad90b2355177b70fe3d297197cccd979d934e2e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2931 zcmbW3c{~%28^^a9Gv-*1<|@Y=E3t&!v5^p&98+X-=MD>zYcnQPe&o)TZ*mNYP;w0+ zkzBDtVRA*1o1fo*zkh$fKR(ar_4>S?=a1+0Jb%1tmKMf5T%ue60D#BjilNo9laE!v z$#GnjOQsHw4H|I8J_rEd7Wj{Vfb3kvaVQdOgb%*%?;adN40Hn+xcWQ0Nt*Z)J>0C^ zh^}FGdfar5y8$MK2G*ey%Xv|LGDgDP+F#s+YO>84UIZ|v2ERTq|8Seb#e#nTx|U1O zkw>t=nF2{cv75O778n^dtBkBxoA?9(lz<*Tw+d;M-dc6@JE2r1DIK6;sv?+x| zEjHU#-LhHv;9i?hRN(jxl!&&Z#7M&gi3OZ&MhJy=eK^Pe8kH*SE{#TfF3$UBmle|_ z+EaI>c$THnl%4!~PI$$KnYv#rp%b99Z5ue#cACCJXPrmjg5l&qwKtM5;?_N#?fRzG z@NI@SiAR82#X8_B6k7*SO^u%-4Q`B$Tp;lX3S!%*PsZAUT6@kMP0p1oWWU4JABK>c zZ|%SC*A;TuH#%ZEont&@SQ_G5QbvpP(4L(4)cpW_k$=hq*Q(~nd`WCZODnUisY;;c zgUOr40M!VDqEzVL+Q4s%q6aVEvZ~JNf5H*H_ELUd^FMd6@wo|~7(g66ZxHoZJF_(Y z+mXTX6+W6DmHv|jDBeo}{W#5iu8ZU>yGtRG_?u{I;}=sl(zqAyS5@jO#A^R69ld+h zICz7QFaaGQQP{~J;jlgjOagx<_~cNFofj&$?!-)MfeX2?M^sXBIZ{jy9A*aG0-E7K zowW?pac0|kN4j#;J5d=Qt_vDqrAbwsB{N9P)NR|pvAD9&QFl#3SD`_`hzd4S*~;cTa> z40U=Azu=_^xG?{_bJ!^`=&FZ}2;+=erV_ZQt`RN1@@J!%>dVmvN+4Q2uOXs6Yqt_4 zE5P7Xe=?)aj}w-?8W}k}7-_-(TR&IW7}x!n{%{=8hfWAYxhILL%Vy15A*{rxdGhZ- zy^h54!9GY5!piq^Dba?=JO4XfYHjrTZc%EVzSq{8+per&L8~rB(v?jts_&g}uOY$< zc{v%gxU18YUAM@^_8YqO`3~ksxz~5FPH0;B*ED+iGcqeg7nQ{(ZX?@<&RGA_+}_8B zWT9ONgL-0#+`=54HZc~Xl~TWLNE08uf`5!W`L zAOIq&!ZRXDm;d{EUK2LIY-?}cQGx6`7x3b<4KVGnm zt{A;JXWWzs?L0daTfVz*+;Je(tGmpFkApRCtLT03{zZ?p>^^mGwKzmISg!)i6mYPa zz?;}Z#-0@BeMB+RP1`?zS}0_5gFa<$E)5XFrq#9DcMQPHQot5b!lC04O=wLPY0L*8 z2AAHyCxp=fW*~XM?ixI!g%V1~zp@fhf#z4*1ao$WzKWmR$>*!xM9=+&i^tS6;C5_KAem&ZvN%iSv)79{z{Ie0}F&iUt3_?cgB#D%Jja=*^!YXwp&pAlN+keU*2O!XV%XY3l`6kkJSp;ll* z>LxEckV$Rb=Tyuq+%6H}f|;Lw0?Z-e4K}RQmuNoIB_(1$Q|s;$H%2-N%xYAE;3sHu zlgah`RWKdJ0OQ-)X3_pGg_u{cWZC543yIZ9LNL_LtfxB4wZ|C76ilbAQ)&4d&3CU(O@u4m@2Oa$aYA!o^i#4%$EA)UlaHn(2YM z&FV}4;$%%42e#o<3@3yd`W0g|3WT0|fgGrR{~~9trkZl5c}ylnuHO2@4tKl0CRxfQ z`^KLy-(27KrifhddBJ6G5Ancj)WQ07^`0euk2B%)b2de&cNkUhVOMj()-oo;2RO5H z9q&8$nyzTgFiZA+Qf+H0orJnid^mLEfl*_#9xR?C7fM-`(@Gm*S)&BP`%HxwiG;F0 zhZYWbRF*ggEDUimlmwTt`_-%myC>EZbR)i3u>&oRfblGfuN9iu$2q+GIWZ?!D2*l< z3(bo&%WIWAgqUpwY?&TEGknG_TiwN!O;uyg>K{*FJ2dTPEEXIZWvK#Vdsp6&4f1=o zS=n-`xub1`4-~qHY-9N|O;4qQzQg_+1`;KF)O$*cRKkBxoaUs~$sB04PBXO-^>oys zIlD1%+~?ACkt0>Y`y=x1lMrsQUqR3kVf>P&jMLurll$AR`zGuBV$k|%eB4vU)?Sv`}MS+9Rt&MNyU z_IH*C*xo6bj4Sb1QcNcbSO&kO4$sJ>cAtp())8DC=eyki9^Vm#@_VB`xI}FQ~0=)olIjTxjROD1ovL21$aW_YnGX0B42sRAC_rVj{fo^)F^m8 z_cfmX{?rBGs@!=q*b;=y8?0hT4)uB7XIRtTY`Woi$G0mn*Kdt4OJJHfVu72gUYO3t{i!9++be<&u z+J54&g-tXu?(-Ikj5<^)lS-6#4}>dH!5B5PrzAl{G%VxJTNZ12uncUMK(Xo}dgt3g zF(kBNf|MUG@7Grvp!9wXl^sTIj8XM?WmEFVDpLjWUGeBF_(?+;$%zgrfQv=k@vJb5 zE|0J@szzJ}*q_1|c|^GH3h|!8`sxd@D=u-+WIItfXSlZB(1%U30b7it1#aE@!!_p; zHH%p2eFprONm$5?EhV#cY3HiK2pO#uWR(lzDk_;&50s*0CUTS@D9xB@ zL&t+^z(eCD5bx;*j9{)U4wjPwtsa8T-8Q@1!Z##3%tqA|%mXJL46XjX#~U{sb2|)R znGv((8g{=c%$cXFuv=rM105pqb#}t(&+`BofVAHJ{>6&{(=#qNu?@g|oqDsRJozUC z!4bpFXen+ZZ5paVzU_z1gKr<&^eb?}{>)`JTCb~kylZ&it%-0W{ED><=OPq){+|V8 zz_J}P+vIyMl@tKUfnY~(ygH!}5ql>KMvj-7iy96uoxdCd OGr+{i!jO(3#Qqy-4>`2} diff --git a/source_assets/ouya/OUYA_DPAD.png b/source_assets/ouya/OUYA_DPAD.png deleted file mode 100644 index d2f9a20b9b4134becca61d05b176f193e99c4299..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 713 zcmeAS@N?(olHy`uVBq!ia0vp^JwUvGgAGXDTh~$yq&N#aB7rowFbFd;%$g$s6qGD+ zjVKAuPb(=;EJ|f?Ovz75Rq)JBOiv9;O-!jQJeg|4z`zvd>EaktaqG<;dp#FNh64}H z7u|K~c5`1IY3g@C@XyK>cO33GxNfyzQr{5uTS|8Bu`Jc<2E%AhPQ{yN_f+oFue?}k zym|jwpUuKaJ)(cE^{6@+aIhUzkYHhMa>UIN-~q|D8J*phD5Ti3^h^5khJ|rQCFZkE zzHc$(G1IY|{{9ya-k2o7vu%m}%=m~E+qP}n-2eF5vt3oPe5{vCx;1AsA3pr%@e20u zYq^h2Ye|5Z$Hvl(n+0^z;Sk?1)B6=$>XucW5#4led1mjuqCFPJc3j+%FsbzZLHV_} zCKa?b=J(5H=Ffg2`Rua&>)4pInIX$BubdVhwn_ip<;TgUQoWn@RM+Q!e=VtI@{#AW zXL;`1_54_k2kHf>TRxzYW`adi9&fH}2nE z`D$0*5q8^^(kpU2IogWO8I;d_X1MRh&KBze`AeVGX7tw4&mHl8@fNq* zXrXfkKz~9*0l}Ka0CF2h7!o%iR!#D@-pN&xe5*fi-t5-1I9ILeuKPC6DW8LH`r1!D zD#>=MuC3DVyr<&hlD31>Seh^*6B^_|gV9(fcXl%{Gc@z3=*Qa$9Ap3jPgg&ebxsLQ E00P1bOaK4? diff --git a/source_assets/ouya/OUYA_DPAD_DOWN.png b/source_assets/ouya/OUYA_DPAD_DOWN.png deleted file mode 100644 index e19cb4ead8bdee5371b501c3b43e0e09cd1eae14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 965 zcmeAS@N?(olHy`uVBq!ia0vp^JwUvGgAGXDTh~$yq&N#aB7rowFbFd;%$g$s6qGD+ zjVKAuPb(=;EJ|f?Ovz75Rq)JBOiv9;O-!jQJeg|4z`z{j>EaktaqG?9{eHoLG6y~e zALigssARYilQQiW!y`QvCGL_UK?&0vE^`;CSt!0~b1_@Yz3x)$3kK=#Qq_ly>uhzn z6sOv+-Tr;vdG*Al-{*byec$h06@7A(&Vkgsn^-v54k}2nG$%M1;ASy5If7&Ze4JA) zI=z;D+QZPkb870%z=zj&@yH*0&l21+c}3~9s_Uwp#ynH1+AQ`&{u*=d>ET z-i*HLSubAoc?+dUys)bJ@`^L$`Fy6WAM1>_Pu^v1IPv!(IXRh@$&)9?#8tmL`R1qO zGNTUTGY4{`<{dkBJa!U3Un0T)>R({EFgHC^`}M76#YI`>>&Z-13x8nSwElV-E|`uNtvhY#=j`|shyhaVEFZ>z54 zadUG!l(o5X*UG<}uGP#wvfJCp*yqlf9V`DD><{pNRV_M6vg+}&V`twkje1)bvEsV3 z*Q8(Cnt6G5p2Y2lUE4O*?eP4osp96AdEb27?`+-r>}8G043@SBJ8qgwHi=K4?)|&g zqiLtZoi{sPUjLX;W#!{*%d^t!n_vE&FFSsQbLHmf=;-OTPf`85zH!G-!=}^cbfsrU zE0&)8udnG=Ftbwa-f_>u6QXBaoj=&;y|Rst@%rcO&-!_~gmcd$CH`g04t+V(<0^C} z(y&XST`}C?x>VESn9ZLyCFTkGe6LhPyeZFH6dcgJWC7?@6kA5C^s{)z>^7* rfPo2$5ypZgWdR;ER@cMr49pCcyz5;yTRH=C7XyQ*tDnm{r-UW|1|yd< diff --git a/source_assets/ouya/OUYA_DPAD_LEFT.png b/source_assets/ouya/OUYA_DPAD_LEFT.png deleted file mode 100644 index 74043e81bd563e3274ac7eda6dc96ce5be4283d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1033 zcmeAS@N?(olHy`uVBq!ia0vp^JwUvGgAGXDTh~$yq&N#aB7rowFbFd;%$g$s6qGD+ zjVKAuPb(=;EJ|f?Ovz75Rq)JBOiv9;O-!jQJeg|4z`#7s)5S5Q;?|qH_8y{z3a|7Rbk@oHO=eW9TAXWr68I{?$CHCC_|i6+jC_7u z+vi30eLHvZKlER#He=CikEWOM5-0vztm?i$TTdcb2xc9`Xpj>ySq%vSJiD{p?SD$R zUUc$%zHz_G_1~36y9Qy9Y@3`tgZKZ9FQ>zI z&IyT*j$Tnx_N=aOdfk7%?Ck8FHs8NyhyRa1?BW`8IOjs`lN0m)W$HL>S*F6$oKWVv zOK!%jIVM?6C$}}c*;}x$PTGLwazIt_!S21{v)@CND$jVEyVt(VN$zsd+HP+@?s~Mnc})Rn);d zlF#I?e(O1}^uK?NpQMMszxUzsbNz4&_1Jd)+#kRF?(RL9zFLq+HTLk5{As7M%eP+7 z*9bXf>JxYA{@o?FKkiwY@4Pl_b*n^1w#1sm8`aq}@-64OS0z6;y2Je4{ZoYKnf;ZY zBJ{X7YIw~r-^X(OcUV!cn2%?~VNhCtq!|Qj2MZ+aHYdPRadSd~ubvPOW@QrqYGlX7p8fgSf+7eR%xeHN%qBh zhws;G^LCZAFMmGg`S(VT?)Uc|pD#aGySF+naP?KDkkT^(3KA^M2?9J#j0f?sIM_h4 z&hw&XJyhvhWD!~??eW(ld+V*mZ;tPh%sZyv{8DfK+7tnwM6W|qY_qC(H{b94_U*#$ zYSUkZd*;m*^x^ZHc95sPhvV3k7J_y`T;iN3RrNeMP{dwo?(vT@Y}Su{Tq*B+;ios_ zQe}PfSzEhhDlCT?{Z{whXsCz(tvKJ@ zoR-(MwTZcDk3IAfaj|1 z{3qT$r>*c(yMzM#F#CTkbKi#qRU*C?cTeqszUA$%xak${iH3NI)x$d>e z&(HB3`@KBj+qubi1I3bD1MBZhy~1vN?Z*sIgg6>-ut8FzqX8^6Vz5rQ1-~oYzH{r; zBkXP0`xoCd0mf^F`o!~VH@Ut`&h>HvTKDJt{ZFqq#xFPJ0Vb2?1P7q8kkpM}@i2mI k0}4a!g|Hr8_$!>i;F)=GPTEx&MFt@7boFyt=akR{0Hv<7m;e9( diff --git a/source_assets/ouya/OUYA_DPAD_UP.png b/source_assets/ouya/OUYA_DPAD_UP.png deleted file mode 100644 index 8e42685d154914861872974121d54c7d0bf0e7c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 976 zcmeAS@N?(olHy`uVBq!ia0vp^JwUvGgAGXDTh~$yq&N#aB7rowFbFd;%$g$s6qGD+ zjVKAuPb(=;EJ|f?Ovz75Rq)JBOiv9;O-!jQJeg|4z`z{q>EaktaqG?9{rK~FX9XZr@WCx?3-%(aY#`4#C542+MBqT3fr?O%GcQeBX z=ja1w*LPRXTXJ#1iMzA=EBD*JF!h_H()4;)GN%AflcNC#+rfqeJS>)GkgVeTV_gM8 zg);a3>t~)lxG+!Mvq)*io7RMT&mLItUvgj9yirwABFEFbXnjy;T3TF6olNhs=`X@p ztIh~CpUC$4)78~y`WILJSX^-M#w3Vk%M{L?KfidnznuGVcXu&ogTK00tZA&^hCFJu5gR1@e$`+shc`IX!varv|Em6xaKGL0U)PCZW)%huAGnPiJeLms# z`9F7ZG@s85ViRt=Ugw-=uehz%MCzbO%nl3jXA>MX9t*^*N~nsRvwLkps)dWjj3&;{ zZa>l<{Xe67w}s=h5zBP786SL)B>t_*ovHV#cdFvF4OV zl|O1RMGG}C9yFL`>?3oWU2^X6yK~ljZ!hURx9P_r&q+T0k1qT^^Z(#Hxm%MA4m(`m zsC@S}o8{q>KgqM_Z!@x7`SIh&7YCoDJnNR$dy-oEwLG!z-F-S%zE#dr`bdt&Xvd-7^~9!HAZ3CO5ut72cZCS>*1jN)wT&yP9YFaPq~ z_wr`571jYafoA`lnYb^#MDF3SbCo;T-<|(bs5awtZIRVvN1eXI*YBP`Sf#%-yClK; z5DzmX*#Rv;u&|{@2k~TAo0XTtv~R7r?*7Q4D{aB{-zVOveEJ-8^Ldn+D3AlE~d?8!ik1CPUk#5JLSyG}tp38$8_f=ZaBoerT=C93y*^a}i{ly?%JsHP^n~V^u*k z7+anLcjwwqK!A<7|K`5gzV&4Jb#|IDABmV+1+Wso#TTF(UdDtabg+_w=Z9tvbgDQj%6 ze??j2i~A=kTO#cuiC3!Yp8M^q9Uw6WdvXcO=Aa|?11**lv3-{bd$2KaB;n&uu`lNe zQa^US{HF?>!(a>I1AwMh(<2;0Ra(SBuB{c{x%N+K&kJaAF?cc~oSWOY@Yw#I$I#Hw z^yhOGl@50LsPAE{H=ICjU*FBGo}||mtD59e#Z z>8$RovDdGwO}o1G=W9Bgm$9(-7c@mso=~dkzkkFPw{&r(Wh}yDn|!L@Q8_RQ=dB^W zQ&z^pZd`MK{@7+vL?rju2nt}-Hsz6{NnYXxwX^C5xEY-R1QMiK&}MqFU6+fS;p=)r zl}AQujjDfekM_YP^XoldY(MdsWSY6pBGKxTJ7{{mHMlQWn~ zkq(8n^MO4!>Ybmb`t#i_p1e(BbV;ouUtz8{<-Mrg6E>V6H0=VcnZY$oQ&dxXXATn+ z4U+3S&69nncGNMT70PVwxW>fPvMBE_Na9FaP!lxfy=;Umfu95+tJBp+67t>}E?xaa z{=h68yivcaSFu}>&Oz@fOBuH4JyGXEkeSh@dk$|&cPd!$YWh| zMS!O2+|wV_Ix zDlJNau}Wgj6*0b0ZqB@Lax%dDkU5E!;LM8;8pw}Y?0>T`0WqR7n6C!*r3Pmdulz|r z{Op&sC#?HUH;SwiUmEVMuFG}nr8xMvof_-+(J>N`Dgom2?+cCDkP2`J#Ci$YJS8_mv+HEl~ykjmhKlGCn z-4){|Hq5)`k777u+_qdHUb-yRjAB8(R19djLOTpKgbZ7)sEgFR*z<9kJaZ&6v$=NT zn1~147X@2FKrG~wZ}0>HE2x#%WPYg2TJF5#v;;XTYnW>M;^Rl$1C^Hq zTe9(0A@KfqX#`vCP0eSrfNCY#m>u2H{P{E{boG$*QAU%^N^9Vg51p6-7A_`LFZIz| z8LDOa5Xekg%13c0<_@bwMEp?&;)`I^-_T}_%6vkWxfryZ$6O!*VL37jLWTH7*8U8X z_HFO5lO*6ICS53VCdtV5e>B-ohOxJ;wcP&$e2dh7$tpxFMyzJVJd`*?6=Z8Q4j1+0 zKx!lt?!WsU*s}lrFwL!`hv0C}gTkjZmSz+&iPcJwyW%uvEvmSK&Po-p9Le9kQ|~?s z)pnLNm^MYRJcyeweM;0d5EWEGA^mhtW|o$gt0e)sWX7;r6aF{S_zxqV1tJ|BS2{uT zSk_Zwfxoi-8^r$u|8Fi|o8bQop)6|6EnNzrM67MZhhLi6Za=`u?u>1%4d&`!p*>tX diff --git a/source_assets/ouya/OUYA_L2.png b/source_assets/ouya/OUYA_L2.png deleted file mode 100644 index d43947f6f7c878faf5f764853549570a8973f9d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2522 zcmZWrc|6n!6dxL8P%%b@+&{(>9_kIi?e7QOVInDA&&JpSyp&@B6&(`@YZT{q=p1>F(;VTS`d^27~Pe@mNn$ z=82+8a;FHx1ItWA2@!=S#=>CI^8bVwthD@qh*XTj`NW-y42??&j0u6+1V;visDt5w zVIiI&fx(HJzC@uIz&yXJNd<$dsv2}qSPc~;}9pWL1(vO+eq2Ky&X7eUWP zuR8>d;GHtj){dQ@(d1{6NVwx~2ikNRm_oN8KUemAvOVsCLGy?KYT?tR4B{^(3kw4U zWAS0*@AI8&=lDfmXq8*zi<{$}yy>OH9k3dry*x}E0fYVv|7S$1e}!JG2QiT|F`Pm^ zB_p=J>R0tEGSf@nl&=yfTA4u^c9r8ZZ+q8_rw$r8C0^GeoNGs+QSXgiy$ zp3Aw5Bi2o5dJ%!Cea z^KRBYd{`k!8;Dx_(`IS&b5uQ5>n39&>AgQZdEnXjL#>sz5fGLKzupH8j8#?_!a&<> zi7@e6vbHr6W{qU998FXXMvSpVjXp4@@`*|w90oZeeF9Dz8`~I&L2JDCO9_;Hj1Q9n zD=2~S1$rZ?v$#spvxa1oHJ%%4BGeIA;p)Ev!&@hvv$t)W#Gr!wRJ=GIY5b-oWgI>P0Xx*m{W>Uq#g@GYo1~B~v5(=YzrSoo-12XL}aOUVf{J5U3I5coY(TEWP z(T@I@oR%X$r7e!%$4bd0`!BkiEe?=G=U(hd9b+gBET?wqNae?8FX-%&gl zR$f+i^wGwbmT#NwpF%@t0%DhD2HDRW{Mz{^1Z81@CcmM|_F6!Q%a5m%QUD<*X|uhT zTJgG*!b`fh_)sNIf_Y^sT0#jkv;2oz8Gj*yP?Vm&vo6DLN?S2FH1zjQ`dfzb^gAif zL*MZQgn-1v#}ir|kXa()E40ksv-zERQD4xkot3J5a6>=>3yObn?+Pv_LyjX?N2^Ag z4F)qDazi}}fR4UhY~F`nNh_l?Ijjn&l)P3`Ro(!}NN6E&J(#NCj#nwDbW)aZ^@b+2 zVQSHjEJRgJd>%azq+oY6l*rO)))q!^l~x`dx3t7AIw7pqS38d7=$>vO&6C!PyeZ3}{+*JUqVIHjv2VM;HHs zH@f_TFLY60k2JO>K}jeDl$C3Rxq_n2zLiaak0HXYQKmWk^~#e^jjgaD9i)@zxn3Nm zdDozCPszCdZHclrB#5P3LmEJHG9bY-OLP)wBYcE!AMZdXZx@mZqHV@st%ueV4G_qL z+h#2gEv=`2>-j@9rCPK`rc+o#@z@FQSF(w@IhVhrIA{Y&vdx`~(tX_kro0Qln?Dm_ zi{T-C7Yl=lUFkj#P8m}VUF1I93kL#=4CL`rW6d<-yR;XTi9QJ*`=`P?6$-J(u9@=To~ummZ??ADN<9yso9N4a38q?~tETE(W5eEuTS3bC?=`KyPU9iXXY z3FO*jAS>%w#SOG#kivou@4}XcH`qyz$t8QPlP{Qp(AJS{vq;>Q$2{J%*CkWum@8yR zFQ9+8Q*suM%+$%)t9pYVkW~um8C!5jIP|KB?&Xh+JRjAxeQZ{zt*1s>SXBBU2WNOX zwa)=!AN5D)s8!ccf&ENn+}-=`(N!bfAJTO9^id%2nr72UGfGzFuds)6@KyIA6Pnn_Ga<@xP4*O*0c??D zOfBa;k#5?md4MiUD*O3H)8(WUnQkL%NVD6h`;N$s;xNyyfVt@z{wPI_-BaazI%#yG z5t?{>EubSx2vH&^lXUTY3WkNV3$x3Q;s&Fu&g*6PNqEKV9fi%*&23?LV$c%(|R`m|JjB@BXlU=VY6*k>)3UyDJOIXe0#@u^Gsd-tfYlf?1w z+>fG+t zl2Qj{nI=qK22fMY4DIxllgNXM6t~fR3;q@*syhKaG%K|0Ry7R5X0pxuD#ki|xFUZ> zhK#o~wWX$YC_lacO0mr{7VJ0&liWH4i_u?D@r}Fcw1vE($#V1VrVhj=|5|A96k*Hs zaRg}Tv9o-5pS-VCy=4g9E!ScrsPsU6(G&TQffL~}=;gG@;#wwC|4bWDp*zgi@R+f> z3l2YF>36NKT&-htL2JPum(l~;yB9wizwGmVVTi0R0x%oqDoJh}R(#f_#P#E|`e&L% z!=*Y4h6>&o_$hx0;%~m-hDXl{0gcmV75vW)s3S|pb6%_`5gSPyZmaPNG!xy|N??r0 z&iU#QT`SBYNVKFDzn>=c9=m7b#-wTBb`|Hxy2Q2mg8lvet6o1fHfwUk$_@rG7F zHSkjUg%W6cSC`u5($=3DKfC`+d5z^fPb|TdYEgdzrVqgbZuY>bDD2Dv!;lL_L-CqLSJ6)Xlsb zCfrsX=8BJm>FDthswE0xmJo}f*I|V;?M{Kt8B%TY8}#dO22VnNma~qYkM~c>ubr@5gm3I pAod^lKlASg@Gs54y`zimgavWz2j4Q}OGSSf48*x&8*R^|{0(_^7m?n3Q$vxC1PCqk zE}?^T5W%1CzjI&i%YE40IXh?fWoORrM(OE1rUtQs0002B1_Ewy6FqM%hm!opk1uRE z-UOg0!rTV{pknyfhyWQ`cW#m_zG`N^h8|A7{&wC-fQqAsJrbhv+|C(kfV6WA^y)_{ z006WO8gLb(fSH|-+U|_~OucMfbhl)Cz|+BEcC>!nT7J4QvBc$EqG*&Q-ns`|{|!#1 zUPi_ZxkbeN5MG^#DvvynIeqZNmWhpjCW6UH1`e)HKH%(n*zNND%S`+H=BsZR6_u4+ zdz+Ql8I^nuJsk1QL0hK#6Twvv7d}KpkZEfKAxqqd$@HR#i{V5@fPbKC zEDal6^0Kr0oG~MX7!$ouddHTj&mpO+=~b}}(-o^W1I`FA{+$U}9|FI3!45eo%koW& zA}dyXhQAkdQU(=yr{AwiTw4wZqA(q;nzy$8yV|4v{P}=I1yZn*xx!8j-DuwpTJ^WE zZVRi>*41WF(%p=&s}qi0JUGgf_Q1Fy`CTClBndGdxaK6Cs;8|XU+`aClkg+cB@Im; zBDQ2qsF2^sC4SECMw!{!r^L0zO;6Q`{t$8WG}R`R%%u#o;pF6{BZ7o+*n`W}nZCa2 z)3#~zqSUz0otwMTN#-c{_7ARg(i!~3Rbtpn&5?Qw*n3lbGvL2#TExvMxrH@P-V{Wf*wgHv&gFAVdDN`YrznOmtQIkOOYeh-J^AslpzK zENf@W`j|XjT*%%?V_bmMACx81C29<+vB;}~^hm4n@(krePu;m1hWg7n6n?P?lcw`! zn3V{ixB_h0AKJ&fbY*l|UC7Rb9#2&^?Yc~zRZ9p3cp3?vofR>2kTN^iR=dZ{vh!~* zeiJ-lg@*eZ{#|iznlk(8U|$RfTyRqC@Od4H)qZNmsqO-Zx;QsAS^AJ&I{V<-oTfv%BgR$V`K2*2oJCuiu=e z;aj!B_ASqzPV3Q;BuVlQnHeL+(`0EwtpcX>V>!as7+lr9YT*9M?S%* z;M1w1cgKFhywngaG*ap+^P7J|PtQc-6xhwXy*AI zauzluT8+pY>IP2l1bno{7-;F$J?C|RC6nPsld3nMWpU9-s^~avpj-&2ABubLS#3tl z)%!b-sYYr(%7t07x*QZPNk#Xx2Bo|uKWpfOjvt&HYl%07SYK<~aDp7Pg4FQH>^{$+n1t_gPCjnowb0*K_7vUtg~MhFq#{ zS+%7TZHe*iPwL&|eztqJMV1D|Ozm#j@^x?dyB!@*`7^q>DjXw)a`bvKVQHR9A#Esi zu?@F3|Bda3;yLw3fh)wX7cZbd>7)lX2syY|pAlA?a{FTg5v-?`O(dy5#W7Krpx*(l zg@3{So*lG?l26I-j8R;*C(U63qxb*zW)XTX!|n=nVLy$N_I7zFPz0XtqzenC@C?+_ zfPV#@?oC`D?K{utE?S*Q!BHm5vND1q={n()I{_HO_wPypzrp(9Yy>9HM4X?GMQiIz zd1lmBwLC2=NPIgb5Ga7r1MmPPMxqUqcv0fV!ZOgJ?C$6$i)d*%HJ#X8MOImemG(4(46y*Ld-emnL8h-r!Our5j~EPVdlIF=m} z97C=}d`iS^1*V6jnn!mMEul$BH~`mORpchCIORUa40e_-?`8mLpq8WFoYwv8IN$Wy z?VM2Sbs*o)u2GagLN7(rsC3HkfVl~@ljog!niDm@u%AOTkdcEhy!dL^o|x$3Q#=RT z!N=Q4-y9}|bk7{K4BeDW3t9PY#wfgcw$B#ag`||=E@oHo?dz)rv~L>na8fFR=p#E- zyAK};chndRqjwBIj*q63B1LFcl$-N`T09aWFqOv#8Q@o*ud+fP;9PaY#6(lXB{^c^ z`9K_6UTLmEF4?BL=!=kF?f8dl%|sSKU@TO}74aVOJ!UXfr7#9gd}KM$u~0K2ntf5; z14_s;k=M=CcX!hI09aXUyJ#dJPjoo=Op3ny;vGwS)C=4`!Kmx!DTgw3GL%V1mUt0L ztU%9zc%{E1^pZhu1g3V%W@H^?l;c2cEd%F3~=mGsMp8etu;(62q24`}DZDiQsy-J(a zwJR|m8JkQWm``H89UDtf?&92|&<*uk-Gv?PloC4jwlrfEw?vC_HLzIbw}?6nXl+bG8qv3S*^o6{GbU5WKz70nLOUBVsHMRYsA}sH14iK_G%ZZ8@SIcM{wWTbI_`s=R@3O*Co^ioY&^R}NW9~86j zKLI0Ie~J4(T;o*2Eu-5dcIU?!M*zf=RJV%_A|nD-5lO%JmZuJn`@pP^Ar8I zXF{R$99U%ddtq)RSUtN!hurLM!0{9w{7Z~%HKHIy+N(j6)d$6~{bhN|KFjxwj|Ot+ zbk(|M<1}tTpOi_~_4UPmUORB0WXx%d^Tn~%JZ$3wXh7*`3!Y<_K*A&e!cQ}8&IEBU z2?q9?wQrMYx%_dv@;TTbd$0$bxn&!@lpTq^KWv$@(E#gmOpzRl>3C;lrLOkEM22Te zCy|rK8^vVdu*7ksP_DMWE1o#}d`un0eOOu%W<)q$b3M==jJi0t_6*Jm#-w4(7(aE*B#EA#3I&lRBeqm@z6ETN#FH>t=v&E3c@n_?O2e(1SEysR76}(>#b*j{2p+?Aq6$K#H zIj1yR48V-oS>1@01J1d{#D@n&$F@A^Dk<(OzonhC-uI7xuwn2Llvk^~!S+Tf^8mmK3C>?;`zCoZ|>1OxEcPNQshwpe?5CpkTdR`ZH{ zNCI_rzW%mCxKP>SLShlwHH-sYj29&klkr4<{U?@ETK$`rjml3a(Zh|@KWZ#*IDkB%)*6?gg%X_-ms&bYq zUyz~)?rPibYL)NTrcx{6HYZLn3V$d?efuqCPwUSK z+#1pea&wQAaO+lt18w6jQgcIZ)<$`3(MS*a~bPtG4q6(Mcose)zi7e8teD^VyM)Hha&yzavSpD^wZes+0RVkgO zQSx&+Rp5Qn&t%GkX)|}*YD-f-Gnt+E4Y0Ox0U3n8=bX60oj@Wmx%Js4zw-&2qpkNH zH+c>l9M+`iz4ojLMzvz8GOFkskVxbkPMMf^9%o@`GOI=`Y=B~f$3!(=NRN-9r3ybM za4TqkzYtFBxDj14dK+BhG#zh4*=1grTVA@Aml;PoRZxiI0|0$wBtv4uvd|z&S3Y~n zx*Z+!3ML%O?z}=oA89tEhbJxT2fqlJn!n42aABu$y~}c)G{$JWgrqAWL%fEQP{y}P zrb_&zxSQjx@o8Urhb3XdX?zZTHfFA( zHpD0mOno=<6{RfmAM3B1R=Ccj2+00t!55Bd?=1f5@_Uj+4$^v-XsJyXCPCgl0(JQM zRpc`V22VUP6#HRuVNTtIbBSOu!s|*5y(2tGEj0M^Ft>p4o~ZrNj!D%0w*v~w@vPCu v^I8@}NLE{BxN(ii|9MXh^8VPMhydW*~T&@ z`#OW{lAXws^~%-l0o>SfSL1mg8)(r@9~h&SL=?iG0w@?-xlu(ARTaajzYQ~w$6@5jCSnB>#;cdjX19&ADuvy=hjrY7fQx8=wlK@@nSBwtM0(`Sx6#N zkp;(_UNE}gp@itP{9-k0UV&+fmxQn&g+b}VOw1Na#@~O!&&aQ(%#E{WwKMR@+8kqb zI;d>&7jB|6dU8vipM|mcHo1x(U;+uz6aEki&>edypbjwoAxP-A|8L-bV_F#+-bdiT zz(BFx4vW78PM2h_6OJ|#a6NmK7b;ms_@h3XT|W9%mB`25i2o~VD2rb$@DqeqvLP%IM9LrUvc>xwsr0uRGCgMEC;#*HoBv1FS9O4lH2}YmCtQg6YM2=ez2}x`JMs-gwx}eRU^wUR(1Os3Ise@B3WADn;_J9q!C`to-=;aYOC(d`O5=B`X&;TvEw4 z@@8pfUnCD@=|{x(M&c=4LR#A~|liRL<}RsW^-?a#Fe?u^KkS>5C%r_=0h!35#E zdu9Vj{f92l=|b4;*>MfKAHt_uw^A;KbK$KlYau84hJEH!^2Fjwrz4+|0j-5C71kR0 zJ#Ts9Gr_X%ZF(&)dwqd z5nxKV)+@m~37jvoAEPn8oYXGC$IL+r)z8tQ;XU@ah#>(?xs(vm^ z?3LRRlFOZLx1j8!KG&*otwFa=b9#gl!S30b%Tvy9O^f_ioz2`c3z5w74o)4Kq5@i* zm`BBF-h{kTB?Abw%Pmp9w=JF+4G>qToY&>L{CPz$$Pr~oajBQhC_H zgCn@DD%Qf`RirCmCXfyOXXY=;HH1DU%DjkCq9misoVvEGD9rH1MP9|4*8qCLD1Tz5 zao!LfQ$9~FoT6->xg)oX7Z z9<05m=JkZlG`56lKRJ~SHO;K5JDNl0P(Y+t0{bh&a*}DA-Rt%lDd)J85=R)NQURTyv>fL zIJ*FsJ{xnZwJu+8j>4{P`BVU0j=MZ#2dfj+VAr?oqTm**SSBYd<7at&98cTTcVWksG#Pr7*wjFqf53b8ca7wlW5Ny)ARymZ6RTTiD>j za1re~NPgb$v{WZ%Y9fg3R!MG7B# zy|AC;4E+^u{|SZwHKq3!+OGLsaG!lJw~DK}I{9XlG?{Y;wJp!KAlvhf+cthmFN|EA z&i&NdFrc`9%yPxG(|~?&eNb;eO^Z$%Pe4L2iE-7jo-pcP9DAb)?FLJ=E z2Ec%tu{+RF!lbte`<3{%Yi-f!mkBRTZWo~QEwM$F$|<=No?F%3D1ubXN8z`rxcU32 zz{(>Vs)E`{{Wwy4`KiS diff --git a/source_assets/ouya/OUYA_LS_DOWN.png b/source_assets/ouya/OUYA_LS_DOWN.png deleted file mode 100644 index 376efd5a47304be28ef3063b9e32c5f54c26b59b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3870 zcma)j1#|R$p7gB4}zo$N0WQH-C3`$xYH`^?v(i@Aqv`@sQPSh^c01`yEhIC+nKFDU)fn zpO^+dr4YpMl}6Dr&(gw%&@^OG?&qn$hzaxJN^p^iYn`O~&^?v$0X@^*ve-IFJQ&{^ zIB7UJ(Kq(4`u4$hS?;6SudEp|*2mXZE@{0_$_otE(**SC1wkT0I1$=}Xn;eV8xTMgC-Kgm${VY}~)*(AHap*^#@bbZFTzNTE=8i9S&h zK61ji#Y4;4Z*lDn4shv5mhWlhe*-9ak8icOae=ShQh*!6sR$uRXAPUxM^Mm6_Wc4y@BhG>iPt7-~Fkq zY5+f0kt|YpgyXY+2?UxQWD5M=f4{TCkfxU1ATN0zV5t50D*m?!|s&y^>(9&R}{0cOoLu)H%Bogg^>>A({qzqp= z8z0ExTbjWlo3094setpOi3+Jzl-5usbm%4@FYmPisi`R4>EDv`+-BvgH`tWor5vMy6UGP z&Kk?yOpkO*tAWw>js&OuuID|M`g=wcu9J?=VwlR*Zp>RtvBo9RjJ9j#$%f7wmnsp% z@opr#WF1RfO(#W>`}gt|foB@Wc=7ay<5r3s+u)bu?@Kd~O7$f6^Rs>;L@a-Rz&O2} zUiB`3gDp-p7_E&Y>bh&{Z24iVb#MMk8}zo`kuHAIlH*MT^~^aV=9>B5)&4uV7j?K9 zKVQ~*@l zU!LZ<&hN#2>=biWVod3ny~oKRcjYGn+y2zt8=UTXcEf$!vgV+OHjS>x;#QNP^Odeq zt`v3_3r|O``BpFgVd@xgu(xXNy7jN1chI5a+xFNaj7!lBV!<$C=L=ujH$3<{I{{4plL4 zmHm&g{o_kDOv{UL*vN=t%_QLN66g6($Cqt8XKGwy4j)wJm*=HxZcuJjCwS}$?RbBg zFTD11%A-&&?m&_tWcE=C&z~DK1D?DUd*)VF`eH5C`Eh|WsF}PRIzQj$szxg+#=2Y5 zv{#NpJkR7Lt#@zY9Gxu>4Jji3oM6Y3SVfW$^xsdP3aX*8Cg+!nF^|YG~!j593&AlFv+-@91ihT)|KkL3g9J<*kpAp3Qc~mXI)NaRKtJo|MrYx#1>Rkq_0CF_N3?f)NK#vGqJgVt(8t?^O5o4AIFO*7c$$^ z-Wb-V(D6HcbCE?}Om@}@VMcFfVag;f7S_$0U7|)8W(Wp+#v>L?!p!`JPG!O)D$PQ6 zGR!ggPG-*jOG^(LPlZ*uRkFB(DKU=KUQPp(zZT|b@bE*lp|6xmXts1Wrb?qOhrQiC ztJfYws{N5oU#nP9?PksbQ{kmzvJXy$4pPlxk3?29iPFH`KZmnhjtURVl25#E3B<>7 zvgV789qZH>za3zGl+@cn`XepC1NJU*ydis`F)aH>dG6!{5t#e)aAY zV-7f6WV6iYP_lq5U8EBn?cy@d8g!AMUVJlSl!ZM-qPLwz*dpV8|FiwyNG7)c$Y`5T zQ|!^%&=F9m>VFh8zxt&U(%Q#vB5igE-3w}mx$6FVo%TEze7G~68yy1 z@yD6iP(A7h6Au zx`0B5Bt{LJX?71SDGC}oH(BoT#Y|%BDUYdEkWEeY(PtBjNEd{wzS+|Wg@?VbjM(S1 ziwZG0vj;7BZjjJyfl93bZ_dmHe2BME%h=6ZS*|Cq%4E zz7qLGMmE>Z6uYT8g3Rzc$A=^uO|iKb;|(eBcCyLe$-CjP_wbciFunUuqTQYuegYt@ ze8s57q91DI=JX9O0aXbp&}IvP8`s{Vx4Nzpj4t*?Bkz1qO3fDSo4PXz6H6&wU;BDx z2fi`NqQ-+g3gW?`PzGPLMU-Xc{Grk8!LxER=8zGxwFp~5YEa~XBqb^xAe}O{q ze^ykG+DG$wh9+xR8aSybi4360e>U?3Cp&J2U_7Y{zN)nV82S=3Qm&41Ekf70&?VPR zXk}?0c{`cYX6k4}Wipl!B|UD7MWqVfW)Ow<%-i#XIO zf5s@T5g=mK60Qbf7P0}Ai>dFz7s8V(uM6Td0Zp0JGPnUt%&V0tBIwR?|U#7wMHG`GMW&mY8ddelWOU`ebN~n;%6}X-t-8yK4nNiY z3Bc3J(&*K@V{@_7*`Bz;Ts5U#RW%e=`ccq36GE$=7C-X^Mb7!-ZR$^9qA6QsOj4|i z^WZ0Xh)MYupZi46a(SaZhmfPSxNhBGG*t0N=UM1MT#Ea4r5-BnEAY_jg)YTkk6qW~ zrPtIGBuMOmOK(_>BTPpBgez+<)u5%JbX6q%Dy~#ea&NS4;9YUrq{}XB0lu7J5(v{P zW{~}7>y@&U8h=pwafv)kR?>U!Iz)bbiad5@!*w9E@G_gpRB*{06FS&Fj1ISb5hIJ(eQ;5cOz1BfBxYixS$iu*_2t&(6NeM>KQyiL0~$S<0WGOt}== zQRs&J+Ak*5f)cLo!K(o^AGtoWzwZJuo=lH^E&6h5rNH?kE!+)$DBGf zHxRsM@PYBgMYHS)cOP1Tv3t5!+~Ux(zBl)#*z>!aOq;~s9tumY!I;W{DM=3(b(caPx_Vu&sLWeta@VPQW9WQC3$L$&?R$MyiQMd*+?cv~ib5RK?O zMkIXD)>e$*VJBx12X`n3_yuv;2fQNn1Rg`ssn)D^DD20=?ES?5z2llNC+qBi9?D7IyKo zw64uwbyWY;#tQ$>@)9+-A?mS;M*qI0tkv1Zz6slkTQYC7Tn17RUD-v9sr diff --git a/source_assets/ouya/OUYA_LS_LEFT.png b/source_assets/ouya/OUYA_LS_LEFT.png deleted file mode 100644 index 27db80af19add6dde2ca8edba2258cb5fe02d219..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3744 zcmai%XEYlQ+s0GG3Pn|_R9iIK+EneQ#bJd06@(Dnk#_x4A#HLo1QAho(8V=o<3Hu?Enh4uGV&UH4s(~cKUW! zwtntCcCrA#RRIlU1w-Gd&CKV{*T*@!?|{|LNTz>Uk8E9jhnT&tz_TPU6AV`&vBFVU zFqYEeWhlj~lrD971{3)Rs9rfNLz8+$u%L(~TIzB8tue=lT|{7O(-gWv=Eri(pOpbu zdk0d}WM^_pYm;IYx#dVR#x!; z$^JU>4(oqD|33#e{&&m2Gx)#C{&upmLho0}72gT?(HuxVn94+A^C=B&%)x)SB&?X5 z4ZcVnfA8_#+sCKI^yTx*DM!rXN&6>>=UJZ+MwyY~0$19+CKk%(KI|s#C6j%5)vy#G zl`W5n@%|`}p}m3@vy27wU;{LLraiA@yjrM4eWA)Q#8egr-+mZDvC{lN`?m{KnZSt@ zCH1=v8Ul?IRDH2hBUv-Sy*;Dx6m$M3oBry1rH)AAE~j}1wydUXk2E)D@uOvSa*}C7 z$nyQTOj%~xhPB6jvM~(CaydJL`t_CYDVeXnROtj~sdxD^EbXTI(M&;%IA>La_}=m1 z;o)ak#l2}Q?Z!klcm|cOGi5K5oQgaR^##q0G&orZ?Q~nL&wP%J%87VwILNY@ixp0#DgR> z8m)D-lV5TYi6#*?q{@OkM+8ldD>9feb)E>ItwP~r& zk#C2!TMho8m~{ONaaZ#O)w)iifHt<3qU~4riJ!>h#{$2wj4!{TyEr1(jcjUKE*G=$ z6$*wZIq6553YAoj`Q{0mIr?)}NH@7!Aw`fV-*r*ok*vC`GZEq*o<8`bTYyYjo3tFA z&H>M(Ir=o{7Y-p4vorCzHZsM(wnrx_#Qc&vc?pEM2?}eF{2a7c<1n-g2D7knJ=jV; z|49qAS30MXD7AF8RdCPclt)xOw4CuIUkp(9{F0QViY5M_SG*gy`Fs?8%jxx_`*D5p zfxu)Kv+kavqav@Rme(+!wyU<63OaPRRU>m$cg58qbH(QVT}Zyj*-U29{J{&8K)ewYGqak)yAzIq`Q2Er zo8vI1e%lObrQ6{Xp>E7Jua(WzH5YrhL?&1zQrs2J&lXh9r>X4F9|TjE0v@27@KE!w z&*jcF&sGwjD+cdawwyz6Jvr5}Z}YosT0CVPemhD6LNK^u=*&>AM!Z3<47pLbmxYJJ=0o^tB%(TT*-Y#RyC=v?ro07Ihh&Lm95@vSpJ1ps05scxE!ndQP+s%mP%@&3lTciQ-C-fiGD zVoo1@k%!NCP3B9l1joxTXw4a{2?<#`YIQhQ97*fHFVXN~$clI+G`65R#RYsxp;vHmDJhxk9`_2aonbM#gDxMS^P2M{j$_11_XN9n+?#56FG0moZ{@QnO7xYnf(y~zwlH*WYbzLh8+h3Ki) zu*)EtY5(lWV_a%VTAkM>RV~8PuMxPpd34R_2_L(Kz2_ko>m}Y~i`BwlD$>ZcaX7-W zHAtxI&CQElS#THhJiOeons9|Xva@D?HO0{C*)jt|P?dD;d#VDX#A^CByg+)qYc@SvdGAQYcmrl@E8?5)Ud;Gb=CNHvT<*8?tCve z`hhzQvjKyF?Z9i>FYz|5x-M(}9Wm#>c-vue-)G_rE)@CQ5hg^QX!d*=$0^o;gUuWY z?0$xIci?E0QpGok*-BSXSA|wV6W2t^?^(T`0}B)~_ei|XpERTuRUo&m>w1c<5{%l! zlW$-@T}-#PgK>nF18~G^$0#SebOD!+ZM4(n#q&}tg+gSxAY`E4c-Dpr95Z2#PfCZ0 zEl*>&vV&u^L9-0(Q<$e4F|hvQ38V@)PP3=$d?Lf$=%CSLW1~yP%mMa=HHu&53BgyV ztO>pS71XC=B4*YNo_^{C*y~3-T710SgpuG}CDuD{X{+VBC`ZB8i)0izhi!d<2#tE#U7!g9JQA(HNbT|T_xxitX$$SxRSdHMaDx&eDzN21Yb%K zil6UY>K`+j_(<*apzQ5Y{37eJ;e17s2vd$Sjir9I0wq9f0b??0bmE|Px&37Sv_^zv zXC4KUJ-2ytKrf27%$6<;o}M}()2P2^G^&V+kDSH)lH_|H>_)s9yBcW%Ou=4=S{1l4 z8<)qh9nv{>B(MrsENwM_W{fRzX{46D201uV*foMaT`-2B+~aIin;9U~){ zMtm%W!{%ibN0-#+RcJI7UWQe>sSta(1*-gbRyWtJ^^en6d(}u`AC0S&6%teRwiu05 zs=@{X3pN*oagxZ=X`Xnd5=h{%--4#yGX3uy1vvVU#_0DMwK#W%Zp-IxfzNeB4YFM< z5HLlJOKc`7SLB8C(`0&^UOtt+>S0$&_^9wDOZ2w!=RaL9#q2k$-wdgblY8GewzaAQ z@X)d0{hcY zYIDq__gP2-wwu4C{aWsTlmvO-6X9pw3vYW0kA-Jh&DQQoYTsr%Fl^UPJr+|0)|Rw} zii-?9wx#Jycdi_ZCyhOXi`{sE#l=id8jOy{EI?&co0xBm+`A~f3dUF{$4`H8@gr??P` zjU+C@8r~MhfFjdTXyiDOo8A1eFwm)3)+OQ<`L>gB5cnRzG%pVT$AFSwSJ z{9ud;aye2m9Rsj%WoEyjEbH4o&O>fPt)qMP(ZwMyQUmv#QZsQ+~T6{`LVV*LYE e(z%y3!hjPW&6x7I&q06b5}=`?qg<*85B(o1geS)U diff --git a/source_assets/ouya/OUYA_LS_RIGHT.png b/source_assets/ouya/OUYA_LS_RIGHT.png deleted file mode 100644 index a16b1d58ec3190c613775e4ab0c7cf029cedcc76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3630 zcma)9XHXOBwhbK&IR=Ot1R|lA(7PleB}i{V=wOfz5`uIPl_p)fQ~_y%f}JQJfq6+thLwx*9< zm&ivau7hb$krSQaxLMS}(cr;MI}dKQjg5X-G%!_~o<;Lt02W|Xr~DiIqj@&=-#5>M z{!eyh_Be&-_Uw7P&Y#N;ze9U}Iy!`o=Y^vxPpD5j?Jg}F~_BqS}RYkuG@_5B&!^&Es_!vV%w>K;d@Mbwia@2%v? zidCD81KI4={a$I)q5O3jMR4eToht|2^{RS0{fwS7E4T)t+{q#AO1^5>|# zcjY;hds+SwS)`XL9ZO!x4Ix(O=~mj@(M}T;s(uLjcI9Ycy}kWq%e@Pr-1yB$74h`V{SUA zu4;nb^xCN77~^d5uecbg04xX@#Z{0q5myUnS<|-dJeo z;!?*IX3gCuNU`wW9BY*jWH23ksygo87?@L7lc;9b;&eDF+rYgYRx9ejpg0%rDfbs5 z)M5FAti}|=q5HNv7mMi zZ^Q8krMtFGZx(uyrKAvNN(yh;D?9RW&0XO7}u2RSph~iznyorX&LYegPg>(c!mLck^xVW?Ey0bbo(rp#p z0Oh{_W!aZ|^ zlEx(5l^t77^WPcsDR9H$Fnd}emofgp#&q1*pMzuOwG6fEzJ;Gs%|E@5ys8grD5l~> z(q0IjCKz2Dvp$SD+i+`aM#>;})ZZ1ABnl~s1kSKCTxq*+C6)X!?7+S*hR?km_Y`^I zPu$VLR($((d*$h2<_i^tT9kp|xP(YLnx-ug%Uxbgh7HBsYNw@pz9Jn;(y0P-;#8=T z3@F4cUK!7sZ|gT6QymACgxPhs7y7!SQzs;k|Lkx^YaM;8As=fqUq2FkH#}N&{}jaroog`(Hokc`LHc zUsa&|V!eXTEQd17x$&0+UJXr;R)OC5#+eX+p>XHrtgzHP zGi*l6hujP4!A74TVnwf@C=z|RQ1J_*k zw}Td3o&`g%V6}NxT!}rR+L|%8S8d2=?2CFaD-yw6Cn#5^}KVEqFBiXhA{nbmWPOz(xvz)*vDD zc+o>FK*TK?udt7WI+?H#Do)^_;U|i9NkSV-wBj{9-V(Z${v&3>o43krgyn7Nxw;Jm^Uv`*UV z?+4!G^4rq0yPH9$eotk&Fir@;O>7>1r+97OF5EN@IS|H+_>@)GNbaW>7x)Ifnb&&v z26AH8V)0|h_Mgs$iTZCmWTo1H3QN$kTntK2SPZ*lPAP6CO`vGXfV>7X#yM{F$i+)i z4$8j^9N&Z$mx3Y7uA{M{Yy=NyU5#JkKn0;gqDTcNQv1D7xJ+xI+mFOSwgcDE74z7X zr%3GL7@cDaj0ug7nV$zKSc>ZK5T+}bzBBHm;In@X=d!8>e;WNMEzyIowle2UmiH!E zU>uA|LLRRuL$F=bz)$|_IUXo2Vy_+R3lV+Ae6WAWzAU~Z3Kf_xoW!dCrWzi&k;0uV zBy51K;=S{1;b;iA3*&qi_T;mmn5`)#P5k^Q#ipMzam@u0mTw-3h7(yVk+%>yZFei2UYn z2X925L0i6-y7Px+NwQQF42a1$=Y)zKBQHT-025*F_{X23hh(axwjO7Ml ztibbDjIS`FcCSCRubHC8bP<(IQ%Hl6LwOgi*>|P$Dy!D_*Z~~HCC05Rm$KjL&Wu7k zIUWrAGOr?|MId|~E}^RcsaZbbNMS1)6;@G*;0?@$$hletz219Cf9%bn(zN z>C7XGhonraBSAxGjIw*jV}tuqyxRPM)puxh?i$vhdo||%{=|qcy`vawXdg#zzDIPF zHJRB>nk+H%bJYoiy}<)bUW)e&D;6@30Y>`up3ER2WZuq&>lfqc9?RMm-7$!ejlOdG z#tIju5qQayf5ECF@KF#$s;hOnHtKGb>#pwr>sDumFjt8fOL7!vLN;H)UKmvnE04P= z$Kqsx`$|=yM%ZdDl+3*e8U3vKvCp&4q|I=ktkNGJ?(RoX3E`bmhrHyH&1CkkF|*hv zZ?lxj^NlQcg7M~34}2A5Wv3=u&Z(+hKj8hNwdM^6Io(HZmP>lS9_1$rbGJP#A|m)c zYe7=WvKuk)L0F3XGnQWB6m?2;(o0DpKPwO>9A{9?w3Z5K;Z3kH@1qJP;)axieR155 z`DPp|itn5nIsHEw9%Ph@6JSEumoo+8W4R-!4XiisUd(6k2&@(j}FrP1Tjtdxz}(TFkUOmPG3F?}RB zU(PIr#S0rN>{QLAsIa0)W#EPy#5BLz7Pg(7De!PeL^XHGN z$EL)2cWg||(bD$MEr-QLWmhLp&%NgHTHSZeZ3B2?ldoBad(F+w*zBYJKph0Fy#qi6 zfv!@}^~8vqei(f0Y6>tt^7ZxovbKg|JLu~Jork)J(F}PRZw%`I>!^jK;wpAd&bP0a z6U$BO$@0vq;byhwi27&UN9WU2vqQV@$cCEfa1RVB-3AQf3l)OyHdM&*0jC3nilOFh zz0Gfzd;tmnxUX+SYe`#Wk;^T;9P%FAKGZir>vG#Fdd;+I)SODAW`$J+oxvi^FR9Z` zgO0^h!an8VA+sNMv&bELBZrkLKebP|FWB($4a#t&_o4o*k1)S$YAQ?Q($=~s9}k-8 zjl`2!vy375=1yWQpzs%6O`K%g?{Bv-sd02J>sdDt+Lfr3@V|Z~zG;(|j*ACiy`zc4 zG>jUdQpUytV21EpidVyW2ZHIdFjW__U*WBNJnjSr%*ec}oPP;W(${A8_UA7(%jGu7 z$Nr?d;OjD|^W>WPdi~JT6dy?kFR~P*>6?S?9HKchC)oP;GikLh`oVy9DJVo<2x+?F zwy|hSN&TyF8|v!9x6G)5ZKO>}ZYp6Xe3yecKDI&FxbbhTlPY!q(alQwt&{E`7vfT` z?7`@x>57>qa=oF7Mmyb|fDvp?M)K{8yg#iS^WV1ZWshH_B7Ol?EYxo zjvPUK6q_qXpq=B%Ldc={z({vN$}I9>?Qe-?bU9Elq`K;oHFty%acY23uSUwIbyc8&n>*mIUaQi z8$USZw#iF*A3Bi`@&W>MfF8qtk_~hub4h;r`*@eoKd^l3bb+(J{K+#?3kjbX1b5p3 zgc~v}M(I{M5)?Y$3?Xi4fS60X&G z81P&TU@LOg2F4;3;@6u@J+0M@NXvVS^h5b|}}?Hyc;2|eo0*q$Zkuh$4lKRCST z+#MF&l2j*Yl~_(uQjlQ0nU6A$02jHYsABxX1ZdHRo%f`rd}!~qx%jKlP#u_b9Xoe@ z-AnxR)^Bm50%>-Rbw906zTMAh@`nBH+B=^X|RCd$PE6-VIAVY8yDXb)Ca3 zb$uZ5=3^BCQiBdDOEIv`Hh+&j8lAC^rR`G|Z-gAr;NMx0n5WaiR_Lx*^0Bp48`a8(7uV zVR|N6AG!JO&^P49(XU{bvSBYho${Iiz09+x@4r5*NLkvg}f(Xr++`Eg7@;q z2=m-jhVz?_XH;`0EFm#XU6Z8`MrkZpVqBjPEq~7>+3+RxdCw7^2I9xE(S?SnCGgvN48Yk{Z-qSD(qzXHACYKWV%z zycyPCX2k-+x6^QJ-SrNbAmZ=Hizg^tZ4L9PMv0vVee!P`r`i?v4I7QwqXl?!f?f`* zZ&cBfbJCH850P@q=37X$+wd~UjO)uZ@_11ob?#RElYN%RC?rF|z`3C)^w0cufQm*v zo%}0Ma-{P9&coXZO6lDqPpmfIv90_?72*t5sbCfnepWwexd}ZqfBR?phsnM-+An4860? zvfaVH(C#r#Rw2Jb9Z~8hC>am}isDM6nE!pB+rY&RKR{hv2g~3H@@xz~t9SJPH79kMO&IfP*OR|%F3ca7!IfC8+8VaSj-ESm4fQn)T%gU zR<3Kywol`<#XP)gD1ghjpjx?1g0rUa$;FY;wqj82U{aY6!ri9=zQ0nl5Vk+rvXyFg z8N~2CqSP6K*Tj_9b#JC=p5tEm zq-XbWcsN0mee?ymo@2^DDSy>2P9EBhy%ztX@4vk<&P`z#tw{M+p^AUuTndNZReVat6axL-3PG?&}bGRJ>HRrNs|HH=!0mGP+v& zbuvCBwab>&yVD-){9N1zl(T|BU;hQPhGK&-$7jXNP$nNHjxvfP>|z#GE&@HL+rf-V z^!Rx<@&e*{N7y%`d(IG-uTq&Ly+ zu$x)=EH{e>Kb281gEXgd^*)OPx!H{#{K)&WS6FD`>nu)V zN?4(dQk05!3}ZJbVJF@DU1jvvvDg4DDiOun{&(Njf=i=vC&BD94Y z2k+@{pepi2U-Z?**YnJ$`C6>qQJ4ITO^=iq^@QgzS%}5+BFI_q7NVt= z-ewQV6`k;mzw6gZbl9q~gIJ3L3jK($8TZ`cEjV}|kPoD>8lsIngNr>GMRSczB;|zg zBSCWS^n&lU(Bybq+RdsBi}^6`$j^_N>oSHMX=JQL-0UDfQ;@4Ii_g=cwy&Rrwg3w1 zh*vI8Pw!i^v*_k(?(8#=Zc^O%3W1?Cbb~8z5O_vQ%%ruz)+GQLiYhL4{TPdj$-Gd? zfsOe&E?|Z`1j!{m(I9pI$|4AhBcEta>FwqILaV8ngPwVDbvLfu05nLmEaM}5&$b!x z5j1nc{De`T6dW`#w6x?ZpxJo^-z!v9scHr4N6}fToMRWWC!si)&5@4jV3F zOvN7_M4K^*wP#Ns3C`2m0G5^B)>+@h^B;n~#55$klaTQ9p!vZm|6&xwzZ^w*g;D=^ r^*{c)I{ufxu8!aoexUx^76>^^?XXKcpONf%PL8>+|`(zE8f7-l=4gsQ{li9{>OlFgG){J@oiPl|jIV z^W?oL&Y?kr%$$M&0RE%@6&Ike7;f-@gwrp10tg;~Zk`x(f4Y~attZ{% zGUJse?(m|kxiP^$V&X@MwKugF-FyBzpQ23)k6M=CzsrT99+k>_w3JJk#WVQeCpBM$ zZL3#hNrDa!LzO%PTE_1conE3A)=Ct*Aa=5e#Myy%?LV{wg^!to79G4wU1bQHhvne# z)_3dKpT{r1)Cjz$5%^_kJF$0Sw=r;PuX(C%XQ1Ei=5eD8in90d^FYx~wi}89<4&j3 z)L_aXm zt|Bl^ymMMIZif^A(20(ErW(M}dB5v?s_CTb@m0gu`(OS^23OFzcwLW3im8KmMk|!d zD%D|3smg1c*ruzqz6{*LpSker_V0V{@;xWE(`WT^KDxC+Zb^HicpyQbyfC=(wJS!> z9FI48fE6lVSwZos!B=k7JhC4a76#Atz-#Btg9B8*qz6QX)G4i7t5DLBq~qRRDq(k* zE3vQ(7&baLbQEI`2??0X3pVoM?fwplIsH_)osDtlro`Jd{XD-%I~4&5xixcGp9wy0 zAe->d=XpN|_WxGc4 ztVCBhwfCKc>@}Kt?B;(7tfSZWT3G;2|NR)?;t(}~3((Nq6 zdgs`PHUxw+T-8uZ8u^Y&@M!+(QeM*>u}BI)9urVJ;GRksTvCdC|6JFo*u7Ce%_)&6 zA(=bA?(Tzk%3yAUh-f?$!D2|>;t{*EFI-%e()+$2X=53!>X|8k9`KQC>ikW^>x@#) zM|G_ET&C(QUGDJAxvp{e_Tiat&a-2Yh&*L+Qoj`o`+4DR2fXP>!J62Yrbt}Uizgfm ztw3HHCSh~BQ&IX`_!R5gK9IyTgtuTYW@1t@LjT%wJzHK?%zgCE6;~C#Gge#ZUd+Zw z*mDN|JljUzDsjb8fE$AH*4cJDDAV^W{tZGd)n0B}4?rh_4Xls@2*_hFi-!8M1_g#} z%$aQz9Xa6+Kessh=KMlEzg+Cy^bhq9)5VU@J#Ay99?cYE*NKP7zYMmr-tNY9D87Kl zeJpx(3capsYlX!2YjJpwcbVkd{;)oYUJno$O8A#Tk*6s7bgx89)^IDp>O=G=yb-?$ zeFN)n{$bF*shjnSHsX*siMHIa1;*~^d152XszDlYN3eEUJU8wPnW)H*!BLWJmKf=V z#Oj#+#*6#0`i=mI7gSZ#_B2lei)B6la0Fkw7Q`}QdW~B}0ox2-VntP4n=O6Nzk;N^ z{oxh|BhxhUfT*gjXANN3;AN2RQ(txj1l$uu7``_D@~3Q`Wf#zCMtD;5%*H*xg~Vzy zO*e5AP_={1#rA7*zH6_g$cURi#XYhHceg$UA2qruk;<*c_hm|yPqVcHXyc%~7EW%q ztL3gWFc(Ubxsa*qrn#bUr|;OW1n1ihUxDO>-N((N&l2NIE^kjhV!65%g}Gfo+|%sj zXq1C8HI|0W#B?X-e??r0{<|wML_``MaRX@1eT2ljKUTJH3U2u(Ra8->M{dWiyjGkh zPOx}m;5w-Q1-}MkNqh$?(g~=)~ z)Eqff?vjQmV@rb9KShYMyH(i8z5i>-`)ty!R+b4^%VBhK6jc&#}~X!`y^okh;vv!Z2N_FxosM%s4k#BXrba~$jY8X_fa!Nz>?O^z`uySyT; zBj0eQ2B`it^H0Xlgl-glTp0K32w^Xy=)5*zNHtoqdVr9?oB)Wg^Scu>^X>eHnr43A z-0euq8eX~xzt))v1{}xBb^4U0{bzIS0mYLC`?LT|*TD@r(>|k|R4qQCq&z{n+iG_r zJSH{cin7K4@aFg*T%_W#k>5$vGkxtX-vHdA@mKmyED$SRJz}gxfPJx{}eAv4i8BAVDq_? zZKuPZLcfJP!DYuco?cG^E&gu5tJGCx$@7w;BrYm92Wl0buJnrU9BJ=Rh~W^~@ViAZ zg|~82$AV5|EM@uF?tL93m{D&5J4nXOHxXJe2d&KF25R(!K0J$hoTzcHjo1>csQ~*u zSL~9^lXB$E-+mGMCU`yiECv%l$kXPqw9R<`j=V-kXXhUMB&zGDt|jdDkFv}>kOya0 zxRPB*R@we80xk*F&60ZbRAC7KnS@U{0^x36=zL3HS7`PqrToWC3pG?<%Zaz|LZwc6 z&}l&8%I`=gF5~{V?cf(m0=5?ivXc==$5`Am`=S09X5;gJe*TPF^yE8L1K(F3BERnL zp+kc>t71G-UbY zE-sM8YgH5E95e0b;xUFT(|=xLc&>K4%EwC$JB3-~CG$pM8K`xW9M|sVi3z){`%Q}Y z0>(}&iJpmX_;D80MtU)Gg$4kY2UGkl;2p?@^|40ju<7F+6oZ{`&;nm7mMGm2T9@!KOCQFk$O9|)npnrjfsGw zf|Cir*s|Yem&R;H)*S|+(iG*J%legoj)sQ2Ht#wyv6X508cSnQ{!HeB8T22~hIY3A z%pBioX8~YGP|)N$Yp?P<9uGz|{%*W~vq(LW`f7RdQlgYflGzMoLn)z|mH5a7pQ`6s z_sHR*(9&h5`zqE9lNnYq&#Box6@u#Y7a6xGYrfuO@%m$*gNMN7csL9uoRZBmlk(Pr zCT;aT&T=wR898|2H3w80n$W=>R2YuI_JQPy;piaf!fKieXXErj(UABDqW;fmns<;y zpLRnv(~Tk)1-iUqIQ&+a=2Wf?$Nx;Zb1cq9o(Cojk(ut({zBRl+dyLO|N87(mJZEm z#Z6uW#%TjR5jDj@%}-e9D5KC5Au~lghc$po@lY3pj%HLO-hVL(~b&zMJ-K zrOMU3065IKmZwcYs!|jb*U?edB@+BwSD3AEj^Oj7-ZYDjZ4@15wwulCkIL|DR-Er; z#t_`q?tfDg5?TQ(4g5`O-g$=Wg`<*IHL`pD$u3)PoMu~*n7?%eV0vf|6ou6FN%+bC jNgV$JSY$V@ae)DOjyY8Ub)1<)90Qn}kc?}Iw7CBO4WCK7 diff --git a/source_assets/ouya/OUYA_R1.png b/source_assets/ouya/OUYA_R1.png deleted file mode 100644 index 0a7a41967d150687985002ff78ada8694b8e5297..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2275 zcmY+GXH*kd6Na;)m<@su2!<*NDo8{ENE1*>LI;6})M!E{^b$H~5R@w91A`(;b%6vB zLQ$$gDWQl9EP^O)iBd$QY^2M_dUnt5{+RcjnRD;CbI$yDZi=;)F+W%w3;+Q5O-<0Y zhhB3Sg&^KTtt5QvI<%jIOdLZ206yVA<0n8~KJ2h57KU*M!v=bWMG!(f0Q&BMt{yU` z{sb=%TMvSJRB*3{4gdfOGDYiOiJVw|WN9Jd1?!ns(*=hpPO$h>k7(j)a)QGCBWROU z^^8J!wW>b~yUTU!dFawkBfzQjb;57wp(cf<*e5~@rcUZYZst_1a_k?pw9PNOXU!Ap zRO?iC)#|igTvsVt$z@L#Tt4`^dr?(5waXP;X#F!BC4&M0xn%yf!~D^8T zCi77KvYX5w)ej*z1RBtxR++pM;+d8WuKo zcD6G$JyYVTANlQRX%B*u9KF9os!o*Vi%wF9I`kuj8!KLC#>H@GL?W?!_^1O8XG2HQ z6`Dou_$WLLq6cC&NIHG#Qe0_onx#r6ye5T7B9Uk}fga`=XYX11pD5pu^g zD_|-qEqCDYg_YweLNGrcf8V;kF2q{>7*Ygu^lr!+b0+ISXGl{LoSS!Amft`Wq7fw~ zCkSJ}YrP)8$nb}d2w9W}qZ7A1wXBC{nYao^Z!~>LXJ%14hp+qTH9qQDZ)m;E%n};D zezvWPw^Sbv8q1j;rr4$1-J&U%7b6+WNNt3AE?w+$XwfStZ{x@1fLu87N zjN`bw!B__KT-H+5{+$z29t0%&L;?;Rr1UXg7 z-7taCj$+74+tcU~gvzeOLHCDE5@a00xwqne!9hRJ0tl1LnsKXRPJYh{;&xkiD-LS=~` z!pflyOe0l2iFALy?YmDGd-Oo z8?b%z4jibGlG2mNum4-*xsotta?-i~_7sR){VJiU`0jpU0JDf`?qk24L3a?RywG3) z%}aJQmguFDl4)JncrO}gzJ578)Xm7#Fe!;?*3v|22U{^vNJx8MM+0b?0q#He9gAZh z3(37z!E~g(^b24Y(E1eS3^|~DBdBNSD+zbq@#O4peN0k`R@31YK^pTT`czl+Iwuin z+t#z$@6G6Rf9p>@H%tzn+18)lySVBJ6}a=NJLLlm3IhWdtwLKMWadmkic5$lUL6G@J$Hw?4Aq;YD!kO`)cGSpgaX0qj@w5Oq@D2$uxYpbSQIinm= zU-D%Ubhb?O@@F>*H<0w2*$HU)W?#(!Gi7&FePNDg4kW#5v1d*yIo=QUEAO^_iG*QU z!l4uWwdtpW0ZIQL`oA;%drYA0-$4J1<^NogL5c7m@Sy-YJN44{iz56EKPUiGj1{`t H0H5%Go2LW{ diff --git a/source_assets/ouya/OUYA_R2.png b/source_assets/ouya/OUYA_R2.png deleted file mode 100644 index 2d000a6811c19dc270105a4ec60a3a48f419bfe3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2764 zcmZWrc{G%b8Xua*(w46B)wxHG#o|T|g@fr-K9LF!ogy~)V2@X>vb24@su@k=rfU@#Cyga0r5e+K-k5p`sx z?S&VSNPM|P>AxobmC|y(=9}3gZq!vnPHbrc>Wal7-h+^>n)D^awzqMDvGc9jnE>9R zJ9M)U7+KnXO(*5&xn$JNy>Oe?`{^#3?!cmQ-%YLhAh~_}77Jn~Tx^v^;B>m&=xlE8 z=LynS60ad)W3v!7*qrk-F)7Kg@#s;LkYClSD{WRAhtAKE2DX;J5cCdXGwF zz`dM-=~GXV0a&9F`@0$hGbnNW=p9HtfVd3}2Xq-xQHa~MiXl@UFh~{U264Fzcn6(4 zfO`UKJzdeYd%oqy&c=rJ3bk~=UQNn)@}frDi=AMhQ@Ih-6(^{yJ}jL9N9jP6v^r}J=6&Sc0R94XXe7+Go(Atw1}9th@Gl~e$;Y1h8n$^pV?(yT-kyi2gb}zg&sIre`DI6h* z1SPqmAzd@$I|ft~SmgQho;L)!DtCJV0hx0mmzO04=)P5Ny#mwA{~ zeIWkXhY$Ub7?@XDv$^Ey>9S`efqTwh%zi@~(T};cKDM>STpT&Rqxjm)5;ta+mAJ*L zYrP|V=*`H*1xI&=D-M!Elj$v%JPwv|25H`RgQR}}v zw=u?&mVyGd<8B8W0Ph4UI_n7_p^!#LHbAA3C1t`yhL(d>F)d_0=g#2SH@*N{41a!J zS#ui{SrW|aKE)`OatT#1w}ReaB3Mx#PKvvo;)rQE_^PbqW}WN)UO?_cA1P~E8!Gwa zwpj*>K=}c9=H2(&+M4k5;|f9WqNGmBukt{F0hDGOQ9jYBEK@6JWJ*X~^W8Z9HZ%N4 z=gBJr74&b)^?CE$waLM9&nk(N&T5$E?a|W!8;R~!*DNNvTYbBw`^<3<_CWyvQsl%e$a8_*O}DP45szNGyP~) zq4DlI&ztbWx=f9s48Q{3SMsXP-xfL<#QlJbmpEcVJvH_Vi`77eVch|?48z%fh6Zqx z?03fc?LLSzNK{=UsFm>!f+BgLlKSwpxQgGg{*qHV)x9y_EIm@v$6ahXo*n`< z5Q{vwp5pEg)@i9+Xk|1yf9mz0uX1FnEu|^R959s?*QTtcP4b@Mpz0IBciVSO zpQ{)+)xM75)Ys7fUlKta4~ZVd=yZoMUDV#&QNGk>#1lEv{@MR3NXm>1TT=oP`>etc zPkd*B2y%MJY2B$zZVdxDLbR0;l|SPJFD) zVRm4?x&APS;rMeGjGqrLbWTryo=6}wU96BQ6opH37w4mDY4G(TQSG-2rhOHo>Od@} zScp(+SxGtHD+U%WG;NJGGTApDS-y^rbi)ZInC~)@5$2+|Lh1%ti9l~?eB{X1Q6SdDmi>IH9Xn`4i?hl^5spvzq4hz+jG@ALX;2^c-o9Ll3z)V%U2m*R6?MH zAae(Mt+Ou?aX>FxPxR8n@^rJfRkf?|*R)D?JvV~^={OYPtIhex;~#374-Z{EC^Rkg z)wM8vjf+i274ww%^JH$4Fy+<7QBsxHwuF*Ddb!Isx{*OWZ*w*qwOwjdPUC6t=V|Y! z29PC*l2Yw)&NMa^Cuo|Y=vv)!wChECLet=PYov<0ti02FmiLe1ERSjEW5CO;yEwt_ z(n*_o7Kh_VoE??$2^8D(00aUlNvgX=5+x=GjjC8*+9nx@RsSmH+>|u4MBY6-mJZO) zrbUmwDibQZ5v53j8`+0f&XMJGTt_`}>{dShiGs`@m1^r7PvY&ygyd$3RmOGwQ{OC3 zRnXv_pS-4NGDl~rqd5LIswHfEzUKUs0jFlIzfQE?(w5{8bk zPIg_2WT#8W#ndRA4#p11W-(>XbdwKTZl+9+80eL3r-pw*hx+)mMX%>xFg)*mGV`*m zP95$*EaDc)iB3=tZO8;K^;xHUUw*UU6f(hi9fL1lqz8e za`lKGfpZa(#IwC#!Mt)`GJ7l3iLYRfJfQoT>_FtOjzryAp m;H#W}g1^1L`O~<*zz&%FGJzF>W~}g)C=9f=wW`E;#r+#Ug%*|o diff --git a/source_assets/ouya/OUYA_R3.png b/source_assets/ouya/OUYA_R3.png deleted file mode 100644 index 54f9eae357e61d9dd3db488665d53bdc8892b1e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4263 zcmZXYcRbXA|HnUfoXr_$&$5*jBE+FMWW>qdWMpJrMmWw@GOx2&c1E%?vPbqA$sUmv zA}1>uefxcXzyA6?9?#eN^?1Dhcs*YKzTeS?`dYM998>@R&}t*@82$Cff0au?_IFNv z*>w7Al#dbSegHtt^gjXt8Ch(9m+by`&HRnMANoJB_jLx;oV*>J`LsRlU7U@a?VW;r z2Aq`vfL>Pnjv6v>ZpYgC9`h`>DhDrQ$FXy`#=xwe)+66ikN1~U`AxkR*_C7a>ih|h z0Annx-2H1vJr8*nDN&ST@+0TZNa3S}6n7O3XFxdMdjEwsSLh#PhWLMwlxY70 zG*S2uzPi?ET$^&cy9^6ehd<~YfsKcP{`ubzACrb1hGLM-qy z9;LW)>zcxK-GkoboA25L%4R=;TuJCmvD4q$tfT`Tuh zX>M$Uv#_!Z3~p1UXQ#`(W4|Gzq;c8Yxas0L1W3EVg{a^pEnbq#^Xm5pzc3;)T2Y4DWPeGx*XqPWJG)d%b#MXS6)1 z6fQJb;1P0rJ23oDNkv?i@=-L5nLXu!sp&vP#1d}w`LhLedc>-eHh}1klpUSgUHE{v z`hXH=i9X=RrAk=wF)=Y+ou7H9xMN6{3*zaDRLf~1eJti-Wfp0Hy+bvzEsc4zl}|bb zR3^CWxx2d~mWDHQD4iftoHu>Js zydnR#o+}Z(PRm6{HG6-yw@qH@)FrCF!Qp65*Lz~BOFs95V6!a_AW1KJen{dosy`wq z;#2f58{`#DCt#c}G@h3EC9^V=p1}dBh0}-|j~=L6zBpei%_oCKo!aNnm>7n^p0Vm= zr;ts}D+g`EL?K@Hpt27#1Co zjedJ|J;LolfX#>Cio(B*+b%BTgUXO)T21CPhjKM#Ovgaal#u`-(-F!k^7_>q^|%N% zIgg1$L-Fvx4OV5kyP*Rz8@Jn$Ha7Zg2VNDY2R{}=5T2f%UzYZNA3a+At;pEn{%A?A zuYWw^;>^rM(V5t4(|fxCL0XwD1(_{>w(aER?2K)BdU}-@nxhix&~}WssR=zp`EC;J z$LE66h7>;iIXOAj1TVWZcxOUcbX`WX`K?{J%s(m;bv4nF##lw=>q*$LV|qcg44^k5 zED*iW8X{a>24iL+cE{OPgAoD2*`Jdy@33R|CV`(i1_qHDFfhy~|!+nZl zxl+DJUM^9O1a5f74L{ih9*=0rc`&`WQo8I4ab0BH_ATQkTk`A+m|xR%G2xzhU6i*Y z#I}Q1{<7yQR*@``N;H&$cEmq`GMgoe&&KAu3b}UFld_kOB~|TdgDu+G*zHeK;~{Xd zOVMLd>ND7Zm5)+^-8UeS^WvgMR|4Ia@FdN&jd6EleMKcz!uI&cdKpS$C#KIl*I#D9 zY|bi0EuG7$XAmwpT-+2vUV1>CvredTPeN_=fbDLV^B@_(fs%3@b*9urmFA1*E$vUH z-WvSpH%(Qro=esYR@P8fY7ANE~|WUcc}ZzJF@@UB{?gsmSMn5Zl%Cy~-&y|2qx zadr#gJZT>stXS{V@kZV&Y8>EFF(Hj3??&X3z+s*y;|0&5MdfCy%boT<2d_dgX+xF2 z%|J-=DhR$c3zmd(!jMmXARavuP3NI&2Wv00m;*luM{mKO1_x`T3{N=wF)B0d24aEV z9W7@mM1MD&ymI8`j=)0<3kX-)5q6q_Xxwalfhw!6QVEP5ZT zg=O9BGp4=YYebj3`Yf_SUZAXUH7EAK_eR&NSdIef_6cymr9CE_b0tYV@MRd1O@&E- zc#Q8lFm_l;&&<7+(iNPydTd)|Z^q5@y;{kD zz9OyPd*C-tU20Zu5@crukjCR)50YKR`=?KT;|mQNG~-f%*r@W}jO}Nf{~~!`myZH; zHuSoMm;|#aU{GhMcbNdgcs5Q>c2Fhor>sr$^h>ArKiGsSN<1CxrCcVnr(`}1NlFe< z{z@^oh!ngedpK7F0<5;SSiqpfF47gE;e`NG2k!`3Z3Kv>NPX)awej&ul`iHbdM+W` zu{*Y8PU`ybvM^zp=%P&c!F5wh!vCDXR|2+1L3n2my5Wlk=@n=ue$o z3~$!$#?SUae4cm`6o$lO#}8Ypsp3X@M)8ddYx(7OXkZP+$o);)rfTr!cn|eXeo7GL zWU?CkBKvvlpS=Rr2BwFmUF6W`x~Le2sp9}H)szDGTRplik3jkd*m}cd3hs`Ui-h*m zqk#PAw0RjBS#R=$C^L6%7I+C-#nLjcVRaxg&2VK*AYCe4e?2cVlDzGRp}6mXAi65Z z%yhvG-z9pyW&Cwa04L=ge;7AEQ52w~w_KYCo`*LzuB+BJe2LH{%&##w%h=U68x_Pm z?kaD|$cHoU8x)Z~IIwbPlJQh6*YT#MNlIJfT#lG_oc|!d+i9>4+?+|FdQw|xd6`>-q~Yen`+^DEzT?#mt*zpcQQHcT2*@in2R z9b-;AQj-X0nv>~^x~=!sk1kss$QaUDK!GP7s7l;pI#q2kbne@__%CU9l%OA>&<2(k zN6bFIo)9ov6B5DVEe4@)KJeYK?;RW`!b!izLIi@VwF9p(^v3v5)BUc(G{m`_D4f4! zg?n7-xkXVHuakf6MgRB{SfWmkg0xL>6CYSoH?0-fDQwOO)-lNw;q^h;E=QypLwcmW z3`;4{c(J(e!a;Ott1vF5>2(OtFaBDBP-R_?#1wpxK>h-;e6!jopP9JYf-RiYj3r-P zA>DkCHSKh*g0i#L=%u#VLRagR`q9TApOKC1hi*6c-dtl3<*yQ-*}d(>=Mx@FvdWMp zpRjLg`NsV7>2P#MZ9VH(*K{~Ac<&*;H2iWX&+A@uO1XQAn_XsoDCM@P@Y!h#e<|w_cy~gzIh2jJS=PEGfQ&Mfo&(tCxL6XQHceB?& zSi8{D%ECFOj)lf#GoS7PVZ}?5Ww;Gj@YV9S;C$0ry7cSEhyoDRc+oTRzE7fWJ2oyZ zV_YO~&d;M@c&gq|YDs9@HODy{2JbnFN<7mr1#nB^mjdavz&p8dpZByTTQa^(zhj%5GCr|xUleR4he>CfdEZNEh);d8>J z-{YsXuhA?oIC3UmqHtvBiR|0qUrbSu?BLf>+FSSXefClmK>l3PKZ-QX$;p`*3k$jM zg=N?AeT_hI>tJirsM^N~Wk7cNXF~t|0gX`9tOia2AjMz0gjY7SFPX#9T?hBSj)M$||3$6q!NYhQ@+rrnSQ*q3T77CFI?f6~->M%IFG5lYAg+*& zwA`WMldS494re{;WV90QFIP;YkA7qVY+Uz>wn!GjS?Rd#MOm|Y3vYR1WgAhl2M&z= z9jT00x<7&{wS)q3077j?h_J#!`mN}FBNiV!W47=r5D@Lm^N|(55{KO3qZ)S}5?C|; zFzAt+YHC5ykLz&5z4D3H08<7eb2GfHlTh#R(ifv-=O@Hy^yPykeF4!I{WsU%#=sxu zn@xyrd0T!IQH~zi$lY=b`Xo{GbnDCgILguK6@Q-{~ zzM#H8r%xHEgA^&ypPyx8h)U@uIa3i~Yo-WsiBE;vB#04{baV9>r90K$HK*9Q9d7!p zqb8XJ(Xcy@J~`?a(5uJQ^Q+3e8gbIZIlki%CYE>qHnt0iOK(d*|TY& z*29$?#$G{(>Lcwq-RX|tpJGj&5M+dNCQdqq4o6hVF}PyT$o!^w_Yh~3qDQNrg4e@v z1Og#VmH#4HD};=Zak1ta)m;c5N#P`eHN&c5%78rgieL1qu@T4#Sw1Pam`j{mg*Dz| zL^^kZ`*DMsRIUY115t&}ZmxLOF)9|g+I2T^54S>Z`CmyA>L83oRxJOsYe9e<^ML5o k|GT39-qK5l;UF>qUsx32f4H{$_sIZg-_^hKPTel@KQLnAI{*Lx diff --git a/source_assets/ouya/OUYA_RS.png b/source_assets/ouya/OUYA_RS.png deleted file mode 100644 index a9a4b4eab40acab66d68e761a7b218316d6ee142..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2546 zcma);X*|>m7svm|USSxCWXY6EC^FYNNi&2=DaKxw?2K(PGuE+8wz_4zWMs=e*)B46 z4Z^jX8OlDELKs;pOWjA$^V}Er^Lbu8FV64$KIeDNyYu23f7{gX1fMt`001Y9Zouyx zb-$y^<>5L~`poi!qsHrZ!#WTE_=SHK8<3eLb~HSVL0Dn#`nqDUjsY&fwFkaVF49Im zj&3e@TpSjt(P?;MdG?6KgMSd4myWy15sG;5;D};B`tBJ?CD#<9OMiyUszTW67i4m$0? zg@rdZ&YLfb7k^KgTPF4O3ISegB->62lD`gf;dYV zteW-k_7<^yjRvo;OFF%Y;zU()qcpX&WDN`rI=4R#nQ-b7-rc7GkmkqSmCF4SjdB`R zb|Chi?T>?Le;6OrelAyjS%{F$V6IFT9qc856+0`YbL6tn3q-aD z?7CGl#uJ4vm}+qhR=N#k$D4F?%ujBAq=vib&GgNbaV;-lG+*>hjWR5%v?hJB;-OnT z%Q%F@`cRAwwLs9H%mt{ONV9lIRhC;zFLLF6s% zPP!h88S(TMEax~L{WaXJSi^6VMyGB!(IqFFgrnWTxiRC?_r81^B4F*f6dAI|G;~4v zMfT0|EMKew+am;t!Bu%Y4)yXb2{5G3qYSS;0Zppz_40G-XIsCl*r z?5$SjPk=|y%f9!m9&vU)lUp%;Jt`bQH3?}~B`srE*}AJt+pT-`&tc<=q7_%kTuK}q zZeCnxV@$Caq`b`n{^)atCHf?`qz-W7=xVR8XtTtLX8&k$dV3l)1F7_wZ6|+_w{4eU z++DXuov4(5~+?)W)KAP7e$W zIQ1rvcai!syBZ&|dMeX9lcg%|e|;^UCSId|7dTklDEaFhYrKLuc+-e4x6Fc!N?g~~ z<_jTFar17m0_51)OG&7VfV^o>DjJln1eQvORCDXx*{QAD#ssc0#_r z8SU_7nHZm39#mELurS!&1G4S_0c@kj>Q&Vv`5H&_X$cXp5HB+eS|PlI6K}X0&2BH1 zmR9%j5+YNSP0hA`EY5Z(wb7=U`zQ9)E4v```k!Q#|1`?;X$t>tW6kzdi3u^k8`+-) zlr2~rpGu-B6faDCS&lLCRUe1LfT~|O$6{Me+Z8V$a9+D*6ct~yDd0say4f!{xD4=x zHpnK2lSZ%n+Q&P5o4vKAxZCr<5(z=BfUoVz4!J6ZaJKmj4R9H0g!<$Xg zACcSn*5L&u?62f)SKKm}`%k7y{_w%n3Mv%8=M#F88Q#k|R=g5`VV6EjE+v3ZTE>Di zksD^&cSaDx3l>Jb|FIiwFlNL7K$m3^FD%89gmC#&Q_H31C;8k>*bcb0-WV1|g z@v*}eLcw=_YnWWrd^{MRBzVx-r@kMmyeLte5@Jh@CR?YkWUM5oK>xf+)t%arG70hD zey>nqARcUQgUsps_UcNdKTPyn>=xdCfBUXFZ6j}vY%mQSbgNlZ{eY*#Th{W8=>s!f zUU?Tu+xkpn4&5uuu7UWTUQlx))KasiWsMLt5ci$?q$mnPX2Xq*{}$)W6!`W-W*1jS zp~*43*sDa~uLN+1i@kJ%VhGBo8dV4zgbqtRcU?j^1s{GGs7}A-%eM`$T@o_cKz8~| z`m0>!Hd#BB3GT1ju@j#_P>?%Sb4;52SX!SGx0OOw7&C3Fb@Fa>xnN0qZj#164Cj?@ZYHa8PT!Y9S4bHkh3WP~l zZ@_bStdq~^Ke3W5~8j%A*xs^U^;7kM@qdy!?;Fd`E z=pe;Fvy0v%cG!099pc#R;vddiVBe?H0~SgF4a;Yae&5lTsgefPc5PmBSzIN(l4ieC z)ZWre@n!*S`&yc8DA%;pzFs7N!W3Si H?-2Db7eAmZ diff --git a/source_assets/ouya/OUYA_RS_DOWN.png b/source_assets/ouya/OUYA_RS_DOWN.png deleted file mode 100644 index 5a25f334d68c67c8bb6c5d3a39775348e8fc240b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4095 zcmb7{c{CJ&zr`6tV~s&X_7Nr|3868QZN|O~F|x0TgfSRVLkPtnWH%ZOvW+Cmgrtn6 zv9BRy4=Eubzur6V{qz2N-*fKwp7S~9{(o;0cc;Bg_j%=>^wfx zWpU8omICk?0m`NHppmKb(0b!1sS9OLi5{_w>}Z&1IaE#ZgPo(N?x@|ns7l@Nu$4DC zuW>8hxcxgmVJln9a#drnqVKqsHz(gu`us62E^=&{$)CJITm-gwIE!Af)IdA0uPaDR z1t?fy!N-#8*|B{hmE&x?0!JV7NSS z(EaryJwwjIIIV|EtR`Q|vKsm-y7P*+?CmQ#HV~`PN$1wK8X!u>ib~hy;<^Dj&l(YbTk02g$E*w&gFk`k9SHLIBO9R!>S`9^p%0p0zSt5hJCIDfWbEwZBv#JW zuIz2zs>Gq;odZ$6Q2|UrYez6`vF?uy4tAfE$6agBq+EB%538T*4gomV!wVV)sKVv) zf<4%iY}$K3-Z&l1809D%o-M4GUp)yDNZc+1<*ZOUv2KDnb)Y<1}atg!bn(CbyqOV#7e&A+o-?BCj02pV7H z5g&(9W?Dj5QufxU@|*MXdb;y0#|B!<+!d`~W#blK^H&QecVeF|z8lkV!JGH*U~BEF zz62Dn-}x-5gEZq=xz)ue7z@3kekHwN?5ao?$L!wPWgmKZD{Q5A7h7o=)8i*gp#362 zejU6$G(H9N5<@dg{Nq5tmMbg`%~hMWr6eAj^%g!8MFInIewkf$IUH?=uj0kgyh#-{ z8LY$V=vpjP-$c(XSk-RG^TFkq zgiDX*l!zS;T6O0@i$C%G!+f7^iHH@l~|LfG~Y{s$hm7 z^6)*D14-V_tQF)G1U6%2deUHJ-6WIjqufUuuEGsxz%`Y!g?!VDl&2D;CGdgPF0zU1 zQz-uQ8krsI z3{~qK^ch?Gd=w`UR5Qw%lOcByoon@{Act&ytGeDYq5p%PQwPz6&JrZ{%X=!~r=%Mw zdVX`rqaaRE=o$K94ypc06dUZD4gM%K$|xSS%jO!G^A;cH^pbNsi?6oLNWvVMi^l8= zjdIzbDlEr!d!anyg0~$xRHbdp-vP6A4*cS+%}X#=D;IK;L1w?0Uq30~O4WZ7T{R6g zm;@&IMZY@vO&PFCQ~Nu?@^ty4_|V5kpM`$mReWm^!u8F~RbbKj=1cEn+s}b+EI%yY zt!&@h8-8v`FsOyEHSdf#N7cv8QyTxf-CZ3D=>*tDCL!^=te-ML!4Rt4}neA+UOYYtDriA6- zKHlxi6ASVV(Iwf9@Q^0l2wZ;4=eGmK8<4P)=P3RGd3;0Q%n}_Hq-z`?K4~+ER+I^yv_DGh3MmLslm3!I-b7hMNb?L^x$`* z3&goQ0dLT^p5`y_N69vurj9DSs6AetLv%zmwwH0BKff$mid$eT^Qs zyK#_E{5(IgqzA-xSH{5#F0PhZCR1!JdoT^(XPk~R2R1JQ>C5dm7V7Jy-(a?ab|A~N z4oCs$AtEqTz$VVm#-KOOoX7l2_nT{*x;xE2kM5mS2>?waIjQ&NDWj&&4=RTZzbDHd z3y&qT+dQ#PD|?dv)&13LcwqtXK^XhRjQ5Q*eZ8t0-(MchssI@v&?n6igRIn@icFmw z=T|ly28)7m5lLQmyhA0436~Axld-boO-8lfsV%+`gy!~+^l!jcEChrVnLfoc${sq{ z)%6H@W}JignAdb~!<|RWjnNZY02w&Y_d4i%PhaXKk3E<;!>paaXH=^Dbz8Z zOJ&ExTl`-`zo1}FFh2`Rhl00^DMxlrIdfJ6~5dK;ihW|x8+NgSSo!c@bDm@6^FohDJVDc4Jk` zumh?J&Q%1x%~~JoAqY!|4jX22SSKpskXFha%E1E+A1Cz3s1ozQxye^PSy;lkqYYMK z*x{a1@P>Wh0uU2b_Mu7+mmDn(9oa>aeyH#bcu%q2Tz~uF){G1ZVeycvnbFZdwzkY#@%;zAiyXt<5WEc^s*0*lf zbN-E_r5SWj54!pHI1=Xep-o*?4fpxph;Y+U+FjEDOn)f;^AiRYyo&dmg8E+4_DyPO zqWLdH$invt8-&@JJ*b82WTCIH=<1&#h)3JXNyPGD;qr2}Q=7?psPWu*)C1X8TD^lb z@VqRcHXwR^7#IG#U1Vl1W&^1yYV;mh18EIa`oM3=pVq#q&jLiiz{+-&$Dn}i!r58rLpgxmaJFgcPJcBPo2ApmvUwh0 zQSS+OiI<2VPsS|6l_>Ea14;pfm99}66SYmb-G|3r_vOu?Wg$|&J-b-UT=#hgTD37? zJ~W0VS&@-IR=5EQuU*m#3`toco&8rP1)?bCRzG3N$vPAbg$Y6_*>&bLtxD<5I|VL6 zHM__&8461W?@E2bwy77Q)!c@)gID;#?z#Nx&jgq6lnM@-=MGOYI=s?N#ibG^lp#4F z`!m%e9sZEj86F2i-jx78`u3Z#ZiR{?3Anxl3hr4b5KKM@39|D(?UIeldLF#I@loq; zMFVdKOh}7YbMyHbaK?4wDX=Yb=rv?X1rGJjURG7Rd$$y+7omg|c_UC#FiYh0+Cz@ zV>VW$NGJH7F3BfKooV$q3m1OA*be&OaiC z>WLkYyhy5iVX=L_4gpvB?fiD?6pFMy*NVRRHaPD7T62Bdb_)k*wEdGjYoe^Q{eWs6y0r>9-mGe9BKp=D(m=t=#r?{lGoSQTZuVvz(3mRUb9=96!y}tT1zGaZvL-qtJxRo7WLaIMT|Kox`(7C#n9*=PYC1D z^b+aaJNwTU7a$gOe#hl1te-poap}hI^93RsqG+@9RmAMB{D!kXPz$Muk!Z$@C~Qg5 zQv$4{z;cEQ6A$Pm$FTz?&gGmXG6*Hmh=)DMKx|+XB-r9bAte^Pf4Z2}K$r z$&9Jj@n2rh{MbDq>ckr85av56*$^_Jh4B7hI9NS>1yLMJkCvWr96&*E)Ragubx$-z z;Zk-Fgl|#fLQ=cr5XexA*vp2-iw8kXK0R*JShS(#(-qaDm)TbJmZ$o{RBxPyp zt*wm_;A WLNncLq3qvyXF?g6>sMcQjrkApVXT<| diff --git a/source_assets/ouya/OUYA_RS_LEFT.png b/source_assets/ouya/OUYA_RS_LEFT.png deleted file mode 100644 index 54a2b6a29379a4db1e66b4623f22f51c3f22e3a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3986 zcmcgvXHXN2vJKKnLNB3+QX)zXT@=M2EfndHs35&b7wOUwFth|I(xihF5ilS<7(gIY z5$R1j1f)m@xqSD{n|W{M{=PqU&zwCwXZGiw7`;d8U^*^30000+Xs8%mV(ew*&`@3W znU4`KE`iov19gc&mVb&2ke&&-9CCW8BE1aV?7Vy|J#7JS8#gQ4>j)Q1ds_orOB+9r zZd*kFfZ-ZK1#aX!LCVr{HX7yp#&A;$Kl8K5szK@{yEpVbtq| zCN8hJ=j6GIOT~H{uV4$oJ3}kO*tKRVakL2&Z#Lozan*i3Tf!R|>~9>9{MnTEw^WGC z#+dW}ZA2#7im zA5J$_YejkQ=b`~|e zwra7kFp5g0!hy`EKLQ?Z(H_zOO>qTW{=&ScVBf#`qmKpMH^!s~w^4{Jl zyAJh)u`<(260=F{nWT^#xx{V1=bChJLw31|_K|@z{WrW2HSeCIEHZ@|e3SUVtiEqc z_IHC|8R7G7tK!n?Xw1>T!_7+O)TP^G^#%?n+yco8}&S_gtn#gV_Y9RJO9p;RA; zLUqv!PqmkseniIoH4Y-*^XBUT%827pOMFhHYoYUeHzhXmuP-OWo5y$Lf7!V$?{=2* zN>+M7_^HF}3r!wI^W0ECU+<x-CxDGXU?=72%Lt?wG!=Ud~ zo^83-MnA%k9f6#nwcOfOdQFK#{8n|h3r{XQ`}OZF9kVU08%B&d zfGN63wuLc;yqh#(RP3u%Q}4J|M_aFI=Air@8m;5i36)Du7=$SsOh>iHx(Jv)3@R0h zc!qGrNG?h%R5|S?0XDw2lLmA%%eBJxd4w@|hil@*h?EO;`}+q!Mx5ERj*rSk>mb8K z^ZUatrRjqpP#%krZVz@&^nE;n9d@R?*xp20(^qlR_s5XFV;amnzg$zoP+<4u<-5MB zc4%|8%3=R>K<&)Z&Vt+cz)Y}G;`G**YwgPopYg+4l3l=IOU3!&PnFPczv9!#u%m_F zoGB`A(=5dj-~7T`(OK5LNe$lpRK~2smaWR2vSg*rQdeDGbwcXcQbhB`JX67LN*pWY{EjrcrUF^u}w_QE9>pb@JD8c=wjCpe| zR=@iSHcq5m0>`6fQYCe``q|N%O|jwjXm$v1l+LTv+}y?Fp}HG4tQd40PObGD`}&Aw z^jej09U*E6Z~V{5v=0qZkB?Sb3o2WK&cTiDJ9%YNT%V>IeM}W7Xt>RV(|y*Pdqe(S z3uLOlB}%#3y=tzer<FxV`p!_P&YJ#d@*n*cygO zSBqt^g+saBANfmaAF<2^2qzOo1X2IGQZyU7JczR;vLB3B1}_Mw>hl3S&m1~k4?`-v zNn?&ad)j!#cNbCE0a4DbwXRUf%;f5sfSBj~G&59Y=JL6>q8WqeuPV;jx_M=J|K{`p z_gdkpvWIG*Z3NKm*i4Pc4`eG+r?V{=_t^ujv(V_~QF`7YS09xGz68k%GdOR!*bO*z z95b{mpFn#>yAmRjp-%%(V>nql-s>raR{daW!Z}tQ?e5t^y`eQ@&HCg?o)87h`f>1k zg})hFTk`kLbz)r?MX=q32NUK>Ut&kAOYiL9AcGk4;Urdu@F@zGL|0~;I%Pz_DxOSY z<(n@J(_J(2{Avap`MHObYCp~6YZ^D~@;pXA);+zrC(3X;h*UB>#4SAXoHDjl6TwWz z-)HH6^_R8a*QZQ&Mbk1%K}SEuO^-DXe%vbCEa?%f_uI4#fEXKilAO|JRBQ3;9q17* zQFDJ;hh2r_UIBsPE2eNnvY_p10yqs;m^bhJ=g4F7tYiKxwJ5O^eopn=({f^NtZE^p zRUJL+Hd@Pus~WdFKIaJj)Q1v&)9`^pI~-`tWKjiFJuxxt4&pTsA(Qqz`AkLR_;@Og zeCO>F__TJc#BtG{5KIIt6vB&vEM7^w!;I<5*uh3dD69xkeZ8jc5mqeQ^Rdj5Pvlii z-H4mra;AmYUS)3GIH!c@+~lqh%vE$@&r-cu(&iu1xb&sV%#Izy{tki@|<9ZxV8g`A`IFGV3F177|IimQwa`e~vxUrKmVV;;_ zhOgNxK|?Kch}~YNa(v0-y4>%?2Wj0Vd?ZXK91ef@Bk-KG=a1u`>?ySxkG45%E1gaH z5C*W8iq_A!Qpk0Z2!AP6${w=ut(=Nh9}9N+N$d9PJ$68hv$wG86xL)QHL}~G-l5|E z?g>j$4{5Ei&c-l(Hp6}jFUP1BDf6UtQ_kN)@L9^V#G(N8<$)lmfg*%`mL>8hIHoHnCl9i`4+cPEHj0DB+D>z z!>-W^b#t0so4N=1?e=cgl(TFF?%Gs1j&-HzY=XRT{ZI=n^!y{yt*eZ@Xl6r~@;E?v z8C%q=vLdi~;=eED;nMT%zH_%igI}4u;Q013kR3tOD?|q|w$F%|w>6U4JJZ~~{-%kK z$F}`auUJJL?)jl;$~);m7vG0}b;J;e7O3zf#+0UVY7;hgL4kYrZ1F~!RpB$}0u;xQ zj1IKeVb>+~Lh>(&En<8Z~O$LCV)5=k<-H16Bt3Wo2C%S2$J;?AAGSQ0s3Dy?TwkTi`LRX1<3BZ0FS zvQt!_Paqqh{&7v>ro*ES&SuTfd5(GPj(tr{2a;u|g=QfRx=k%7)c)xNU`B(2W3%xrvMM`Ry4t`Kq>%C=C z#;iHMMBZl-bZe7)hPc^N64c|2Y@~9BYa3GCwuZ(#hL>nLfIukv+$hSeQ1$i}^lXoY z(hFS!HZz0d)z@6uh#8PL_Ct7#s)h$oHiT02iwE|drS$-1Zi!RV4P;`ZZB7u^OF6mZ zKTq@i!2Cyy)T!eC3b%g(@!vqQdm+DQ{sMf>KV&6T2|cb^zyFw zIgjErcP9>I%zFg^?u@SF@1=VwT_N*>+TA(Fr1fI(dm4eZ>AFMpluwWw97EKc>>}z) zG2+e>cqv9NPf2eJQVyK|Y^#mDO0IR{2447yHqO z9C6V&yvay`q7QA>6YbS;o;&X8N+x4zbM!Xjy~#+^@)Hz4ZN8r#l_rm$D#(W>~JX03ZruOB<;%tW{kA9{ZZmw3Y&@4^i7nv z3?C=u=NSj_FN0Cms{8?Vbz9JHmBHfY<#zF^vlUq@DwR6u|Z8 zt>J)7g-gii|4ns)`J{P$wxMiG0XA=d^Ltc(QIyNI5Y^4;|eVmobmZ_3sk z-y|+FUpInwn)VR-G8Y6IdiieMHRhc%e>3SM-*kBN3AHR&2KJfeW`l6VwY_EZ*W#P} t!6#M9V^6D%PqZ5SucXE|e}c)V0LtOpX?t)hx63>YK&U=a`KW9W_Adk5bHxAv diff --git a/source_assets/ouya/OUYA_RS_RIGHT.png b/source_assets/ouya/OUYA_RS_RIGHT.png deleted file mode 100644 index e2e2536278994f3f2ed49a66a12aee20d2438a8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4060 zcmcgvSv(Ygx26!2eGp^pOm>6Gl6_CcPK>p|3`3T&C5kYXv1Mz_SVGy2C?dNEAyJlO z$(}3;WjDG0zk6Tq<9)dg-}%n(obx;9=36QBg4&-_p0b;FJp#(bHYT z?=Nvd7sL>73vt0$f&T$DRc=1_MUf}iz&_a8A02!j8Hl3N@$h#;2^#w%JyBLDq{jp7 z07{*TiUnh=uVWK7z2$6jk7IyGmaO5H=W|bZWcYnVSH@1fhCFxNJq|pHvo7Zb@-dk` z@seRRt*D@ys33JUO`dqVI5m7n62O8&%Q5Ju3}XgB5{;RHBg5iT5h%v{<(uv5G#^i zpZkB(|J}bB{Xh1R^#8s8)+PTp8>zL3dUV0Qf|oO5^K}$mW7yeDen@-WOWI=x1Oh=X zt~`W7A>n>%1-bt&)a5 z>qj!nI89-xRD3P183*FWU7SLQ-9QUqlu*h4Bs-G^g3e~~;)uO0%)uFWm2L3e%6IKa zIH(_D3&Ed?y*S%AI6d|M`?rpX!fSs{=R_e_*C+4)J*Xp*ctUs29vo~;NKJG;-93KJ zf*g2*IyfG1Y7Ld)1%;Q(0$+zmgm2brOjZNT$r026<|Zb|qf{q^=H&mujC|f-m5mP%mN|WEd@vJL8o+RbB^-8h`Y&1MK4NFJ6O|bWY-ag;o ztK6pWHG|c{ey0B>_oZk&+7r#ot*ZF0>HetyxkqHuO;b9Oh)Bc+P_k3)HT6Wi9!uYj`M0uA+yXICTL2fn?x^mA&oy-T6#t@s zA#yc;$kjoy&9acX@n3!NwX+Y;vl(g>G$U2nw8T;xb!aNE8}1^e(zwq|;D?;VBEuJ~ zAKzX+J-lJSMQndH)QMN$!vg{mqartK+)D8I(3a@a0FM$g0vbIXG1FNcNY^xNCOA@i zW@}*KRe$FS8+$T@WwbzNwd6dce#5@=u zTV}7>2Og2DXI!)hKY$0K3G~70kRpA)d6J3`?-E4Hech;efy6}zdH8FohPEx<`arh< zZN0yp?KuuUblhUxCQH}z4X|5`J)AjMbI|EYsib>}cujR}#MMHBLw?RR8zs#1^^?b| z8^do`-%D960hQ-)i;+VvstOE>0Rej)m~%y4{cMyKzL@`Ip^yLTwg(-0dLh4Lip^Kq zO9n-;hH{CTH21dV1Ce3Rox8yikRG+jNUmq-#Fg+GdRA`kum5NDJ~)+ zYk3R7Kjczs#|OLK+YlEuk9kVFMG>(H6<*24)+GZ!lNeeUNF`CNQSx#_ecL@)eLs6IhD%YpMkb!;~&X>G~6t?;YU zy*gYRz-2G+M5jzW-yq&>#%EIaI2?l!MGFq>(^ikj2LqrARv^*Vb?YEVD;(be% z05^$F@eb-#Lbk-~H(c}$ZEg7~NGJySU`1YGaVVI3RF=4|T0X|pfhyV?H6VCeDQ3rJ zh(tsZ!*q5}_IHFoG$|kWm(1uKiW+?NV;wO;Q*X<8AjCAJb?YOUMv`Z2Lp>xSvh@B3zNX6a@3E z9bQ~KH7vZ6rQ+w*N_dNjk&A`J8p{Af*9TTpZ*raNG4^jA<& zYF3<_45tM!DP_|m2zD>AB(fqhWf{=L`z}mH3S6w9rre#)u zBc>ZX?C3qM*XpsFC|wz%KdSU$??k9V;PQ0=ie?f65R|kB7sl}fe;-#f>~MOsA^eeS z_QRsv2X6t|VW~goJ^C~HJJu>uxQ7prwALVo?IwcSN_%^|KxLhs8d6{EHDkkBAA*4v zw%g4nY*I+2leui6g!?*2sv;e)gciBtd(SlvDS6S+O?k;2<&yiFMO8EU%ASPT#Sn;6 zcf}Ns?Gk*Nw{)amsh{o$BCbt`P0v#vnF#OnYX*0mSC%(@9n;mXK~5gmeYL^;g&SEJ zys#kCTY1g49nXyhE_@aI+gH_Zfs^L|a|^+7_M-#vL2&UM+#oD7F!JbAYhLO=Z_Gnt z1)2id%0vlUc`J>namSr!a#euHgdCrc*RafLoy-x@g?Z$Jry^yrJsy^l@hDtPt#vvH z3dt=#;8S58jM`PO6xjOC>78oF4v}F0`1TPIQ2?-2!B$ca(z)CawJuh^4Jgz7O%R2< zJJcw?@i?Xk{NqlRwidcS#BP{z27FYyULrscVC9UKwj>Jk*k@o*x7(+#n+-j?k*)+* z4Tl9PdXxi4?-nM%y6vyqBdzl1x@%2%_xoa7i+cvRaYh8eH5c$&ryIU8Rex-29}5REEpxX$(EEoIZrUkx5%YK6 z4Z-0)#|^kpkzz#urzin9b9ZalE26qkEKl#VK zSl4tplFI4pPnDjrRIj$b!MG!x^iJ=|OQVvNqs%`O$2J(AblMX6eem{dt7l2Fr8_Ox z5+uca2hA9gB$4Fd(EXmz;mT(PdzYoJg8ZT$9cb02GC;f+C0p6uJM_M!J5HWcLgI`_ zmc0fvP;%J8z-mwz&&+?JWOH1N z<@2hOk+*NogV{lSVqsNQ^6U~4U{~z)(}!qt$p%IkJRQo*>(t|lm+XCFEPX8Z2I@$R z6HC#9GAAmqx%h_|(LEPXTon9hBNkfE;WQLx1ox8nMJxY}|CkZMp0IHU(;?;(pU5K# z@d?gXYXd_y<0B54>uqG8T34c2WyG4r1+wh0M1w%wqT^jvzlEU7KHhhSER{1XMln1< z(=V3Zq!O-GsY&ID?(GW9^L8XW%?XZc1;{8?i7*b*7^g!L3G$?mJ~pij`pUJhZsVY{ z`YKD|y`OTJdVKtW{4#UFgKe1~qzxTo1@00+>sORYojKIX&2bbbkyfw0=zR951kkOi zhDJBNwbvn?4`hMIq$s>UWMVB>$t#UsA#f0%k*4-63+qKnz9x(NH_Nv@j1SZ`Gpzi! zw2d_t*#UD*mwGMLn>KoJp*n@hB<)G-#j`XFc=1F}0mNKR{ z_IBR6oxMf7Lj2d7s4IGwtrWo`g$G$X6iww<^f7MJ__Z)R%r;()sWTC}Zly7ruE++>P`9hs{UM;^Ys8QYnZvS#hAA+SilpsvCyKRt3{3Ok< z(?<%x$XI4ij&FU?ycNM|E9oOS0CRvbb3L1LoS3)Nu}rzSq^ae*26Dxu*eXgf`e`^a z(37lJntkpC&tY|IMe1%yH#oWo@kmWA~;5tOam1G z`YkpD0Ty*xwGt#+WBM9r9)sx=FEe&&%No-Z`Wd!^fO(LTyZ!N|J@mPB@4rc%^Fzu= zVjSFItlBXTnM+JsscRyoU-iH0NfRMCT3rm42^z^$u}2JVaWRa=MCUxF{4R^@ATc~G zd!=mY*Q?GXY`Vpi#er}egT|Ca$DUN4MG(2ckm;Y0gj{Qz)t-^3xpWGz{*I5g6pBZu z>EecS4Ns>&u&W_))WHRsK6zJhBRZ#!8elCF3~|u%c}NWCL%^;$Td5^o`7D|1CVaQ# zQh|5(4mEh?@>F^5v5GU3FF+@8Stl2CeV8l=M0>m2ldx3#P}8dUKFcx0>^OTo%fd~~ z$Ep*j2LpaObe|JowCg{$h`l0JBgU7p+8kaSPeNRR&eVn>3Vz0HhJt3#faQ+Li9Iuo z6XxN69GaGOKx!E`BtLu%Bt1fUMJjCWOUJ4`>B;C7Rwq|~nXRQC|6!Q*MY2*PMLVDI`X`sp z&N!~FAD>hVN~83&HaE7y6^rU9NrN?k1SMghHk*yu*b}fxvPnqHls?1TPNqbwhLH`k zUhYyn6tJ|?j_$lhqB8ZMR$o?Z6dk}dO2DM7XA8j7pL&qKs?QUR-;BF#?GsSk`V~u0 z>17#j84A^R%{$_E9TwK(;ko^yPeFZpo7&4BAsM#xDT)T3pd1qCN+>Tutsk$NL3dt) zGPTmagrv%F9H6g#ME&ng-;K$u>mieJCkxHsU4Z16l42uyU2rcEx(lJ>QwuQEh;3FH wy!9ip<<~P`HTHN`zW+D#`HuCUTo;wRL9Z5<@o&xxXHI2oV5a|4_ioI80UKCcbN~PV diff --git a/source_assets/ouya/OUYA_RS_UP.png b/source_assets/ouya/OUYA_RS_UP.png deleted file mode 100644 index ba551419b36edfd2172d079539f8a112b7cbff1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4044 zcmV;-4>RzIP) zK~#9!?44a~RL2#^$59^ndaa?d`()R7up`-&RFzoUDzq=LBcLy_!x}egld9M#3RHqL zrhvqUC~K-fs}xv@tEzk`c3)bku-8wawI7VyBK#Cv1^2PG;hoO^dair#?A-6!nOW}~ z>B`Qs@!q|^IcLr}bLLFlt5>gxmFkr`3(x|zVgXvQ04+c(7N8Xi(250U0an!)sH@A- zAC2s4qt`a}PrJFdF4Aj({l37iIsBy0V9o+m2dtO=$g!(c(w|+SSINDq320RSWYFAe ztAdY&wvN-QK%dWo1(*&ROyMxS^7LxZcq`NND$?gvv;dQV8;+xGn>KAC&CSiEy<;cY zym_<96$=M zjcJ`Q6nM9h02 z<}!&{9Xk9|^77?N5yW0qUaB&HLGUow9X<9lQjG#_93038g&qScVn!tZgW&z*^y!L+ z1u7t(KX;b=X<|Z)IjuNA3J-z#rD~k-lE^0~j%$HfQGhH7{RI#2`i&xKVkxhUBmoeS zxoN9Zh*2?sEY2(Op~9un(G8_}F(FRV=bWoHfOCA1z7giUI0DB;5cHp<&w51mXT4S- zcm*CFyvvK*(+bmB{xnAcPxef|ATmWh*L`kWe#Gofs0Xu<1s z;^wd25GNxZJ^GUT=>7LIeP&Bb3)!*b>*Sknw2(b}_R`;X7zYvSi{Ib7mw)*teeQYF z0Kzo*lGL~F+zpKPWB}x4*RHq7z~CY0r%7`4$`$hKt5^7!zaeAgLZ%5F_WsA)Jw3{U zb$3vVUb;k9S67WPrSJtfkun#)CQ1A9e87%XbX{`&`ZWsjhsHp}DobDgd;H4>*|cMX z29{}`ZpY=xlPBckk3KS83-j6mvf$L`d72Wi!=yqRP0_-h-rmrGuS)~-e9+$B(P7NU zzj5uFF{Tt+$Vo%i?9A&D?yJ{tKILiOk%ZP0XZ$Z1nhQIlH>MD*hl4@9p1zfc)W)x1CrpO8)lcBV#OrV1Vazn$R3? zK2#bdh z{x-A>+9oKQCsR|C&hk)J*$lv?`IK1E=Q1ajoBTLjr`?33y3NC$vfA zv_uKY=w$}^H4kv;$Po(f^F;8VMKRio1PA*mg8bQ;zw<9Gs0QfUZS$O(AQL2Mzz*#Z zY(_~W(A=S+!&!rT@wA|sDR-TE$zVEuay0SS%MN%7D7*)`O za>9KFg0=O>A5^yR7(PKzmS+Cxyc7o}6F|?%S#NEOj(@6FC7^|;PM!>X4^}EJT)bHJ zy3VTcfDj^e6NIczOv!&^Gs+%9oVgI|geDaI8#2dw9bWV4$XC=01BSb zN|rVxnEBy9alMx4wN8F$RT4=`p2$;{whY!sL zh_sZfEQ2g9gtuzKCKp&IE@8fswOMRtfb0fVyswSjx@Dvm>MrgTWN9)lW5`OS75o5y zXPg#B1^1N?9cDzCpMog>i{Af$nNY2TSVoExn9(HlG;+1?v$7akMiabDO%Bk^&b8ru zOG)fT{mX;DR#g+%O3r;phRXW7cfyNj74EsTb758u{KC`oWJI?XnkwkCEzmwUhQ{7N zEtT0m^T}Ff-1PnfGV`*^(W_P9xCrLH5oWa-8Ni%!fS#?vyIEgQcQpAtQr$&AIt7DQ zP~|q^(LQ14epMRiEv+xWma{c2pDD${rHo4EY7@7*o0Anb$lX%<9#;u;0QB1J2KUA& zM2xCw-ju3Lbel2nofWORk9fK>6=Zylw9PGKtskcA(Byejikiz>nGXXBrKZ{7cH5G* za#K=HHNeIQhh~`fN@Z=&GCgDv6iPW~NpOw}(XD|ZfV)|jdcw|3xXI6lXh*zJA;Q80 zY(MMu)Vz!niKmcOqOkXp>!Griiqo|KF`z>)WWe=0MXjhkk~0M$q~vLx0n_n#BSXZT z7XWY6J-vlB1RRq6*_8sg)rH7RM@|IsdwafH^^Og)O_=ip@X*wC*b_4sD)IT!01A4a zw7NGP1QA~vBUk6kyz19vTR$>K^cz&23Ecd`=5`sRo?Zro1wHj{kBfWW~8iQ4rY(Ei3ATHe%VuIr+q} z%ni&u23W|!k8gS$mNxc$T6weS!ZUVr3krKfAg+6->=>F(vUWI>-$c#MI-?wOjBbz) zxV?LV92Ms+h>6|BSFj#5Z={SJ~CW`))0tJR^EHU zB^wZ7f$sXT;ybmP4MN;|tm9<`EA**PH_KX5;rpLO z=R`Q^rQj{h6HFVIxlugAo1h@g#OLAKPUqjaeOoa9;J&a+Xny{wv!^5GRNFE_XI-Yir#~bqfCF$vw)!cAvd5?pSPP8Ailu*X)T?dU7-hE1)N~w9o-}R>CbG0 z=UGZlS`s*hEHce1@+YjY!6jTxhnXLxCNszyU@(8@+hx7m-b`DeCUtWQV!1H)7~8t8 zUB4m9+7PD6Q_NG%c_#M~%nQ9R;@@G~uvj5zaIi+%1BGYlU4V7K(QAP@DrN96fKiDT zX37O|?qZhm!pvtU(J!>@{W5V*=>%ldNe0AJUX3gSmD@2V3ZUEA)fi{qlT@+m2RjPUvvSvsm1XQZ+R9$2Qw zo9K|g)62~E!LausEruiZ;&{XX=JTB_`y*rkEIXqY66FNE1>)?2qqwuWS$J| z(db_Gb8D2N1g%T*J+X4ZCBIkL)IhWWWM6*4YhJMbJk2)d1R%X;aL!{2mxD|p2g-Z7 zW;m9EgwOy}M4DEU$mnq2ZPd-3>IUfZMzfaH!?a?w#%cSgLhyZX?h(R*wCyD^I0dyb zna>cE1rTQ7zuwoq@7?bBbCMn$;*VRI>uauQCMpN(|ICfbBmDx8N?#tig|UnCDtLR&=xpa z!!nZ((oJZXDTVWZQVU%tyr`6bRTu0FlwML$5r7P0S&FR|AO?gCNCCFV*1n1Y4Dw3( z`j8rchj}k2qa%fKfT93@qe2XT2T8r!ZVEtQf$K&xr@G)N0T=}_?m}pl1?tk{J*@!4 zAVOp$zIDWTA%$9*mx+u6=z)lUu&gUXngvo_f}}d)ynssWiknSs0K*&`*QECKzh|sA zqWJgx*>gebl<+q5S=&ce1waN7^MkN75Bby6r_UIZ1c$lA0yDZW256mcyFg6jkv_}pBx5&V0 zP4XH6kU?x@+8Ek)3T2Bht+HWa=?BiqU5=Xu z&Uk>FX+=S!N%Blq@@LCama>yn zS5|LJU~b_-0+3tPUD6T5)il7EbEsFAs})jB0<0CW04+c(7N8Xi&;qn#0a~#Dtyq8- zpcMdVVD;A&?3($%MXaQQW0IgVn7N7-a y0a~#Dtyq8-pcM#TR3~~t&8lH$hbQsBP&F<9Eq$>m(iIiLN?i% zWo9NmeZPOg=kfXB^?p4bugBy4c>Vf%CK{o&8R@Ul0{{ReCWTBGf2}a$kf*(DAYN?9e{H4b#aI3`Z#;Ko47l>h5LVU zzYPE|#p-IH%)+LB79fo5COCU*WhHPc@WgVfr@-jbFq!6@3ogFSvD==k}vy%+?zYD|Xa?veA zrmxVEusP6=_LQ#klb4TLl~h#bJfKe^muY@5_D0l(*?TXBF8VlpJ!%bZoN#j1lmwSmm+Fpz#FLO$#$57rNQNwsRqy1i;E~~dcs^7kUJK%lYcA>IkH=(4uGD*w7vKZIig^C%HS+uDob3)x7 z7!7A7#<1x-w75`xJUe5!>;c5)aIr}O61au>H1*krpkfQGrb~ZnZ-SFyMW$9`Sx@@t z+N|xK;s6${doJH+Canw)4~`BG!%NAz`fBVd-&#qbt)V+}8&NCw{h6;o@oW$+A=))@ z1*^8pHJxg$spH?D*nADTwi0gKmMb>&zvn`h%n}i(PODvAErCVCw>!;wRctq?MW3CW);?N|^7{0QVE8Ia%SQ+`dB=C~tOdmaD=H!?A+|(`?=_C9 zPnGN`B`skAF(?`}J1e9j(j;43(M#k}$5ds$fQa`BNMlu6Bc`t2hM$D@i`)O*=z~xU zUCetke^N01V*zq4{xfxgzH{2AB~Vs@Dl5$BGzKNV{h?&PkQR2+P~uh`DmzuK36lWi zUrLh5Pt$|nm=`TzRvL2TQz^QbtS74eXpTk6X9CF4m{QgAlN|_c0^!HT4Vwp7TA=bl zO2$+t6J2+z-1biE^B}gxNGpDB3fQA4pQ>NTXvn6@<8YF5%Z)S z@O$jua6e|9jt(hiQ!@GVB5aLmD&yot;W=UJ@%8O*PQ?YN6cs7sNGuvean^Z$djrx} zxRCb*)D_xd^jq54m`!VR-i&~IPclW)VkPJdDj)KD3)I4b5WoEVl{GD+X&lTBu)<4f zJCP9zhaZJ40~5YtxyT$`ywJtGLVa}lsrsT*+L-!!oN1H%+2OouxD)YtF%AE;wPqAv*tyYYzv%XU zI?ISNaah~p5wSxZ8?Vd4+e|l6z~4B?a&Tp=?5$YmQ26>rMmw&GVW4s?c1s%G)dEcK zLBHYEuVTO&$>o*>&{(&TXyUvRWX&M1%gb2F+Y5*}EW#@wUfi;PKXVa{#s}g;IMWBG zdD0M6N!Ts3yEmWdv*JOY$+xM4e>$`xEgBJ(WcW|w&Ye)`3b+E_wZ|$Wpw0MYohmKO zm+DqZgPnSAnI8`k@5GUljHsNy+D797k(7ZBmMzkYo|3Ixry3hv8!?;;Jd6_h9Muy8 zq3_OPc({u8*}Zutifs^Wai^y($9fl~SZdU!w8Fl$@Mv~^0LXAknt@-<=VtDl2H1@N zqsmHrz!ZHSI3!tJZT9rImrMG2ryB_Xo->ZKy5>2^2g>aLcSSnEZByAE$R1M5D|Xe` z4#tDA3NC4cJ!KDH&c9ON6*)yp9*mZqKYj>GI*Tz-$9{U^si-mX!cXWr+cEIBJfd%u z#FRf_4%MnGBRISO?G2|k-0}DW2ir`-KNS#eC z8L_1$_qh)1iqkVp!GZC`mIEc`1oZ|uf`?ZYKgp~7L6M>p32x$1cqem@P^^|=o4i6# zIYw{33?r!l2aB+YuxDtS8fA4cf8*==H5t|e*hFdYUuPQLFI=GdMUz^d5d7=kF@e&R zN|Xrot&$3wyzE75^3dmZ5`5)vkA*us?%vR^Q@)BE>VoN|?6Zw7tGSDfHzy;k&QjNVewn2^(C zO6gqB$XkmJv%JIjmLK%~w@6!j&~GXqcX#7O-t3QLwIXA88P>a@S4qinY?0$_`y5u+7TR0%ymCgK+Y>vop6l?YV&JQ53?sy5y z0;n(m@w=0B6GTtc&xfUSEZdz(Yk{Rg53Wd)fuC%N2K~>s=M8=QXbiXRvca7ABwx5w zVy2$bBC8Gp2L zygWRnG1{A_JM+hLmX#LDHY{M z>Sx!L%PYcT4Mq}Z)^;vWJk{Icz8-Hm{xym8Gio^$i5zvlCjI-#yUVI<10MYfrC3o@ z*a&O-9n6h&F@8Sd&$=BN-X(ec&YOvb5gAjz>M_HkY%ViO8uBTf%69V@A}1tG+ZZti zfpu`0C}D+ag4q~~MKVufn-eJDnX%1C*t}nGu4(|4EhO!^kt;k8(vUf>OC)r_RK5Fp z>VEJv={Eahr>ro)dPi)Wf%j{Fm%;g)Gjp3T7UxM|RFikpnr{JUt)}iDG6;5dFO>w3 zZ}Uk>Et~~-h#c3&e0-Ivap8I^LL3rOYr3XL{(BL$W4qb=YUD#of^eLjfsDZuE?e>Y9U33ZVSm7h^T@$)gn< z051{loaiEP!Q$aYdwxBrTEQn+QWU#CZwM;~h9MMWSRf0zdw=O?*luOXao!(Xe zVtbb^^usyDZ~gls)|s2aU^C54N%R$~#*(E1NTjfQddSN(u7BI$CKIjI@27r=0=xlu z*QYYt>F=eUBm1a9bQ;~JpoXQFMGGgLCEOwSSt`--&5C_(p(O44fXUD2Z7US&>=5I( za(;Bk#Z3x=sOV8-RYBMCG0W;|5Y0zEUF|-1w#-?lG-Q#UlKNj&%%p9T)e76a*IEy# zfsGTvrrT*bE+t8;w*+PNR~Bi}9gr-u9vq`(K5!9G?!rz5O7xRbiVc+3ff=3Wf-FLqAxeI=#I5Zj5?VEfL&vhz@N6d91ork}qdIE(!iafuq?L~= zW_seV!Ftu;<{z2d(efr=^+=VH4GyE$xPX!S+{&yV;UIVp(zwvEl(9=h^u@F2r0N<44isCWRV0!IXfGXY3h3e%t~^f zEdX0!^y=(<-!kU9%%nxoDz}5-V}-tw47#>)ZbcvHd^r3IA>YPy#{|F|V-2 S5XyhZ3eeR=YrIi&iv15&X8|w( diff --git a/source_assets/ouya/OUYA_TOUCHPAD.png b/source_assets/ouya/OUYA_TOUCHPAD.png deleted file mode 100644 index 1c86e5c8ab8407aed53e79996c80dbf415c36078..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3531 zcmb7{S5%W*w}vB9LlY?h6woN3)L1|i>4YW(h!9Go1dLIdv;=`o4q6&`S%{@+?|VaG1r`9J@1%vjCrxfdSlEG`rKeqFbD+VHZ;&h zp5(HV$YWVmhyGq&*t;hktqpaxES`<8W|_KKj0k?nA(h5+d>P!W6*@A6r%q{OM7BP9HZOiOH*iB54R<%P1~Ec^{&dJOCA zXA{q7kU$Jg{o`i5N=egXmHzwlq(3H(R*U-*yi1pcdok}Rs0UIsL4 zq0wJ`<~^*A^lGx#Uwwttoy?kWzhljvYd7z4Ib`Mg#+J@}ox?Rh99OjieQtYp9r{@P zr?`*b7^A7DZJ}TogN!Qc;pQ$og|`Ye$bF5}pJi3{uukv&#`~@F@Zcc4soh?@NyvhL zmHhZ{oq6}iWRmx&npYHaMXQUZn$x-hHMuEh$8F%-x3>K8nR=L-*sl#*_2Ey!wvj*e zi18Tzc<7&J^F4vBv1G+O5lrx8mhHHpcO2 zfeXdKGPhw<>ebSek$JF?U>S5?+K!m|H{yTR^>mx7Is7SQ&iKOw?(f|<6W`vq?j)|w z2m1{S4z?=B0_y&l7_Z>qKJ8bZ9+d_3y{m7C(1r4CNvCLCzultvCopUU5-7WQY=f4q z$2~2_Bi_2T8^S%u6A}W2*5~Htre^p31Haa~qmxC?b4Bq;%p-4N$ck@^{Z$+tBXm5J z8XGt-Ep2H783?we$jGVj-uU-oqN3mlm7^O`9G1l%J!FTYl}VH1ITD%7`ZQbJ-Hz{0 zvXKao7~*`3F*?frh+?nwj(2tFa;6ZA2KkJ*?iaR3tgxyMj+{Rg4ibc6ibDc_k;K;R zGCp%YIoIG+2Pwv9jyro?Nz!eUL2yD?w%AWA7&qg@b|7tS!&uYA?3r{^9NB&Jm_C~E zdw=v?r@Zz0WVr~AMDUiBfs`@rO!I5Jlhz9f8LD@yielOJMa|pvgo1&ItXJT$*yi`Z zvH#)j6|?D<+JUffzH4^B^oE|I21v$nL9z7*&sn_Chg?O9F6`6 zZJfN|(7o$hu4Ws1oc+gFm}MUDZ`bEA4!-a#&1pu0FfvMyTMv84Xu@Ao+Jx!tkwn|a zl4&f!4B+Vy3#9e-MMs;C=7gxJi!*I2&H5sZxjKK(b(wR1nfScQ?<0rjcKa^O)^@jU-7^1Kx@SDJf13=RJBwVdAwO?rrNx z+UCz253XI`f>Fp}9bKUUs0|;%EP*lB!_i(#+VWm)G*rR+a;G4**@;faupPb+m6%zJnjFeg`sXP(OHF7IU>X$WT9 z7)dY3Er@1*ag@24H>5-gn5m(Mhq7O2;J=!s{Q0VUS2N9jddm!YERuf1kG(9t@0A@# zSg5dhQK@fUS4~;L2Gpt7)+Z+bT2RHzRDd_Pl)545lW15czvObhs&8vLH;dVpH4enQ8F|J*PyPm&*DY2!PhTAW#KaqQu8XP$Nd!adu4R zwC`LTUJT#CSd>LrON=n6CP$~`wZP6Hk}5j- z@Xb^Q-ijzPPVShS`yr5}q)h#4+h<~|TbK&N#C7+aHJ}}|Z!Hd9QX=9w1@Hgqxa+wq zgCXayyEE8zd=#(jeQ zK6bBwgR`vPql4bJm!jicM_z;r+2p6kSQaq9=aCn``^>S5m9hmrHH52A))NvRXlwDa z+7=zwov^`sJx|ovKyBw6SmsrN;fj&X{ZDiwWvp--$yx zNkD*5mC;gGODM)3RRdd%&8PCPV@pRrzC)X4R!(z;x{JJZvG$RVRKHSBEp5@JUN{P( zZE{ZfXVu?HE+-8o3dyu*XT~!SNE7#x#4x;@98FnNjdZUJy7Dn7D6;wD`PNxa+erw2 zW0Ym4fY+OrXpD{2_0Y3tsHKIJFDCvmfu|kiT9>CKG?xv<2(?00Y@a0&_pH@YRj$^O z1RTxVZd?dh$eM(QTXorN8&7=5lv-`!8CNf=G%{^GbFRl*;k<-&Ji(T>T+wcbj|am5 zF?jXSWCNlxph(KP`RE{o5U2FYYBBHpz{&)3s0|{Uf%>s)l$izuD0m^c_Ww#`Y9IZT z{+b@WnMHSt8%`M8Svw4lxj|E^P*VM(tD|-G8tJ6Fkxep)WlGbTBaAQgH%R$KX8E9{ zU8_k&)%LrE*oMd7q(n#8<>Nq~h8Q!3&(|U>R%7?fZ4uzR9zK&UNL0*oJ7)H4W?M59 zN6bE|^J9iv7oKeto(!b%vh~8`+#_xRN~V;6wtc!4kGS0at&iH7=f$|?r;S#`o>04{ zb1<4VOKB-gs|N=GU8JT$W6i>9A<#v(S{!FFyDIGDHNSmWRE6S}lTu;l5Lf?0*q1;+ ziIp31m9}P4ccc&N?NsZ-DHJhDL_)O)f+sYd0B24GhMDDNI;ctNV8S}X=6>UHxDcHp zM)Qc!2-(BHZf~4B46Jgv7Ye9jxtsQ!7I$67ck5)Wu(RbmJ5$opJY#1r+)n1o4%$)u zMdNV2OM}^&1k=Bgv>ILaSDJ zvN=)79!IW>kjSMl*9s6^9Sbs8P2_y_wPJx`l5sEO4G4Hup68R3XtWl83&p_Ke1$Ll|XUnCGRM$cc)%dKZ2af|5NRxN-;0 z7u#IXJ$DX}XOopFf^m-ULrE1YdheA~T_bAr)5F~-oyOC`EGgcVma`mOdDcn#J>A~2 z_Y&qwXp;dTsYlw+J%&RFZ0uRHY$S$E-fVBy3IkJ&?LOg2qSUWju{cQkV-D+zIqL8X zuQAGOiCD(z!SeP;&@T?xUYgl+HN*i@v!*@7)AoV1(z3Rji2Y(ZFs$R~HBpv%Q6xA+GhAzdw}axF(N;kA95iKvP$k%z9bdMTHtwm9Q8cK0Fz+6#3eT zHq0e0l~n^5pj(7PN!)9dk4I+Lk?w^3y6ukF+Cry5AjTrLuDGpmL8{ ztc;!sk3X}5j>@33f>y6iVbxq^K|L9%Ey|V#I@W5;wPRAUO@%X!lf!?xhVHN-DD18& zDwYlo_iNHtL*fe_(#Ey5tEwLf+s~c-Nu>Ljy!6Z+oE>>vL@~0yG-LHbSlO2ymVB9H zfvA0V{LIVSp*?+2Wm7jV;#qDr#qe-&kZ z8(xjJbLBQdsD8S%7&BmG;gDu8KEYr#o*N0Q zehGSvCJ4LUM3!jVHc07uI51d|rC$xN$*>0?MR8`$)2=1vm~Sab=6C$r-;bc9 z$Tz&297(`gYnk$^ZFGY+-09wET}^Js@}C+0MT(m`#|CQlcL_NB1424Au#Z95P^qnk z#n^VAv;6(6RGK6}AHabAaTkBf=Kg_mUX~Lh1~P;rbSc`7 G;r{`3{kXmW diff --git a/source_assets/ouya/OUYA_U.png b/source_assets/ouya/OUYA_U.png deleted file mode 100644 index e7a851f3768ba0f16329e35718f9755ad36ea0e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3091 zcmbtW`9BkmAKq+cV;DJx(n!obSMF;=hU8iZnKV~2LPTP&IiiGEj>yrRLv!T5Latn; z+^Iw)a(sL!eSQCg@9X=+^E|KD^Sod0*X#N1Nwl)O$jL6u4gdf+@uo&LCmM5t0x0B! z6-yS6PXy*~>KF(BaGd%tfPkmD$P-g2$k-vsmh2G};&z(^FuXy&PD0^txp|UoNNzXo z2D~BZoLm>+jSTHVXEyRKdpS?@_qqC}TTw`H$cYQJzSQ`H0aQzJ)MT`0npKEx8Q(-` zN$teuRk_J!lJ2Oos!`#`dg}}V?mh!(^GSEA_6K9X+c02at^!+(wr@I8mu5iY?t>*1Fy&-BmxY}Wn7i<^vL0$Xp$4hDR;nCEy;dL&_ zz?;^xIrV6MxC|EneDRmg!JeW5L`0ooG@ZBAp*=q8na_O)p%zu>|Nfa9)#@aPHUq}g zfo-da>gXV5Zt+b9za0nV87=%L95s$ zGttQHEHR`a>ukrn#f>UYKs`e#t`URIii+}OykVcy`r8i$KLeX@_pXwkzDg_EDnHav z-Q$9gI1z%m7(@S^w#DGnpisc;95FaMy7Aym#8hUc zg9IFpD3>uEhVzqM4s4;_KV!m0)=P$|#Dv3>-!c8J2XWqLc9aLKM-qz3BCl3<)i+AD zg}{EmFFy+-4Svx|r5X(Hs=~#fUQye->lIml1)OvAtgqf28#dEX+xEctuU?!H^MV@H zOSxev{yTpr$4v`!;tE%nhCEwYo@0)SO`<#06s?` zEl|!8KRlOdxW!nDm9aAJHo$c!AZiMVl_T>Wj~vX7L!?tGc&>z8h3xgW;Se)*2>oES zjUY&j8G59D2MQJwL=52UoFz&dG+BVsD<4srR@fR-#AAiehqE-e+KjJBy_J##ftIMPHkv4#59M=@wh zBYQ9WaC(wf8#<1&vrX;nivZT8P3z$!_no0V4$^b6>_NP;**sD~EG%--T(R`7?&;^$ z@oCotV~j*{<(%Nm#!5JC{59POBh9ZO5pNjM-o!^6v5a+W_ej39{g+tk!m%hF;p(sM zusL0s(iUsz$*+}iO5C>9v*~Mi&9kn0VI}N~pWf$3pc@G@*rj?By|gO2;)@NBUw7tM zyq7tCy=J7204V$1P{s1jU(j<>F=cjG`$Gdf5h{2NTAF*SdyAsLL)hbwH^P2dbZHN& zLZe!#hUaPf4NU=q?G?yce$yEy941If6e!L6!EuCF>ls#JxUH%(4C=qi{H7QhGtc3X z$Ad2}(R(8)LPg1sg8A31<5G5+@<`tP)c_4?#-6W;eJc|lQq2qTo_`fq z=1tx0Q}&e$OsimCc%r|<4dK_>G&@o?L&k3iC${N1#M`y{Cte<;1s}}$AiP2Gy+*K$ zJexse_mS`492?=nt|p0&@v>JwL!Ka46^1ZN{O}O__AjzB)U0KzN$_rnP>m;0i@^o7fzcIV(5f6(un*>CM%}^+VjM(H}bB-z@;zvK*3MX zYt|Y_Q;Mp|Eh;TBz6-KQ(YqEal#}SQg-4dbQp;675o;70)xgKFzXcQL z$5vgQ+S=8(y^ae`DF0ZmVAnv<8xN~|JfGRV$^lPSa5i3OL!#LvQYiP~k%%bEU5~7M5kUldXM20ZW?jv~vKw&fw!MgTu?e|Q;X1%b* zKX|>N7?L+{*STd@&Ik7$ApAz}KQna0R{OB$6Piw??TRr^^SHG>x<;VNq)PqePQm_Oz5 zN!kDVObobTHSVA>o)>H4&9%!EXO@+=XS!nO=eDwz+iV62s5@i1RddSp(|Qqlp@;TA znc(_>PAOCr2`?3L^(rIT^YuxW+al%-gWMZ6_ZX;MqdBG-%`CU-UcntPa{Zxvp}ktz z`xVHi`YJXy*_t-8{bpLUv{#0X$kD80mO5$u<*gnJKNXmg1bMQ0KD((~bE*`ixpUqx zf4)xm%I4bo-cmF1Ut?wo9Pog|)G`$g3mj?KL-CZ7TN5^1$^=%C|;WgeG{` zg?wPh{78I|B+qt_{=(CN%yI=4XbrnC#|6@kc4be2$LN#CVR~o|;|QYw(>+A<#b@i@s5Nl)g6La{Cwh$AvL>>kSEVgR(mK z=d)C~N3w_|QB|vHiFR{lHOcD?W71(_G{^mkk+v(T9rX-z8-=;fad4L|D z(ufO^CAmEXQBf_X!&@Kdgm*ubr%HL{si<(w2qhbF-BtGS~w+7djC!EQS-I zhrz|wjLVnrj08j{aAU4xDr@EVz+|G8!BqEI8v9Z3xD*U~R!HU0yKE1_lB+1=O9fS-;xv|N6x>6FG-m4A3VKJp`M zME%zkKX^y4F;JSAU}#OKE+XklI>5m>>-LJq-wcDBhhS|TlErBOAO82ulziHSr2 diff --git a/source_assets/ouya/OUYA_Y.png b/source_assets/ouya/OUYA_Y.png deleted file mode 100644 index a0f650cd16b1e1cb3902261fb2dfb194a8646ca3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3080 zcmbW3c{~%2AI4{f$z;xEQZr{O8bV2KLMrzeHX5ptWA12}`$~=}_egFFX{rmm#e4f|qd3~P0pLc@UjjO!J;Ku*}0I#u;zQtdU{;NVT=iht2 zlz#ZvxP6T5{Q&?T!GFaDc$x?M8;TMP>Fwi+8u2x4qEz_N&+u;@ zYTH9$UnvF3M_s=!u##~uUHf6*^TO6C+v}}?Kb{uKd7i))g4qpVa#U@8&P22sDG~`0 z`rjis5~j+`5F8tA%sLolo@A+hIc^$JU;k%Sj02Lz=^|ZZjkf5Rd&jUio?wp5fxc~Pf z**7`Uw*2(NzCS;zq!9HYN&G^Cq;4h9hD!@-xHEz>yX)b6)Z>|pQ9QnWTG)U8YR`s_6Fpz!0)wJm ztsN4CsgL-8h>OL0YkVGB0yoS-HF+t2MxTvpVyr#({37QpM%EAL*1pp;@%7IK9YMf(p6v}iBXN8o8(`Hr@;!} zoyuGCsR-rxKj*+OnNy*wuA?->O)xr*-X?oKwW1Y76@~DF(JAL|)2}uz*MdopT%+@Q z1dew8w7mDa$U)_Xgdh+eK1VN4Ct{&9oJ6zR%K21+)x|r0FTJSoqgV)WU`jXTNEfeF^?30KxN0J1w@UWX)$aWNJf8fZk$R@?Cs)! zmNn}2W4R<~&t=u7FJ&dC>hp~;v?&S8r-2J;kbCtN5*6*UhVo^;u-gg?S&L!8K<_K9 zeRJov)_N}NRIlt5xxz@nEMLbQ{NDNqZHjqGxA;0%vAl6xu_p(sC?*RD)isVY%Z*H+ zB(G;Gw=Ph)v%=nJ?JU2$&I&Z{V13Y6jX_66<5(yyJ+s8I1Rex{>he&@z1pchV&iaS zaB3_j9Uh-3QH8d~tcP|=1nd4HiNz=>pU_279NSWZ?gWWSe70$sl=R~++E&y<*=YN{ zpv#JMUMx3}`$L)*VMG@PX33SF7n0e8`s1v&;GCC!8<*#)fKpmk3{b0?qoplrJW6R_ zYjAd>Ucwa@w|yw$(NZ1dpB>y*PeaDzN@YkB0<4+v6d}w3S{W@fZMAe?VsQN7s`&IwQ zk~6kNJh3PzQirz10;+P3`sU48wb12}9k%G|;5h}qUb|qZt?q8g*8Tl^qV5@VC`cA< zx-ww6O2oFlA^oXoHUYY~b+Y-()Rx4HxrY;rS~F6a2KS@~7x6)V6fVZEfBCEbWU@ zlU6CxJx3G{^RXNRxuIugR|Nu+5oX*@hKX4d(M%b96}|!D%C$of1bV)E94!7r8ghAb z%i}%$R^|kgvv|;>cspv&!{N2h{h8ic@Tum(YGq?1bnrp*nH-x%M=M+OX*jf zZk9>T0+-V0O>G@L;pNxnpyxVSA5yMlwYymb$h=`Zo5u{;Ta8=CAJ8xPx_$XT9tLgwv)3R9_8D{VFpH9>4$eY2hE@Kv$?xfPWsiWq*H-v?Jpq;l@CYx>!GS2yXp-;kA9k9#Uvt{SJ)xE zljt7pLbuMN+@#7SrbCPdP<6pa_#A58_geoAh48nJu6S^#x7J=s2}DYTd0*MnV9;;(|vF8ZZEN|-k%V$4BbHuO>pV@r1IwUR%i{@nMa1d1m2Q5;f>Aq;uZ*R$lI>2;X! z8gMLU+X5XNs+wI4ZZ2gS>C1cTs>)7MTI~IRz z>DtB5OBJrrQaRe46%7?zF^FGYF5J3hI@i~%wBmpkYLT)Y8oNZ8K{I9#hb0_244ir! zo6!UQ`OWOcrgy$L^rM$8?4~SRgUD*;E1AU;ed@6iO~;a2k5ai|^Zm38+QQ0XCZyt7 zweH6-Sjmcsd6HDxU1u(d#7>Bc;{B+v*)K(amh_zT-?+0#4eckb;{p8B#upm?ZvB8s z87t$EmNwZ=nF8Z8)(6Xt&m>b*>0f+pdd=?yM3b-%_@Soz8=P@Z0UF^N-3l&%-!5H0 z?640NfJJwIZNQ!MCBq%#+UA#w+nT5ro%jk#r7(Xku4oW2B+hbbj3dMRE>=F?^|zU_ z@CAn$34YUB89GtxLK9xo3cFk2YCd{qS6h^v6+MPKAl9tF-|evJ+Qa$IOaXPw2`}N1 z=zCSXG?BUYFKDT51k<(WXaoXr)3RymcvV$>gPB?=B~Du?ib(XG`=r=EJgeV_LnuW^ z>>r{j$u%$4x4%W2P1wI;s6b|k+V-tg)+VYt1NJ)W5KuXq!0!4;&{A$fD;#gy6dq{_ zt?q|hx)dL#@A_VhDj2<0z^Cq<{M<1ocXz+8&l*wP%Gpi9$-x74fBJ1dssW7;<`CXb z*)8TJVa6O`Qc$D5avS$v>Kd{vKis}_;u?PQ;{aR(P0scD#|fk}L}rDu>j4vcmzPdd zj-Y#!9oXqtPZ9wufuE3zcrPJ7aWT!NFPC8g-t0enOpVMkiGV#vg8a_BNEA`RP5N%7 z9WoZEJ#U90Ut8oC1Vlxt7hoUmFu40+KF5W7x2`gUybmQq>H&q8A`ge(bI zMVfK&L{l9;3^IwOT0Cl_k0|M(o;DZ^*32%s^0WGP#R&1q%_{7n?c&5{h?O=hk&R90 zBV$W2G{Z$UX4v^!#Fcn)tyljywf;*a3hrZabuhq4Qsg2N)aN(680S GMEwWm&aw^w From f54a24daecfe318766740eab588e0d8f6b98339c Mon Sep 17 00:00:00 2001 From: iota97 Date: Wed, 1 Sep 2021 17:07:35 +0200 Subject: [PATCH 230/336] Don't add VIRTKEY_TOGGLE_FULLSCREE in custom key list on mobile device --- UI/GamepadEmu.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/UI/GamepadEmu.h b/UI/GamepadEmu.h index 03b568ae32..655fbaf7c3 100644 --- a/UI/GamepadEmu.h +++ b/UI/GamepadEmu.h @@ -293,7 +293,9 @@ namespace CustomKey { { ImageID::invalid(), VIRTKEY_SAVE_STATE }, { ImageID::invalid(), VIRTKEY_LOAD_STATE }, { ImageID::invalid(), VIRTKEY_NEXT_SLOT }, +#if !defined(MOBILE_DEVICE) { ImageID::invalid(), VIRTKEY_TOGGLE_FULLSCREEN }, +#endif { ImageID::invalid(), VIRTKEY_SPEED_CUSTOM1 }, { ImageID::invalid(), VIRTKEY_SPEED_CUSTOM2 }, { ImageID::invalid(), VIRTKEY_TEXTURE_DUMP }, @@ -335,8 +337,7 @@ namespace GestureKey { VIRTKEY_REWIND, VIRTKEY_SAVE_STATE, VIRTKEY_LOAD_STATE, - VIRTKEY_NEXT_SLOT, - VIRTKEY_TOGGLE_FULLSCREEN, + VIRTKEY_NEXT_SLOT, VIRTKEY_TEXTURE_DUMP, VIRTKEY_TEXTURE_REPLACE, VIRTKEY_SCREENSHOT, From 529329785b9559695ce6036005bf695184698f5e Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 2 Sep 2021 07:18:49 -0700 Subject: [PATCH 231/336] interp: Prevent crash on bad lv.q or sv.q addr. See #5496. --- Core/MIPS/MIPSIntVFPU.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Core/MIPS/MIPSIntVFPU.cpp b/Core/MIPS/MIPSIntVFPU.cpp index 0281b6bb42..cb02a3c98a 100644 --- a/Core/MIPS/MIPSIntVFPU.cpp +++ b/Core/MIPS/MIPSIntVFPU.cpp @@ -206,6 +206,7 @@ namespace MIPSInt int vt = (((op >> 16) & 0x1f)) | ((op&1) << 5); u32 addr = R(rs) + imm; + float *f; switch (op >> 26) { @@ -244,7 +245,9 @@ namespace MIPSInt _dbg_assert_msg_( 0, "Misaligned lv.q at %08x (pc = %08x)", addr, PC); } #ifndef COMMON_BIG_ENDIAN - WriteVector((const float*)Memory::GetPointer(addr), V_Quad, vt); + f = reinterpret_cast(Memory::GetPointer(addr)); + if (f) + WriteVector(f, V_Quad, vt); #else float lvqd[4]; @@ -291,7 +294,9 @@ namespace MIPSInt _dbg_assert_msg_( 0, "Misaligned sv.q at %08x (pc = %08x)", addr, PC); } #ifndef COMMON_BIG_ENDIAN - ReadVector(reinterpret_cast(Memory::GetPointer(addr)), V_Quad, vt); + f = reinterpret_cast(Memory::GetPointer(addr)); + if (f) + ReadVector(f, V_Quad, vt); #else float svqd[4]; ReadVector(svqd, V_Quad, vt); From 6b76bcf07050fab27460f8cade98ce9ced9c3f2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 3 Sep 2021 00:06:49 +0200 Subject: [PATCH 232/336] Add new texture filtering "Auto Max Quality" that tweaks texture filtering for best quality. It does this by enforcing mipmapping and minification filters, and always autogenerates mipmaps and enforces anisotropic filtering for all modes (if that's separately enabled). This looks nice and flicker free in most games without any additional tweaking, including GTA and Burnout which have long been painfully flickery in the distance due to undersampling. Needs a bit more testing before merge, maybe. Fixes #13888 --- Core/Config.h | 2 +- Core/ConfigValues.h | 7 +++++++ GPU/Common/SplineCommon.cpp | 2 +- GPU/Common/TextureCacheCommon.cpp | 22 +++++++++++++++++++++- GPU/Common/TextureDecoder.h | 7 +------ GPU/Vulkan/DrawEngineVulkan.cpp | 4 ++++ GPU/Vulkan/TextureCacheVulkan.cpp | 9 +++++++++ UI/GameSettingsScreen.cpp | 2 +- Windows/MainWindowMenu.cpp | 5 +++-- Windows/ppsspp.rc | 1 + Windows/resource.h | 1 + 11 files changed, 50 insertions(+), 12 deletions(-) diff --git a/Core/Config.h b/Core/Config.h index fc96c761c6..b413058436 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -161,7 +161,7 @@ public: bool bVendorBugChecksEnabled; int iRenderingMode; // 0 = non-buffered rendering 1 = buffered rendering - int iTexFiltering; // 1 = off , 2 = nearest , 3 = linear , 4 = linear(CG) + int iTexFiltering; // 1 = auto , 2 = nearest , 3 = linear , 4 = auto max quality int iBufFilter; // 1 = linear, 2 = nearest int iSmallDisplayZoomType; // Used to fit display into screen 0 = stretch, 1 = partial stretch, 2 = auto scaling, 3 = manual scaling. float fSmallDisplayOffsetX; // Along with Y it goes from 0.0 to 1.0, XY (0.5, 0.5) = center of the screen diff --git a/Core/ConfigValues.h b/Core/ConfigValues.h index a3899b0646..debeee4808 100644 --- a/Core/ConfigValues.h +++ b/Core/ConfigValues.h @@ -45,6 +45,13 @@ enum { ROTATION_AUTO_HORIZONTAL = 5, }; +enum TextureFiltering { + TEX_FILTER_AUTO = 1, + TEX_FILTER_FORCE_NEAREST = 2, + TEX_FILTER_FORCE_LINEAR = 3, + TEX_FILTER_AUTO_MAX_QUALITY = 4, +}; + enum BufferFilter { SCALE_LINEAR = 1, SCALE_NEAREST = 2, diff --git a/GPU/Common/SplineCommon.cpp b/GPU/Common/SplineCommon.cpp index 86226907f0..f1e47b257b 100644 --- a/GPU/Common/SplineCommon.cpp +++ b/GPU/Common/SplineCommon.cpp @@ -532,7 +532,7 @@ void DrawEngineCommon::SubmitCurve(const void *control_points, const void *indic int vertexSize = vdecoder->VertexSize(); if (vertexSize != sizeof(SimpleVertex)) { - ERROR_LOG(G3D, "Something went really wrong, vertex size: %i vs %i", vertexSize, (int)sizeof(SimpleVertex)); + ERROR_LOG(G3D, "Something went really wrong, vertex size: %d vs %d", vertexSize, (int)sizeof(SimpleVertex)); } // Make an array of pointers to the control points, to get rid of indices. diff --git a/GPU/Common/TextureCacheCommon.cpp b/GPU/Common/TextureCacheCommon.cpp index 36d72ef0af..097e036be5 100644 --- a/GPU/Common/TextureCacheCommon.cpp +++ b/GPU/Common/TextureCacheCommon.cpp @@ -241,10 +241,18 @@ SamplerCacheKey TextureCacheCommon::GetSamplingParams(int maxLevel, const TexCac } break; case TEX_FILTER_FORCE_NEAREST: - default: // Just force to nearest without checks. Safe (but ugly). forceFiltering = TEX_FILTER_FORCE_NEAREST; break; + case TEX_FILTER_AUTO_MAX_QUALITY: + default: + forceFiltering = TEX_FILTER_AUTO_MAX_QUALITY; + if (gstate.isModeThrough() && g_Config.iInternalResolution != 1) { + bool uglyColorTest = gstate.isColorTestEnabled() && !IsColorTestTriviallyTrue() && gstate.getColorTestRef() != 0; + if (uglyColorTest) + forceFiltering = TEX_FILTER_FORCE_NEAREST; + } + break; } } @@ -260,6 +268,18 @@ SamplerCacheKey TextureCacheCommon::GetSamplingParams(int maxLevel, const TexCac key.magFilt = 0; key.minFilt = 0; break; + case TEX_FILTER_AUTO_MAX_QUALITY: + // NOTE: We do not override magfilt here. If a game should have pixellated filtering, + // let it keep it. But we do enforce minification and mipmap filtering and max out the level. + // Later we'll also auto-generate any missing mipmaps. + key.minFilt = 1; + key.mipFilt = 1; + key.maxLevel = 9 * 256; + key.lodBias = 0.0f; + if (gstate_c.Supports(GPU_SUPPORTS_ANISOTROPY) && g_Config.iAnisotropyLevel > 0) { + key.aniso = true; + } + break; } return key; diff --git a/GPU/Common/TextureDecoder.h b/GPU/Common/TextureDecoder.h index b00958a296..863e509cba 100644 --- a/GPU/Common/TextureDecoder.h +++ b/GPU/Common/TextureDecoder.h @@ -27,16 +27,11 @@ enum CheckAlphaResult { #include "Common/Common.h" #include "Common/Swap.h" #include "Core/MemMap.h" +#include "Core/ConfigValues.h" #include "GPU/ge_constants.h" #include "GPU/Common/TextureDecoderNEON.h" #include "GPU/GPUState.h" -enum TextureFiltering { - TEX_FILTER_AUTO = 1, - TEX_FILTER_FORCE_NEAREST = 2, - TEX_FILTER_FORCE_LINEAR = 3, -}; - void SetupTextureDecoder(); // Pitch must be aligned to 16 bits (as is the case on a PSP) diff --git a/GPU/Vulkan/DrawEngineVulkan.cpp b/GPU/Vulkan/DrawEngineVulkan.cpp index 7a679a8566..628f133f98 100644 --- a/GPU/Vulkan/DrawEngineVulkan.cpp +++ b/GPU/Vulkan/DrawEngineVulkan.cpp @@ -819,6 +819,10 @@ void DrawEngineVulkan::DoFlush() { } shaderManager_->GetShaders(prim, lastVType_, &vshader, &fshader, true, useHWTessellation_, decOptions_.expandAllWeightsToFloat); // usehwtransform + if (!vshader) { + // We're screwed. + return; + } _dbg_assert_msg_(vshader->UseHWTransform(), "Bad vshader"); Draw::NativeObject object = framebufferManager_->UseBufferedRendering() ? Draw::NativeObject::FRAMEBUFFER_RENDERPASS : Draw::NativeObject::BACKBUFFER_RENDERPASS; diff --git a/GPU/Vulkan/TextureCacheVulkan.cpp b/GPU/Vulkan/TextureCacheVulkan.cpp index f39c43a730..e2a02e3497 100644 --- a/GPU/Vulkan/TextureCacheVulkan.cpp +++ b/GPU/Vulkan/TextureCacheVulkan.cpp @@ -751,6 +751,15 @@ void TextureCacheVulkan::BuildTexture(TexCacheEntry *const entry) { // such as when using replacement textures - but let's keep the same amount of levels. int maxLevelToGenerate = maxLevel; + if (g_Config.iTexFiltering == TEX_FILTER_AUTO_MAX_QUALITY) { + // Boost the number of mipmaps. + int maxPossibleMipmaps = log2i(std::min(gstate.getTextureWidth(0), gstate.getTextureHeight(0))); + if (maxPossibleMipmaps != maxLevelToGenerate) { + maxLevelToGenerate = maxPossibleMipmaps; + } + } + + // If GLES3 is available, we can preallocate the storage, which makes texture loading more efficient. VkFormat dstFmt = GetDestFormat(GETextureFormat(entry->format), gstate.getClutPaletteFormat()); diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 7c94269ff8..8240e45137 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -547,7 +547,7 @@ void GameSettingsScreen::CreateViews() { PopupMultiChoice *anisoFiltering = graphicsSettings->Add(new PopupMultiChoice(&g_Config.iAnisotropyLevel, gr->T("Anisotropic Filtering"), anisoLevels, 0, ARRAY_SIZE(anisoLevels), gr->GetName(), screenManager())); anisoFiltering->SetDisabledPtr(&g_Config.bSoftwareRendering); - static const char *texFilters[] = { "Auto", "Nearest", "Linear" }; + static const char *texFilters[] = { "Auto", "Nearest", "Linear", "Auto Max Quality"}; graphicsSettings->Add(new PopupMultiChoice(&g_Config.iTexFiltering, gr->T("Texture Filter"), texFilters, 1, ARRAY_SIZE(texFilters), gr->GetName(), screenManager())); static const char *bufFilters[] = { "Linear", "Nearest", }; diff --git a/Windows/MainWindowMenu.cpp b/Windows/MainWindowMenu.cpp index 026540f443..a4c958fde3 100644 --- a/Windows/MainWindowMenu.cpp +++ b/Windows/MainWindowMenu.cpp @@ -1225,11 +1225,12 @@ namespace MainWindow { ID_OPTIONS_TEXTUREFILTERING_AUTO, ID_OPTIONS_NEARESTFILTERING, ID_OPTIONS_LINEARFILTERING, + ID_OPTIONS_AUTOMAXQUALITYFILTERING, }; if (g_Config.iTexFiltering < TEX_FILTER_AUTO) g_Config.iTexFiltering = TEX_FILTER_AUTO; - else if (g_Config.iTexFiltering > TEX_FILTER_FORCE_LINEAR) - g_Config.iTexFiltering = TEX_FILTER_FORCE_LINEAR; + else if (g_Config.iTexFiltering > TEX_FILTER_AUTO_MAX_QUALITY) + g_Config.iTexFiltering = TEX_FILTER_AUTO_MAX_QUALITY; for (int i = 0; i < ARRAY_SIZE(texfilteringitems); i++) { CheckMenuItem(menu, texfilteringitems[i], MF_BYCOMMAND | ((i + 1) == g_Config.iTexFiltering ? MF_CHECKED : MF_UNCHECKED)); diff --git a/Windows/ppsspp.rc b/Windows/ppsspp.rc index cd0655dc24..b9ea154e26 100644 --- a/Windows/ppsspp.rc +++ b/Windows/ppsspp.rc @@ -632,6 +632,7 @@ BEGIN MENUITEM "Auto", ID_OPTIONS_TEXTUREFILTERING_AUTO MENUITEM "Nearest", ID_OPTIONS_NEARESTFILTERING MENUITEM "Linear", ID_OPTIONS_LINEARFILTERING + MENUITEM "Auto Max Quality", ID_OPTIONS_AUTOMAXQUALITYFILTERING END POPUP "Screen Scaling Filter", ID_OPTIONS_SCREENFILTER_MENU BEGIN diff --git a/Windows/resource.h b/Windows/resource.h index 1121a59da5..27c95fd839 100644 --- a/Windows/resource.h +++ b/Windows/resource.h @@ -207,6 +207,7 @@ #define ID_OPTIONS_HARDWARETRANSFORM 40030 #define IDC_STEPHLE 40032 #define ID_OPTIONS_LINEARFILTERING 40033 +#define ID_OPTIONS_AUTOMAXQUALITYFILTERING 40043 #define ID_FILE_QUICKSAVESTATE 40034 #define ID_FILE_QUICKLOADSTATE 40035 #define ID_FILE_QUICKSAVESTATE_HC 40036 From 1df31e930465f37a650c128c3d680cc12a85cffb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 5 Sep 2021 23:54:41 +0200 Subject: [PATCH 233/336] Fix windows menus for the new tex filtering options. --- GPU/D3D11/TextureCacheD3D11.cpp | 3 +++ GPU/Vulkan/TextureCacheVulkan.cpp | 8 +++----- Windows/MainWindowMenu.cpp | 8 +++++--- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/GPU/D3D11/TextureCacheD3D11.cpp b/GPU/D3D11/TextureCacheD3D11.cpp index 24f20071a5..be61a5ae48 100644 --- a/GPU/D3D11/TextureCacheD3D11.cpp +++ b/GPU/D3D11/TextureCacheD3D11.cpp @@ -447,7 +447,10 @@ void TextureCacheD3D11::BuildTexture(TexCacheEntry *const entry) { // Adjust maxLevel to actually present levels.. bool badMipSizes = false; + + // maxLevel here is the max level to upload. Not the count. int maxLevel = entry->maxLevel; + for (int i = 0; i <= maxLevel; i++) { // If encountering levels pointing to nothing, adjust max level. u32 levelTexaddr = gstate.getTextureAddress(i); diff --git a/GPU/Vulkan/TextureCacheVulkan.cpp b/GPU/Vulkan/TextureCacheVulkan.cpp index e2a02e3497..c009cce9a5 100644 --- a/GPU/Vulkan/TextureCacheVulkan.cpp +++ b/GPU/Vulkan/TextureCacheVulkan.cpp @@ -754,12 +754,9 @@ void TextureCacheVulkan::BuildTexture(TexCacheEntry *const entry) { if (g_Config.iTexFiltering == TEX_FILTER_AUTO_MAX_QUALITY) { // Boost the number of mipmaps. int maxPossibleMipmaps = log2i(std::min(gstate.getTextureWidth(0), gstate.getTextureHeight(0))); - if (maxPossibleMipmaps != maxLevelToGenerate) { - maxLevelToGenerate = maxPossibleMipmaps; - } + maxLevelToGenerate = maxPossibleMipmaps; } - // If GLES3 is available, we can preallocate the storage, which makes texture loading more efficient. VkFormat dstFmt = GetDestFormat(GETextureFormat(entry->format), gstate.getClutPaletteFormat()); @@ -807,7 +804,8 @@ void TextureCacheVulkan::BuildTexture(TexCacheEntry *const entry) { } } - // TODO + // TODO: Support mip levels for upscaled images. + // Probably can just remove this check? if (scaleFactor > 1) { maxLevel = 0; } diff --git a/Windows/MainWindowMenu.cpp b/Windows/MainWindowMenu.cpp index a4c958fde3..dac18e2a1e 100644 --- a/Windows/MainWindowMenu.cpp +++ b/Windows/MainWindowMenu.cpp @@ -325,6 +325,7 @@ namespace MainWindow { TranslateMenuItem(menu, ID_OPTIONS_TEXTUREFILTERING_AUTO); TranslateMenuItem(menu, ID_OPTIONS_NEARESTFILTERING); TranslateMenuItem(menu, ID_OPTIONS_LINEARFILTERING); + TranslateMenuItem(menu, ID_OPTIONS_AUTOMAXQUALITYFILTERING); TranslateMenuItem(menu, ID_OPTIONS_SCREENFILTER_MENU); TranslateMenuItem(menu, ID_OPTIONS_BUFLINEARFILTER); TranslateMenuItem(menu, ID_OPTIONS_BUFNEARESTFILTER); @@ -979,9 +980,10 @@ namespace MainWindow { g_Config.iShowFPSCounter = g_Config.iShowFPSCounter ? 0 : 3; // 3 = both speed and FPS break; - case ID_OPTIONS_TEXTUREFILTERING_AUTO: setTexFiltering(TEX_FILTER_AUTO); break; - case ID_OPTIONS_NEARESTFILTERING: setTexFiltering(TEX_FILTER_FORCE_NEAREST); break; - case ID_OPTIONS_LINEARFILTERING: setTexFiltering(TEX_FILTER_FORCE_LINEAR); break; + case ID_OPTIONS_TEXTUREFILTERING_AUTO: setTexFiltering(TEX_FILTER_AUTO); break; + case ID_OPTIONS_NEARESTFILTERING: setTexFiltering(TEX_FILTER_FORCE_NEAREST); break; + case ID_OPTIONS_LINEARFILTERING: setTexFiltering(TEX_FILTER_FORCE_LINEAR); break; + case ID_OPTIONS_AUTOMAXQUALITYFILTERING: setTexFiltering(TEX_FILTER_AUTO_MAX_QUALITY); break; case ID_OPTIONS_BUFLINEARFILTER: setBufFilter(SCALE_LINEAR); break; case ID_OPTIONS_BUFNEARESTFILTER: setBufFilter(SCALE_NEAREST); break; From 7addc18a6b03f14eff80a92c98ddb973ee60c7a7 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 5 Sep 2021 23:24:08 -0700 Subject: [PATCH 234/336] softgpu: Avoid overflow infinite loop. For certain large values, it would overflow and continue looping endlessly. --- GPU/Software/Rasterizer.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/GPU/Software/Rasterizer.cpp b/GPU/Software/Rasterizer.cpp index d4486356b2..1fbd61dbe1 100644 --- a/GPU/Software/Rasterizer.cpp +++ b/GPU/Software/Rasterizer.cpp @@ -1137,7 +1137,7 @@ static inline Vec4 EdgeRecip(const Vec4 &w0, const Vec4 &w1, co template void DrawTriangleSlice( const VertexData& v0, const VertexData& v1, const VertexData& v2, - int minX, int minY, int maxX, int maxY, + int x1, int y1, int x2, int y2, bool byY, int h1, int h2) { Vec4 bias0 = Vec4::AssignToAll(IsRightSideOrFlatBottomLine(v0.screenpos.xy(), v1.screenpos.xy(), v2.screenpos.xy()) ? -1 : 0); @@ -1170,6 +1170,7 @@ void DrawTriangleSlice( TriangleEdge e1; TriangleEdge e2; + int64_t minX = x1, maxX = x2, minY = y1, maxY = y2; if (byY) { maxY = std::min(maxY, minY + h2 * 16 * 2) - 1; minY += h1 * 16 * 2; @@ -1189,7 +1190,7 @@ void DrawTriangleSlice( Sampler::Funcs sampler = Sampler::GetFuncs(); - for (pprime.y = minY; pprime.y <= maxY; pprime.y += 32, + for (int64_t curY = minY; curY <= maxY; curY += 32, w0_base = e0.StepY(w0_base), w1_base = e1.StepY(w1_base), w2_base = e2.StepY(w2_base)) { @@ -1198,14 +1199,13 @@ void DrawTriangleSlice( Vec4 w2 = w2_base; // TODO: Maybe we can clip the edges instead? - int scissorYPlus1 = pprime.y + 16 > maxY ? -1 : 0; + int scissorYPlus1 = curY + 16 > maxY ? -1 : 0; Vec4 scissor_mask = Vec4(0, maxX - minX, scissorYPlus1, (maxX - minX) | scissorYPlus1); Vec4 scissor_step = Vec4(0, -32, 0, -32); - pprime.x = minX; - DrawingCoords p = TransformUnit::ScreenToDrawing(pprime); + DrawingCoords p = TransformUnit::ScreenToDrawing(ScreenCoords(minX, curY, 0)); - for (; pprime.x <= maxX; pprime.x += 32, + for (int64_t curX = minX; curX <= maxX; curX += 32, w0 = e0.StepX(w0), w1 = e1.StepX(w1), w2 = e2.StepX(w2), From da4652aa2a6365beee1348c2f56473bb10b70f52 Mon Sep 17 00:00:00 2001 From: Stuart Kenny Date: Mon, 6 Sep 2021 20:00:50 +0100 Subject: [PATCH 235/336] Do not skip SwapBuffer() when skipDrawReason set. Fixes nothing being rendered with high frameskip ratios. --- libretro/LibretroGraphicsContext.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/libretro/LibretroGraphicsContext.h b/libretro/LibretroGraphicsContext.h index ca684a71c3..ee15e5a1ac 100644 --- a/libretro/LibretroGraphicsContext.h +++ b/libretro/LibretroGraphicsContext.h @@ -51,9 +51,7 @@ public: bool Init(bool cache_context); void SetRenderTarget() override {} void SwapBuffers() override { - if (!gstate_c.skipDrawReason) { - video_cb(RETRO_HW_FRAME_BUFFER_VALID, PSP_CoreParameter().pixelWidth, PSP_CoreParameter().pixelHeight, 0); - } + video_cb(RETRO_HW_FRAME_BUFFER_VALID, PSP_CoreParameter().pixelWidth, PSP_CoreParameter().pixelHeight, 0); } virtual void ContextReset(); virtual void ContextDestroy(); From 3b39b6fcaa4de173f31ff580a291a3f1abf2aaa0 Mon Sep 17 00:00:00 2001 From: Stuart Kenny Date: Mon, 6 Sep 2021 20:03:57 +0100 Subject: [PATCH 236/336] Do not fast forward by default. --- libretro/libretro.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index 970e5860cd..c368b6aa54 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -397,6 +397,16 @@ static void check_variables(CoreParameter &coreParam) } } + bool isFastForwarding = environ_cb(RETRO_ENVIRONMENT_GET_FASTFORWARDING, &isFastForwarding); + if (isFastForwarding) + { + coreParam.fastForward = true; + } + else + { + coreParam.fastForward = false; + } + if (ppsspp_texture_scaling_type.Update(&g_Config.iTexScalingType) && gpu) gpu->ClearCacheNextFrame(); @@ -683,7 +693,6 @@ bool retro_load_game(const struct retro_game_info *game) coreParam.startBreak = false; coreParam.printfEmuLog = true; coreParam.headLess = true; - coreParam.fastForward = true; coreParam.graphicsContext = ctx; coreParam.gpuCore = ctx->GetGPUCore(); coreParam.cpuCore = CPUCore::JIT; From 6db91abf171335ca7df184b162079e7fd798d77a Mon Sep 17 00:00:00 2001 From: Stuart Kenny Date: Mon, 6 Sep 2021 20:10:13 +0100 Subject: [PATCH 237/336] Move core initialization code out of retro_load_game method --- libretro/libretro.cpp | 181 ++++++++++++++---------------------------- 1 file changed, 60 insertions(+), 121 deletions(-) diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index c368b6aa54..21b65b15b0 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -343,7 +343,7 @@ static void check_variables(CoreParameter &coreParam) { bool updated = false; - if ( coreState != CORE_POWERUP + if ( coreState != CoreState::CORE_POWERUP && environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && !updated) return; @@ -421,58 +421,78 @@ void retro_set_input_state(retro_input_state_t cb) { input_state_cb = cb; } void retro_init(void) { - struct retro_log_callback log; -#if 0 - g_Config.Load(""); -#endif - - g_Config.bEnableLogging = true; - // libretro does its own timing, so this should stay CONTINUOUS. - g_Config.iFastForwardMode = (int)FastForwardMode::CONTINUOUS; - g_Config.bMemStickInserted = true; - g_Config.iGlobalVolume = VOLUME_FULL - 1; - g_Config.iReverbVolume = VOLUME_FULL; - g_Config.iAltSpeedVolume = -1; - g_Config.bEnableSound = true; - g_Config.iCwCheatRefreshRate = 60; - g_Config.iMemStickSizeGB = 16; - g_Config.bFuncReplacements = true; - g_Config.bEncryptSave = true; - g_Config.bHighQualityDepth = true; - g_Config.bLoadPlugins = true; - g_Config.bFragmentTestCache = true; - g_Config.bSavedataUpgrade= true; - g_Config.bSeparateSASThread = true; - g_Config.sMACAddress = "12:34:56:78:9A:BC"; - - g_Config.iFirmwareVersion = PSP_DEFAULT_FIRMWARE; - g_Config.iPSPModel = PSP_MODEL_SLIM; - - LogManager::Init(&g_Config.bEnableLogging); - g_threadManager.Init(cpu_info.num_cores, cpu_info.logical_cpu_count); - host = new LibretroHost; + struct retro_input_descriptor desc[] = { + { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" }, + { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up" }, + { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down" }, + { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right" }, + { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "Cross" }, + { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "Circle" }, + { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "Triangle" }, + { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Square" }, + { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L, "L" }, + { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "R" }, + { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Select" }, + { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }, + { 0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X, "Right Analog X" }, + { 0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y, "Right Analog Y" }, + { 0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X, "Left Analog X" }, + { 0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y, "Left Analog Y" }, + { 0 }, + }; + environ_cb(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS, desc); + if (environ_cb(RETRO_ENVIRONMENT_GET_INPUT_BITMASKS, NULL)) + libretro_supports_bitmasks = true; + + struct retro_log_callback log; if (environ_cb(RETRO_ENVIRONMENT_GET_LOG_INTERFACE, &log)) { + LogManager::Init(&g_Config.bEnableLogging); printfLogger = new PrintfLogger(log); - LogManager *logman = LogManager::GetInstance(); + LogManager* logman = LogManager::GetInstance(); logman->RemoveListener(logman->GetConsoleListener()); logman->RemoveListener(logman->GetDebuggerListener()); logman->ChangeFileLog(nullptr); logman->AddListener(printfLogger); -#if 1 logman->SetAllLogLevels(LogTypes::LINFO); -#endif } - if (environ_cb(RETRO_ENVIRONMENT_GET_INPUT_BITMASKS, NULL)) - libretro_supports_bitmasks = true; + g_Config.Load("", ""); + g_Config.iInternalResolution = 0; + g_Config.sMACAddress = "12:34:56:78:9A:BC"; + + const char* nickname = NULL; + if (environ_cb(RETRO_ENVIRONMENT_GET_USERNAME, &nickname) && nickname) + g_Config.sNickName = std::string(nickname); + + Path retro_base_dir; + Path retro_save_dir; + const char* dir_ptr = NULL; + if (environ_cb(RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, &dir_ptr) && dir_ptr) + retro_base_dir = Path(dir_ptr); + + if (environ_cb(RETRO_ENVIRONMENT_GET_SAVE_DIRECTORY, &dir_ptr) && dir_ptr) + retro_save_dir = Path(dir_ptr); + + retro_base_dir /= "PPSSPP"; + + g_Config.currentDirectory = retro_base_dir; + g_Config.defaultCurrentDirectory = retro_base_dir; + g_Config.memStickDirectory = retro_save_dir; + g_Config.flash0Directory = retro_base_dir / "flash0"; + g_Config.internalDataDirectory = retro_base_dir; + + VFSRegister("", new DirectoryAssetReader(retro_base_dir)); + + host = new LibretroHost; } void retro_deinit(void) { + g_threadManager.Teardown(); LogManager::Shutdown(); delete printfLogger; @@ -611,72 +631,13 @@ namespace Libretro bool retro_load_game(const struct retro_game_info *game) { - static Path retro_base_dir; - static Path retro_save_dir; - std::string error_string; - enum retro_pixel_format fmt = RETRO_PIXEL_FORMAT_XRGB8888; - const char *nickname = NULL; - const char *dir_ptr = NULL; - struct retro_input_descriptor desc[] = { - { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" }, - { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up" }, - { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down" }, - { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right" }, - { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "Cross" }, - { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "Circle" }, - { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "Triangle" }, - { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Square" }, - { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L, "L" }, - { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "R" }, - { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Select" }, - { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }, - { 0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X, "Right Analog X" }, - { 0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y, "Right Analog Y" }, - { 0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X, "Left Analog X" }, - { 0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y, "Left Analog Y" }, - { 0 }, - }; - - environ_cb(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS, desc); - + retro_pixel_format fmt = retro_pixel_format::RETRO_PIXEL_FORMAT_XRGB8888; if (!environ_cb(RETRO_ENVIRONMENT_SET_PIXEL_FORMAT, &fmt)) { ERROR_LOG(SYSTEM, "XRGB8888 is not supported.\n"); return false; } - if (environ_cb(RETRO_ENVIRONMENT_GET_USERNAME, &nickname) && nickname) - g_Config.sNickName = std::string(nickname); - - - if (environ_cb(RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, &dir_ptr) - && dir_ptr) - { - retro_base_dir = Path(dir_ptr); - } - - if (environ_cb(RETRO_ENVIRONMENT_GET_SAVE_DIRECTORY, &dir_ptr) - && dir_ptr) - { - retro_save_dir = Path(dir_ptr); - } - - if (retro_base_dir.empty()) - retro_base_dir = Path(game->path).NavigateUp(); - - retro_base_dir /= "PPSSPP"; - - if (retro_save_dir.empty()) - retro_save_dir = Path(game->path).NavigateUp(); - - g_Config.currentDirectory = retro_base_dir; - g_Config.defaultCurrentDirectory = retro_base_dir; - g_Config.memStickDirectory = retro_save_dir; - g_Config.flash0Directory = retro_base_dir / "flash0"; - g_Config.internalDataDirectory = retro_base_dir; - - VFSRegister("", new DirectoryAssetReader(retro_base_dir)); - coreState = CORE_POWERUP; ctx = LibretroGraphicsContext::CreateGraphicsContext(); INFO_LOG(SYSTEM, "Using %s backend", ctx->Ident()); @@ -695,13 +656,10 @@ bool retro_load_game(const struct retro_game_info *game) coreParam.headLess = true; coreParam.graphicsContext = ctx; coreParam.gpuCore = ctx->GetGPUCore(); - coreParam.cpuCore = CPUCore::JIT; + coreParam.cpuCore = (CPUCore)g_Config.iCpuCore; check_variables(coreParam); -#if 0 - g_Config.bVertexDecoderJit = (coreParam.cpuCore == CPU_JIT) ? true : false; -#endif - + std::string error_string; if (!PSP_InitStart(coreParam, &error_string)) { ERROR_LOG(BOOT, "%s", error_string.c_str()); @@ -722,8 +680,6 @@ void retro_unload_game(void) delete ctx; ctx = nullptr; PSP_CoreParameter().graphicsContext = nullptr; - - g_threadManager.Teardown(); } void retro_reset(void) @@ -732,20 +688,11 @@ void retro_reset(void) PSP_Shutdown(); -#if 0 - coreState = CORE_POWERUP; - if (!PSP_InitStart(PSP_CoreParameter(), &error_string)) - { - ERROR_LOG(BOOT, "%s", error_string.c_str()); - environ_cb(RETRO_ENVIRONMENT_SHUTDOWN, nullptr); - } -#else if (!PSP_Init(PSP_CoreParameter(), &error_string)) { ERROR_LOG(BOOT, "%s", error_string.c_str()); environ_cb(RETRO_ENVIRONMENT_SHUTDOWN, nullptr); } -#endif } static void retro_input(void) @@ -787,7 +734,7 @@ static void retro_input(void) for (i = 0; i < sizeof(map) / sizeof(*map); i++) { - bool pressed = ret & (1 << map[i].retro); + bool pressed = ret & (1 << map[i].retro); if (pressed) { @@ -812,16 +759,8 @@ void retro_run(void) if (PSP_IsIniting()) { std::string error_string; -#if 0 - if (!PSP_InitUpdate(&error_string)) - { - graphics_context->SwapBuffers(); - return; - } -#else while (!PSP_InitUpdate(&error_string)) sleep_ms(4); -#endif if (!PSP_IsInited()) { From 0f45c95d17794bf3cee0b40986363088cf41e03e Mon Sep 17 00:00:00 2001 From: Stuart Kenny Date: Mon, 6 Sep 2021 20:13:07 +0100 Subject: [PATCH 238/336] Fix capitalization in core option labels. --- libretro/libretro.cpp | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index 21b65b15b0..3b3dc0377a 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -198,37 +198,37 @@ template class RetroOption std::vector> list_; }; -static RetroOption ppsspp_cpu_core("ppsspp_cpu_core", "CPU Core", { { "jit", CPUCore::JIT }, { "IR jit", CPUCore::IR_JIT }, { "interpreter", CPUCore::INTERPRETER } }); +static RetroOption ppsspp_cpu_core("ppsspp_cpu_core", "CPU Core", { { "JIT", CPUCore::JIT }, { "IR JIT", CPUCore::IR_JIT }, { "Interpreter", CPUCore::INTERPRETER } }); static RetroOption ppsspp_locked_cpu_speed("ppsspp_locked_cpu_speed", "Locked CPU Speed", { { "off", 0 }, { "222MHz", 222 }, { "266MHz", 266 }, { "333MHz", 333 } }); -static RetroOption ppsspp_language("ppsspp_language", "Language", { { "automatic", -1 }, { "english", PSP_SYSTEMPARAM_LANGUAGE_ENGLISH }, { "japanese", PSP_SYSTEMPARAM_LANGUAGE_JAPANESE }, { "french", PSP_SYSTEMPARAM_LANGUAGE_FRENCH }, { "spanish", PSP_SYSTEMPARAM_LANGUAGE_SPANISH }, { "german", PSP_SYSTEMPARAM_LANGUAGE_GERMAN }, { "italian", PSP_SYSTEMPARAM_LANGUAGE_ITALIAN }, { "dutch", PSP_SYSTEMPARAM_LANGUAGE_DUTCH }, { "portuguese", PSP_SYSTEMPARAM_LANGUAGE_PORTUGUESE }, { "russian", PSP_SYSTEMPARAM_LANGUAGE_RUSSIAN }, { "korean", PSP_SYSTEMPARAM_LANGUAGE_KOREAN }, { "chinese_traditional", PSP_SYSTEMPARAM_LANGUAGE_CHINESE_TRADITIONAL }, { "chinese_simplified", PSP_SYSTEMPARAM_LANGUAGE_CHINESE_SIMPLIFIED } }); -static RetroOption ppsspp_rendering_mode("ppsspp_rendering_mode", "Rendering Mode", { { "buffered", FB_BUFFERED_MODE }, { "nonbuffered", FB_NON_BUFFERED_MODE } }); +static RetroOption ppsspp_language("ppsspp_language", "Language", { { "Automatic", -1 }, { "English", PSP_SYSTEMPARAM_LANGUAGE_ENGLISH }, { "Japanese", PSP_SYSTEMPARAM_LANGUAGE_JAPANESE }, { "French", PSP_SYSTEMPARAM_LANGUAGE_FRENCH }, { "Spanish", PSP_SYSTEMPARAM_LANGUAGE_SPANISH }, { "German", PSP_SYSTEMPARAM_LANGUAGE_GERMAN }, { "Italian", PSP_SYSTEMPARAM_LANGUAGE_ITALIAN }, { "Dutch", PSP_SYSTEMPARAM_LANGUAGE_DUTCH }, { "Portuguese", PSP_SYSTEMPARAM_LANGUAGE_PORTUGUESE }, { "Russian", PSP_SYSTEMPARAM_LANGUAGE_RUSSIAN }, { "Korean", PSP_SYSTEMPARAM_LANGUAGE_KOREAN }, { "Chinese Traditional", PSP_SYSTEMPARAM_LANGUAGE_CHINESE_TRADITIONAL }, { "Chinese Simplified", PSP_SYSTEMPARAM_LANGUAGE_CHINESE_SIMPLIFIED } }); +static RetroOption ppsspp_rendering_mode("ppsspp_rendering_mode", "Rendering Mode", { { "Buffered", FB_BUFFERED_MODE }, { "Skip Buffer Effects", FB_NON_BUFFERED_MODE } }); static RetroOption ppsspp_auto_frameskip("ppsspp_auto_frameskip", "Auto Frameskip", false); -static RetroOption ppsspp_frameskip("ppsspp_frameskip", "Frameskip", { "off", "1", "2", "3", "4", "5", "6", "7", "8" }); -static RetroOption ppsspp_frameskiptype("ppsspp_frameskiptype", "Frameskip Type", { {"number of frames", 0}, {"percent of fps", 1} }); -static RetroOption ppsspp_internal_resolution("ppsspp_internal_resolution", "Internal Resolution (restart)", 1, { "480x272", "960x544", "1440x816", "1920x1088", "2400x1360", "2880x1632", "3360x1904", "3840x2176", "4320x2448", "4800x2720" }); -static RetroOption ppsspp_button_preference("ppsspp_button_preference", "Confirmation Button", { { "cross", PSP_SYSTEMPARAM_BUTTON_CROSS }, { "circle", PSP_SYSTEMPARAM_BUTTON_CIRCLE } }); +static RetroOption ppsspp_frameskip("ppsspp_frameskip", "Frameskip", { "Off", "1", "2", "3", "4", "5", "6", "7", "8" }); +static RetroOption ppsspp_frameskiptype("ppsspp_frameskiptype", "Frameskip Type", { {"Number of frames", 0}, {"Percent of FPS", 1} }); +static RetroOption ppsspp_internal_resolution("ppsspp_internal_resolution", "Internal Resolution (Restart)", 1, { "480x272", "960x544", "1440x816", "1920x1088", "2400x1360", "2880x1632", "3360x1904", "3840x2176", "4320x2448", "4800x2720" }); +static RetroOption ppsspp_button_preference("ppsspp_button_preference", "Confirmation Button", { { "Cross", PSP_SYSTEMPARAM_BUTTON_CROSS }, { "Circle", PSP_SYSTEMPARAM_BUTTON_CIRCLE } }); static RetroOption ppsspp_fast_memory("ppsspp_fast_memory", "Fast Memory (Speedhack)", true); static RetroOption ppsspp_block_transfer_gpu("ppsspp_block_transfer_gpu", "Block Transfer GPU", true); -static RetroOption ppsspp_texture_scaling_level("ppsspp_texture_scaling_level", "Texture Scaling Level", { { "off", 1 }, { "2x", 2 }, { "3x", 3 }, { "4x", 4 }, { "5x", 5 }, { "auto", 0 } }); +static RetroOption ppsspp_texture_scaling_level("ppsspp_texture_scaling_level", "Texture Scaling Level", { { "Auto", 0 }, { "Off", 1 }, { "2x", 2 }, { "3x", 3 }, { "4x", 4 }, { "5x", 5 } }); static RetroOption ppsspp_texture_scaling_type("ppsspp_texture_scaling_type", "Texture Scaling Type", { { "xbrz", TextureScalerCommon::XBRZ }, { "hybrid", TextureScalerCommon::HYBRID }, { "bicubic", TextureScalerCommon::BICUBIC }, { "hybrid_bicubic", TextureScalerCommon::HYBRID_BICUBIC } }); -static RetroOption ppsspp_texture_filtering("ppsspp_texture_filtering", "Texture Filtering", { { "auto", 1 }, { "nearest", 2 }, { "linear", 3 } }); +static RetroOption ppsspp_texture_filtering("ppsspp_texture_filtering", "Texture Filtering", { { "Auto", 1 }, { "Nearest", 2 }, { "Linear", 3 } }); static RetroOption ppsspp_texture_anisotropic_filtering("ppsspp_texture_anisotropic_filtering", "Anisotropic Filtering", { "off", "2x", "4x", "8x", "16x" }); -static RetroOption ppsspp_lower_resolution_for_effects("ppsspp_lower_resolution_for_effects", "Lower resolution for effects", { {"off", 0}, {"safe", 1}, {"balanced", 2}, {"aggressive", 3} }); +static RetroOption ppsspp_lower_resolution_for_effects("ppsspp_lower_resolution_for_effects", "Lower resolution for effects", { {"Off", 0}, {"Safe", 1}, {"Balanced", 2}, {"Aggressive", 3} }); static RetroOption ppsspp_texture_deposterize("ppsspp_texture_deposterize", "Texture Deposterize", false); static RetroOption ppsspp_texture_replacement("ppsspp_texture_replacement", "Texture Replacement", false); static RetroOption ppsspp_gpu_hardware_transform("ppsspp_gpu_hardware_transform", "GPU Hardware T&L", true); static RetroOption ppsspp_vertex_cache("ppsspp_vertex_cache", "Vertex Cache (Speedhack)", false); static RetroOption ppsspp_cheats("ppsspp_cheats", "Internal Cheats Support", false); -static RetroOption ppsspp_io_threading("ppsspp_io_threading", "I/O on thread (experimental)", true); +static RetroOption ppsspp_io_threading("ppsspp_io_threading", "I/O on thread (Experimental)", true); static RetroOption ppsspp_io_timing_method("ppsspp_io_timing_method", "IO Timing Method", { { "Fast", IOTimingMethods::IOTIMING_FAST }, { "Host", IOTimingMethods::IOTIMING_HOST }, { "Simulate UMD delays", IOTimingMethods::IOTIMING_REALISTIC } }); static RetroOption ppsspp_frame_duplication("ppsspp_frame_duplication", "Duplicate frames in 30hz games", false); static RetroOption ppsspp_software_skinning("ppsspp_software_skinning", "Software Skinning", true); static RetroOption ppsspp_ignore_bad_memory_access("ppsspp_ignore_bad_memory_access", "Ignore bad memory accesses", true); -static RetroOption ppsspp_lazy_texture_caching("ppsspp_lazy_texture_caching", "Lazy texture caching (speedup)", false); -static RetroOption ppsspp_retain_changed_textures("ppsspp_retain_changed_textures", "Retain changed textures (speedup, mem hog)", false); -static RetroOption ppsspp_force_lag_sync("ppsspp_force_lag_sync", "Force real clock sync (slower, less lag)", false); -static RetroOption ppsspp_spline_quality("ppsspp_spline_quality", "Spline/Bezier curves quality", { {"low", 0}, {"medium", 1}, {"high", 2} }); -static RetroOption ppsspp_disable_slow_framebuffer_effects("ppsspp_disable_slow_framebuffer_effects", "Disable slower effects (speedup)", false); +static RetroOption ppsspp_lazy_texture_caching("ppsspp_lazy_texture_caching", "Lazy texture caching (Speedup)", false); +static RetroOption ppsspp_retain_changed_textures("ppsspp_retain_changed_textures", "Retain changed textures (Speedup, mem hog)", false); +static RetroOption ppsspp_force_lag_sync("ppsspp_force_lag_sync", "Force real clock sync (Slower, less lag)", false); +static RetroOption ppsspp_spline_quality("ppsspp_spline_quality", "Spline/Bezier curves quality", { {"Low", 0}, {"Medium", 1}, {"High", 2} }); +static RetroOption ppsspp_disable_slow_framebuffer_effects("ppsspp_disable_slow_framebuffer_effects", "Disable slower effects (Speedup)", false); void retro_set_environment(retro_environment_t cb) { From c593da050c7dd5392fdca71429196a94ef388bbf Mon Sep 17 00:00:00 2001 From: Stuart Kenny Date: Mon, 6 Sep 2021 20:14:08 +0100 Subject: [PATCH 239/336] Expose inflight frames as core option. --- libretro/libretro.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index 3b3dc0377a..5c0b28f2c1 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -209,6 +209,7 @@ static RetroOption ppsspp_internal_resolution("ppsspp_internal_resolution", static RetroOption ppsspp_button_preference("ppsspp_button_preference", "Confirmation Button", { { "Cross", PSP_SYSTEMPARAM_BUTTON_CROSS }, { "Circle", PSP_SYSTEMPARAM_BUTTON_CIRCLE } }); static RetroOption ppsspp_fast_memory("ppsspp_fast_memory", "Fast Memory (Speedhack)", true); static RetroOption ppsspp_block_transfer_gpu("ppsspp_block_transfer_gpu", "Block Transfer GPU", true); +static RetroOption ppsspp_inflight_frames("ppsspp_inflight_frames", "Buffered frames (Slower, less lag, restart)", { "No buffer", "Up to 1", "Up to 2" }); static RetroOption ppsspp_texture_scaling_level("ppsspp_texture_scaling_level", "Texture Scaling Level", { { "Auto", 0 }, { "Off", 1 }, { "2x", 2 }, { "3x", 3 }, { "4x", 4 }, { "5x", 5 } }); static RetroOption ppsspp_texture_scaling_type("ppsspp_texture_scaling_type", "Texture Scaling Type", { { "xbrz", TextureScalerCommon::XBRZ }, { "hybrid", TextureScalerCommon::HYBRID }, { "bicubic", TextureScalerCommon::BICUBIC }, { "hybrid_bicubic", TextureScalerCommon::HYBRID_BICUBIC } }); static RetroOption ppsspp_texture_filtering("ppsspp_texture_filtering", "Texture Filtering", { { "Auto", 1 }, { "Nearest", 2 }, { "Linear", 3 } }); @@ -249,6 +250,7 @@ void retro_set_environment(retro_environment_t cb) vars.push_back(ppsspp_vertex_cache.GetOptions()); vars.push_back(ppsspp_fast_memory.GetOptions()); vars.push_back(ppsspp_block_transfer_gpu.GetOptions()); + vars.push_back(ppsspp_inflight_frames.GetOptions()); vars.push_back(ppsspp_software_skinning.GetOptions()); vars.push_back(ppsspp_lazy_texture_caching.GetOptions()); vars.push_back(ppsspp_retain_changed_textures.GetOptions()); @@ -375,6 +377,7 @@ static void check_variables(CoreParameter &coreParam) ppsspp_force_lag_sync.Update(&g_Config.bForceLagSync); ppsspp_spline_quality.Update(&g_Config.iSplineBezierQuality); ppsspp_disable_slow_framebuffer_effects.Update(&g_Config.bDisableSlowFramebufEffects); + ppsspp_inflight_frames.Update(&g_Config.iInflightFrames); ppsspp_language.Update(&g_Config.iLanguage); if (g_Config.iLanguage < 0) From feade27cd331d31c2de6531f0cd2b1c97784c727 Mon Sep 17 00:00:00 2001 From: Stuart Kenny Date: Mon, 6 Sep 2021 21:01:17 +0100 Subject: [PATCH 240/336] Review style fixes. --- libretro/libretro.cpp | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index 5c0b28f2c1..9fe04e0454 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -401,14 +401,7 @@ static void check_variables(CoreParameter &coreParam) } bool isFastForwarding = environ_cb(RETRO_ENVIRONMENT_GET_FASTFORWARDING, &isFastForwarding); - if (isFastForwarding) - { - coreParam.fastForward = true; - } - else - { - coreParam.fastForward = false; - } + coreParam.fastForward = isFastForwarding; if (ppsspp_texture_scaling_type.Update(&g_Config.iTexScalingType) && gpu) gpu->ClearCacheNextFrame(); @@ -490,7 +483,7 @@ void retro_init(void) VFSRegister("", new DirectoryAssetReader(retro_base_dir)); - host = new LibretroHost; + host = new LibretroHost(); } void retro_deinit(void) From be87acf62bc10540b10c544c984bf3e49865a694 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 7 Sep 2021 00:51:28 +0200 Subject: [PATCH 241/336] libretro: Fix defaults for texture_scaling_level and inflight_frames --- libretro/libretro.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index 9fe04e0454..a2e093f1c3 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -209,8 +209,8 @@ static RetroOption ppsspp_internal_resolution("ppsspp_internal_resolution", static RetroOption ppsspp_button_preference("ppsspp_button_preference", "Confirmation Button", { { "Cross", PSP_SYSTEMPARAM_BUTTON_CROSS }, { "Circle", PSP_SYSTEMPARAM_BUTTON_CIRCLE } }); static RetroOption ppsspp_fast_memory("ppsspp_fast_memory", "Fast Memory (Speedhack)", true); static RetroOption ppsspp_block_transfer_gpu("ppsspp_block_transfer_gpu", "Block Transfer GPU", true); -static RetroOption ppsspp_inflight_frames("ppsspp_inflight_frames", "Buffered frames (Slower, less lag, restart)", { "No buffer", "Up to 1", "Up to 2" }); -static RetroOption ppsspp_texture_scaling_level("ppsspp_texture_scaling_level", "Texture Scaling Level", { { "Auto", 0 }, { "Off", 1 }, { "2x", 2 }, { "3x", 3 }, { "4x", 4 }, { "5x", 5 } }); +static RetroOption ppsspp_inflight_frames("ppsspp_inflight_frames", "Buffered frames (Slower, less lag, restart)", { { "Up to 2", 2 }, { "Up to 1", 1 }, { "No buffer", 0 }, , }); +static RetroOption ppsspp_texture_scaling_level("ppsspp_texture_scaling_level", "Texture Scaling Level", { { "Off", 1 }, { "2x", 2 }, { "3x", 3 }, { "4x", 4 }, { "5x", 5 }, { "Auto", 0 } }); static RetroOption ppsspp_texture_scaling_type("ppsspp_texture_scaling_type", "Texture Scaling Type", { { "xbrz", TextureScalerCommon::XBRZ }, { "hybrid", TextureScalerCommon::HYBRID }, { "bicubic", TextureScalerCommon::BICUBIC }, { "hybrid_bicubic", TextureScalerCommon::HYBRID_BICUBIC } }); static RetroOption ppsspp_texture_filtering("ppsspp_texture_filtering", "Texture Filtering", { { "Auto", 1 }, { "Nearest", 2 }, { "Linear", 3 } }); static RetroOption ppsspp_texture_anisotropic_filtering("ppsspp_texture_anisotropic_filtering", "Anisotropic Filtering", { "off", "2x", "4x", "8x", "16x" }); From 694e92dc82c3deb92bce8f639b59aadc5aecc8a5 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 6 Sep 2021 19:39:34 -0700 Subject: [PATCH 242/336] Core: Use FileBlockDevice for PBPs without an ISO. --- Core/FileSystems/BlockDevices.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Core/FileSystems/BlockDevices.cpp b/Core/FileSystems/BlockDevices.cpp index 0cbd59bb9a..abe6a042dc 100644 --- a/Core/FileSystems/BlockDevices.cpp +++ b/Core/FileSystems/BlockDevices.cpp @@ -44,10 +44,13 @@ BlockDevice *constructBlockDevice(FileLoader *fileLoader) { size_t size = fileLoader->ReadAt(0, 1, 4, buffer); if (size == 4 && !memcmp(buffer, "CISO", 4)) return new CISOFileBlockDevice(fileLoader); - else if (size == 4 && !memcmp(buffer, "\x00PBP", 4)) - return new NPDRMDemoBlockDevice(fileLoader); - else - return new FileBlockDevice(fileLoader); + if (size == 4 && !memcmp(buffer, "\x00PBP", 4)) { + uint32_t psarOffset = 0; + size = fileLoader->ReadAt(0x24, 1, 4, &psarOffset); + if (size == 4 && psarOffset < fileLoader->FileSize()) + return new NPDRMDemoBlockDevice(fileLoader); + } + return new FileBlockDevice(fileLoader); } u32 BlockDevice::CalculateCRC(volatile bool *cancel) { From 825d9a8d2b63354e9dd39686ca3cc30a6e68bb70 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 6 Sep 2021 19:40:40 -0700 Subject: [PATCH 243/336] Reporting: Calculate CRC for PSN games. --- Core/Reporting.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Core/Reporting.cpp b/Core/Reporting.cpp index 9f4d7317b6..fc02b27f31 100644 --- a/Core/Reporting.cpp +++ b/Core/Reporting.cpp @@ -107,8 +107,7 @@ namespace Reporting static int CalculateCRCThread() { SetCurrentThreadName("ReportCRC"); - // TODO: Use the blockDevice from pspFileSystem? - FileLoader *fileLoader = ConstructFileLoader(crcFilename); + FileLoader *fileLoader = ResolveFileLoaderTarget(ConstructFileLoader(crcFilename)); BlockDevice *blockDevice = constructBlockDevice(fileLoader); u32 crc = 0; From bac7def66b60d5d9cff6a392a4b2a2674b962669 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 6 Sep 2021 19:47:39 -0700 Subject: [PATCH 244/336] libretro: Fix typo. --- libretro/libretro.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index a2e093f1c3..6fba4a616a 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -209,7 +209,7 @@ static RetroOption ppsspp_internal_resolution("ppsspp_internal_resolution", static RetroOption ppsspp_button_preference("ppsspp_button_preference", "Confirmation Button", { { "Cross", PSP_SYSTEMPARAM_BUTTON_CROSS }, { "Circle", PSP_SYSTEMPARAM_BUTTON_CIRCLE } }); static RetroOption ppsspp_fast_memory("ppsspp_fast_memory", "Fast Memory (Speedhack)", true); static RetroOption ppsspp_block_transfer_gpu("ppsspp_block_transfer_gpu", "Block Transfer GPU", true); -static RetroOption ppsspp_inflight_frames("ppsspp_inflight_frames", "Buffered frames (Slower, less lag, restart)", { { "Up to 2", 2 }, { "Up to 1", 1 }, { "No buffer", 0 }, , }); +static RetroOption ppsspp_inflight_frames("ppsspp_inflight_frames", "Buffered frames (Slower, less lag, restart)", { { "Up to 2", 2 }, { "Up to 1", 1 }, { "No buffer", 0 }, }); static RetroOption ppsspp_texture_scaling_level("ppsspp_texture_scaling_level", "Texture Scaling Level", { { "Off", 1 }, { "2x", 2 }, { "3x", 3 }, { "4x", 4 }, { "5x", 5 }, { "Auto", 0 } }); static RetroOption ppsspp_texture_scaling_type("ppsspp_texture_scaling_type", "Texture Scaling Type", { { "xbrz", TextureScalerCommon::XBRZ }, { "hybrid", TextureScalerCommon::HYBRID }, { "bicubic", TextureScalerCommon::BICUBIC }, { "hybrid_bicubic", TextureScalerCommon::HYBRID_BICUBIC } }); static RetroOption ppsspp_texture_filtering("ppsspp_texture_filtering", "Texture Filtering", { { "Auto", 1 }, { "Nearest", 2 }, { "Linear", 3 } }); From b5ba469826fce2a73c7e031b5e823d98ff4fbfd4 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 6 Sep 2021 22:05:39 -0700 Subject: [PATCH 245/336] softgpu: Prevent pixel gaps when drawing sprites. If you end a sprite at 255.9, it draws the pixel at 255. This uses the same logic to handle that as in the triangle path. --- GPU/Software/RasterizerRectangle.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/GPU/Software/RasterizerRectangle.cpp b/GPU/Software/RasterizerRectangle.cpp index bbc7e27463..920f5c6077 100644 --- a/GPU/Software/RasterizerRectangle.cpp +++ b/GPU/Software/RasterizerRectangle.cpp @@ -86,7 +86,8 @@ void DrawSprite(const VertexData& v0, const VertexData& v1) { Sampler::NearestFunc nearestFunc = Sampler::GetNearestFunc(); // Looks at gstate. DrawingCoords pos0 = TransformUnit::ScreenToDrawing(v0.screenpos); - DrawingCoords pos1 = TransformUnit::ScreenToDrawing(v1.screenpos); + // Include the ending pixel based on its center, not start. + DrawingCoords pos1 = TransformUnit::ScreenToDrawing(v1.screenpos + ScreenCoords(7, 7, 0)); DrawingCoords scissorTL(gstate.getScissorX1(), gstate.getScissorY1(), 0); DrawingCoords scissorBR(gstate.getScissorX2(), gstate.getScissorY2(), 0); From 227333f45bdaafbc337c0be851e3048c81eb4e0d Mon Sep 17 00:00:00 2001 From: iota97 Date: Mon, 6 Sep 2021 19:47:06 +0200 Subject: [PATCH 246/336] Don't show CRC button when we can't get it --- UI/GameScreen.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/UI/GameScreen.cpp b/UI/GameScreen.cpp index 02d2c57c25..fdcdacaf2f 100644 --- a/UI/GameScreen.cpp +++ b/UI/GameScreen.cpp @@ -34,6 +34,7 @@ #include "Core/Config.h" #include "Core/Reporting.h" #include "Core/System.h" +#include "Core/Loaders.h" #include "UI/CwCheatScreen.h" #include "UI/EmuScreen.h" #include "UI/GameScreen.h" @@ -178,7 +179,19 @@ void GameScreen::CreateViews() { btnSetBackground_->OnClick.Handle(this, &GameScreen::OnSetBackground); btnSetBackground_->SetVisibility(V_GONE); - if (!Reporting::HasCRC(gamePath_)) { + bool fileTypeSupportCRC = false; + if (info) { + switch (info->fileType) { + case IdentifiedFileType::PSP_PBP: + case IdentifiedFileType::PSP_PBP_DIRECTORY: + case IdentifiedFileType::PSP_ISO_NP: + case IdentifiedFileType::PSP_ISO: + fileTypeSupportCRC = true; + } + } + + bool isHomebrew = info->region > GAMEREGION_MAX; + if (fileTypeSupportCRC && !isHomebrew && !Reporting::HasCRC(gamePath_) ) { btnCalcCRC_ = rightColumnItems->Add(new ChoiceWithValueDisplay(&CRC32string, ga->T("Calculate CRC"), (const char*)nullptr)); btnCalcCRC_->OnClick.Handle(this, &GameScreen::OnDoCRC32); } else { From b44c991fc17dbb50882de6bf74e580c0f7ac5e29 Mon Sep 17 00:00:00 2001 From: iota97 Date: Tue, 7 Sep 2021 16:16:39 +0200 Subject: [PATCH 247/336] Add info check --- UI/GameScreen.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UI/GameScreen.cpp b/UI/GameScreen.cpp index fdcdacaf2f..9cb05ca450 100644 --- a/UI/GameScreen.cpp +++ b/UI/GameScreen.cpp @@ -190,7 +190,7 @@ void GameScreen::CreateViews() { } } - bool isHomebrew = info->region > GAMEREGION_MAX; + bool isHomebrew = info && info->region > GAMEREGION_MAX; if (fileTypeSupportCRC && !isHomebrew && !Reporting::HasCRC(gamePath_) ) { btnCalcCRC_ = rightColumnItems->Add(new ChoiceWithValueDisplay(&CRC32string, ga->T("Calculate CRC"), (const char*)nullptr)); btnCalcCRC_->OnClick.Handle(this, &GameScreen::OnDoCRC32); From e2b0137400f8db3cdf25ee7fd026291a4ed0bb07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 7 Sep 2021 23:41:03 +0200 Subject: [PATCH 248/336] VK: Only autogenerate mipmaps for R8G8B8A8 format textures. Quickfix for bug with Auto High Quality texture filtering. Fixes #14804 (good enough for now at least). --- GPU/Vulkan/TextureCacheVulkan.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/GPU/Vulkan/TextureCacheVulkan.cpp b/GPU/Vulkan/TextureCacheVulkan.cpp index c009cce9a5..fadb043b22 100644 --- a/GPU/Vulkan/TextureCacheVulkan.cpp +++ b/GPU/Vulkan/TextureCacheVulkan.cpp @@ -751,15 +751,15 @@ void TextureCacheVulkan::BuildTexture(TexCacheEntry *const entry) { // such as when using replacement textures - but let's keep the same amount of levels. int maxLevelToGenerate = maxLevel; - if (g_Config.iTexFiltering == TEX_FILTER_AUTO_MAX_QUALITY) { + VkFormat dstFmt = GetDestFormat(GETextureFormat(entry->format), gstate.getClutPaletteFormat()); + + // TODO: Really should inspect the format capabilities. + if (g_Config.iTexFiltering == TEX_FILTER_AUTO_MAX_QUALITY && dstFmt == VK_FORMAT_R8G8B8A8_UNORM) { // Boost the number of mipmaps. int maxPossibleMipmaps = log2i(std::min(gstate.getTextureWidth(0), gstate.getTextureHeight(0))); maxLevelToGenerate = maxPossibleMipmaps; } - // If GLES3 is available, we can preallocate the storage, which makes texture loading more efficient. - VkFormat dstFmt = GetDestFormat(GETextureFormat(entry->format), gstate.getClutPaletteFormat()); - int scaleFactor = standardScaleFactor_; if (scaleFactor > maxScaleFactor_) scaleFactor = maxScaleFactor_; From 5dab9994b64056daf48cbe17cf29167f7242baf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 7 Sep 2021 23:52:06 +0200 Subject: [PATCH 249/336] Bezier/Spline: Fix logical error (must flush buffered data before we modify submitType). Should fix #14774 --- GPU/Common/ShaderId.cpp | 4 ++++ GPU/Common/SplineCommon.cpp | 1 - GPU/GPUCommon.cpp | 6 ++++++ GPU/Vulkan/ShaderManagerVulkan.cpp | 4 ++-- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/GPU/Common/ShaderId.cpp b/GPU/Common/ShaderId.cpp index e1097ff210..d137ac5b9f 100644 --- a/GPU/Common/ShaderId.cpp +++ b/GPU/Common/ShaderId.cpp @@ -74,6 +74,10 @@ void ComputeVertexShaderID(VShaderID *id_out, u32 vertType, bool useHWTransform, bool doBezier = gstate_c.submitType == SubmitType::HW_BEZIER; bool doSpline = gstate_c.submitType == SubmitType::HW_SPLINE; + if (doBezier || doSpline) { + _assert_(hasNormal); + } + bool enableFog = gstate.isFogEnabled() && !isModeThrough && !gstate.isModeClear(); bool lmode = gstate.isUsingSecondaryColor() && gstate.isLightingEnabled() && !isModeThrough; bool vertexRangeCulling = gstate_c.Supports(GPU_SUPPORTS_VS_RANGE_CULLING) && diff --git a/GPU/Common/SplineCommon.cpp b/GPU/Common/SplineCommon.cpp index f1e47b257b..e919d58d0d 100644 --- a/GPU/Common/SplineCommon.cpp +++ b/GPU/Common/SplineCommon.cpp @@ -492,7 +492,6 @@ template void DrawEngineCommon::SubmitCurve(const void *control_p template void DrawEngineCommon::SubmitCurve(const void *control_points, const void *indices, Surface &surface, u32 vertType, int *bytesRead, const char *scope) { PROFILE_THIS_SCOPE(scope); - DispatchFlush(); // Real hardware seems to draw nothing when given < 4 either U or V. // This would result in num_patches_u / num_patches_v being 0. diff --git a/GPU/GPUCommon.cpp b/GPU/GPUCommon.cpp index efaedbb6a3..3f4fe99b66 100644 --- a/GPU/GPUCommon.cpp +++ b/GPU/GPUCommon.cpp @@ -1826,6 +1826,9 @@ void GPUCommon::Execute_Bezier(u32 op, u32 diff) { DEBUG_LOG_REPORT(G3D, "Unusual bezier/spline vtype: %08x, morph: %d, bones: %d", gstate.vertType, (gstate.vertType & GE_VTYPE_MORPHCOUNT_MASK) >> GE_VTYPE_MORPHCOUNT_SHIFT, vertTypeGetNumBoneWeights(gstate.vertType)); } + // Can't flush after setting gstate_c.submitType below since it'll be a mess - it must be done already. + drawEngineCommon_->DispatchFlush(); + Spline::BezierSurface surface; surface.tess_u = gstate.getPatchDivisionU(); surface.tess_v = gstate.getPatchDivisionV(); @@ -1891,6 +1894,9 @@ void GPUCommon::Execute_Spline(u32 op, u32 diff) { DEBUG_LOG_REPORT(G3D, "Unusual bezier/spline vtype: %08x, morph: %d, bones: %d", gstate.vertType, (gstate.vertType & GE_VTYPE_MORPHCOUNT_MASK) >> GE_VTYPE_MORPHCOUNT_SHIFT, vertTypeGetNumBoneWeights(gstate.vertType)); } + // Can't flush after setting gstate_c.submitType below since it'll be a mess - it must be done already. + drawEngineCommon_->DispatchFlush(); + Spline::SplineSurface surface; surface.tess_u = gstate.getPatchDivisionU(); surface.tess_v = gstate.getPatchDivisionV(); diff --git a/GPU/Vulkan/ShaderManagerVulkan.cpp b/GPU/Vulkan/ShaderManagerVulkan.cpp index f225560ad1..ef2d7eb7e4 100644 --- a/GPU/Vulkan/ShaderManagerVulkan.cpp +++ b/GPU/Vulkan/ShaderManagerVulkan.cpp @@ -266,7 +266,7 @@ void ShaderManagerVulkan::GetShaders(int prim, u32 vertType, VulkanVertexShader uint64_t uniformMask = 0; // Not used uint32_t attributeMask = 0; // Not used bool success = GenerateVertexShader(VSID, codeBuffer_, compat_, draw_->GetBugs(), &attributeMask, &uniformMask, &genErrorString); - _assert_(success); + _assert_msg_(success, "VS gen error: %s", genErrorString.c_str()); vs = new VulkanVertexShader(vulkan_, VSID, codeBuffer_, useHWTransform); vsCache_.Insert(VSID, vs); } @@ -279,7 +279,7 @@ void ShaderManagerVulkan::GetShaders(int prim, u32 vertType, VulkanVertexShader std::string genErrorString; uint64_t uniformMask = 0; // Not used bool success = GenerateFragmentShader(FSID, codeBuffer_, compat_, draw_->GetBugs(), &uniformMask, &genErrorString); - _assert_(success); + _assert_msg_(success, "FS gen error: %s", genErrorString.c_str()); fs = new VulkanFragmentShader(vulkan_, FSID, codeBuffer_); fsCache_.Insert(FSID, fs); } From 68f7c9e9ff6e20e47733cd4140d5810858ee2c86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 8 Sep 2021 00:18:41 +0200 Subject: [PATCH 250/336] Round the location of single-pixel lines to the nearest pixel. Should hopefully help #14204. --- Common/Render/DrawBuffer.cpp | 8 ++++---- Common/Render/DrawBuffer.h | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Common/Render/DrawBuffer.cpp b/Common/Render/DrawBuffer.cpp index b932c62493..e554799386 100644 --- a/Common/Render/DrawBuffer.cpp +++ b/Common/Render/DrawBuffer.cpp @@ -123,17 +123,17 @@ void DrawBuffer::Rect(float x, float y, float w, float h, uint32_t color, int al } void DrawBuffer::hLine(float x1, float y, float x2, uint32_t color) { + // Round Y to the closest full pixel, since we're making it 1-pixel-thin. + y -= fmodf(y, pixel_in_dps_y); Rect(x1, y, x2 - x1, pixel_in_dps_y, color); } void DrawBuffer::vLine(float x, float y1, float y2, uint32_t color) { + // Round X to the closest full pixel, since we're making it 1-pixel-thin. + x -= fmodf(x, pixel_in_dps_x); Rect(x, y1, pixel_in_dps_x, y2 - y1, color); } -void DrawBuffer::vLineAlpha50(float x, float y1, float y2, uint32_t color) { - Rect(x, y1, pixel_in_dps_x, y2 - y1, (color | 0xFF000000) & 0x7F000000); -} - void DrawBuffer::RectVGradient(float x, float y, float w, float h, uint32_t colorTop, uint32_t colorBottom) { V(x, y, 0, colorTop, 0, 0); V(x + w, y, 0, colorTop, 1, 0); diff --git a/Common/Render/DrawBuffer.h b/Common/Render/DrawBuffer.h index 07aa344ca7..a978b6173c 100644 --- a/Common/Render/DrawBuffer.h +++ b/Common/Render/DrawBuffer.h @@ -73,7 +73,6 @@ public: void Rect(float x, float y, float w, float h, uint32_t color, int align = ALIGN_TOPLEFT); void hLine(float x1, float y, float x2, uint32_t color); void vLine(float x, float y1, float y2, uint32_t color); - void vLineAlpha50(float x, float y1, float y2, uint32_t color); void Line(ImageID atlas_image, float x1, float y1, float x2, float y2, float thickness, uint32_t color); From 2b683ff8c7f89b9727e36ff0968983d0c04cf34f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 8 Sep 2021 00:19:18 +0200 Subject: [PATCH 251/336] Fix typo (and maybe a bug). --- UI/ControlMappingScreen.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UI/ControlMappingScreen.cpp b/UI/ControlMappingScreen.cpp index 31f7fe761d..1db57b1949 100644 --- a/UI/ControlMappingScreen.cpp +++ b/UI/ControlMappingScreen.cpp @@ -130,7 +130,7 @@ void SingleControlMapper::Refresh() { std::vector mappings; KeyMap::KeyFromPspButton(pspKey_, &mappings, false); - rows_.empty(); + rows_.clear(); for (size_t i = 0; i < mappings.size(); i++) { std::string deviceName = GetDeviceName(mappings[i].deviceId); std::string keyName = KeyMap::GetKeyOrAxisName(mappings[i].keyCode); From 2a223bb91df28a9a2fb390edb979723221eead29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 8 Sep 2021 01:16:49 +0200 Subject: [PATCH 252/336] No longer need to specify build tools version, gradle now has a default. --- android/build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/android/build.gradle b/android/build.gradle index 45217d4303..67bb3291c5 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -45,7 +45,6 @@ android { } } compileSdkVersion 30 - buildToolsVersion '30.0.0' defaultConfig { applicationId 'org.ppsspp.ppsspp' if (androidGitVersion.name() != "unknown" && androidGitVersion.code() >= 14000000) { From 7b33325cacf35346bcad00e27a5781c7b2b60e78 Mon Sep 17 00:00:00 2001 From: iota97 Date: Wed, 8 Sep 2021 08:54:59 +0200 Subject: [PATCH 253/336] Double binding fix --- Core/KeyMap.cpp | 19 +++++++++++++++++++ Core/KeyMap.h | 2 ++ UI/ControlMappingScreen.cpp | 12 ++++++++---- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/Core/KeyMap.cpp b/Core/KeyMap.cpp index 76b173dab8..6b9627eaa6 100644 --- a/Core/KeyMap.cpp +++ b/Core/KeyMap.cpp @@ -603,6 +603,25 @@ bool IsKeyMapped(int device, int key) { return false; } +bool ReplaceSingleKeyMapping(int btn, int index, KeyDef key) { + // Check for duplicate + for (int i = 0; i < g_controllerMap[btn].size(); ++i) { + if (i != index && g_controllerMap[btn][i] == key) { + g_controllerMap[btn].erase(g_controllerMap[btn].begin()+index); + g_controllerMapGeneration++; + + UpdateNativeMenuKeys(); + return false; + } + } + KeyMap::g_controllerMap[btn][index] = key; + g_controllerMapGeneration++; + + g_seenDeviceIds.insert(key.deviceId); + UpdateNativeMenuKeys(); + return true; +} + void SetKeyMapping(int btn, KeyDef key, bool replace) { if (key.keyCode < 0) return; diff --git a/Core/KeyMap.h b/Core/KeyMap.h index 2126bcdc82..b2a1266e9c 100644 --- a/Core/KeyMap.h +++ b/Core/KeyMap.h @@ -128,6 +128,8 @@ namespace KeyMap { // Configure the key mapping. // Any configuration will be saved to the Core config. void SetKeyMapping(int psp_key, KeyDef key, bool replace); + // Return false if bind was a duplicate and got removed + bool ReplaceSingleKeyMapping(int btn, int index, KeyDef key); // Configure an axis mapping, saves the configuration. // Direction is negative or positive. diff --git a/UI/ControlMappingScreen.cpp b/UI/ControlMappingScreen.cpp index 1db57b1949..fa404f1c47 100644 --- a/UI/ControlMappingScreen.cpp +++ b/UI/ControlMappingScreen.cpp @@ -166,13 +166,17 @@ void SingleControlMapper::MappedCallback(KeyDef kdf) { replaceAllButton_->SetFocus(); break; case REPLACEONE: - KeyMap::g_controllerMap[pspKey_][actionIndex_] = kdf; - KeyMap::g_controllerMapGeneration++; - if (actionIndex_ < rows_.size()) + { + bool success = KeyMap::ReplaceSingleKeyMapping(pspKey_, actionIndex_, kdf); + if (!success) { + replaceAllButton_->SetFocus(); // Last got removed as a duplicate + } else if (actionIndex_ < rows_.size()) { rows_[actionIndex_]->SetFocus(); - else + } else { SetFocus(); + } break; + } default: SetFocus(); break; From 6350b41d3fe1fb524a3c83381b5ef25fdf878cda Mon Sep 17 00:00:00 2001 From: Stuart Kenny Date: Wed, 8 Sep 2021 09:27:15 +0100 Subject: [PATCH 254/336] Expose new texture filtering option and fix runtime changing texture upscale mode --- libretro/libretro.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index 6fba4a616a..cc02d7959f 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -212,7 +212,7 @@ static RetroOption ppsspp_block_transfer_gpu("ppsspp_block_transfer_gpu", static RetroOption ppsspp_inflight_frames("ppsspp_inflight_frames", "Buffered frames (Slower, less lag, restart)", { { "Up to 2", 2 }, { "Up to 1", 1 }, { "No buffer", 0 }, }); static RetroOption ppsspp_texture_scaling_level("ppsspp_texture_scaling_level", "Texture Scaling Level", { { "Off", 1 }, { "2x", 2 }, { "3x", 3 }, { "4x", 4 }, { "5x", 5 }, { "Auto", 0 } }); static RetroOption ppsspp_texture_scaling_type("ppsspp_texture_scaling_type", "Texture Scaling Type", { { "xbrz", TextureScalerCommon::XBRZ }, { "hybrid", TextureScalerCommon::HYBRID }, { "bicubic", TextureScalerCommon::BICUBIC }, { "hybrid_bicubic", TextureScalerCommon::HYBRID_BICUBIC } }); -static RetroOption ppsspp_texture_filtering("ppsspp_texture_filtering", "Texture Filtering", { { "Auto", 1 }, { "Nearest", 2 }, { "Linear", 3 } }); +static RetroOption ppsspp_texture_filtering("ppsspp_texture_filtering", "Texture Filtering", { { "Auto", 1 }, { "Nearest", 2 }, { "Linear", 3 }, {"Auto max quality", 4}}); static RetroOption ppsspp_texture_anisotropic_filtering("ppsspp_texture_anisotropic_filtering", "Anisotropic Filtering", { "off", "2x", "4x", "8x", "16x" }); static RetroOption ppsspp_lower_resolution_for_effects("ppsspp_lower_resolution_for_effects", "Lower resolution for effects", { {"Off", 0}, {"Safe", 1}, {"Balanced", 2}, {"Aggressive", 3} }); static RetroOption ppsspp_texture_deposterize("ppsspp_texture_deposterize", "Texture Deposterize", false); @@ -404,10 +404,16 @@ static void check_variables(CoreParameter &coreParam) coreParam.fastForward = isFastForwarding; if (ppsspp_texture_scaling_type.Update(&g_Config.iTexScalingType) && gpu) + { gpu->ClearCacheNextFrame(); + gpu->Resized(); + } if (ppsspp_texture_scaling_level.Update(&g_Config.iTexScalingLevel) && gpu) + { gpu->ClearCacheNextFrame(); + gpu->Resized(); + } } void retro_set_audio_sample_batch(retro_audio_sample_batch_t cb) { audio_batch_cb = cb; } From 01aaed54d69c1333d82adaed87497ca029262ef1 Mon Sep 17 00:00:00 2001 From: iota97 Date: Wed, 8 Sep 2021 15:03:32 +0200 Subject: [PATCH 255/336] Wave animation --- Core/ConfigValues.h | 1 + UI/GameSettingsScreen.cpp | 2 +- UI/MiscScreens.cpp | 29 +++++++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/Core/ConfigValues.h b/Core/ConfigValues.h index debeee4808..f6e7558ed1 100644 --- a/Core/ConfigValues.h +++ b/Core/ConfigValues.h @@ -128,4 +128,5 @@ enum class BackgroundAnimation { OFF = 0, FLOATING_SYMBOLS = 1, RECENT_GAMES = 2, + WAVE = 3, }; diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 8240e45137..3d2b64b617 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -880,7 +880,7 @@ void GameSettingsScreen::CreateViews() { if (backgroundChoice_ != nullptr) { backgroundChoice_->OnClick.Handle(this, &GameSettingsScreen::OnChangeBackground); } - static const char *backgroundAnimations[] = { "No animation", "Floating symbols", "Recent games" }; + static const char *backgroundAnimations[] = { "No animation", "Floating symbols", "Recent games", "Waves" }; systemSettings->Add(new PopupMultiChoice(&g_Config.iBackgroundAnimation, sy->T("UI background animation"), backgroundAnimations, 0, ARRAY_SIZE(backgroundAnimations), sy->GetName(), screenManager())); systemSettings->Add(new ItemHeader(sy->T("Help the PPSSPP team"))); diff --git a/UI/MiscScreens.cpp b/UI/MiscScreens.cpp index 485613e4eb..d2b1023621 100644 --- a/UI/MiscScreens.cpp +++ b/UI/MiscScreens.cpp @@ -79,6 +79,32 @@ public: virtual void Draw(UIContext &dc, double t, float alpha) = 0; }; +class WaveAnimation : public Animation { +public: + void Draw(UIContext &dc, double t, float alpha) override { + const uint32_t color = 0x30FFFFFF; + const float speed = 1.0; + + Bounds bounds = dc.GetBounds(); + dc.Flush(); + dc.BeginNoTex(); + + t *= speed; + for (int x = 0; x < bounds.w; ++x) { + float i = x * 1280/bounds.w; + + float wave0 = sin(i*0.005+t*0.8)*0.05 + sin(i*0.002+t*0.25)*0.02 + sin(i*0.001+t*0.3)*0.03 + 0.625; + dc.Draw()->RectVGradient(x, wave0*bounds.h, pixel_in_dps_x, (1.0-wave0)*bounds.h, color, 0x00000000); + + float wave1 = sin(i*0.0044+t*0.4)*0.07 + sin(i*0.003+t*0.1)*0.02 + sin(i*0.001+t*0.3)*0.01 + 0.625; + dc.Draw()->RectVGradient(x, wave1*bounds.h, pixel_in_dps_x, (1.0-wave1)*bounds.h, color, 0x00000000); + } + + dc.Flush(); + dc.Begin(); + } +}; + class FloatingSymbolsAnimation : public Animation { public: ~FloatingSymbolsAnimation() override {} @@ -236,6 +262,9 @@ void DrawBackground(UIContext &dc, float alpha) { case BackgroundAnimation::RECENT_GAMES: g_Animation.reset(new RecentGamesAnimation()); break; + case BackgroundAnimation::WAVE: + g_Animation.reset(new WaveAnimation()); + break; default: g_Animation.reset(nullptr); } From 79b10c4d53e91e1d212c72d2c0cfe21615dc5440 Mon Sep 17 00:00:00 2001 From: iota97 Date: Wed, 8 Sep 2021 16:36:57 +0200 Subject: [PATCH 256/336] Add some antialiasing --- UI/MiscScreens.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/UI/MiscScreens.cpp b/UI/MiscScreens.cpp index d2b1023621..5e5c5d9071 100644 --- a/UI/MiscScreens.cpp +++ b/UI/MiscScreens.cpp @@ -82,7 +82,7 @@ public: class WaveAnimation : public Animation { public: void Draw(UIContext &dc, double t, float alpha) override { - const uint32_t color = 0x30FFFFFF; + const uint32_t color = colorAlpha(0xFFFFFFFF, alpha * 0.2f); const float speed = 1.0; Bounds bounds = dc.GetBounds(); @@ -94,10 +94,13 @@ public: float i = x * 1280/bounds.w; float wave0 = sin(i*0.005+t*0.8)*0.05 + sin(i*0.002+t*0.25)*0.02 + sin(i*0.001+t*0.3)*0.03 + 0.625; - dc.Draw()->RectVGradient(x, wave0*bounds.h, pixel_in_dps_x, (1.0-wave0)*bounds.h, color, 0x00000000); - float wave1 = sin(i*0.0044+t*0.4)*0.07 + sin(i*0.003+t*0.1)*0.02 + sin(i*0.001+t*0.3)*0.01 + 0.625; + dc.Draw()->RectVGradient(x, wave0*bounds.h, pixel_in_dps_x, (1.0-wave0)*bounds.h, color, 0x00000000); dc.Draw()->RectVGradient(x, wave1*bounds.h, pixel_in_dps_x, (1.0-wave1)*bounds.h, color, 0x00000000); + + // Add some "antialiasing" + dc.Draw()->RectVGradient(x, wave0*bounds.h-3*pixel_in_dps_y, pixel_in_dps_x, 3*pixel_in_dps_y, 0x00000000, color); + dc.Draw()->RectVGradient(x, wave1*bounds.h-3*pixel_in_dps_y, pixel_in_dps_x, 3*pixel_in_dps_y, 0x00000000, color); } dc.Flush(); From f442f4012c4bc49e70c79e71be4255c0a2947545 Mon Sep 17 00:00:00 2001 From: Stuart Kenny Date: Wed, 8 Sep 2021 16:42:11 +0100 Subject: [PATCH 257/336] Expose texture shader core option. --- GPU/Common/PostShader.cpp | 4 ++-- libretro/libretro.cpp | 27 ++++++++++++++------------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/GPU/Common/PostShader.cpp b/GPU/Common/PostShader.cpp index ff106531b7..fbb7297dea 100644 --- a/GPU/Common/PostShader.cpp +++ b/GPU/Common/PostShader.cpp @@ -81,10 +81,10 @@ void LoadPostShaderInfo(const std::vector &directories) { for (size_t d = 0; d < directories.size(); d++) { std::vector fileInfo; - File::GetFilesInDir(directories[d], &fileInfo, "ini:"); + VFSGetFileListing(directories[d].c_str(), &fileInfo, "ini:"); if (fileInfo.size() == 0) { - VFSGetFileListing(directories[d].c_str(), &fileInfo, "ini:"); + File::GetFilesInDir(directories[d], &fileInfo, "ini:"); } for (size_t f = 0; f < fileInfo.size(); f++) { diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index cc02d7959f..7eb2285d0b 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -212,6 +212,7 @@ static RetroOption ppsspp_block_transfer_gpu("ppsspp_block_transfer_gpu", static RetroOption ppsspp_inflight_frames("ppsspp_inflight_frames", "Buffered frames (Slower, less lag, restart)", { { "Up to 2", 2 }, { "Up to 1", 1 }, { "No buffer", 0 }, }); static RetroOption ppsspp_texture_scaling_level("ppsspp_texture_scaling_level", "Texture Scaling Level", { { "Off", 1 }, { "2x", 2 }, { "3x", 3 }, { "4x", 4 }, { "5x", 5 }, { "Auto", 0 } }); static RetroOption ppsspp_texture_scaling_type("ppsspp_texture_scaling_type", "Texture Scaling Type", { { "xbrz", TextureScalerCommon::XBRZ }, { "hybrid", TextureScalerCommon::HYBRID }, { "bicubic", TextureScalerCommon::BICUBIC }, { "hybrid_bicubic", TextureScalerCommon::HYBRID_BICUBIC } }); +static RetroOption ppsspp_texture_shader("ppsspp_texture_shader", "Texture Shader (Vulkan only, overrides Texture Scaling Type)", { {"Off", "Off"}, {"4xBRZ", "Tex4xBRZ"}, {"MMPX", "TexMMPX"} }); static RetroOption ppsspp_texture_filtering("ppsspp_texture_filtering", "Texture Filtering", { { "Auto", 1 }, { "Nearest", 2 }, { "Linear", 3 }, {"Auto max quality", 4}}); static RetroOption ppsspp_texture_anisotropic_filtering("ppsspp_texture_anisotropic_filtering", "Anisotropic Filtering", { "off", "2x", "4x", "8x", "16x" }); static RetroOption ppsspp_lower_resolution_for_effects("ppsspp_lower_resolution_for_effects", "Lower resolution for effects", { {"Off", 0}, {"Safe", 1}, {"Balanced", 2}, {"Aggressive", 3} }); @@ -259,6 +260,7 @@ void retro_set_environment(retro_environment_t cb) vars.push_back(ppsspp_lower_resolution_for_effects.GetOptions()); vars.push_back(ppsspp_texture_scaling_level.GetOptions()); vars.push_back(ppsspp_texture_scaling_type.GetOptions()); + vars.push_back(ppsspp_texture_shader.GetOptions()); vars.push_back(ppsspp_texture_filtering.GetOptions()); vars.push_back(ppsspp_texture_deposterize.GetOptions()); vars.push_back(ppsspp_texture_replacement.GetOptions()); @@ -378,6 +380,17 @@ static void check_variables(CoreParameter &coreParam) ppsspp_spline_quality.Update(&g_Config.iSplineBezierQuality); ppsspp_disable_slow_framebuffer_effects.Update(&g_Config.bDisableSlowFramebufEffects); ppsspp_inflight_frames.Update(&g_Config.iInflightFrames); + const bool do_scaling_type_update = ppsspp_texture_scaling_type.Update(&g_Config.iTexScalingType); + const bool do_scaling_level_update = ppsspp_texture_scaling_level.Update(&g_Config.iTexScalingLevel); + const bool do_texture_shader_update = ppsspp_texture_shader.Update(&g_Config.sTextureShaderName); + + g_Config.bTexHardwareScaling = "Off" != g_Config.sTextureShaderName; + + if (gpu && (do_scaling_type_update || do_scaling_level_update || do_texture_shader_update)) + { + gpu->ClearCacheNextFrame(); + gpu->Resized(); + } ppsspp_language.Update(&g_Config.iLanguage); if (g_Config.iLanguage < 0) @@ -386,7 +399,7 @@ static void check_variables(CoreParameter &coreParam) g_Config.sLanguageIni = map_psp_language_to_i18n_locale(g_Config.iLanguage); i18nrepo.LoadIni(g_Config.sLanguageIni); - if (!PSP_IsInited() && ppsspp_internal_resolution.Update(&g_Config.iInternalResolution)) + if (ppsspp_internal_resolution.Update(&g_Config.iInternalResolution) && !PSP_IsInited()) { coreParam.pixelWidth = coreParam.renderWidth = g_Config.iInternalResolution * 480; coreParam.pixelHeight = coreParam.renderHeight = g_Config.iInternalResolution * 272; @@ -402,18 +415,6 @@ static void check_variables(CoreParameter &coreParam) bool isFastForwarding = environ_cb(RETRO_ENVIRONMENT_GET_FASTFORWARDING, &isFastForwarding); coreParam.fastForward = isFastForwarding; - - if (ppsspp_texture_scaling_type.Update(&g_Config.iTexScalingType) && gpu) - { - gpu->ClearCacheNextFrame(); - gpu->Resized(); - } - - if (ppsspp_texture_scaling_level.Update(&g_Config.iTexScalingLevel) && gpu) - { - gpu->ClearCacheNextFrame(); - gpu->Resized(); - } } void retro_set_audio_sample_batch(retro_audio_sample_batch_t cb) { audio_batch_cb = cb; } From 8e9cdf97cfaed316974f81a2f1c2174f8459c60b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 8 Sep 2021 21:33:50 +0200 Subject: [PATCH 258/336] Implement support for new file chooser on Android 11+. --- .../org/ppsspp/ppsspp/ShortcutActivity.java | 53 ++++++++++++++++--- 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/android/src/org/ppsspp/ppsspp/ShortcutActivity.java b/android/src/org/ppsspp/ppsspp/ShortcutActivity.java index 8b33203d7e..92dfd6a616 100644 --- a/android/src/org/ppsspp/ppsspp/ShortcutActivity.java +++ b/android/src/org/ppsspp/ppsspp/ShortcutActivity.java @@ -5,6 +5,7 @@ import android.app.AlertDialog; import android.content.Intent; import android.content.Intent.ShortcutIconResource; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.Looper; @@ -18,31 +19,68 @@ import java.io.File; public class ShortcutActivity extends Activity { private static final String TAG = "PPSSPP"; + private boolean scoped = false; + private static final int RESULT_OPEN_DOCUMENT = 2; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - // Show file selector dialog here. - SimpleFileChooser fileDialog = new SimpleFileChooser(this, Environment.getExternalStorageDirectory(), onFileSelectedListener); - fileDialog.showDialog(); + // Show file selector dialog here. If Android version is more than or equal to 11, + // use the native file browser instead of our SimpleFileChooser. + scoped = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q); + + if (scoped) { + try { + Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); + intent.addCategory(Intent.CATEGORY_OPENABLE); + intent.setType("*/*"); + intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); + // Possible alternative approach: + // String[] mimeTypes = {"application/octet-stream", "/x-iso9660-image"}; + // intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes); + startActivityForResult(intent, RESULT_OPEN_DOCUMENT); + // intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri); + } catch (Exception e) { + Log.e(TAG, e.toString()); + } + } else { + SimpleFileChooser fileDialog = new SimpleFileChooser(this, Environment.getExternalStorageDirectory(), onFileSelectedListener); + fileDialog.showDialog(); + } + } + + // Respond to native file dialog. + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (resultCode == RESULT_OPEN_DOCUMENT) { + Uri selectedFile = data.getData(); + if (selectedFile != null) { + // Grab permanent permission so we can show it in recents list etc. + if (Build.VERSION.SDK_INT >= 19) { + getContentResolver().takePersistableUriPermission(selectedFile, Intent.FLAG_GRANT_READ_URI_PERMISSION); + } + Log.i(TAG, "Browse file finished:" + selectedFile.toString()); + + } + } } public static native String queryGameName(String path); // Create shortcut as response for ACTION_CREATE_SHORTCUT intent. - private void respondToShortcutRequest(String path) { + private void respondToShortcutRequest(Uri uri) { // This is Intent that will be sent when user execute our shortcut on // homescreen. Set our app as target Context. Set Main activity as // target class. Add any parameter as data. Intent shortcutIntent = new Intent(this, PpssppActivity.class); - Uri uri = Uri.fromFile(new File(path)); Log.i(TAG, "Shortcut URI: " + uri.toString()); shortcutIntent.setData(uri); shortcutIntent.putExtra(PpssppActivity.SHORTCUT_EXTRA_KEY, path); PpssppActivity.CheckABIAndLoadLibrary(); - String name = queryGameName(path); + String name = queryGameName(uri.toString()); if (name.equals("")) { showBadGameMessage(); return; @@ -89,7 +127,8 @@ public class ShortcutActivity extends Activity { @Override public void onFileSelected(File file) { // create shortcut using file path - respondToShortcutRequest(file.getAbsolutePath()); + Uri uri = Uri.fromFile(new File(file.getAbsolutePath())); + respondToShortcutRequest(uri); } }; } From 0d9d360b07709790ff2db8704e0d7f8a795e382d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 8 Sep 2021 23:24:00 +0200 Subject: [PATCH 259/336] ThreadManager cleanups --- Common/Thread/ThreadManager.cpp | 12 +++++++++--- Common/Thread/ThreadManager.h | 5 ++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/Common/Thread/ThreadManager.cpp b/Common/Thread/ThreadManager.cpp index 8ac9ac0a22..4177b9f44b 100644 --- a/Common/Thread/ThreadManager.cpp +++ b/Common/Thread/ThreadManager.cpp @@ -98,7 +98,7 @@ static void WorkerThreadFunc(GlobalThreadContext *global, ThreadContext *thread) } void ThreadManager::Init(int numRealCores, int numLogicalCoresPerCpu) { - if (!global_->threads_.empty()) { + if (IsInitialized()) { Teardown(); } @@ -118,6 +118,8 @@ void ThreadManager::Init(int numRealCores, int numLogicalCoresPerCpu) { } void ThreadManager::EnqueueTask(Task *task, TaskType taskType) { + _assert_msg_(IsInitialized(), "ThreadManager not initialized"); + int maxThread; int threadOffset = 0; if (taskType == TaskType::CPU_COMPUTE) { @@ -158,7 +160,7 @@ void ThreadManager::EnqueueTask(Task *task, TaskType taskType) { } void ThreadManager::EnqueueTaskOnThread(int threadNum, Task *task, TaskType taskType) { - _assert_(threadNum >= 0 && threadNum < (int)global_->threads_.size()); + _assert_msg_(threadNum >= 0 && threadNum < (int)global_->threads_.size(), "Bad threadnum or not initialized"); ThreadContext *thread = global_->threads_[threadNum]; { std::unique_lock lock(thread->mutex); @@ -172,5 +174,9 @@ int ThreadManager::GetNumLooperThreads() const { } void ThreadManager::TryCancelTask(uint64_t taskID) { - // Do nothing + // Do nothing for now, just let it finish. +} + +bool ThreadManager::IsInitialized() const { + return !global_->threads_.empty(); } diff --git a/Common/Thread/ThreadManager.h b/Common/Thread/ThreadManager.h index 822997d921..683451da8e 100644 --- a/Common/Thread/ThreadManager.h +++ b/Common/Thread/ThreadManager.h @@ -48,6 +48,8 @@ public: void EnqueueTaskOnThread(int threadNum, Task *task, TaskType taskType); void Teardown(); + bool IsInitialized() const; + // Currently does nothing. It will always be best-effort - maybe it cancels, // maybe it doesn't. Note that the id is the id() returned by the task. You need to make that // something meaningful yourself. @@ -58,7 +60,8 @@ public: int GetNumLooperThreads() const; private: - GlobalThreadContext *global_ = nullptr; + // This is always pointing to a context, initialized in the constructor. + GlobalThreadContext *global_; int numThreads_ = 0; int numComputeThreads_ = 0; From 568043211f8bf4375904d96670b7aa124523675c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 8 Sep 2021 23:24:28 +0200 Subject: [PATCH 260/336] Fix error message --- Core/Loaders.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/Loaders.cpp b/Core/Loaders.cpp index cd0667829b..13093046a0 100644 --- a/Core/Loaders.cpp +++ b/Core/Loaders.cpp @@ -71,7 +71,7 @@ IdentifiedFileType Identify_File(FileLoader *fileLoader, std::string *errorStrin } if (!fileLoader->Exists()) { - *errorString = "IdentifyFile: File doesn't exist" + fileLoader->GetPath().ToString(); + *errorString = "IdentifyFile: File doesn't exist: " + fileLoader->GetPath().ToString(); return IdentifiedFileType::ERROR_IDENTIFYING; } From 1d08317766eb5989f822b9c617bb97e66a915ecb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 8 Sep 2021 23:25:39 +0200 Subject: [PATCH 261/336] Valiant attempt to fix queryGameName --- android/jni/app-android.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/android/jni/app-android.cpp b/android/jni/app-android.cpp index da4d591113..7b2f2079f2 100644 --- a/android/jni/app-android.cpp +++ b/android/jni/app-android.cpp @@ -1441,15 +1441,30 @@ extern "C" bool JNICALL Java_org_ppsspp_ppsspp_NativeActivity_runEGLRenderLoop(J return true; } +// NOTE: This is defunct and not working, due to how the Android storage functions currently require +// a PpssppActivity specifically and we don't have one here. extern "C" jstring Java_org_ppsspp_ppsspp_ShortcutActivity_queryGameName(JNIEnv *env, jclass, jstring jpath) { + bool teardownThreadManager = false; + if (!g_threadManager.IsInitialized()) { + INFO_LOG(SYSTEM, "No thread manager - initializing one"); + // Need a thread manager. + teardownThreadManager = true; + g_threadManager.Init(1, 1); + } + Path path = Path(GetJavaString(env, jpath)); + + INFO_LOG(SYSTEM, "queryGameName(%s)", path.c_str()); + std::string result = ""; GameInfoCache *cache = new GameInfoCache(); std::shared_ptr info = cache->GetInfo(nullptr, path, 0); // Wait until it's done: this is synchronous, unfortunately. if (info) { + INFO_LOG(SYSTEM, "GetInfo successful, waiting"); cache->WaitUntilDone(info); + INFO_LOG(SYSTEM, "Done waiting"); if (info->fileType != IdentifiedFileType::UNKNOWN) { result = info->GetTitle(); @@ -1458,9 +1473,19 @@ extern "C" jstring Java_org_ppsspp_ppsspp_ShortcutActivity_queryGameName(JNIEnv if (result.length() > strlen("The ") && startsWithNoCase(result, "The ")) { result = result.substr(strlen("The ")); } + + INFO_LOG(SYSTEM, "queryGameName: Got '%s'", result.c_str()); + } else { + INFO_LOG(SYSTEM, "queryGameName: Filetype unknown"); } + } else { + INFO_LOG(SYSTEM, "No info from cache"); } delete cache; + if (teardownThreadManager) { + g_threadManager.Teardown(); + } + return env->NewStringUTF(result.c_str()); } From bad0736fa3ad80f42d4354c833abbc1547d7c3d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 8 Sep 2021 23:26:01 +0200 Subject: [PATCH 262/336] Avoid calling into C++ when creating game shortcuts. Use scoped storage-compatible file chooser when possible. --- .../src/org/ppsspp/ppsspp/PpssppActivity.java | 2 +- .../org/ppsspp/ppsspp/ShortcutActivity.java | 49 +++++++++++++++---- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/android/src/org/ppsspp/ppsspp/PpssppActivity.java b/android/src/org/ppsspp/ppsspp/PpssppActivity.java index f7786ef707..9f55c799cc 100644 --- a/android/src/org/ppsspp/ppsspp/PpssppActivity.java +++ b/android/src/org/ppsspp/ppsspp/PpssppActivity.java @@ -98,7 +98,7 @@ public class PpssppActivity extends NativeActivity { // String action = intent.getAction(); Uri data = intent.getData(); if (data != null) { - String path = intent.getData().getPath(); + String path = data.toString(); Log.i(TAG, "Found Shortcut Parameter in data: " + path); super.setShortcutParam("\"" + path.replace("\\", "\\\\").replace("\"", "\\\"") + "\""); // Toast.makeText(getApplicationContext(), path, Toast.LENGTH_SHORT).show(); diff --git a/android/src/org/ppsspp/ppsspp/ShortcutActivity.java b/android/src/org/ppsspp/ppsspp/ShortcutActivity.java index 92dfd6a616..51a21ee12c 100644 --- a/android/src/org/ppsspp/ppsspp/ShortcutActivity.java +++ b/android/src/org/ppsspp/ppsspp/ShortcutActivity.java @@ -11,6 +11,7 @@ import android.os.Environment; import android.os.Looper; import android.util.Log; import java.io.File; +import java.nio.charset.StandardCharsets; /** * This class will respond to android.intent.action.CREATE_SHORTCUT intent from launcher homescreen. @@ -27,8 +28,8 @@ public class ShortcutActivity extends Activity { super.onCreate(savedInstanceState); // Show file selector dialog here. If Android version is more than or equal to 11, - // use the native file browser instead of our SimpleFileChooser. - scoped = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q); + // use the native document file browser instead of our SimpleFileChooser. + scoped = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R); if (scoped) { try { @@ -41,6 +42,7 @@ public class ShortcutActivity extends Activity { // intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes); startActivityForResult(intent, RESULT_OPEN_DOCUMENT); // intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri); + Log.i(TAG, "Starting open document activity"); } catch (Exception e) { Log.e(TAG, e.toString()); } @@ -53,17 +55,23 @@ public class ShortcutActivity extends Activity { // Respond to native file dialog. @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (resultCode == RESULT_OPEN_DOCUMENT) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == RESULT_OPEN_DOCUMENT && data != null) { Uri selectedFile = data.getData(); if (selectedFile != null) { // Grab permanent permission so we can show it in recents list etc. if (Build.VERSION.SDK_INT >= 19) { + Log.i(TAG, "Taking URI permission"); getContentResolver().takePersistableUriPermission(selectedFile, Intent.FLAG_GRANT_READ_URI_PERMISSION); } Log.i(TAG, "Browse file finished:" + selectedFile.toString()); - + respondToShortcutRequest(selectedFile); // finishes. + return; } } + + // We're done, no matter how it went. + finish(); } public static native String queryGameName(String path); @@ -76,15 +84,40 @@ public class ShortcutActivity extends Activity { Intent shortcutIntent = new Intent(this, PpssppActivity.class); Log.i(TAG, "Shortcut URI: " + uri.toString()); shortcutIntent.setData(uri); - + String path = uri.toString(); shortcutIntent.putExtra(PpssppActivity.SHORTCUT_EXTRA_KEY, path); + // We can't call C++ functions here that use storage APIs since there's no + // NativeActivity and all the AndroidStorage methods are methods on that. + // Should probably change that. In the meantime, let's just process the URI to make + // up a name. + + String name = "PPSSPP Game"; + String pathStr = "PPSSPP Game"; + if (path.startsWith("content://")) { + String [] segments = path.split("/"); + try { + pathStr = java.net.URLDecoder.decode(segments[segments.length - 1], StandardCharsets.UTF_8.name()); + } catch (Exception e) { + Log.i(TAG, "Exception getting name: " + e); + } + } else { + pathStr = path; + } + + String[] pathSegments = pathStr.split("/"); + name = pathSegments[pathSegments.length - 1]; + + /* PpssppActivity.CheckABIAndLoadLibrary(); - String name = queryGameName(uri.toString()); + String name = queryGameName(path); if (name.equals("")) { + Log.i(TAG, "Failed to retrieve game name - ignoring."); showBadGameMessage(); return; - } + }*/ + + Log.i(TAG, "Game name: " + name + " : Creating shortcut to " + path); // This is Intent that will be returned by this method, as response to // ACTION_CREATE_SHORTCUT. Wrap shortcut intent inside this intent. @@ -118,8 +151,6 @@ public class ShortcutActivity extends Activity { } catch (InterruptedException e) { e.printStackTrace(); } - - System.exit(-1); } // Event when a file is selected on file dialog. From 273376ab8dbcd21585f76143ece7d2fd18821376 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 8 Sep 2021 23:43:35 +0200 Subject: [PATCH 263/336] Set a couple flags on the ShortcutIntent --- android/src/org/ppsspp/ppsspp/ShortcutActivity.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/android/src/org/ppsspp/ppsspp/ShortcutActivity.java b/android/src/org/ppsspp/ppsspp/ShortcutActivity.java index 51a21ee12c..7e84cefb26 100644 --- a/android/src/org/ppsspp/ppsspp/ShortcutActivity.java +++ b/android/src/org/ppsspp/ppsspp/ShortcutActivity.java @@ -81,7 +81,9 @@ public class ShortcutActivity extends Activity { // This is Intent that will be sent when user execute our shortcut on // homescreen. Set our app as target Context. Set Main activity as // target class. Add any parameter as data. - Intent shortcutIntent = new Intent(this, PpssppActivity.class); + Intent shortcutIntent = new Intent(getApplicationContext(), PpssppActivity.class); + shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); Log.i(TAG, "Shortcut URI: " + uri.toString()); shortcutIntent.setData(uri); String path = uri.toString(); From c9bcbf326f83ca433a2ef7b080d2a8b1d5597f7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 9 Sep 2021 00:00:54 +0200 Subject: [PATCH 264/336] More shortcut fixes --- UI/NativeApp.cpp | 10 +++++++++- android/src/org/ppsspp/ppsspp/ShortcutActivity.java | 10 +++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index 80e6570850..5d4d8c1b76 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -46,6 +46,7 @@ #include "Common/Net/HTTPClient.h" #include "Common/Net/Resolve.h" +#include "Common/Net/URL.h" #include "Common/Render/TextureAtlas.h" #include "Common/Render/Text/draw_text.h" #include "Common/GPU/OpenGL/GLFeatures.h" @@ -683,7 +684,14 @@ void NativeInit(int argc, const char *argv[], const char *savegame_dir, const ch } } if (okToLoad) { - boot_filename = Path(std::string(argv[i])); + std::string str = std::string(argv[i]); + // Handle file:/// URIs, since you get those when creating shortcuts on some Android systems. + if (startsWith(str, "file:///")) { + str = UriDecode(str.substr(7)); + INFO_LOG(IO, "Decoding '%s' to '%s'", argv[i], str.c_str()); + } + + boot_filename = Path(str); skipLogo = true; } if (okToLoad && okToCheck) { diff --git a/android/src/org/ppsspp/ppsspp/ShortcutActivity.java b/android/src/org/ppsspp/ppsspp/ShortcutActivity.java index 7e84cefb26..d21c3bddca 100644 --- a/android/src/org/ppsspp/ppsspp/ShortcutActivity.java +++ b/android/src/org/ppsspp/ppsspp/ShortcutActivity.java @@ -103,6 +103,12 @@ public class ShortcutActivity extends Activity { } catch (Exception e) { Log.i(TAG, "Exception getting name: " + e); } + } else if (path.startsWith("file:///")) { + try { + pathStr = java.net.URLDecoder.decode(path.substring(7), StandardCharsets.UTF_8.name()); + } catch (Exception e) { + Log.i(TAG, "Exception getting name: " + e); + } } else { pathStr = path; } @@ -111,6 +117,8 @@ public class ShortcutActivity extends Activity { name = pathSegments[pathSegments.length - 1]; /* + // No longer working for various reasons. + PpssppActivity.CheckABIAndLoadLibrary(); String name = queryGameName(path); if (name.equals("")) { @@ -119,7 +127,7 @@ public class ShortcutActivity extends Activity { return; }*/ - Log.i(TAG, "Game name: " + name + " : Creating shortcut to " + path); + Log.i(TAG, "Game name: " + name + " : Creating shortcut to " + uri.toString()); // This is Intent that will be returned by this method, as response to // ACTION_CREATE_SHORTCUT. Wrap shortcut intent inside this intent. From 9283d14a3d0d54ab684c99c3bb1ccf8b3bb2d202 Mon Sep 17 00:00:00 2001 From: iota97 Date: Thu, 9 Sep 2021 11:58:02 +0200 Subject: [PATCH 265/336] Fix wave on different dps --- Common/Render/DrawBuffer.cpp | 5 ----- Common/Render/DrawBuffer.h | 5 +++++ UI/MiscScreens.cpp | 13 ++++++++----- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/Common/Render/DrawBuffer.cpp b/Common/Render/DrawBuffer.cpp index e554799386..742cb1a5fd 100644 --- a/Common/Render/DrawBuffer.cpp +++ b/Common/Render/DrawBuffer.cpp @@ -14,11 +14,6 @@ #include "Common/Log.h" #include "Common/StringUtils.h" -enum { - // Enough? - MAX_VERTS = 65536, -}; - DrawBuffer::DrawBuffer() : count_(0), atlas(0) { verts_ = new Vertex[MAX_VERTS]; fontscalex = 1.0f; diff --git a/Common/Render/DrawBuffer.h b/Common/Render/DrawBuffer.h index a978b6173c..dcf2513c22 100644 --- a/Common/Render/DrawBuffer.h +++ b/Common/Render/DrawBuffer.h @@ -13,6 +13,11 @@ struct Atlas; +enum { + // Enough? + MAX_VERTS = 65536, +}; + enum { ALIGN_LEFT = 0, ALIGN_RIGHT = 16, diff --git a/UI/MiscScreens.cpp b/UI/MiscScreens.cpp index 5e5c5d9071..28d4853527 100644 --- a/UI/MiscScreens.cpp +++ b/UI/MiscScreens.cpp @@ -89,18 +89,21 @@ public: dc.Flush(); dc.BeginNoTex(); + // Be sure to not overflow our vertex buffer + const float step = ceil(24*bounds.w/pixel_in_dps_x) > MAX_VERTS ? 24*bounds.w/(MAX_VERTS-48) : pixel_in_dps_x; + t *= speed; - for (int x = 0; x < bounds.w; ++x) { + for (float x = 0; x < bounds.w; x += step) { float i = x * 1280/bounds.w; float wave0 = sin(i*0.005+t*0.8)*0.05 + sin(i*0.002+t*0.25)*0.02 + sin(i*0.001+t*0.3)*0.03 + 0.625; float wave1 = sin(i*0.0044+t*0.4)*0.07 + sin(i*0.003+t*0.1)*0.02 + sin(i*0.001+t*0.3)*0.01 + 0.625; - dc.Draw()->RectVGradient(x, wave0*bounds.h, pixel_in_dps_x, (1.0-wave0)*bounds.h, color, 0x00000000); - dc.Draw()->RectVGradient(x, wave1*bounds.h, pixel_in_dps_x, (1.0-wave1)*bounds.h, color, 0x00000000); + dc.Draw()->RectVGradient(x, wave0*bounds.h, step, (1.0-wave0)*bounds.h, color, 0x00000000); + dc.Draw()->RectVGradient(x, wave1*bounds.h, step, (1.0-wave1)*bounds.h, color, 0x00000000); // Add some "antialiasing" - dc.Draw()->RectVGradient(x, wave0*bounds.h-3*pixel_in_dps_y, pixel_in_dps_x, 3*pixel_in_dps_y, 0x00000000, color); - dc.Draw()->RectVGradient(x, wave1*bounds.h-3*pixel_in_dps_y, pixel_in_dps_x, 3*pixel_in_dps_y, 0x00000000, color); + dc.Draw()->RectVGradient(x, wave0*bounds.h-3*pixel_in_dps_y, step, 3*pixel_in_dps_y, 0x00000000, color); + dc.Draw()->RectVGradient(x, wave1*bounds.h-3*pixel_in_dps_y, step, 3*pixel_in_dps_y, 0x00000000, color); } dc.Flush(); From ecab31ef8bb6d1069d13422437efabc32b9d6d84 Mon Sep 17 00:00:00 2001 From: iota97 Date: Thu, 9 Sep 2021 16:31:14 +0200 Subject: [PATCH 266/336] Keep track of focus position --- Common/UI/Root.cpp | 1 - Common/UI/Screen.cpp | 7 +++++++ Common/UI/Screen.h | 2 ++ UI/MiscScreens.cpp | 38 ++++++++++++++++++++++++-------------- 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/Common/UI/Root.cpp b/Common/UI/Root.cpp index 0e61243ff6..b02ae9ee55 100644 --- a/Common/UI/Root.cpp +++ b/Common/UI/Root.cpp @@ -24,7 +24,6 @@ static std::mutex eventMutex_; static std::function soundCallback; static bool soundEnabled = true; - struct DispatchQueueItem { Event *e; EventParams params; diff --git a/Common/UI/Screen.cpp b/Common/UI/Screen.cpp index ea5ed185f5..7df38f3fb0 100644 --- a/Common/UI/Screen.cpp +++ b/Common/UI/Screen.cpp @@ -191,6 +191,13 @@ void ScreenManager::render() { processFinishDialog(); } +void ScreenManager::getFocusPosition(float &x, float &y, float &z) { + UI::View *v = UI::GetFocusedView(); + x = v ? v->GetBounds().x : 0; + y = v ? v->GetBounds().y : 0; + z = stack_.size(); +} + void ScreenManager::sendMessage(const char *msg, const char *value) { if (!strcmp(msg, "recreateviews")) RecreateAllViews(); diff --git a/Common/UI/Screen.h b/Common/UI/Screen.h index 59429d75e7..de24c74985 100644 --- a/Common/UI/Screen.h +++ b/Common/UI/Screen.h @@ -141,6 +141,8 @@ public: Screen *topScreen() const; + void getFocusPosition(float &x, float &y, float &z); + std::recursive_mutex inputLock_; private: diff --git a/UI/MiscScreens.cpp b/UI/MiscScreens.cpp index 5e5c5d9071..4cb59392a6 100644 --- a/UI/MiscScreens.cpp +++ b/UI/MiscScreens.cpp @@ -76,12 +76,12 @@ static std::unique_ptr bgTexture; class Animation { public: virtual ~Animation() {} - virtual void Draw(UIContext &dc, double t, float alpha) = 0; + virtual void Draw(UIContext &dc, double t, float alpha, float x, float y, float z) = 0; }; class WaveAnimation : public Animation { public: - void Draw(UIContext &dc, double t, float alpha) override { + void Draw(UIContext &dc, double t, float alpha, float x, float y, float z) override { const uint32_t color = colorAlpha(0xFFFFFFFF, alpha * 0.2f); const float speed = 1.0; @@ -111,7 +111,7 @@ public: class FloatingSymbolsAnimation : public Animation { public: ~FloatingSymbolsAnimation() override {} - void Draw(UIContext &dc, double t, float alpha) override { + void Draw(UIContext &dc, double t, float alpha, float x, float y, float z) override { float xres = dc.GetBounds().w; float yres = dc.GetBounds().h; if (last_xres != xres || last_yres != yres) { @@ -150,7 +150,7 @@ private: class RecentGamesAnimation : public Animation { public: ~RecentGamesAnimation() override {} - void Draw(UIContext &dc, double t, float alpha) override { + void Draw(UIContext &dc, double t, float alpha, float x, float y, float z) override { if (lastIndex_ == nextIndex_) { CheckNext(dc, t); } else if (t > nextT_) { @@ -250,7 +250,7 @@ void UIBackgroundShutdown() { bgTextureInited = false; } -void DrawBackground(UIContext &dc, float alpha) { +void DrawBackground(UIContext &dc, float alpha, float x, float y, float z) { if (!bgTextureInited) { UIBackgroundInit(dc); bgTextureInited = true; @@ -298,11 +298,11 @@ void DrawBackground(UIContext &dc, float alpha) { #endif if (g_Animation) { - g_Animation->Draw(dc, t, alpha); + g_Animation->Draw(dc, t, alpha, x, y, z); } } -void DrawGameBackground(UIContext &dc, const Path &gamePath) { +void DrawGameBackground(UIContext &dc, const Path &gamePath, float x, float y, float z) { std::shared_ptr ginfo; if (!gamePath.empty()) ginfo = g_gameInfoCache->GetInfo(dc.GetDrawContext(), gamePath, GAMEINFO_WANTBG); @@ -318,7 +318,7 @@ void DrawGameBackground(UIContext &dc, const Path &gamePath) { dc.Flush(); dc.RebindTexture(); } else { - ::DrawBackground(dc, 1.0f); + ::DrawBackground(dc, 1.0f, x, y, z); dc.RebindTexture(); dc.Flush(); } @@ -364,15 +364,19 @@ void HandleCommonMessages(const char *message, const char *value, ScreenManager } void UIScreenWithBackground::DrawBackground(UIContext &dc) { - ::DrawBackground(dc, 1.0f); + float x, y, z; + screenManager()->getFocusPosition(x, y, z); + ::DrawBackground(dc, 1.0f, x, y, z); dc.Flush(); } void UIScreenWithGameBackground::DrawBackground(UIContext &dc) { + float x, y, z; + screenManager()->getFocusPosition(x, y, z); if (!gamePath_.empty()) { - DrawGameBackground(dc, gamePath_); + DrawGameBackground(dc, gamePath_, x, y, z); } else { - ::DrawBackground(dc, 1.0f); + ::DrawBackground(dc, 1.0f, x, y, z); dc.Flush(); } } @@ -386,7 +390,9 @@ void UIScreenWithGameBackground::sendMessage(const char *message, const char *va } void UIDialogScreenWithGameBackground::DrawBackground(UIContext &dc) { - DrawGameBackground(dc, gamePath_); + float x, y, z; + screenManager()->getFocusPosition(x, y, z); + DrawGameBackground(dc, gamePath_, x, y, z); } void UIDialogScreenWithGameBackground::sendMessage(const char *message, const char *value) { @@ -402,7 +408,9 @@ void UIScreenWithBackground::sendMessage(const char *message, const char *value) } void UIDialogScreenWithBackground::DrawBackground(UIContext &dc) { - ::DrawBackground(dc, 1.0f); + float x, y, z; + screenManager()->getFocusPosition(x, y, z); + ::DrawBackground(dc, 1.0f, x, y, z); dc.Flush(); } @@ -686,7 +694,9 @@ void LogoScreen::render() { alphaText = 3.0f - t; uint32_t textColor = colorAlpha(dc.theme->infoStyle.fgColor, alphaText); - ::DrawBackground(dc, alpha); + float x, y, z; + screenManager()->getFocusPosition(x, y, z); + ::DrawBackground(dc, alpha, x, y, z); auto cr = GetI18NCategory("PSPCredits"); auto gr = GetI18NCategory("Graphics"); From 85ac0f88567c746c60c4f02683e085b3a73d6870 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 10 Sep 2021 01:13:01 +0200 Subject: [PATCH 267/336] Fix a couple sort comparators for the savedata screen --- UI/SavedataScreen.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/UI/SavedataScreen.cpp b/UI/SavedataScreen.cpp index 1c44d8127c..747ebd5edc 100644 --- a/UI/SavedataScreen.cpp +++ b/UI/SavedataScreen.cpp @@ -317,13 +317,13 @@ void SavedataButton::Draw(UIContext &dc) { int availableWidth = bounds_.w - 150; float sineWidth = std::max(0.0f, (tw - availableWidth)) / 2.0f; - float tx = 150; + float tx = 150.0f; if (availableWidth < tw) { float overageRatio = 1.5f * availableWidth * 1.0f / tw; tx -= (1.0f + sin(time_now_d() * overageRatio)) * sineWidth; Bounds tb = bounds_; - tb.x = bounds_.x + 150; - tb.w = bounds_.w - 150; + tb.x = bounds_.x + 150.0f; + tb.w = std::max(1.0f, bounds_.w - 150.0f); dc.PushScissor(tb); } dc.DrawText(title_.c_str(), bounds_.x + tx, bounds_.y + 4, style.fgColor, ALIGN_TOPLEFT); @@ -443,6 +443,8 @@ bool SavedataBrowser::BySize(const UI::View *v1, const UI::View *v2) { if (GetTotalSize(b1) > GetTotalSize(b2)) return true; + else if (GetTotalSize(b1) < GetTotalSize(b2)) + return false; return strcmp(b1->GamePath().c_str(), b2->GamePath().c_str()) < 0; } @@ -469,6 +471,8 @@ bool SavedataBrowser::ByDate(const UI::View *v1, const UI::View *v2) { if (GetDateSeconds(b1) > GetDateSeconds(b2)) return true; + if (GetDateSeconds(b1) < GetDateSeconds(b2)) + return false; return strcmp(b1->GamePath().c_str(), b2->GamePath().c_str()) < 0; } From 5876388c657ede0b17c2a55d4590f5ff95ec1f55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 10 Sep 2021 01:13:28 +0200 Subject: [PATCH 268/336] Vulkan scissor fix (validation errors). --- Common/GPU/Vulkan/VulkanRenderManager.h | 17 +++++++++++++---- GPU/Common/PostShader.cpp | 2 +- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Common/GPU/Vulkan/VulkanRenderManager.h b/Common/GPU/Vulkan/VulkanRenderManager.h index 1914f5214c..d2adc7d346 100644 --- a/Common/GPU/Vulkan/VulkanRenderManager.h +++ b/Common/GPU/Vulkan/VulkanRenderManager.h @@ -185,13 +185,22 @@ public: // Clamp to curWidth_/curHeight_. Apparently an issue. if ((int)(rc.offset.x + rc.extent.width) > curWidth_) { - rc.extent.width = curWidth_ - rc.offset.x; + int newWidth = curWidth_ - rc.offset.x; + rc.extent.width = std::max(1, newWidth); + if (rc.offset.x >= curWidth_) { + // Fallback. + rc.offset.x = curWidth_ - rc.extent.width; + } } + if ((int)(rc.offset.y + rc.extent.height) > curHeight_) { - rc.extent.height = curHeight_ - rc.offset.y; + int newHeight = curHeight_ - rc.offset.y; + rc.extent.height = std::max(1, newHeight); + if (rc.offset.y >= curHeight_) { + // Fallback. + rc.offset.y = curHeight_ - rc.extent.height; + } } - _dbg_assert_((int)(rc.offset.x + rc.extent.width) <= curWidth_); - _dbg_assert_((int)(rc.offset.y + rc.extent.height) <= curHeight_); curRenderArea_.Apply(rc); VkRenderData data{ VKRRenderCommand::SCISSOR }; diff --git a/GPU/Common/PostShader.cpp b/GPU/Common/PostShader.cpp index fbb7297dea..b174b78191 100644 --- a/GPU/Common/PostShader.cpp +++ b/GPU/Common/PostShader.cpp @@ -83,7 +83,7 @@ void LoadPostShaderInfo(const std::vector &directories) { std::vector fileInfo; VFSGetFileListing(directories[d].c_str(), &fileInfo, "ini:"); - if (fileInfo.size() == 0) { + if (fileInfo.empty()) { File::GetFilesInDir(directories[d], &fileInfo, "ini:"); } From fb5b528b976f831850699587a077a09d06753d6e Mon Sep 17 00:00:00 2001 From: iota97 Date: Fri, 10 Sep 2021 01:55:23 +0200 Subject: [PATCH 269/336] Moving Background --- Core/ConfigValues.h | 1 + UI/GameSettingsScreen.cpp | 2 +- UI/MiscScreens.cpp | 45 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/Core/ConfigValues.h b/Core/ConfigValues.h index f6e7558ed1..5f6ed413b0 100644 --- a/Core/ConfigValues.h +++ b/Core/ConfigValues.h @@ -129,4 +129,5 @@ enum class BackgroundAnimation { FLOATING_SYMBOLS = 1, RECENT_GAMES = 2, WAVE = 3, + MOVING_BACKGROUND = 4, }; diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 3d2b64b617..dcd18cf21c 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -880,7 +880,7 @@ void GameSettingsScreen::CreateViews() { if (backgroundChoice_ != nullptr) { backgroundChoice_->OnClick.Handle(this, &GameSettingsScreen::OnChangeBackground); } - static const char *backgroundAnimations[] = { "No animation", "Floating symbols", "Recent games", "Waves" }; + static const char *backgroundAnimations[] = { "No animation", "Floating symbols", "Recent games", "Waves", "Moving background" }; systemSettings->Add(new PopupMultiChoice(&g_Config.iBackgroundAnimation, sy->T("UI background animation"), backgroundAnimations, 0, ARRAY_SIZE(backgroundAnimations), sy->GetName(), screenManager())); systemSettings->Add(new ItemHeader(sy->T("Help the PPSSPP team"))); diff --git a/UI/MiscScreens.cpp b/UI/MiscScreens.cpp index 4cb59392a6..b04f13f071 100644 --- a/UI/MiscScreens.cpp +++ b/UI/MiscScreens.cpp @@ -79,6 +79,48 @@ public: virtual void Draw(UIContext &dc, double t, float alpha, float x, float y, float z) = 0; }; +class MovingBackground : public Animation { +public: + void Draw(UIContext &dc, double t, float alpha, float x, float y, float z) override { + if (!bgTexture) + return; + + dc.Flush(); + dc.GetDrawContext()->BindTexture(0, bgTexture->GetTexture()); + Bounds bounds = dc.GetBounds(); + + x = std::min(std::max(x/bounds.w, 0.0f), 1.0f) * XFAC; + y = std::min(std::max(y/bounds.h, 0.0f), 1.0f) * YFAC; + z = 1.0f + std::max(XFAC, YFAC) + (z-1.0f) * ZFAC; + + lastX_ = abs(x-lastX_) > 0.001f ? x*XSPEED+lastX_*(1.0f-XSPEED) : x; + lastY_ = abs(y-lastY_) > 0.001f ? y*YSPEED+lastY_*(1.0f-YSPEED) : y; + lastZ_ = abs(z-lastZ_) > 0.001f ? z*ZSPEED+lastZ_*(1.0f-ZSPEED) : z; + + float u1 = lastX_/lastZ_; + float v1 = lastY_/lastZ_; + float u2 = (1.0f+lastX_)/lastZ_; + float v2 = (1.0f+lastY_)/lastZ_; + + dc.Draw()->DrawTexRect(bounds, u1, v1, u2, v2, whiteAlpha(alpha)); + + dc.Flush(); + dc.RebindTexture(); + } + +private: + static constexpr float XFAC = 0.3f; + static constexpr float YFAC = 0.3f; + static constexpr float ZFAC = 0.12f; + static constexpr float XSPEED = 0.05f; + static constexpr float YSPEED = 0.05f; + static constexpr float ZSPEED = 0.1f; + + float lastX_ = 0.0f; + float lastY_ = 0.0f; + float lastZ_ = 1.0f + std::max(XFAC, YFAC); +}; + class WaveAnimation : public Animation { public: void Draw(UIContext &dc, double t, float alpha, float x, float y, float z) override { @@ -268,6 +310,9 @@ void DrawBackground(UIContext &dc, float alpha, float x, float y, float z) { case BackgroundAnimation::WAVE: g_Animation.reset(new WaveAnimation()); break; + case BackgroundAnimation::MOVING_BACKGROUND: + g_Animation.reset(new MovingBackground()); + break; default: g_Animation.reset(nullptr); } From c94e9ad73cab675bf2102876f25cd236cab6801f Mon Sep 17 00:00:00 2001 From: iota97 Date: Fri, 10 Sep 2021 02:06:51 +0200 Subject: [PATCH 270/336] Support ScrollView for focus position --- Common/UI/Screen.cpp | 7 +++++-- Common/UI/ViewGroup.cpp | 17 +++++++++++++++++ Common/UI/ViewGroup.h | 7 +++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/Common/UI/Screen.cpp b/Common/UI/Screen.cpp index 7df38f3fb0..416c69dc6e 100644 --- a/Common/UI/Screen.cpp +++ b/Common/UI/Screen.cpp @@ -4,6 +4,7 @@ #include "Common/UI/Screen.h" #include "Common/UI/UI.h" #include "Common/UI/View.h" +#include "Common/UI/ViewGroup.h" #include "Common/Log.h" #include "Common/TimeUtil.h" @@ -192,9 +193,11 @@ void ScreenManager::render() { } void ScreenManager::getFocusPosition(float &x, float &y, float &z) { + UI::ScrollView::GetLastScrollPosition(x, y); + UI::View *v = UI::GetFocusedView(); - x = v ? v->GetBounds().x : 0; - y = v ? v->GetBounds().y : 0; + x += v ? v->GetBounds().x : 0; + y += v ? v->GetBounds().y : 0; z = stack_.size(); } diff --git a/Common/UI/ViewGroup.cpp b/Common/UI/ViewGroup.cpp index ba8a9ef1bf..f73816c229 100644 --- a/Common/UI/ViewGroup.cpp +++ b/Common/UI/ViewGroup.cpp @@ -1091,11 +1091,25 @@ bool ScrollView::CanScroll() const { } } +float ScrollView::lastScrollPosX = 0; +float ScrollView::lastScrollPosY = 0; + +ScrollView::~ScrollView() { + lastScrollPosX = 0; + lastScrollPosY = 0; +} + +void ScrollView::GetLastScrollPosition(float &x, float &y) { + x = lastScrollPosX; + y = lastScrollPosY; +} + void ScrollView::Update() { if (visibility_ != V_VISIBLE) { inertia_ = 0.0f; } ViewGroup::Update(); + float oldPos = scrollPos_; Gesture gesture = orientation_ == ORIENT_VERTICAL ? GESTURE_DRAG_VERTICAL : GESTURE_DRAG_HORIZONTAL; gesture_.UpdateFrame(); @@ -1124,6 +1138,9 @@ void ScrollView::Update() { pull_ = 0.0f; } } + + if (oldPos != scrollPos_) + orientation_ == ORIENT_HORIZONTAL ? lastScrollPosX = scrollPos_ : lastScrollPosY = scrollPos_; } void AnchorLayout::Measure(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert) { diff --git a/Common/UI/ViewGroup.h b/Common/UI/ViewGroup.h index ad21b08a0f..10ca2fbc09 100644 --- a/Common/UI/ViewGroup.h +++ b/Common/UI/ViewGroup.h @@ -264,6 +264,7 @@ class ScrollView : public ViewGroup { public: ScrollView(Orientation orientation, LayoutParams *layoutParams = 0, bool rememberPosition = false) : ViewGroup(layoutParams), orientation_(orientation), rememberPosition_(rememberPosition) {} + ~ScrollView(); void Measure(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert) override; void Layout() override; @@ -280,6 +281,9 @@ public: bool CanScroll() const; void Update() override; + // Get the last moved scroll view position + static void GetLastScrollPosition(float &x, float &y); + // Override so that we can scroll to the active one after moving the focus. bool SubviewFocused(View *view) override; void PersistData(PersistStatus status, std::string anonId, PersistMap &storage) override; @@ -306,6 +310,9 @@ private: float lastViewSize_ = 0.0f; bool scrollToTopOnSizeChange_ = false; bool rememberPosition_; + + static float lastScrollPosX; + static float lastScrollPosY; }; class ViewPager : public ScrollView { From 0b73c1ce83306f96fc6c2555eb75ea7c11d5404e Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 9 Sep 2021 20:05:41 -0700 Subject: [PATCH 271/336] softgpu: Correct guardband cull behavior. Culling is based on whether clipping happens, not whether clamping happens. This is important for issues like #12348. --- GPU/Software/TransformUnit.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/GPU/Software/TransformUnit.cpp b/GPU/Software/TransformUnit.cpp index 65baa6f363..dc1bc88a5c 100644 --- a/GPU/Software/TransformUnit.cpp +++ b/GPU/Software/TransformUnit.cpp @@ -111,18 +111,19 @@ static inline ScreenCoords ClipToScreenInternal(const ClipCoords& coords, bool * // Account for rounding for X and Y. // TODO: Validate actual rounding range. const float SCREEN_BOUND = 4095.0f + (15.5f / 16.0f); - const float DEPTH_BOUND = 65535.5f; // This matches hardware tests - depth is clamped when this flag is on. if (gstate.isDepthClampEnabled()) { - // Note: if the depth is clamped, the outside_range_flag should NOT be set, even for x and y. + // Note: if the depth is clipped (z/w <= -1.0), the outside_range_flag should NOT be set, even for x and y. + if (outside_range_flag && coords.z > -coords.w && (x >= SCREEN_BOUND || y >= SCREEN_BOUND || x < 0 || y < 0)) { + *outside_range_flag = true; + } + if (z < 0.f) z = 0.f; else if (z > 65535.0f) z = 65535.0f; - else if (outside_range_flag && (x >= SCREEN_BOUND || y >= SCREEN_BOUND || x < 0 || y < 0)) - *outside_range_flag = true; - } else if (outside_range_flag && (x > SCREEN_BOUND || y >= SCREEN_BOUND || x < 0 || y < 0 || z < 0 || z >= DEPTH_BOUND)) { + } else if (outside_range_flag && (x > SCREEN_BOUND || y >= SCREEN_BOUND || x < 0 || y < 0)) { *outside_range_flag = true; } From 121c56e6dbdc7f3f1dbdbccb29c0e88fb336ff31 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 9 Sep 2021 20:13:42 -0700 Subject: [PATCH 272/336] softgpu: Clip only on -Z, cull if entirely outside. This is important for several issues, like #12058 or #12060, where something is drawn entirely outside valid Z, and should be culled. --- GPU/Software/Clipper.cpp | 103 ++++++++++++++++++++++++--------------- 1 file changed, 65 insertions(+), 38 deletions(-) diff --git a/GPU/Software/Clipper.cpp b/GPU/Software/Clipper.cpp index ee6f7ff3b9..c0c46764a8 100644 --- a/GPU/Software/Clipper.cpp +++ b/GPU/Software/Clipper.cpp @@ -22,6 +22,7 @@ #include "GPU/Software/Clipper.h" #include "GPU/Software/Rasterizer.h" #include "GPU/Software/RasterizerRectangle.h" +#include "GPU/Software/TransformUnit.h" #include "Common/Profiler/Profiler.h" @@ -29,11 +30,6 @@ namespace Clipper { enum { SKIP_FLAG = -1, - CLIP_POS_X_BIT = 0x01, - CLIP_NEG_X_BIT = 0x02, - CLIP_POS_Y_BIT = 0x04, - CLIP_NEG_Y_BIT = 0x08, - CLIP_POS_Z_BIT = 0x10, CLIP_NEG_Z_BIT = 0x20, }; @@ -41,11 +37,6 @@ static inline int CalcClipMask(const ClipCoords& v) { int mask = 0; // This checks `x / w` compared to 1 or -1, skipping the division. - if (v.x > v.w) mask |= CLIP_POS_X_BIT; - if (v.x < -v.w) mask |= CLIP_NEG_X_BIT; - if (v.y > v.w) mask |= CLIP_POS_Y_BIT; - if (v.y < -v.w) mask |= CLIP_NEG_Y_BIT; - if (v.z > v.w) mask |= CLIP_POS_Z_BIT; if (v.z < -v.w) mask |= CLIP_NEG_Z_BIT; return mask; } @@ -134,9 +125,37 @@ static void RotateUVThrough(const VertexData &tl, const VertexData &br, VertexDa } } +void ProcessTriangleInternal(VertexData &v0, VertexData &v1, VertexData &v2, const VertexData &provoking, bool fromRectangle); + +static inline bool CheckOutsideZ(ClipCoords p, int &pos, int &neg) { + constexpr float outsideValue = 1.000030517578125f; + float z = p.z / p.w; + if (z >= outsideValue) { + pos++; + return true; + } + if (-z >= outsideValue) { + neg++; + return true; + } + return false; +} + void ProcessRect(const VertexData& v0, const VertexData& v1) { if (!gstate.isModeThrough()) { + // We may discard the entire rect based on depth values. + int outsidePos = 0, outsideNeg = 0; + CheckOutsideZ(v0.clippos, outsidePos, outsideNeg); + CheckOutsideZ(v1.clippos, outsidePos, outsideNeg); + + // With depth clamp off, we discard the rectangle if even one vert is outside. + if (outsidePos + outsideNeg > 0 && !gstate.isDepthClampEnabled()) + return; + // With it on, both must be outside in the same direction. + else if (outsidePos >= 2 || outsideNeg >= 2) + return; + VertexData buf[4]; buf[0].clippos = ClipCoords(v0.clippos.x, v0.clippos.y, v1.clippos.z, v1.clippos.w); buf[0].texturecoords = v0.texturecoords; @@ -171,10 +190,10 @@ void ProcessRect(const VertexData& v0, const VertexData& v1) } // Four triangles to do backfaces as well. Two of them will get backface culled. - ProcessTriangle(*topleft, *topright, *bottomright, buf[3]); - ProcessTriangle(*bottomright, *topright, *topleft, buf[3]); - ProcessTriangle(*bottomright, *bottomleft, *topleft, buf[3]); - ProcessTriangle(*topleft, *bottomleft, *bottomright, buf[3]); + ProcessTriangleInternal(*topleft, *topright, *bottomright, buf[3], true); + ProcessTriangleInternal(*bottomright, *topright, *topleft, buf[3], true); + ProcessTriangleInternal(*bottomright, *bottomleft, *topleft, buf[3], true); + ProcessTriangleInternal(*topleft, *bottomleft, *bottomright, buf[3], true); } else { // through mode handling @@ -245,23 +264,23 @@ void ProcessLine(VertexData& v0, VertexData& v1) return; } + int outsidePos = 0, outsideNeg = 0; + CheckOutsideZ(v0.clippos, outsidePos, outsideNeg); + CheckOutsideZ(v1.clippos, outsidePos, outsideNeg); + + // With depth clamp off, we discard the line if even one vert is outside. + if (outsidePos + outsideNeg > 0 && !gstate.isDepthClampEnabled()) + return; + // With it on, both must be outside in the same direction. + else if (outsidePos >= 2 || outsideNeg >= 2) + return; + VertexData *Vertices[2] = {&v0, &v1}; int mask0 = CalcClipMask(v0.clippos); int mask1 = CalcClipMask(v1.clippos); int mask = mask0 | mask1; - - if (mask0 & mask1) { - // Even if clipping is disabled, we can discard if the line is entirely outside. - return; - } - if (mask) { - CLIP_LINE(CLIP_POS_X_BIT, -1, 0, 0, 1); - CLIP_LINE(CLIP_NEG_X_BIT, 1, 0, 0, 1); - CLIP_LINE(CLIP_POS_Y_BIT, 0, -1, 0, 1); - CLIP_LINE(CLIP_NEG_Y_BIT, 0, 1, 0, 1); - CLIP_LINE(CLIP_POS_Z_BIT, 0, 0, 0, 1); CLIP_LINE(CLIP_NEG_Z_BIT, 0, 0, 1, 1); } @@ -271,7 +290,7 @@ void ProcessLine(VertexData& v0, VertexData& v1) Rasterizer::DrawLine(data[0], data[1]); } -void ProcessTriangle(VertexData& v0, VertexData& v1, VertexData& v2, const VertexData &provoking) { +void ProcessTriangleInternal(VertexData &v0, VertexData &v1, VertexData &v2, const VertexData &provoking, bool fromRectangle) { if (gstate.isModeThrough()) { // In case of cull reordering, make sure the right color is on the final vertex. if (gstate.getShadeMode() == GE_SHADE_FLAT) { @@ -307,7 +326,20 @@ void ProcessTriangle(VertexData& v0, VertexData& v1, VertexData& v2, const Verte mask |= CalcClipMask(v1.clippos); mask |= CalcClipMask(v2.clippos); - if (mask) { + if (mask && !fromRectangle) { + // We may discard the entire triangle based on depth values. First check what's outside. + int outsidePos = 0, outsideNeg = 0; + for (int i = 0; i < 3; ++i) { + CheckOutsideZ(Vertices[i]->clippos, outsidePos, outsideNeg); + } + + // With depth clamp off, we discard the triangle if even one vert is outside. + if (outsidePos + outsideNeg > 0 && !gstate.isDepthClampEnabled()) + return; + // With it on, all three must be outside in the same direction. + else if (outsidePos >= 3 || outsideNeg >= 3) + return; + for (int i = 0; i < 3; i += 3) { int vlist[2][2*6+1]; int *inlist = vlist[0], *outlist = vlist[1]; @@ -323,13 +355,8 @@ void ProcessTriangle(VertexData& v0, VertexData& v1, VertexData& v2, const Verte indices[1] = SKIP_FLAG; indices[2] = SKIP_FLAG; - // The PSP doesn't clip on the sides (so, commented out) but it does appear to have a Z clipper. - // POLY_CLIP(CLIP_POS_X_BIT, -1, 0, 0, 1); - // POLY_CLIP(CLIP_NEG_X_BIT, 1, 0, 0, 1); - // POLY_CLIP(CLIP_POS_Y_BIT, 0, -1, 0, 1); - // POLY_CLIP(CLIP_NEG_Y_BIT, 0, 1, 0, 1); - POLY_CLIP(CLIP_POS_Z_BIT, 0, 0, 0, 1); - POLY_CLIP(CLIP_NEG_Z_BIT, 0, 0, 1, 1); + // The PSP only clips on negative Z (importantly, regardless of viewport.) + POLY_CLIP(CLIP_NEG_Z_BIT, 0, 0, 1, 1); // transform the poly in inlist into triangles indices[0] = inlist[0]; @@ -341,10 +368,6 @@ void ProcessTriangle(VertexData& v0, VertexData& v1, VertexData& v2, const Verte indices[numIndices++] = inlist[j]; } } - } else if (CalcClipMask(v0.clippos) & CalcClipMask(v1.clippos) & CalcClipMask(v2.clippos)) { - // If clipping is disabled, only discard the current primitive - // if all three vertices lie outside one of the clipping planes - return; } for (int i = 0; i + 3 <= numIndices; i += 3) { @@ -365,4 +388,8 @@ void ProcessTriangle(VertexData& v0, VertexData& v1, VertexData& v2, const Verte } } +void ProcessTriangle(VertexData &v0, VertexData &v1, VertexData &v2, const VertexData &provoking) { + ProcessTriangleInternal(v0, v1, v2, provoking, false); +} + } // namespace From d88fec8950486cbe6b2fb2db7000fdf0017dcf78 Mon Sep 17 00:00:00 2001 From: Stuart Kenny Date: Fri, 10 Sep 2021 20:38:52 +0100 Subject: [PATCH 273/336] Decouple Vulkan context object destruction from retroarch's ContextDestroy call --- libretro/LibretroVulkanContext.cpp | 7 +++++++ libretro/LibretroVulkanContext.h | 3 ++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/libretro/LibretroVulkanContext.cpp b/libretro/LibretroVulkanContext.cpp index 98a2db727e..5c27ef33cf 100644 --- a/libretro/LibretroVulkanContext.cpp +++ b/libretro/LibretroVulkanContext.cpp @@ -125,6 +125,13 @@ void LibretroVulkanContext::ContextReset() { LibretroHWRenderContext::ContextReset(); } +void LibretroVulkanContext::ContextDestroy() { + INFO_LOG(G3D, "LibretroVulkanContext::ContextDestroy()"); + + LostBackbuffer(); + gpu->DeviceLost(); +} + void LibretroVulkanContext::CreateDrawContext() { vk->ReinitSurface(); diff --git a/libretro/LibretroVulkanContext.h b/libretro/LibretroVulkanContext.h index 1da32aec6c..c6d3ea4ac6 100644 --- a/libretro/LibretroVulkanContext.h +++ b/libretro/LibretroVulkanContext.h @@ -5,7 +5,7 @@ class LibretroVulkanContext : public LibretroHWRenderContext { public: LibretroVulkanContext(); - ~LibretroVulkanContext() override {} + ~LibretroVulkanContext() override { Shutdown(); } bool Init() override; void Shutdown() override; void SwapBuffers() override; @@ -14,6 +14,7 @@ public: void CreateDrawContext() override; void ContextReset() override; + void ContextDestroy() override; GPUCore GetGPUCore() override { return GPUCORE_VULKAN; } const char *Ident() override { return "Vulkan"; } From 7632e5e16efa217529017531661f669f5acae2e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 10 Sep 2021 22:52:49 +0200 Subject: [PATCH 274/336] Minor polish to MemStickScreen --- UI/MemStickScreen.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/UI/MemStickScreen.cpp b/UI/MemStickScreen.cpp index edacb553a8..59c71e8bb8 100644 --- a/UI/MemStickScreen.cpp +++ b/UI/MemStickScreen.cpp @@ -182,9 +182,12 @@ UI::EventReturn MemStickScreen::OnUseInternalStorage(UI::EventParams ¶ms) { } else { // This can't really happen?? Not worth making an error message. } - } else { + } else if (pendingMemStickFolder != g_Config.memStickDirectory) { // Always ask for confirmation when called from the UI. Likely there's already some data. screenManager()->push(new ConfirmMemstickMoveScreen(pendingMemStickFolder, false)); + } else { + // User chose the same directory it's already in. Let's just bail. + TriggerFinish(DialogResult::DR_OK); } return UI::EVENT_DONE; } @@ -200,9 +203,12 @@ UI::EventReturn MemStickScreen::OnUseStorageRoot(UI::EventParams ¶ms) { } else { // This can't really happen?? Not worth making an error message. } - } else { + } else if (pendingMemStickFolder != g_Config.memStickDirectory) { // Always ask for confirmation when called from the UI. Likely there's already some data. screenManager()->push(new ConfirmMemstickMoveScreen(pendingMemStickFolder, false)); + } else { + // User chose the same directory it's already in. Let's just bail. + TriggerFinish(DialogResult::DR_OK); } return UI::EVENT_DONE; } @@ -227,9 +233,6 @@ void MemStickScreen::sendMessage(const char *message, const char *value) { if (pendingMemStickFolder == g_Config.memStickDirectory) { auto iz = GetI18NCategory("MemStick"); -#if PPSSPP_PLATFORM(ANDROID) - SystemToast(iz->T("That's the folder being used!")); -#endif return; } From d3abcf1b56300f27f18552a4b48daaea556f67b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 10 Sep 2021 23:41:44 +0200 Subject: [PATCH 275/336] Draw bullet points as circles for a consistent look regardless of system font. --- Common/Render/DrawBuffer.cpp | 32 ++++++++++++++++++------ Common/Render/DrawBuffer.h | 1 + Common/Render/Text/draw_text_android.cpp | 3 +++ Common/UI/View.cpp | 10 +++++--- 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/Common/Render/DrawBuffer.cpp b/Common/Render/DrawBuffer.cpp index 742cb1a5fd..f1e3e9baa8 100644 --- a/Common/Render/DrawBuffer.cpp +++ b/Common/Render/DrawBuffer.cpp @@ -356,7 +356,6 @@ void DrawBuffer::DrawImageRotatedStretch(ImageID atlas_image, const Bounds &boun } } -// TODO: add arc support void DrawBuffer::Circle(float xc, float yc, float radius, float thickness, int segments, float startAngle, uint32_t color, float u_mul) { float angleDelta = PI * 2 / segments; float uDelta = 1.0f / segments; @@ -372,12 +371,31 @@ void DrawBuffer::Circle(float xc, float yc, float radius, float thickness, int s float c1 = cosf(angle1), s1 = sinf(angle1), c2 = cosf(angle2), s2 = sinf(angle2); const float x[4] = {c1 * r1 + xc, c2 * r1 + xc, c1 * r2 + xc, c2 * r2 + xc}; const float y[4] = {s1 * r1 + yc, s2 * r1 + yc, s1 * r2 + yc, s2 * r2 + yc}; - V(x[0], y[0], color, u1, 0); - V(x[1], y[1], color, u2, 0); - V(x[2], y[2], color, u1, 1); - V(x[1], y[1], color, u2, 0); - V(x[3], y[3], color, u2, 1); - V(x[2], y[2], color, u1, 1); + V(x[0], y[0], color, u1, 0.0f); + V(x[1], y[1], color, u2, 0.0f); + V(x[2], y[2], color, u1, 1.0f); + V(x[1], y[1], color, u2, 0.0f); + V(x[3], y[3], color, u2, 1.0f); + V(x[2], y[2], color, u1, 1.0f); + } +} + +void DrawBuffer::FillCircle(float xc, float yc, float radius, int segments, uint32_t color) { + float angleDelta = PI * 2 / segments; + float uDelta = 1.0f / segments; + float r1 = radius; + for (int i = 0; i < segments + 1; i++) { + float angle1 = i * angleDelta; + float angle2 = (i + 1) * angleDelta; + float u1 = i * uDelta; + float u2 = (i + 1) * uDelta; + // TODO: get rid of one pair of cos/sin per loop, can reuse from last iteration + float c1 = cosf(angle1), s1 = sinf(angle1), c2 = cosf(angle2), s2 = sinf(angle2); + const float x[2] = { c1 * r1 + xc, c2 * r1 + xc }; + const float y[2] = { s1 * r1 + yc, s2 * r1 + yc }; + V(xc, yc, color, 0.0f, 0.0f); + V(x[0], y[0], color, u1, 0.0f); + V(x[1], y[1], color, u2, 1.0f); } } diff --git a/Common/Render/DrawBuffer.h b/Common/Render/DrawBuffer.h index dcf2513c22..6190f3ecba 100644 --- a/Common/Render/DrawBuffer.h +++ b/Common/Render/DrawBuffer.h @@ -101,6 +101,7 @@ public: } void Circle(float x, float y, float radius, float thickness, int segments, float startAngle, uint32_t color, float u_mul); + void FillCircle(float x, float y, float radius, int segments, uint32_t color); // New drawing APIs diff --git a/Common/Render/Text/draw_text_android.cpp b/Common/Render/Text/draw_text_android.cpp index 16241818ad..7d0a1e2623 100644 --- a/Common/Render/Text/draw_text_android.cpp +++ b/Common/Render/Text/draw_text_android.cpp @@ -221,6 +221,9 @@ void TextDrawerAndroid::DrawStringBitmap(std::vector &bitmapData, TextS void TextDrawerAndroid::DrawString(DrawBuffer &target, const char *str, float x, float y, uint32_t color, int align) { using namespace Draw; + if (!str) + return; + std::string text(NormalizeString(std::string(str))); if (text.empty()) return; diff --git a/Common/UI/View.cpp b/Common/UI/View.cpp index 8d929056c0..435487b3f0 100644 --- a/Common/UI/View.cpp +++ b/Common/UI/View.cpp @@ -848,10 +848,12 @@ void TextView::Draw(UIContext &dc) { Bounds textBounds = bounds_; if (bullet_) { - // Possible alternatives: •●■ - // TODO: Maybe draw an actual circle if we don't have real unicode fonts. So far this is only - // used on Android. - dc.DrawTextRect("●", textBounds, textColor, ALIGN_LEFT); + float radius = 7.0f; + dc.Flush(); + dc.BeginNoTex(); + dc.Draw()->FillCircle(textBounds.x + radius, textBounds.centerY(), radius, 20, textColor); + dc.Flush(); + dc.Begin(); textBounds.x += bulletOffset; textBounds.w -= bulletOffset; } From e7214f4f6b26a44c45332a285b9a9b04340c0e9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 10 Sep 2021 23:42:21 +0200 Subject: [PATCH 276/336] Hide the folder selector for memstick directory on Android 9 and earlier. It just doesn't work. --- UI/MemStickScreen.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/UI/MemStickScreen.cpp b/UI/MemStickScreen.cpp index 59c71e8bb8..78ad8a7906 100644 --- a/UI/MemStickScreen.cpp +++ b/UI/MemStickScreen.cpp @@ -147,10 +147,16 @@ void MemStickScreen::CreateViews() { } #endif - leftColumn->Add(new Choice(iz->T("Create or Choose a PSP folder")))->OnClick.Handle(this, &MemStickScreen::OnBrowse); - leftColumn->Add(new TextView(iz->T("DataWillStay", "Data will stay even if you uninstall PPSSPP.")))->SetBullet(true); - leftColumn->Add(new TextView(iz->T("DataCanBeShared", "Data can be shared between PPSSPP regular/Gold.")))->SetBullet(true); - leftColumn->Add(new TextView(iz->T("EasyUSBAccess", "Easy USB access")))->SetBullet(true); + // Let's only offer the browse-for-folder choice on Android 10 or later. + // Earlier versions often don't really have working folder browsers. + bool storageBrowserWorking = System_GetPropertyInt(SYSPROP_SYSTEMVERSION) >= 29; + + if (storageBrowserWorking) { + leftColumn->Add(new Choice(iz->T("Create or Choose a PSP folder")))->OnClick.Handle(this, &MemStickScreen::OnBrowse); + leftColumn->Add(new TextView(iz->T("DataWillStay", "Data will stay even if you uninstall PPSSPP.")))->SetBullet(true); + leftColumn->Add(new TextView(iz->T("DataCanBeShared", "Data can be shared between PPSSPP regular/Gold.")))->SetBullet(true); + leftColumn->Add(new TextView(iz->T("EasyUSBAccess", "Easy USB access")))->SetBullet(true); + } leftColumn->Add(new Choice(iz->T("Use App Private Directory")))->OnClick.Handle(this, &MemStickScreen::OnUseInternalStorage); // Consider https://www.compart.com/en/unicode/U+26A0 (unicode warning sign?)? or a graphic? From df0dd441c9a2d58046a1803d52040789376c01c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 10 Sep 2021 23:59:54 +0200 Subject: [PATCH 277/336] Add back the ability to manually specify a folder, on Android 9 and earlier. --- UI/MemStickScreen.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ UI/MemStickScreen.h | 1 + 2 files changed, 43 insertions(+) diff --git a/UI/MemStickScreen.cpp b/UI/MemStickScreen.cpp index 78ad8a7906..e5c58547a6 100644 --- a/UI/MemStickScreen.cpp +++ b/UI/MemStickScreen.cpp @@ -156,6 +156,10 @@ void MemStickScreen::CreateViews() { leftColumn->Add(new TextView(iz->T("DataWillStay", "Data will stay even if you uninstall PPSSPP.")))->SetBullet(true); leftColumn->Add(new TextView(iz->T("DataCanBeShared", "Data can be shared between PPSSPP regular/Gold.")))->SetBullet(true); leftColumn->Add(new TextView(iz->T("EasyUSBAccess", "Easy USB access")))->SetBullet(true); + } else { + leftColumn->Add(new Choice(iz->T("Manually specify PSP folder")))->OnClick.Handle(this, &MemStickScreen::OnSetFolderManually); + leftColumn->Add(new TextView(iz->T("DataWillStay", "Data will stay even if you uninstall PPSSPP.")))->SetBullet(true); + leftColumn->Add(new TextView(iz->T("DataCanBeShared", "Data can be shared between PPSSPP regular/Gold.")))->SetBullet(true); } leftColumn->Add(new Choice(iz->T("Use App Private Directory")))->OnClick.Handle(this, &MemStickScreen::OnUseInternalStorage); @@ -177,6 +181,44 @@ void MemStickScreen::CreateViews() { INFO_LOG(SYSTEM, "MemStickScreen: initialSetup=%d", (int)initialSetup_); } +UI::EventReturn MemStickScreen::OnSetFolderManually(UI::EventParams ¶ms) { + // The old way, from before scoped storage. + + auto sy = GetI18NCategory("System"); + System_InputBoxGetString(sy->T("Memory Stick Folder"), g_Config.memStickDirectory.ToString(), [&](bool result, const std::string &value) { + auto sy = GetI18NCategory("System"); + auto di = GetI18NCategory("Dialog"); + + if (result) { + std::string newPath = value; + size_t pos = newPath.find_last_not_of("/"); + // Gotta have at least something but a /, and also needs to start with a /. + if (newPath.empty() || pos == newPath.npos || newPath[0] != '/') { + settingInfo_->Show(sy->T("ChangingMemstickPathInvalid", "That path couldn't be used to save Memory Stick files."), nullptr); + return; + } + if (pos != newPath.size() - 1) { + newPath = newPath.substr(0, pos + 1); + } + + Path pendingMemStickFolder(newPath); + if (pendingMemStickFolder == g_Config.memStickDirectory) { + // Same directory as before - all good. + TriggerFinish(DialogResult::DR_OK); + return; + } + + if (!File::Exists(pendingMemStickFolder)) { + SystemToast(sy->T("Path does not exist!")); + return; + } + + screenManager()->push(new ConfirmMemstickMoveScreen(pendingMemStickFolder, false)); + } + }); + return UI::EVENT_DONE; +} + UI::EventReturn MemStickScreen::OnUseInternalStorage(UI::EventParams ¶ms) { Path pendingMemStickFolder = Path(g_extFilesDir); diff --git a/UI/MemStickScreen.h b/UI/MemStickScreen.h index 2c248103f0..a320f017c8 100644 --- a/UI/MemStickScreen.h +++ b/UI/MemStickScreen.h @@ -59,6 +59,7 @@ private: UI::EventReturn OnBrowse(UI::EventParams &e); UI::EventReturn OnUseInternalStorage(UI::EventParams ¶ms); UI::EventReturn OnUseStorageRoot(UI::EventParams ¶ms); + UI::EventReturn OnSetFolderManually(UI::EventParams ¶ms); SettingInfoMessage *settingInfo_ = nullptr; From 08dbcf7f7907e62fbeda61ea235f37d039a56f6f Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 10 Sep 2021 19:01:56 -0700 Subject: [PATCH 278/336] UI: Fix non-Android build error. --- UI/MemStickScreen.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/UI/MemStickScreen.cpp b/UI/MemStickScreen.cpp index e5c58547a6..812a8e80c5 100644 --- a/UI/MemStickScreen.cpp +++ b/UI/MemStickScreen.cpp @@ -183,7 +183,7 @@ void MemStickScreen::CreateViews() { UI::EventReturn MemStickScreen::OnSetFolderManually(UI::EventParams ¶ms) { // The old way, from before scoped storage. - +#if PPSSPP_PLATFORM(ANDROID) auto sy = GetI18NCategory("System"); System_InputBoxGetString(sy->T("Memory Stick Folder"), g_Config.memStickDirectory.ToString(), [&](bool result, const std::string &value) { auto sy = GetI18NCategory("System"); @@ -216,6 +216,7 @@ UI::EventReturn MemStickScreen::OnSetFolderManually(UI::EventParams ¶ms) { screenManager()->push(new ConfirmMemstickMoveScreen(pendingMemStickFolder, false)); } }); +#endif return UI::EVENT_DONE; } From d264cbef32bfbb4ca1e7553320c6ee33f28bebed Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 10 Sep 2021 23:35:31 -0700 Subject: [PATCH 279/336] Vulkan: MSVC 2017 buildfix. Fixes the buildbot. --- Common/GPU/Vulkan/VulkanRenderManager.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Common/GPU/Vulkan/VulkanRenderManager.h b/Common/GPU/Vulkan/VulkanRenderManager.h index d2adc7d346..2c13d155d6 100644 --- a/Common/GPU/Vulkan/VulkanRenderManager.h +++ b/Common/GPU/Vulkan/VulkanRenderManager.h @@ -4,6 +4,7 @@ // Only draws and binds are handled here, resource creation and allocations are handled as normal - // that's the nice thing with Vulkan. +#include #include #include #include From 46ada8649cf3166db3676f62e0b21b2b69a5bd8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 11 Sep 2021 13:13:05 +0200 Subject: [PATCH 280/336] VK mip gen: Could end up with a zero dimension in the lowest mipmap, prevent that. Should help #14814 --- Common/GPU/Vulkan/VulkanImage.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Common/GPU/Vulkan/VulkanImage.cpp b/Common/GPU/Vulkan/VulkanImage.cpp index 765742af95..9ef3060ec9 100644 --- a/Common/GPU/Vulkan/VulkanImage.cpp +++ b/Common/GPU/Vulkan/VulkanImage.cpp @@ -1,6 +1,9 @@ +#include + +#include "Common/Log.h" + #include "Common/GPU/Vulkan/VulkanImage.h" #include "Common/GPU/Vulkan/VulkanMemory.h" -#include "Common/Log.h" using namespace PPSSPP_VK; @@ -211,15 +214,15 @@ void VulkanTexture::GenerateMip(VkCommandBuffer cmd, int mip, VkImageLayout imag blit.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; blit.srcSubresource.layerCount = 1; blit.srcSubresource.mipLevel = mip - 1; - blit.srcOffsets[1].x = width_ >> (mip - 1); - blit.srcOffsets[1].y = height_ >> (mip - 1); + blit.srcOffsets[1].x = std::max(width_ >> (mip - 1), 1); + blit.srcOffsets[1].y = std::max(height_ >> (mip - 1), 1); blit.srcOffsets[1].z = 1; blit.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; blit.dstSubresource.layerCount = 1; blit.dstSubresource.mipLevel = mip; - blit.dstOffsets[1].x = width_ >> mip; - blit.dstOffsets[1].y = height_ >> mip; + blit.dstOffsets[1].x = std::max(width_ >> mip, 1); + blit.dstOffsets[1].y = std::max(height_ >> mip, 1); blit.dstOffsets[1].z = 1; // TODO: We could do better with the image transitions - would be enough with one per level From 04578edf6550156350f475067ab4df29896b8493 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 11 Sep 2021 15:02:52 +0200 Subject: [PATCH 281/336] Hide directories games should not know about from them. Stops some games from spending lots of time iterating over files they should not care about. Helps the performance issues in #13847 quite a bit. --- Core/HLE/sceIo.cpp | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index 0c4dcf20e1..c1e3f9e998 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -21,6 +21,7 @@ #include #include "Common/Thread/ThreadUtil.h" +#include "Common/TimeUtil.h" #include "Common/Profiler/Profiler.h" #include "Common/File/FileUtil.h" @@ -2321,10 +2322,48 @@ static u32 sceIoDopen(const char *path) { DirListing *dir = new DirListing(); SceUID id = kernelObjects.Create(dir); + double time = time_now_d(); dir->listing = pspFileSystem.GetDirListing(path); dir->index = 0; dir->name = std::string(path); + // Blacklist some directories that games should not be able to find out about. + // Speeds up directory iteration on slow Android Scoped Storage implementations :( + // Might also want to filter out PSP/GAME if not a homebrew, maybe also irrelevant directories + // in PSP/SAVEDATA, though iffy to know which ones are irrelevant.. + if (!strcmp(path, "ms0:/PSP")) { + static const char *const pspFolderBlacklist[] = { + "CHEATS", + "PPSSPP_STATE", + "PLUGINS", + "SYSTEM", + "SCREENSHOT", + "TEXTURES", + "DUMP", + }; + std::vector filtered; + for (const auto &entry : dir->listing) { + bool blacklisted = false; + for (auto black : pspFolderBlacklist) { + if (!strcasecmp(entry.name.c_str(), black)) { + blacklisted = true; + break; + } + } + + if (!blacklisted) { + filtered.push_back(entry); + } + } + + dir->listing = filtered; + } + + double diff = time_now_d() - time; + //if (diff > 0.01) { + ERROR_LOG(IO, "sceIoDopen(%s) took %0.3f seconds", path, diff); + //} + // TODO: The result is delayed only from the memstick, it seems. return id; } @@ -2349,7 +2388,7 @@ static u32 sceIoDread(int id, u32 dirent_addr) { SceIoDirEnt *entry = (SceIoDirEnt*) Memory::GetPointer(dirent_addr); if (dir->index == (int) dir->listing.size()) { - DEBUG_LOG(SCEIO, "sceIoDread( %d %08x ) - end of the line", id, dirent_addr); + DEBUG_LOG(SCEIO, "sceIoDread( %d %08x ) - end", id, dirent_addr); entry->d_name[0] = '\0'; return 0; } From 1f81876ab13debe9e1f7516932e7b9c44faa95da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 11 Sep 2021 15:04:53 +0200 Subject: [PATCH 282/336] Cleanup --- Core/HLE/sceIo.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index c1e3f9e998..ef842b92f5 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -2322,7 +2322,6 @@ static u32 sceIoDopen(const char *path) { DirListing *dir = new DirListing(); SceUID id = kernelObjects.Create(dir); - double time = time_now_d(); dir->listing = pspFileSystem.GetDirListing(path); dir->index = 0; dir->name = std::string(path); @@ -2359,11 +2358,6 @@ static u32 sceIoDopen(const char *path) { dir->listing = filtered; } - double diff = time_now_d() - time; - //if (diff > 0.01) { - ERROR_LOG(IO, "sceIoDopen(%s) took %0.3f seconds", path, diff); - //} - // TODO: The result is delayed only from the memstick, it seems. return id; } From 830d205839257328f3215411f04aaf3b1b482c7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 11 Sep 2021 15:11:56 +0200 Subject: [PATCH 283/336] Optimize savedata size calculation --- UI/GameInfoCache.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/UI/GameInfoCache.cpp b/UI/GameInfoCache.cpp index 3d8db8fd7c..00e3395eaf 100644 --- a/UI/GameInfoCache.cpp +++ b/UI/GameInfoCache.cpp @@ -152,12 +152,9 @@ u64 GameInfo::GetSaveDataSizeInBytes() { for (size_t j = 0; j < saveDataDir.size(); j++) { std::vector fileInfo; File::GetFilesInDir(saveDataDir[j], &fileInfo); - // Note: GetFilesInDir does not fill in fileSize properly. - for (size_t i = 0; i < fileInfo.size(); i++) { - File::FileInfo finfo; - File::GetFileInfo(fileInfo[i].fullName, &finfo); - if (!finfo.isDirectory) - filesSizeInDir += finfo.size; + for (auto const &file : fileInfo) { + if (!file.isDirectory) + filesSizeInDir += file.size; } if (filesSizeInDir < 0xA00000) { // HACK: Generally the savedata size in a dir shouldn't be more than 10MB. @@ -351,7 +348,9 @@ public: if (!info_->LoadFromPath(gamePath_)) { return; } + // In case of a remote file, check if it actually exists before locking. + // This is likely not necessary at a if (!info_->GetFileLoader()->Exists()) { return; } From 369ae031dea0f348ddd8171c929178ec686666fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 11 Sep 2021 15:12:55 +0200 Subject: [PATCH 284/336] Optimize install data size calculation. --- UI/GameInfoCache.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/UI/GameInfoCache.cpp b/UI/GameInfoCache.cpp index 00e3395eaf..803315aa77 100644 --- a/UI/GameInfoCache.cpp +++ b/UI/GameInfoCache.cpp @@ -176,12 +176,11 @@ u64 GameInfo::GetInstallDataSizeInBytes() { for (size_t j = 0; j < saveDataDir.size(); j++) { std::vector fileInfo; File::GetFilesInDir(saveDataDir[j], &fileInfo); - // Note: GetFilesInDir does not fill in fileSize properly. - for (size_t i = 0; i < fileInfo.size(); i++) { - File::FileInfo finfo; - File::GetFileInfo(fileInfo[i].fullName, &finfo); - if (!finfo.isDirectory) - filesSizeInDir += finfo.size; + for (auto const &file : fileInfo) { + // TODO: Might want to recurse here? Don't know games that use directories + // for install-data though. + if (!file.isDirectory) + filesSizeInDir += file.size; } if (filesSizeInDir >= 0xA00000) { // HACK: Generally the savedata size in a dir shouldn't be more than 10MB. From b075b7917500d4ebfbf049a2f7dcfca5c893c4cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 11 Sep 2021 15:14:44 +0200 Subject: [PATCH 285/336] Also hide SHADERS directory from games --- Core/HLE/sceIo.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index ef842b92f5..64af3b4ebb 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -2339,6 +2339,7 @@ static u32 sceIoDopen(const char *path) { "SCREENSHOT", "TEXTURES", "DUMP", + "SHADERS", }; std::vector filtered; for (const auto &entry : dir->listing) { From 09f65db91c6eff0f65d50d2ee14445f4ec3a9cc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 11 Sep 2021 15:35:11 +0200 Subject: [PATCH 286/336] Cleanup --- Core/FileSystems/MetaFileSystem.cpp | 1 - Core/HLE/sceIo.cpp | 1 - 2 files changed, 2 deletions(-) diff --git a/Core/FileSystems/MetaFileSystem.cpp b/Core/FileSystems/MetaFileSystem.cpp index 6ecd36226c..173cf4a863 100644 --- a/Core/FileSystems/MetaFileSystem.cpp +++ b/Core/FileSystems/MetaFileSystem.cpp @@ -654,7 +654,6 @@ u64 MetaFileSystem::getDirSize(const std::string &dirPath) { for (auto file : allFiles) { if (file.name == "." || file.name == "..") continue; - _assert_(!file.name.empty()); if (file.type == FILETYPE_DIRECTORY) { result += getDirSize(dirPath + file.name); } else { diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index 64af3b4ebb..d290d540b0 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -21,7 +21,6 @@ #include #include "Common/Thread/ThreadUtil.h" -#include "Common/TimeUtil.h" #include "Common/Profiler/Profiler.h" #include "Common/File/FileUtil.h" From 906664b9d8641021100863587a0ea83fb032e3f6 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 11 Sep 2021 07:29:15 -0700 Subject: [PATCH 287/336] Io: Cache SAVEDATA usage between writes. Some games will loop over saves to check the size of each, and calculating the total usage is expensive. We don't need to recalculate each time. --- Core/FileSystems/DirectoryFileSystem.cpp | 13 ++++++++++++- Core/HW/MemoryStick.cpp | 21 ++++++++++++++++----- Core/HW/MemoryStick.h | 1 + 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/Core/FileSystems/DirectoryFileSystem.cpp b/Core/FileSystems/DirectoryFileSystem.cpp index 528654a045..abad3b9b9e 100644 --- a/Core/FileSystems/DirectoryFileSystem.cpp +++ b/Core/FileSystems/DirectoryFileSystem.cpp @@ -392,6 +392,9 @@ bool DirectoryFileHandle::Open(const Path &basePath, std::string &fileName, File if (fullName.FilePathContains("PSP/GAME/")) { inGameDir_ = true; } + if (access & (FILEACCESS_APPEND | FILEACCESS_CREATE | FILEACCESS_WRITE)) { + MemoryStick_NotifyWrite(); + } return success; } @@ -446,6 +449,8 @@ size_t DirectoryFileHandle::Write(const u8* pointer, s64 size) bytesWritten = ReplayApplyDiskWrite(pointer, (uint64_t)bytesWritten, (uint64_t)size, &diskFull, inGameDir_, CoreTiming::GetGlobalTimeUs()); } + MemoryStick_NotifyWrite(); + if (diskFull) { ERROR_LOG(FILESYS, "Disk full"); auto err = GetI18NCategory("Error"); @@ -545,6 +550,7 @@ bool DirectoryFileSystem::MkDir(const std::string &dirname) { #else result = File::CreateFullPath(GetLocalPath(dirname)); #endif + MemoryStick_NotifyWrite(); return ReplayApplyDisk(ReplayAction::MKDIR, result, CoreTiming::GetGlobalTimeUs()) != 0; } @@ -553,8 +559,10 @@ bool DirectoryFileSystem::RmDir(const std::string &dirname) { #if HOST_IS_CASE_SENSITIVE // Maybe we're lucky? - if (File::DeleteDirRecursively(fullName)) + if (File::DeleteDirRecursively(fullName)) { + MemoryStick_NotifyWrite(); return (bool)ReplayApplyDisk(ReplayAction::RMDIR, true, CoreTiming::GetGlobalTimeUs()); + } // Nope, fix case and try again. Should we try again? std::string fullPath = dirname; @@ -565,6 +573,7 @@ bool DirectoryFileSystem::RmDir(const std::string &dirname) { #endif bool result = File::DeleteDirRecursively(fullName); + MemoryStick_NotifyWrite(); return ReplayApplyDisk(ReplayAction::RMDIR, result, CoreTiming::GetGlobalTimeUs()) != 0; } @@ -612,6 +621,7 @@ int DirectoryFileSystem::RenameFile(const std::string &from, const std::string & // TODO: Better error codes. int result = retValue ? 0 : (int)SCE_KERNEL_ERROR_ERRNO_FILE_ALREADY_EXISTS; + MemoryStick_NotifyWrite(); return ReplayApplyDisk(ReplayAction::FILE_RENAME, result, CoreTiming::GetGlobalTimeUs()); } @@ -633,6 +643,7 @@ bool DirectoryFileSystem::RemoveFile(const std::string &filename) { } #endif + MemoryStick_NotifyWrite(); return ReplayApplyDisk(ReplayAction::FILE_REMOVE, retValue, CoreTiming::GetGlobalTimeUs()) != 0; } diff --git a/Core/HW/MemoryStick.cpp b/Core/HW/MemoryStick.cpp index 50f46a9321..2efec86c75 100644 --- a/Core/HW/MemoryStick.cpp +++ b/Core/HW/MemoryStick.cpp @@ -33,6 +33,8 @@ static MemStickFatState memStickFatState; static bool memStickNeedsAssign = false; static u64 memStickInsertedAt = 0; static uint64_t memstickInitialFree = 0; +static uint64_t memstickCurrentUse = 0; +static bool memstickCurrentUseValid = false; enum FreeCalcStatus { NONE, @@ -122,11 +124,16 @@ u64 MemoryStick_FreeSpace() { // not planned for back then (even though 2GB cards were available.) // We have a compat setting to make it even smaller for Harry Potter : Goblet of Fire, see #13266. const u64 memStickSize = flags.ReportSmallMemstick ? smallMemstickSize : (u64)g_Config.iMemStickSizeGB * 1024 * 1024 * 1024; + // Assume the memory stick is only used to store savedata. - u64 usedSpace = pspFileSystem.getDirSize("ms0:/PSP/SAVEDATA/"); + if (!memstickCurrentUseValid) { + memstickCurrentUse = pspFileSystem.getDirSize("ms0:/PSP/SAVEDATA/"); + memstickCurrentUseValid = true; + } + u64 simulatedFreeSpace = 0; - if (usedSpace < memStickSize) { - simulatedFreeSpace = memStickSize - usedSpace; + if (memstickCurrentUse < memStickSize) { + simulatedFreeSpace = memStickSize - memstickCurrentUse; } else if (flags.ReportSmallMemstick) { // There's more stuff in the memstick than the size we report. // This doesn't work, so we'll just have to lie. Not sure what the best way is. @@ -135,14 +142,18 @@ u64 MemoryStick_FreeSpace() { if (flags.MemstickFixedFree) { // Assassin's Creed: Bloodlines fails to save if free space changes incorrectly during game. realFreeSpace = 0; - if (usedSpace <= memstickInitialFree) { - realFreeSpace = memstickInitialFree - usedSpace; + if (memstickCurrentUse <= memstickInitialFree) { + realFreeSpace = memstickInitialFree - memstickCurrentUse; } } return std::min(simulatedFreeSpace, realFreeSpace); } +void MemoryStick_NotifyWrite() { + memstickCurrentUseValid = false; +} + void MemoryStick_SetFatState(MemStickFatState state) { memStickFatState = state; memStickNeedsAssign = false; diff --git a/Core/HW/MemoryStick.h b/Core/HW/MemoryStick.h index 481acf57b8..00ecfefba2 100644 --- a/Core/HW/MemoryStick.h +++ b/Core/HW/MemoryStick.h @@ -51,3 +51,4 @@ void MemoryStick_SetFatState(MemStickFatState state); u64 MemoryStick_SectorSize(); u64 MemoryStick_FreeSpace(); +void MemoryStick_NotifyWrite(); From bcc4c3d8fa1413b4a7ef289be4f91ac530dee10a Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 11 Sep 2021 07:36:02 -0700 Subject: [PATCH 288/336] Io: Assume a write may have happened on resume. This way if they switch away to delete files, it will have more free space. --- UI/NativeApp.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index 5d4d8c1b76..6a526125c1 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -95,6 +95,7 @@ #include "Core/HLE/sceUsbCam.h" #include "Core/HLE/sceUsbGps.h" #include "Core/HLE/proAdhoc.h" +#include "Core/HW/MemoryStick.h" #include "Core/Util/GameManager.h" #include "Core/Util/AudioFormat.h" #include "Core/WebServer.h" @@ -1260,6 +1261,10 @@ void HandleGlobalMessage(const std::string &msg, const std::string &value) { PostLoadConfig(); g_Config.iGPUBackend = gpuBackend; } + if (msg == "app_resumed" || msg == "got_focus") { + // Assume that the user may have modified things. + MemoryStick_NotifyWrite(); + } } void NativeUpdate() { From cd79a1d92f1bea65ce7c66781069a35140f19524 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 11 Sep 2021 15:44:40 +0200 Subject: [PATCH 289/336] Fix another GetFileInfo loop (GetFilesInDir now does return sizes) --- Common/File/DirListing.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Common/File/DirListing.cpp b/Common/File/DirListing.cpp index f41009f176..0d1d07ed7d 100644 --- a/Common/File/DirListing.cpp +++ b/Common/File/DirListing.cpp @@ -289,10 +289,7 @@ int64_t GetDirectoryRecursiveSize(const Path &path, const char *filter, int flag std::vector fileInfo; GetFilesInDir(path, &fileInfo, filter, flags); int64_t sizeSum = 0; - // Note: GetFilesInDir does not fill in fileSize. - for (size_t i = 0; i < fileInfo.size(); i++) { - FileInfo finfo; - GetFileInfo(fileInfo[i].fullName, &finfo); + for (const auto &finfo : fileInfo) { if (!finfo.isDirectory) sizeSum += finfo.size; else From e842d395fa156862915dfb47fddf879cb6ea3dd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 11 Sep 2021 16:36:35 +0200 Subject: [PATCH 290/336] Add untested function Android_ComputeRecursiveDirectorySize --- Common/File/AndroidStorage.cpp | 13 +++++ Common/File/AndroidStorage.h | 2 + UI/GameInfoCache.cpp | 2 - .../src/org/ppsspp/ppsspp/PpssppActivity.java | 54 +++++++++++++++++++ 4 files changed, 69 insertions(+), 2 deletions(-) diff --git a/Common/File/AndroidStorage.cpp b/Common/File/AndroidStorage.cpp index 78d457aabf..c98a649385 100644 --- a/Common/File/AndroidStorage.cpp +++ b/Common/File/AndroidStorage.cpp @@ -20,6 +20,7 @@ static jmethodID contentUriFileExists; static jmethodID contentUriGetFreeStorageSpace; static jmethodID filePathGetFreeStorageSpace; static jmethodID isExternalStoragePreservedLegacy; +static jmethodID computeRecursiveDirectorySize; static jobject g_nativeActivity; @@ -54,6 +55,8 @@ void Android_RegisterStorageCallbacks(JNIEnv * env, jobject obj) { _dbg_assert_(filePathGetFreeStorageSpace); isExternalStoragePreservedLegacy = env->GetMethodID(env->GetObjectClass(obj), "isExternalStoragePreservedLegacy", "()Z"); _dbg_assert_(isExternalStoragePreservedLegacy); + computeRecursiveDirectorySize = env->GetMethodID(env->GetObjectClass(obj), "computeRecursiveDirectorySize", "(Ljava/lang/String;)J"); + _dbg_assert_(computeRecursiveDirectorySize); } bool Android_IsContentUri(const std::string &filename) { @@ -258,6 +261,16 @@ int64_t Android_GetFreeSpaceByFilePath(const std::string &filePath) { return env->CallLongMethod(g_nativeActivity, filePathGetFreeStorageSpace, param); } +int64_t Android_ComputeRecursiveDirectorySize(const std::string &uri) { + if (!g_nativeActivity) { + return false; + } + auto env = getEnv(); + + jstring param = env->NewStringUTF(uri.c_str()); + return env->CallLongMethod(g_nativeActivity, computeRecursiveDirectorySize, param); +} + bool Android_IsExternalStoragePreservedLegacy() { if (!g_nativeActivity) { return false; diff --git a/Common/File/AndroidStorage.h b/Common/File/AndroidStorage.h index 2a890d33b4..40ab19f1b0 100644 --- a/Common/File/AndroidStorage.h +++ b/Common/File/AndroidStorage.h @@ -49,6 +49,7 @@ StorageError Android_RemoveFile(const std::string &fileUri); StorageError Android_RenameFileTo(const std::string &fileUri, const std::string &newName); bool Android_GetFileInfo(const std::string &fileUri, File::FileInfo *info); bool Android_FileExists(const std::string &fileUri); +int64_t Android_ComputeRecursiveDirectorySize(const std::string &fileUri); int64_t Android_GetFreeSpaceByContentUri(const std::string &uri); int64_t Android_GetFreeSpaceByFilePath(const std::string &filePath); bool Android_IsExternalStoragePreservedLegacy(); @@ -72,6 +73,7 @@ inline StorageError Android_RemoveFile(const std::string &fileUri) { return Stor inline StorageError Android_RenameFileTo(const std::string &fileUri, const std::string &newName) { return StorageError::UNKNOWN; } inline bool Android_GetFileInfo(const std::string &fileUri, File::FileInfo *info) { return false; } inline bool Android_FileExists(const std::string &fileUri) { return false; } +inline int64_t Android_GetRecursiveDirectorySize(const std::string &fileUri) { return -1; } inline int64_t Android_GetFreeSpaceByContentUri(const std::string &uri) { return -1; } inline int64_t Android_GetFreeSpaceByFilePath(const std::string &filePath) { return -1; } inline bool Android_IsExternalStoragePreservedLegacy() { return false; } diff --git a/UI/GameInfoCache.cpp b/UI/GameInfoCache.cpp index 803315aa77..25c426f5dd 100644 --- a/UI/GameInfoCache.cpp +++ b/UI/GameInfoCache.cpp @@ -343,13 +343,11 @@ public: void Run() override { // An early-return will result in the destructor running, where we can set // flags like working and pending. - if (!info_->LoadFromPath(gamePath_)) { return; } // In case of a remote file, check if it actually exists before locking. - // This is likely not necessary at a if (!info_->GetFileLoader()->Exists()) { return; } diff --git a/android/src/org/ppsspp/ppsspp/PpssppActivity.java b/android/src/org/ppsspp/ppsspp/PpssppActivity.java index 9f55c799cc..67b74014b0 100644 --- a/android/src/org/ppsspp/ppsspp/PpssppActivity.java +++ b/android/src/org/ppsspp/ppsspp/PpssppActivity.java @@ -178,6 +178,60 @@ public class PpssppActivity extends NativeActivity { return str + size + "|" + documentName + "|" + lastModified; } + private long directorySizeRecursion(Uri uri, String documentId) { + Cursor c = null; + try { + Log.i(TAG, "recursing into " + uri.toString()); + final String[] columns = new String[]{ + DocumentsContract.Document.COLUMN_DOCUMENT_ID, + DocumentsContract.Document.COLUMN_SIZE, + DocumentsContract.Document.COLUMN_MIME_TYPE, // check for MIME_TYPE_DIR + }; + final ContentResolver resolver = getContentResolver(); + final Uri childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree(uri, documentId); + c = resolver.query(childrenUri, columns, null, null, null); + long sizeSum = 0; + while (c.moveToNext()) { + final String mimeType = c.getString(2); + final boolean isDirectory = mimeType.equals(DocumentsContract.Document.MIME_TYPE_DIR); + if (isDirectory) { + final String childDocumentId = c.getString(0); + long dirSize = directorySizeRecursion( + DocumentsContract.buildDocumentUriUsingTree(uri, childDocumentId), + documentId + ); + if (dirSize >= 0) { + sizeSum += dirSize; + } + } else { + final long fileSize = c.getLong(1); + sizeSum += fileSize; + } + } + return sizeSum; + } catch (Exception e) { + return -1; + } finally { + if (c != null) { + c.close(); + } + } + } + + public long computeRecursiveDirectorySize(String uriString) { + try { + Uri uri = Uri.parse(uriString); + String documentId = DocumentsContract.getDocumentId(uri); + long totalSize = directorySizeRecursion(uri, documentId); + Log.i(TAG, "directorySizeRecursion(" + uriString + ") returned " + totalSize); + return totalSize; + } + catch (Exception e) { + Log.e(TAG, "computeRecursiveSize exception: " + e.toString()); + return -1; + } + } + // TODO: Maybe add a cheaper version that doesn't extract all the file information? // TODO: Replace with a proper query: // * https://stackoverflow.com/questions/42186820/documentfile-is-very-slow From 48310d15a9ea69d38173f951d5066744a330c118 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 11 Sep 2021 17:18:39 +0200 Subject: [PATCH 291/336] Add metafilesystem hook to add optimized implementations of compute recursive directory size --- Common/File/AndroidStorage.h | 2 +- Common/File/FileUtil.cpp | 28 ++++++++++++++++++++++ Common/File/FileUtil.h | 3 +++ Core/FileSystems/BlobFileSystem.h | 2 ++ Core/FileSystems/DirectoryFileSystem.h | 5 ++++ Core/FileSystems/FileSystem.h | 5 ++-- Core/FileSystems/ISOFileSystem.h | 4 ++++ Core/FileSystems/MetaFileSystem.cpp | 30 ++++++++++++++++++------ Core/FileSystems/MetaFileSystem.h | 16 ++++++++++++- Core/FileSystems/VirtualDiscFileSystem.h | 2 ++ Core/HW/MemoryStick.cpp | 4 ++-- 11 files changed, 88 insertions(+), 13 deletions(-) diff --git a/Common/File/AndroidStorage.h b/Common/File/AndroidStorage.h index 40ab19f1b0..a9a88055d1 100644 --- a/Common/File/AndroidStorage.h +++ b/Common/File/AndroidStorage.h @@ -73,7 +73,7 @@ inline StorageError Android_RemoveFile(const std::string &fileUri) { return Stor inline StorageError Android_RenameFileTo(const std::string &fileUri, const std::string &newName) { return StorageError::UNKNOWN; } inline bool Android_GetFileInfo(const std::string &fileUri, File::FileInfo *info) { return false; } inline bool Android_FileExists(const std::string &fileUri) { return false; } -inline int64_t Android_GetRecursiveDirectorySize(const std::string &fileUri) { return -1; } +inline int64_t Android_ComputeRecursiveDirectorySize(const std::string &fileUri) { return -1; } inline int64_t Android_GetFreeSpaceByContentUri(const std::string &uri) { return -1; } inline int64_t Android_GetFreeSpaceByFilePath(const std::string &filePath) { return -1; } inline bool Android_IsExternalStoragePreservedLegacy() { return false; } diff --git a/Common/File/FileUtil.cpp b/Common/File/FileUtil.cpp index 91c0aee6b6..2de9d89598 100644 --- a/Common/File/FileUtil.cpp +++ b/Common/File/FileUtil.cpp @@ -324,6 +324,34 @@ std::string ResolvePath(const std::string &path) { #endif } +static int64_t RecursiveSize(const Path &path) { + // TODO: Some file systems can optimize this. + std::vector fileInfo; + if (!GetFilesInDir(path, &fileInfo)) { + return -1; + } + int64_t result = 0; + for (const auto &file : fileInfo) { + if (file.name == "." || file.name == "..") + continue; + if (file.isDirectory) { + result += RecursiveSize(file.fullName); + } else { + result += file.size; + } + } + return result; +} + +uint64_t ComputeRecursiveDirectorySize(const Path &path) { + if (path.Type() == PathType::CONTENT_URI) { + return Android_ComputeRecursiveDirectorySize(path.ToString()); + } + + // Generic solution. + return RecursiveSize(path); +} + // Returns true if file filename exists. Will return true on directories. bool ExistsInDir(const Path &path, const std::string &filename) { return Exists(path / filename); diff --git a/Common/File/FileUtil.h b/Common/File/FileUtil.h index ed0581b66c..ae77f859a1 100644 --- a/Common/File/FileUtil.h +++ b/Common/File/FileUtil.h @@ -79,6 +79,9 @@ uint64_t GetFileSize(const Path &filename); // Overloaded GetSize, accepts FILE* uint64_t GetFileSize(FILE *f); +// Computes the recursive size of a directory. Warning: Might be slow! +uint64_t ComputeRecursiveDirectorySize(const Path &path); + // Returns true if successful, or path already exists. bool CreateDir(const Path &filename); diff --git a/Core/FileSystems/BlobFileSystem.h b/Core/FileSystems/BlobFileSystem.h index faab90004a..f45576d6a7 100644 --- a/Core/FileSystems/BlobFileSystem.h +++ b/Core/FileSystems/BlobFileSystem.h @@ -54,6 +54,8 @@ public: bool RemoveFile(const std::string &filename) override; u64 FreeSpace(const std::string &path) override; + bool ComputeRecursiveDirSizeIfFast(const std::string &path, int64_t *size) override { return false; } + private: // File positions. std::map entries_; diff --git a/Core/FileSystems/DirectoryFileSystem.h b/Core/FileSystems/DirectoryFileSystem.h index 9d8478d691..daf900a16e 100644 --- a/Core/FileSystems/DirectoryFileSystem.h +++ b/Core/FileSystems/DirectoryFileSystem.h @@ -115,6 +115,9 @@ public: FileSystemFlags Flags() override { return flags; } u64 FreeSpace(const std::string &path) override; + // TODO: Replace with optimized implementation. + bool ComputeRecursiveDirSizeIfFast(const std::string &path, int64_t *size) override { return false; } + private: struct OpenFileEntry { DirectoryFileHandle hFile; @@ -159,6 +162,8 @@ public: FileSystemFlags Flags() override { return FileSystemFlags::FLASH; } u64 FreeSpace(const std::string &path) override { return 0; } + bool ComputeRecursiveDirSizeIfFast(const std::string &path, int64_t *size) override { return false; } + private: struct OpenFileEntry { u8 *fileData; diff --git a/Core/FileSystems/FileSystem.h b/Core/FileSystems/FileSystem.h index 5df227dd1f..87c87ae569 100644 --- a/Core/FileSystems/FileSystem.h +++ b/Core/FileSystems/FileSystem.h @@ -136,11 +136,11 @@ public: virtual PSPDevType DevType(u32 handle) = 0; virtual FileSystemFlags Flags() = 0; virtual u64 FreeSpace(const std::string &path) = 0; + virtual bool ComputeRecursiveDirSizeIfFast(const std::string &path, int64_t *size) = 0; }; -class EmptyFileSystem : public IFileSystem -{ +class EmptyFileSystem : public IFileSystem { public: virtual void DoState(PointerWrap &p) override {} std::vector GetDirListing(std::string path) override {std::vector vec; return vec;} @@ -161,6 +161,7 @@ public: virtual PSPDevType DevType(u32 handle) override { return PSPDevType::INVALID; } virtual FileSystemFlags Flags() override { return FileSystemFlags::NONE; } virtual u64 FreeSpace(const std::string &path) override { return 0; } + bool ComputeRecursiveDirSizeIfFast(const std::string &path, int64_t *size) override { return false; } }; diff --git a/Core/FileSystems/ISOFileSystem.h b/Core/FileSystems/ISOFileSystem.h index 0b8c00512a..608fa444e0 100644 --- a/Core/FileSystems/ISOFileSystem.h +++ b/Core/FileSystems/ISOFileSystem.h @@ -54,6 +54,8 @@ public: int RenameFile(const std::string &from, const std::string &to) override { return -1; } bool RemoveFile(const std::string &filename) override { return false; } + bool ComputeRecursiveDirSizeIfFast(const std::string &path, int64_t *size) override { return false; } + private: struct TreeEntry { ~TreeEntry(); @@ -150,6 +152,8 @@ public: int RenameFile(const std::string &from, const std::string &to) override { return -1; } bool RemoveFile(const std::string &filename) override { return false; } + bool ComputeRecursiveDirSizeIfFast(const std::string &path, int64_t *size) override { return false; } + private: std::shared_ptr isoFileSystem_; }; diff --git a/Core/FileSystems/MetaFileSystem.cpp b/Core/FileSystems/MetaFileSystem.cpp index 173cf4a863..c726a87b51 100644 --- a/Core/FileSystems/MetaFileSystem.cpp +++ b/Core/FileSystems/MetaFileSystem.cpp @@ -500,12 +500,9 @@ bool MetaFileSystem::RemoveFile(const std::string &filename) std::string of; IFileSystem *system; int error = MapFilePath(filename, of, &system); - if (error == 0) - { + if (error == 0) { return system->RemoveFile(of); - } - else - { + } else { return false; } } @@ -648,17 +645,36 @@ void MetaFileSystem::DoState(PointerWrap &p) } } -u64 MetaFileSystem::getDirSize(const std::string &dirPath) { +int64_t MetaFileSystem::RecursiveSize(const std::string &dirPath) { u64 result = 0; auto allFiles = GetDirListing(dirPath); for (auto file : allFiles) { if (file.name == "." || file.name == "..") continue; if (file.type == FILETYPE_DIRECTORY) { - result += getDirSize(dirPath + file.name); + result += RecursiveSize(dirPath + file.name); } else { result += file.size; } } return result; } + +int64_t MetaFileSystem::ComputeRecursiveDirectorySize(const std::string &filename) { + std::lock_guard guard(lock); + std::string of; + IFileSystem *system; + int error = MapFilePath(filename, of, &system); + if (error == 0) { + int64_t size; + if (system->ComputeRecursiveDirSizeIfFast(of, &size)) { + // Some file systems can optimize this. + return size; + } else { + // Those that can't, we just run a generic implementation. + return RecursiveSize(filename); + } + } else { + return false; + } +} diff --git a/Core/FileSystems/MetaFileSystem.h b/Core/FileSystems/MetaFileSystem.h index f980fc1900..9a3b041c93 100644 --- a/Core/FileSystems/MetaFileSystem.h +++ b/Core/FileSystems/MetaFileSystem.h @@ -136,5 +136,19 @@ public: startingDirectory = dir; } - u64 getDirSize(const std::string &dirPath); + int64_t ComputeRecursiveDirectorySize(const std::string &dirPath); + + // Shouldn't ever be called, but meh. + bool ComputeRecursiveDirSizeIfFast(const std::string &path, int64_t *size) override { + int64_t sizeTemp = ComputeRecursiveDirectorySize(path); + if (sizeTemp >= 0) { + *size = sizeTemp; + return true; + } else { + return false; + } + } + +private: + int64_t RecursiveSize(const std::string &dirPath); }; diff --git a/Core/FileSystems/VirtualDiscFileSystem.h b/Core/FileSystems/VirtualDiscFileSystem.h index 6c76d6b6fb..0c1b6db872 100644 --- a/Core/FileSystems/VirtualDiscFileSystem.h +++ b/Core/FileSystems/VirtualDiscFileSystem.h @@ -52,6 +52,8 @@ public: int RenameFile(const std::string &from, const std::string &to) override; bool RemoveFile(const std::string &filename) override; + bool ComputeRecursiveDirSizeIfFast(const std::string &path, int64_t *size) override { return false; } + private: void LoadFileListIndex(); // Warning: modifies input string. diff --git a/Core/HW/MemoryStick.cpp b/Core/HW/MemoryStick.cpp index 2efec86c75..964a002900 100644 --- a/Core/HW/MemoryStick.cpp +++ b/Core/HW/MemoryStick.cpp @@ -96,7 +96,7 @@ static void MemoryStick_CalcInitialFree() { std::unique_lock guard(freeCalcMutex); freeCalcStatus = FreeCalcStatus::RUNNING; freeCalcThread = std::thread([] { - memstickInitialFree = pspFileSystem.FreeSpace("ms0:/") + pspFileSystem.getDirSize("ms0:/PSP/SAVEDATA/"); + memstickInitialFree = pspFileSystem.FreeSpace("ms0:/") + pspFileSystem.ComputeRecursiveDirectorySize("ms0:/PSP/SAVEDATA/"); std::unique_lock guard(freeCalcMutex); freeCalcStatus = FreeCalcStatus::DONE; @@ -127,7 +127,7 @@ u64 MemoryStick_FreeSpace() { // Assume the memory stick is only used to store savedata. if (!memstickCurrentUseValid) { - memstickCurrentUse = pspFileSystem.getDirSize("ms0:/PSP/SAVEDATA/"); + memstickCurrentUse = pspFileSystem.ComputeRecursiveDirectorySize("ms0:/PSP/SAVEDATA/"); memstickCurrentUseValid = true; } From fcc0337576e5cf9eadcb15f433d93418d4c72254 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 11 Sep 2021 17:50:07 +0200 Subject: [PATCH 292/336] Fix the Android recursive size computation and hook it up. --- Common/File/DirListing.cpp | 13 ------- Common/File/DirListing.h | 1 - Common/File/FileUtil.cpp | 12 +++---- Core/FileSystems/DirectoryFileSystem.cpp | 12 +++++++ Core/FileSystems/DirectoryFileSystem.h | 2 +- UI/GameInfoCache.cpp | 2 +- UI/SavedataScreen.cpp | 3 +- .../src/org/ppsspp/ppsspp/PpssppActivity.java | 35 +++++++++++++------ 8 files changed, 44 insertions(+), 36 deletions(-) diff --git a/Common/File/DirListing.cpp b/Common/File/DirListing.cpp index 0d1d07ed7d..b4b3352669 100644 --- a/Common/File/DirListing.cpp +++ b/Common/File/DirListing.cpp @@ -285,19 +285,6 @@ bool GetFilesInDir(const Path &directory, std::vector *files, const ch return true; } -int64_t GetDirectoryRecursiveSize(const Path &path, const char *filter, int flags) { - std::vector fileInfo; - GetFilesInDir(path, &fileInfo, filter, flags); - int64_t sizeSum = 0; - for (const auto &finfo : fileInfo) { - if (!finfo.isDirectory) - sizeSum += finfo.size; - else - sizeSum += GetDirectoryRecursiveSize(finfo.fullName, filter, flags); - } - return sizeSum; -} - #if PPSSPP_PLATFORM(WINDOWS) // Returns a vector with the device names std::vector GetWindowsDrives() diff --git a/Common/File/DirListing.h b/Common/File/DirListing.h index 99c938630e..c53d420588 100644 --- a/Common/File/DirListing.h +++ b/Common/File/DirListing.h @@ -35,7 +35,6 @@ enum { }; bool GetFilesInDir(const Path &directory, std::vector *files, const char *filter = nullptr, int flags = 0); -int64_t GetDirectoryRecursiveSize(const Path &path, const char *filter = nullptr, int flags = 0); std::vector ApplyFilter(std::vector files, const char *filter); #ifdef _WIN32 diff --git a/Common/File/FileUtil.cpp b/Common/File/FileUtil.cpp index 2de9d89598..a9b3498118 100644 --- a/Common/File/FileUtil.cpp +++ b/Common/File/FileUtil.cpp @@ -327,20 +327,18 @@ std::string ResolvePath(const std::string &path) { static int64_t RecursiveSize(const Path &path) { // TODO: Some file systems can optimize this. std::vector fileInfo; - if (!GetFilesInDir(path, &fileInfo)) { + if (!GetFilesInDir(path, &fileInfo, nullptr, GETFILES_GETHIDDEN)) { return -1; } - int64_t result = 0; + int64_t sizeSum = 0; for (const auto &file : fileInfo) { - if (file.name == "." || file.name == "..") - continue; if (file.isDirectory) { - result += RecursiveSize(file.fullName); + sizeSum += RecursiveSize(file.fullName); } else { - result += file.size; + sizeSum += file.size; } } - return result; + return sizeSum; } uint64_t ComputeRecursiveDirectorySize(const Path &path) { diff --git a/Core/FileSystems/DirectoryFileSystem.cpp b/Core/FileSystems/DirectoryFileSystem.cpp index abad3b9b9e..1da5499310 100644 --- a/Core/FileSystems/DirectoryFileSystem.cpp +++ b/Core/FileSystems/DirectoryFileSystem.cpp @@ -878,6 +878,18 @@ static std::string SimulateVFATBug(std::string filename) { return filename; } +bool DirectoryFileSystem::ComputeRecursiveDirSizeIfFast(const std::string &path, int64_t *size) { + Path localPath = GetLocalPath(path); + + int64_t sizeTemp = File::ComputeRecursiveDirectorySize(localPath); + if (sizeTemp >= 0) { + *size = sizeTemp; + return true; + } else { + return false; + } +} + std::vector DirectoryFileSystem::GetDirListing(std::string path) { std::vector myVector; diff --git a/Core/FileSystems/DirectoryFileSystem.h b/Core/FileSystems/DirectoryFileSystem.h index daf900a16e..fa2b24d013 100644 --- a/Core/FileSystems/DirectoryFileSystem.h +++ b/Core/FileSystems/DirectoryFileSystem.h @@ -116,7 +116,7 @@ public: u64 FreeSpace(const std::string &path) override; // TODO: Replace with optimized implementation. - bool ComputeRecursiveDirSizeIfFast(const std::string &path, int64_t *size) override { return false; } + bool ComputeRecursiveDirSizeIfFast(const std::string &path, int64_t *size) override; private: struct OpenFileEntry { diff --git a/UI/GameInfoCache.cpp b/UI/GameInfoCache.cpp index 25c426f5dd..e3bbfb34d0 100644 --- a/UI/GameInfoCache.cpp +++ b/UI/GameInfoCache.cpp @@ -114,7 +114,7 @@ u64 GameInfo::GetGameSizeInBytes() { switch (fileType) { case IdentifiedFileType::PSP_PBP_DIRECTORY: case IdentifiedFileType::PSP_SAVEDATA_DIRECTORY: - return File::GetDirectoryRecursiveSize(ResolvePBPDirectory(filePath_), nullptr, File::GETFILES_GETHIDDEN); + return File::ComputeRecursiveDirectorySize(ResolvePBPDirectory(filePath_)); default: return GetFileLoader()->FileSize(); diff --git a/UI/SavedataScreen.cpp b/UI/SavedataScreen.cpp index 747ebd5edc..cfd61045a3 100644 --- a/UI/SavedataScreen.cpp +++ b/UI/SavedataScreen.cpp @@ -430,8 +430,7 @@ static time_t GetTotalSize(const SavedataButton *b) { switch (Identify_File(fileLoader.get(), &errorString)) { case IdentifiedFileType::PSP_PBP_DIRECTORY: case IdentifiedFileType::PSP_SAVEDATA_DIRECTORY: - return File::GetDirectoryRecursiveSize(ResolvePBPDirectory(b->GamePath()), nullptr, File::GETFILES_GETHIDDEN); - + return File::ComputeRecursiveDirectorySize(ResolvePBPDirectory(b->GamePath())); default: return fileLoader->FileSize(); } diff --git a/android/src/org/ppsspp/ppsspp/PpssppActivity.java b/android/src/org/ppsspp/ppsspp/PpssppActivity.java index 67b74014b0..4a37e21e4f 100644 --- a/android/src/org/ppsspp/ppsspp/PpssppActivity.java +++ b/android/src/org/ppsspp/ppsspp/PpssppActivity.java @@ -17,6 +17,8 @@ import android.database.Cursor; import android.provider.DocumentsContract; import android.os.Environment; import androidx.documentfile.provider.DocumentFile; + +import java.lang.reflect.Array; import java.util.ArrayList; import java.util.UUID; import java.io.File; @@ -178,36 +180,48 @@ public class PpssppActivity extends NativeActivity { return str + size + "|" + documentName + "|" + lastModified; } - private long directorySizeRecursion(Uri uri, String documentId) { + private long directorySizeRecursion(Uri uri) { Cursor c = null; try { - Log.i(TAG, "recursing into " + uri.toString()); + // Log.i(TAG, "recursing into " + uri.toString()); final String[] columns = new String[]{ DocumentsContract.Document.COLUMN_DOCUMENT_ID, DocumentsContract.Document.COLUMN_SIZE, DocumentsContract.Document.COLUMN_MIME_TYPE, // check for MIME_TYPE_DIR }; final ContentResolver resolver = getContentResolver(); + final String documentId = DocumentsContract.getDocumentId(uri); final Uri childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree(uri, documentId); c = resolver.query(childrenUri, columns, null, null, null); long sizeSum = 0; + + // Buffer the URIs so we only have one cursor active at once. I don't trust the storage framework + // to handle more than one... + ArrayList childDirs = new ArrayList(); + while (c.moveToNext()) { final String mimeType = c.getString(2); final boolean isDirectory = mimeType.equals(DocumentsContract.Document.MIME_TYPE_DIR); if (isDirectory) { final String childDocumentId = c.getString(0); - long dirSize = directorySizeRecursion( - DocumentsContract.buildDocumentUriUsingTree(uri, childDocumentId), - documentId - ); - if (dirSize >= 0) { - sizeSum += dirSize; - } + final Uri childUri = DocumentsContract.buildDocumentUriUsingTree(uri, childDocumentId); + childDirs.add(childUri); } else { final long fileSize = c.getLong(1); sizeSum += fileSize; } } + c.close(); + c = null; + + for (Uri childUri : childDirs) { + long dirSize = directorySizeRecursion(childUri); + if (dirSize >= 0) { + sizeSum += dirSize; + } else { + return dirSize; + } + } return sizeSum; } catch (Exception e) { return -1; @@ -221,8 +235,7 @@ public class PpssppActivity extends NativeActivity { public long computeRecursiveDirectorySize(String uriString) { try { Uri uri = Uri.parse(uriString); - String documentId = DocumentsContract.getDocumentId(uri); - long totalSize = directorySizeRecursion(uri, documentId); + long totalSize = directorySizeRecursion(uri); Log.i(TAG, "directorySizeRecursion(" + uriString + ") returned " + totalSize); return totalSize; } From f7895457ee443521d11b5e4440c85cbe999671a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 11 Sep 2021 18:06:26 +0200 Subject: [PATCH 293/336] Add back the dir listing logging. Add hack to avoid confusing Wipeout :( --- Core/HLE/sceIo.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index d290d540b0..5ed0ad5c67 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -22,6 +22,7 @@ #include "Common/Thread/ThreadUtil.h" #include "Common/Profiler/Profiler.h" +#include "Common/TimeUtil.h" #include "Common/File/FileUtil.h" #include "Common/Serialize/SerializeFuncs.h" @@ -2321,15 +2322,25 @@ static u32 sceIoDopen(const char *path) { DirListing *dir = new DirListing(); SceUID id = kernelObjects.Create(dir); + double startTime = time_now_d(); + dir->listing = pspFileSystem.GetDirListing(path); dir->index = 0; dir->name = std::string(path); + double listTime = time_now_d() - startTime; + + if (listTime > 0.01) { + ERROR_LOG(IO, "Dir listing '%s' took %0.3f", path, listTime); + } + // Blacklist some directories that games should not be able to find out about. // Speeds up directory iteration on slow Android Scoped Storage implementations :( // Might also want to filter out PSP/GAME if not a homebrew, maybe also irrelevant directories // in PSP/SAVEDATA, though iffy to know which ones are irrelevant.. - if (!strcmp(path, "ms0:/PSP")) { + // Also if we're stripping PSP from the path due to setting a directory named PSP as the memstick root, + // these will also show up at ms0: which is not ideal. Should find some other way to deal with that. + if (!strcmp(path, "ms0:/PSP") || !strcmp(path, "ms0:")) { static const char *const pspFolderBlacklist[] = { "CHEATS", "PPSSPP_STATE", @@ -2349,6 +2360,10 @@ static u32 sceIoDopen(const char *path) { break; } } + // Also don't let games see a GAME directory in the root. This confuses Wipeout... + if (!strcasecmp(entry.name.c_str(), "GAME") && !strcmp(path, "ms0:")) { + blacklisted = true; + } if (!blacklisted) { filtered.push_back(entry); From dc520a59d338d9da3df6add2956674214f8698a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 11 Sep 2021 18:17:14 +0200 Subject: [PATCH 294/336] Log the duration of directory size computations too --- Common/File/AndroidStorage.cpp | 8 +++++++- android/src/org/ppsspp/ppsspp/PpssppActivity.java | 1 - 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Common/File/AndroidStorage.cpp b/Common/File/AndroidStorage.cpp index c98a649385..5e12921904 100644 --- a/Common/File/AndroidStorage.cpp +++ b/Common/File/AndroidStorage.cpp @@ -268,7 +268,13 @@ int64_t Android_ComputeRecursiveDirectorySize(const std::string &uri) { auto env = getEnv(); jstring param = env->NewStringUTF(uri.c_str()); - return env->CallLongMethod(g_nativeActivity, computeRecursiveDirectorySize, param); + + double start = time_now_d(); + int64_t size = env->CallLongMethod(g_nativeActivity, computeRecursiveDirectorySize, param); + double elapsed = time_now_d() - start; + + ERROR_LOG(IO, "ComputeRecursiveDirectorySize(%s) in %0.3f s", uri.c_str(), elapsed); + return size; } bool Android_IsExternalStoragePreservedLegacy() { diff --git a/android/src/org/ppsspp/ppsspp/PpssppActivity.java b/android/src/org/ppsspp/ppsspp/PpssppActivity.java index 4a37e21e4f..95e684659b 100644 --- a/android/src/org/ppsspp/ppsspp/PpssppActivity.java +++ b/android/src/org/ppsspp/ppsspp/PpssppActivity.java @@ -236,7 +236,6 @@ public class PpssppActivity extends NativeActivity { try { Uri uri = Uri.parse(uriString); long totalSize = directorySizeRecursion(uri); - Log.i(TAG, "directorySizeRecursion(" + uriString + ") returned " + totalSize); return totalSize; } catch (Exception e) { From 07413aa4e384ef61ecd8753269f4e39d440dacac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 11 Sep 2021 18:53:46 +0200 Subject: [PATCH 295/336] Feedback --- Common/File/AndroidStorage.cpp | 2 +- Core/FileSystems/DirectoryFileSystem.h | 1 - Core/HLE/sceIo.cpp | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Common/File/AndroidStorage.cpp b/Common/File/AndroidStorage.cpp index 5e12921904..01b5824a8a 100644 --- a/Common/File/AndroidStorage.cpp +++ b/Common/File/AndroidStorage.cpp @@ -273,7 +273,7 @@ int64_t Android_ComputeRecursiveDirectorySize(const std::string &uri) { int64_t size = env->CallLongMethod(g_nativeActivity, computeRecursiveDirectorySize, param); double elapsed = time_now_d() - start; - ERROR_LOG(IO, "ComputeRecursiveDirectorySize(%s) in %0.3f s", uri.c_str(), elapsed); + INFO_LOG(IO, "ComputeRecursiveDirectorySize(%s) in %0.3f s", uri.c_str(), elapsed); return size; } diff --git a/Core/FileSystems/DirectoryFileSystem.h b/Core/FileSystems/DirectoryFileSystem.h index fa2b24d013..9ee4777796 100644 --- a/Core/FileSystems/DirectoryFileSystem.h +++ b/Core/FileSystems/DirectoryFileSystem.h @@ -115,7 +115,6 @@ public: FileSystemFlags Flags() override { return flags; } u64 FreeSpace(const std::string &path) override; - // TODO: Replace with optimized implementation. bool ComputeRecursiveDirSizeIfFast(const std::string &path, int64_t *size) override; private: diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index 5ed0ad5c67..37eda68a42 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -2331,7 +2331,7 @@ static u32 sceIoDopen(const char *path) { double listTime = time_now_d() - startTime; if (listTime > 0.01) { - ERROR_LOG(IO, "Dir listing '%s' took %0.3f", path, listTime); + INFO_LOG(IO, "Dir listing '%s' took %0.3f", path, listTime); } // Blacklist some directories that games should not be able to find out about. From 8e2b73b05f7f8b03236a4ae4e68227e27c396360 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 11 Sep 2021 19:32:37 +0200 Subject: [PATCH 296/336] Optimize MetaFileSystem::ReadEntireFile --- Core/Dialog/SavedataParam.cpp | 2 +- Core/FileSystems/MetaFileSystem.cpp | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index 6af370b696..22879d326f 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -649,7 +649,7 @@ int SavedataParam::LoadSaveData(SceUtilitySavedataParam *param, const std::strin std::string filename = GetFileName(param); std::string filePath = dirPath + "/" + filename; s64 readSize; - INFO_LOG(SCEUTILITY,"Loading file with size %u in %s",param->dataBufSize,filePath.c_str()); + INFO_LOG(SCEUTILITY, "Loading file with size %u in %s", param->dataBufSize, filePath.c_str()); u8 *saveData = nullptr; int saveSize = -1; if (!ReadPSPFile(filePath, &saveData, saveSize, &readSize)) { diff --git a/Core/FileSystems/MetaFileSystem.cpp b/Core/FileSystems/MetaFileSystem.cpp index c726a87b51..7192630ae2 100644 --- a/Core/FileSystems/MetaFileSystem.cpp +++ b/Core/FileSystems/MetaFileSystem.cpp @@ -588,7 +588,9 @@ int MetaFileSystem::ReadEntireFile(const std::string &filename, std::vector if (handle < 0) return handle; - size_t dataSize = (size_t)GetFileInfo(filename).size; + SeekFile(handle, 0, FILEMOVE_END); + size_t dataSize = GetSeekPos(handle); + SeekFile(handle, 0, FILEMOVE_BEGIN); data.resize(dataSize); size_t result = ReadFile(handle, (u8 *)&data[0], dataSize); From 464af0723e30fc9bba698c9bc40405dffd67ed5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 11 Sep 2021 19:32:48 +0200 Subject: [PATCH 297/336] Minor gradle upgrade, why not --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index a6beab90bd..a2dd2770f6 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:7.0.1' + classpath 'com.android.tools.build:gradle:7.0.2' } } From 5d53e59c1d5380c8c3984a191627809c49117a07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 11 Sep 2021 19:33:28 +0200 Subject: [PATCH 298/336] Optimize ReadPSPFile (which should probably be replaced with ReadEntireFile anyway) --- Core/Dialog/SavedataParam.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index 22879d326f..3d9b260ee4 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -66,9 +66,12 @@ namespace if (handle < 0) return false; - if(dataSize == -1) - { - dataSize = pspFileSystem.GetFileInfo(filename).size; + if (dataSize == -1) { + // Determine the size through seeking instead of querying. + pspFileSystem.SeekFile(handle, 0, FILEMOVE_END); + dataSize = pspFileSystem.GetSeekPos(handle); + pspFileSystem.SeekFile(handle, 0, FILEMOVE_BEGIN); + *data = new u8[(size_t)dataSize]; } From 36079b86d0f4155fddc476845fc0404b5f19591c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 11 Sep 2021 19:53:19 +0200 Subject: [PATCH 299/336] Optimize away a couple of existence checks --- Core/Dialog/SavedataParam.cpp | 41 +++++++++++++---------------- Core/Dialog/SavedataParam.h | 2 +- Core/FileSystems/MetaFileSystem.cpp | 1 + 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index 3d9b260ee4..14c6860f39 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -602,19 +602,19 @@ int SavedataParam::Load(SceUtilitySavedataParam *param, const std::string &saveD return isRWMode ? SCE_UTILITY_SAVEDATA_ERROR_RW_NO_DATA : SCE_UTILITY_SAVEDATA_ERROR_LOAD_NO_DATA; } - if (!pspFileSystem.GetFileInfo(sfoPath).exists) + // Load sfo + if (!LoadSFO(param, dirPath)) { return isRWMode ? SCE_UTILITY_SAVEDATA_ERROR_RW_DATA_BROKEN : SCE_UTILITY_SAVEDATA_ERROR_LOAD_DATA_BROKEN; + } if (fileName != "" && !pspFileSystem.GetFileInfo(filePath).exists) { return isRWMode ? SCE_UTILITY_SAVEDATA_ERROR_RW_FILE_NOT_FOUND : SCE_UTILITY_SAVEDATA_ERROR_LOAD_FILE_NOT_FOUND; } - LoadSFO(param, dirPath); // Load sfo - // Don't know what it is, but PSP always respond this and this unlock some game param->bind = 1021; - // Load another files,seems these are required by some games, e.g. Fushigi no Dungeon Fuurai no Shiren 4 Plus. + // Load another files, seems these are required by some games, e.g. Fushigi no Dungeon Fuurai no Shiren 4 Plus. // Load ICON0.PNG LoadFile(dirPath, ICON0_FILENAME, ¶m->icon0FileData); @@ -793,35 +793,33 @@ u32 SavedataParam::LoadNotCryptedSave(SceUtilitySavedataParam *param, u8 *data, return 0; } -void SavedataParam::LoadSFO(SceUtilitySavedataParam *param, const std::string& dirPath) { +bool SavedataParam::LoadSFO(SceUtilitySavedataParam *param, const std::string& dirPath) { ParamSFOData sfoFile; - std::string sfopath = dirPath+"/" + SFO_FILENAME; - PSPFileInfo sfoInfo = pspFileSystem.GetFileInfo(sfopath); - if (sfoInfo.exists) { - // Read sfo - std::vector sfoData; - if (pspFileSystem.ReadEntireFile(sfopath, sfoData) >= 0) { - sfoFile.ReadSFO(sfoData); + std::string sfopath = dirPath + "/" + SFO_FILENAME; + std::vector sfoData; + if (pspFileSystem.ReadEntireFile(sfopath, sfoData) >= 0) { + sfoFile.ReadSFO(sfoData); - // copy back info in request - strncpy(param->sfoParam.title,sfoFile.GetValueString("TITLE").c_str(),128); - strncpy(param->sfoParam.savedataTitle,sfoFile.GetValueString("SAVEDATA_TITLE").c_str(),128); - strncpy(param->sfoParam.detail,sfoFile.GetValueString("SAVEDATA_DETAIL").c_str(),1024); - param->sfoParam.parentalLevel = sfoFile.GetValueInt("PARENTAL_LEVEL"); - } + // copy back info in request + strncpy(param->sfoParam.title,sfoFile.GetValueString("TITLE").c_str(),128); + strncpy(param->sfoParam.savedataTitle,sfoFile.GetValueString("SAVEDATA_TITLE").c_str(),128); + strncpy(param->sfoParam.detail,sfoFile.GetValueString("SAVEDATA_DETAIL").c_str(),1024); + param->sfoParam.parentalLevel = sfoFile.GetValueInt("PARENTAL_LEVEL"); } + return true; } std::vector SavedataParam::GetSFOEntries(const std::string &dirPath) { std::vector result; const std::string sfoPath = dirPath + "/" + SFO_FILENAME; - if (!pspFileSystem.GetFileInfo(sfoPath).exists) - return result; ParamSFOData sfoFile; std::vector sfoData; - if (pspFileSystem.ReadEntireFile(dirPath + "/" + SFO_FILENAME, sfoData) >= 0) + if (pspFileSystem.ReadEntireFile(sfoPath, sfoData) >= 0) { sfoFile.ReadSFO(sfoData); + } else { + return result; + } const int FILE_LIST_COUNT_MAX = 99; u32 sfoFileListSize = 0; @@ -1164,7 +1162,6 @@ int SavedataParam::GetSizes(SceUtilitySavedataParam *param) NotifyMemInfo(MemBlockFlags::WRITE, param->utilityData.ptr, sizeof(SceUtilitySavedataUsedDataInfo), "SavedataGetSizes"); } return ret; - } bool SavedataParam::GetList(SceUtilitySavedataParam *param) diff --git a/Core/Dialog/SavedataParam.h b/Core/Dialog/SavedataParam.h index 7011d45e37..fc215a97b9 100644 --- a/Core/Dialog/SavedataParam.h +++ b/Core/Dialog/SavedataParam.h @@ -366,7 +366,7 @@ private: int LoadSaveData(SceUtilitySavedataParam *param, const std::string &saveDirName, const std::string& dirPath, bool secureMode); u32 LoadCryptedSave(SceUtilitySavedataParam *param, u8 *data, const u8 *saveData, int &saveSize, int prevCryptMode, const u8 *expectedHash, bool &saveDone); u32 LoadNotCryptedSave(SceUtilitySavedataParam *param, u8 *data, u8 *saveData, int &saveSize); - void LoadSFO(SceUtilitySavedataParam *param, const std::string& dirPath); + bool LoadSFO(SceUtilitySavedataParam *param, const std::string& dirPath); void LoadFile(const std::string& dirPath, const std::string& filename, PspUtilitySavedataFileData *fileData); int DecryptSave(unsigned int mode, unsigned char *data, int *dataLen, int *alignedLen, unsigned char *cryptkey, const u8 *expectedHash); diff --git a/Core/FileSystems/MetaFileSystem.cpp b/Core/FileSystems/MetaFileSystem.cpp index 7192630ae2..4ac716aa57 100644 --- a/Core/FileSystems/MetaFileSystem.cpp +++ b/Core/FileSystems/MetaFileSystem.cpp @@ -598,6 +598,7 @@ int MetaFileSystem::ReadEntireFile(const std::string &filename, std::vector if (result != dataSize) return SCE_KERNEL_ERROR_ERROR; + return 0; } From 825a84a5d1758ca1e29b9307f326194b13442ccc Mon Sep 17 00:00:00 2001 From: Stuart Kenny Date: Sat, 11 Sep 2021 19:05:34 +0100 Subject: [PATCH 300/336] Wire inflight frames config setting to render managers. --- libretro/LibretroGLCoreContext.cpp | 3 +++ libretro/LibretroVulkanContext.cpp | 3 +++ 2 files changed, 6 insertions(+) diff --git a/libretro/LibretroGLCoreContext.cpp b/libretro/LibretroGLCoreContext.cpp index 0b5a57b91b..66261dea82 100644 --- a/libretro/LibretroGLCoreContext.cpp +++ b/libretro/LibretroGLCoreContext.cpp @@ -28,6 +28,9 @@ void LibretroGLCoreContext::CreateDrawContext() { } draw_ = Draw::T3DCreateGLContext(); renderManager_ = (GLRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); + renderManager_->SetInflightFrames(g_Config.iInflightFrames); + SetGPUBackend(GPUBackend::OPENGL); + draw_->CreatePresets(); } void LibretroGLCoreContext::DestroyDrawContext() { diff --git a/libretro/LibretroVulkanContext.cpp b/libretro/LibretroVulkanContext.cpp index 5c27ef33cf..666d941de5 100644 --- a/libretro/LibretroVulkanContext.cpp +++ b/libretro/LibretroVulkanContext.cpp @@ -11,6 +11,7 @@ #include "libretro/LibretroVulkanContext.h" #include "libretro/libretro_vulkan.h" +#include static VulkanContext *vk; @@ -140,6 +141,8 @@ void LibretroVulkanContext::CreateDrawContext() { } draw_ = Draw::T3DCreateVulkanContext(vk, false); + ((VulkanRenderManager*)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER))->SetInflightFrames(g_Config.iInflightFrames); + SetGPUBackend(GPUBackend::VULKAN); } void LibretroVulkanContext::Shutdown() { From 71056e3486439847cc5e791d661ee27b274ee4ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 11 Sep 2021 20:26:36 +0200 Subject: [PATCH 301/336] SFO return value fix, oops --- Core/Dialog/SavedataParam.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index 14c6860f39..19cb39097c 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -805,8 +805,10 @@ bool SavedataParam::LoadSFO(SceUtilitySavedataParam *param, const std::string& d strncpy(param->sfoParam.savedataTitle,sfoFile.GetValueString("SAVEDATA_TITLE").c_str(),128); strncpy(param->sfoParam.detail,sfoFile.GetValueString("SAVEDATA_DETAIL").c_str(),1024); param->sfoParam.parentalLevel = sfoFile.GetValueInt("PARENTAL_LEVEL"); + return true; + } else { + return false; } - return true; } std::vector SavedataParam::GetSFOEntries(const std::string &dirPath) { From b05a74803dc3b52cf9f4b72c938d39e1f119f849 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 11 Sep 2021 20:31:42 +0200 Subject: [PATCH 302/336] Remove another redundant check, comment fixes --- Core/Dialog/SavedataParam.cpp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index 19cb39097c..4e3ad43f3e 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -453,9 +453,7 @@ int SavedataParam::Save(SceUtilitySavedataParam* param, const std::string &saveD // SAVE PARAM.SFO ParamSFOData sfoFile; - std::string sfopath = dirPath+"/" + SFO_FILENAME; - PSPFileInfo sfoInfo = pspFileSystem.GetFileInfo(sfopath); - if (sfoInfo.exists) // Read old sfo if exist + std::string sfopath = dirPath + "/" + SFO_FILENAME; { std::vector sfoData; if (pspFileSystem.ReadEntireFile(sfopath, sfoData) >= 0) @@ -575,14 +573,12 @@ int SavedataParam::Save(SceUtilitySavedataParam* param, const std::string &saveD std::string pic1path = dirPath + "/" + PIC1_FILENAME; WritePSPFile(pic1path, param->pic1FileData.buf, param->pic1FileData.size); } - // Save SND if (param->snd0FileData.buf.IsValid()) { std::string snd0path = dirPath + "/" + SND0_FILENAME; WritePSPFile(snd0path, param->snd0FileData.buf, param->snd0FileData.size); } - return 0; } @@ -614,7 +610,7 @@ int SavedataParam::Load(SceUtilitySavedataParam *param, const std::string &saveD // Don't know what it is, but PSP always respond this and this unlock some game param->bind = 1021; - // Load another files, seems these are required by some games, e.g. Fushigi no Dungeon Fuurai no Shiren 4 Plus. + // Load other files, seems these are required by some games, e.g. Fushigi no Dungeon Fuurai no Shiren 4 Plus. // Load ICON0.PNG LoadFile(dirPath, ICON0_FILENAME, ¶m->icon0FileData); @@ -1180,11 +1176,11 @@ bool SavedataParam::GetList(SceUtilitySavedataParam *param) std::vector sfoFiles; std::vector allDir = pspFileSystem.GetDirListing(savePath); - std::string searchString = GetGameName(param)+GetSaveName(param); + std::string searchString = GetGameName(param) + GetSaveName(param); for (size_t i = 0; i < allDir.size() && validDir.size() < maxFile; i++) { std::string dirName = allDir[i].name; - if(PSPMatch(dirName, searchString)) + if (PSPMatch(dirName, searchString)) { validDir.push_back(allDir[i]); } @@ -1192,7 +1188,7 @@ bool SavedataParam::GetList(SceUtilitySavedataParam *param) PSPFileInfo sfoFile; for (size_t i = 0; i < validDir.size(); ++i) { - // GetFileName(param) == NUll here + // GetFileName(param) == null here // so use sfo files to set the date. sfoFile = pspFileSystem.GetFileInfo(savePath + validDir[i].name + "/" + SFO_FILENAME); sfoFiles.push_back(sfoFile); From d8768345617c6e55fde594ae525029fb6ae3234b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 11 Sep 2021 21:17:01 +0200 Subject: [PATCH 303/336] Fix weird linker problem --- UI/MiscScreens.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/UI/MiscScreens.cpp b/UI/MiscScreens.cpp index 186bb00fb3..683b35918a 100644 --- a/UI/MiscScreens.cpp +++ b/UI/MiscScreens.cpp @@ -79,6 +79,13 @@ public: virtual void Draw(UIContext &dc, double t, float alpha, float x, float y, float z) = 0; }; +static constexpr float XFAC = 0.3f; +static constexpr float YFAC = 0.3f; +static constexpr float ZFAC = 0.12f; +static constexpr float XSPEED = 0.05f; +static constexpr float YSPEED = 0.05f; +static constexpr float ZSPEED = 0.1f; + class MovingBackground : public Animation { public: void Draw(UIContext &dc, double t, float alpha, float x, float y, float z) override { @@ -109,16 +116,9 @@ public: } private: - static constexpr float XFAC = 0.3f; - static constexpr float YFAC = 0.3f; - static constexpr float ZFAC = 0.12f; - static constexpr float XSPEED = 0.05f; - static constexpr float YSPEED = 0.05f; - static constexpr float ZSPEED = 0.1f; - - float lastX_ = 0.0f; - float lastY_ = 0.0f; - float lastZ_ = 1.0f + std::max(XFAC, YFAC); + float lastX_ = 0.0f; + float lastY_ = 0.0f; + float lastZ_ = 1.0f + std::max(XFAC, YFAC); }; class WaveAnimation : public Animation { From de3d711616edb6c86fe8135bb2331e38957978cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 11 Sep 2021 21:17:23 +0200 Subject: [PATCH 304/336] Move FixPathCase to Common/File/Path --- Common/File/Path.cpp | 110 +++++++++++++++++++++++ Common/File/Path.h | 35 ++++++++ Core/Dialog/SavedataParam.cpp | 13 --- Core/Dialog/SavedataParam.h | 2 - Core/FileSystems/DirectoryFileSystem.cpp | 102 --------------------- Core/FileSystems/DirectoryFileSystem.h | 30 ------- 6 files changed, 145 insertions(+), 147 deletions(-) diff --git a/Common/File/Path.cpp b/Common/File/Path.cpp index 3ffd64549d..3a44c0c0f8 100644 --- a/Common/File/Path.cpp +++ b/Common/File/Path.cpp @@ -2,6 +2,7 @@ #include #include "Common/File/Path.h" +#include "Common/File/FileUtil.h" #include "Common/StringUtils.h" #include "Common/Log.h" #include "Common/Data/Encoding/Utf8.h" @@ -9,6 +10,12 @@ #include "android/jni/app-android.h" #include "android/jni/AndroidContentURI.h" +#if HOST_IS_CASE_SENSITIVE +#include +#include +#include +#endif + Path::Path(const std::string &str) { Init(str); } @@ -346,3 +353,106 @@ bool Path::ComputePathTo(const Path &other, std::string &path) const { return true; } } + +#if HOST_IS_CASE_SENSITIVE + +static bool FixFilenameCase(const std::string &path, std::string &filename) { + // Are we lucky? + if (File::Exists(Path(path + filename))) + return true; + + size_t filenameSize = filename.size(); // size in bytes, not characters + for (size_t i = 0; i < filenameSize; i++) + { + filename[i] = tolower(filename[i]); + } + + //TODO: lookup filename in cache for "path" + struct dirent *result = NULL; + + DIR *dirp = opendir(path.c_str()); + if (!dirp) + return false; + + bool retValue = false; + + while ((result = readdir(dirp))) + { + if (strlen(result->d_name) != filenameSize) + continue; + + size_t i; + for (i = 0; i < filenameSize; i++) + { + if (filename[i] != tolower(result->d_name[i])) + break; + } + + if (i < filenameSize) + continue; + + filename = result->d_name; + retValue = true; + } + + closedir(dirp); + + return retValue; +} + +bool FixPathCase(const Path &realBasePath, std::string &path, FixPathCaseBehavior behavior) { + if (realBasePath.Type() == PathType::CONTENT_URI) { + // Nothing to do. These are already case insensitive, I think. + return true; + } + + std::string basePath = realBasePath.ToString(); + + size_t len = path.size(); + + if (len == 0) + return true; + + if (path[len - 1] == '/') + { + len--; + + if (len == 0) + return true; + } + + std::string fullPath; + fullPath.reserve(basePath.size() + len + 1); + fullPath.append(basePath); + + size_t start = 0; + while (start < len) + { + size_t i = path.find('/', start); + if (i == std::string::npos) + i = len; + + if (i > start) + { + std::string component = path.substr(start, i - start); + + // Fix case and stop on nonexistant path component + if (FixFilenameCase(fullPath, component) == false) { + // Still counts as success if partial matches allowed or if this + // is the last component and only the ones before it are required + return (behavior == FPC_PARTIAL_ALLOWED || (behavior == FPC_PATH_MUST_EXIST && i >= len)); + } + + path.replace(start, i - start, component); + + fullPath.append(1, '/'); + fullPath.append(component); + } + + start = i + 1; + } + + return true; +} + +#endif diff --git a/Common/File/Path.h b/Common/File/Path.h index 4a0658e5f7..202f4d120f 100644 --- a/Common/File/Path.h +++ b/Common/File/Path.h @@ -4,6 +4,26 @@ #include +#if defined(__APPLE__) + +#if TARGET_OS_IPHONE +#define HOST_IS_CASE_SENSITIVE 1 +#elif TARGET_IPHONE_SIMULATOR +#define HOST_IS_CASE_SENSITIVE 0 +#else +// Mac OSX case sensitivity defaults off, but is user configurable (when +// creating a filesytem), so assume the worst: +#define HOST_IS_CASE_SENSITIVE 1 +#endif + +#elif defined(_WIN32) +#define HOST_IS_CASE_SENSITIVE 0 + +#else // Android, Linux, BSD (and the rest?) +#define HOST_IS_CASE_SENSITIVE 1 + +#endif + enum class PathType { UNDEFINED = 0, NATIVE = 1, // Can be relative. @@ -108,3 +128,18 @@ private: PathType type_; }; + + +// Utility function for fixing the case of paths. Only present on Unix-like systems. + +#if HOST_IS_CASE_SENSITIVE + +enum FixPathCaseBehavior { + FPC_FILE_MUST_EXIST, // all path components must exist (rmdir, move from) + FPC_PATH_MUST_EXIST, // all except the last one must exist - still tries to fix last one (fopen, move to) + FPC_PARTIAL_ALLOWED, // don't care how many exist (mkdir recursive) +}; + +bool FixPathCase(const Path &basePath, std::string &path, FixPathCaseBehavior behavior); + +#endif diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index 4e3ad43f3e..bf4860569f 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -1919,16 +1919,3 @@ bool SavedataParam::IsInSaveDataList(std::string saveName, int count) { } return false; } - -bool SavedataParam::IsSaveDirectoryExist(SceUtilitySavedataParam* param) { - std::string dirPath = savePath + GetGameName(param) + GetSaveName(param); - PSPFileInfo directoryInfo = pspFileSystem.GetFileInfo(dirPath); - return directoryInfo.exists; -} - -bool SavedataParam::IsSfoFileExist(SceUtilitySavedataParam* param) { - std::string dirPath = savePath + GetGameName(param) + GetSaveName(param); - std::string sfoPath = dirPath + "/" + SFO_FILENAME; - PSPFileInfo sfoInfo = pspFileSystem.GetFileInfo(sfoPath); - return sfoInfo.exists; -} diff --git a/Core/Dialog/SavedataParam.h b/Core/Dialog/SavedataParam.h index fc215a97b9..d3a40d4bf3 100644 --- a/Core/Dialog/SavedataParam.h +++ b/Core/Dialog/SavedataParam.h @@ -319,8 +319,6 @@ public: bool GetSize(SceUtilitySavedataParam* param); int GetSaveCryptMode(SceUtilitySavedataParam* param, const std::string &saveDirName); bool IsInSaveDataList(std::string saveName, int count); - bool IsSaveDirectoryExist(SceUtilitySavedataParam* param); - bool IsSfoFileExist(SceUtilitySavedataParam* param); std::string GetGameName(const SceUtilitySavedataParam *param) const; std::string GetSaveName(const SceUtilitySavedataParam *param) const; diff --git a/Core/FileSystems/DirectoryFileSystem.cpp b/Core/FileSystems/DirectoryFileSystem.cpp index 1da5499310..9a3bb74cfb 100644 --- a/Core/FileSystems/DirectoryFileSystem.cpp +++ b/Core/FileSystems/DirectoryFileSystem.cpp @@ -66,108 +66,6 @@ #include #endif -#if HOST_IS_CASE_SENSITIVE -static bool FixFilenameCase(const std::string &path, std::string &filename) { - // Are we lucky? - if (File::Exists(Path(path + filename))) - return true; - - size_t filenameSize = filename.size(); // size in bytes, not characters - for (size_t i = 0; i < filenameSize; i++) - { - filename[i] = tolower(filename[i]); - } - - //TODO: lookup filename in cache for "path" - struct dirent *result = NULL; - - DIR *dirp = opendir(path.c_str()); - if (!dirp) - return false; - - bool retValue = false; - - while ((result = readdir(dirp))) - { - if (strlen(result->d_name) != filenameSize) - continue; - - size_t i; - for (i = 0; i < filenameSize; i++) - { - if (filename[i] != tolower(result->d_name[i])) - break; - } - - if (i < filenameSize) - continue; - - filename = result->d_name; - retValue = true; - } - - closedir(dirp); - - return retValue; -} - -bool FixPathCase(const Path &realBasePath, std::string &path, FixPathCaseBehavior behavior) { - if (realBasePath.Type() == PathType::CONTENT_URI) { - // Nothing to do. These are already case insensitive, I think. - return true; - } - - std::string basePath = realBasePath.ToString(); - - size_t len = path.size(); - - if (len == 0) - return true; - - if (path[len - 1] == '/') - { - len--; - - if (len == 0) - return true; - } - - std::string fullPath; - fullPath.reserve(basePath.size() + len + 1); - fullPath.append(basePath); - - size_t start = 0; - while (start < len) - { - size_t i = path.find('/', start); - if (i == std::string::npos) - i = len; - - if (i > start) - { - std::string component = path.substr(start, i - start); - - // Fix case and stop on nonexistant path component - if (FixFilenameCase(fullPath, component) == false) { - // Still counts as success if partial matches allowed or if this - // is the last component and only the ones before it are required - return (behavior == FPC_PARTIAL_ALLOWED || (behavior == FPC_PATH_MUST_EXIST && i >= len)); - } - - path.replace(start, i - start, component); - - fullPath.append(1, '/'); - fullPath.append(component); - } - - start = i + 1; - } - - return true; -} - -#endif - DirectoryFileSystem::DirectoryFileSystem(IHandleAllocator *_hAlloc, const Path & _basePath, FileSystemFlags _flags) : basePath(_basePath), flags(_flags) { File::CreateFullPath(basePath); hAlloc = _hAlloc; diff --git a/Core/FileSystems/DirectoryFileSystem.h b/Core/FileSystems/DirectoryFileSystem.h index 9ee4777796..779325ed65 100644 --- a/Core/FileSystems/DirectoryFileSystem.h +++ b/Core/FileSystems/DirectoryFileSystem.h @@ -28,36 +28,6 @@ typedef void * HANDLE; #endif -#if defined(__APPLE__) - -#if TARGET_OS_IPHONE -#define HOST_IS_CASE_SENSITIVE 1 -#elif TARGET_IPHONE_SIMULATOR -#define HOST_IS_CASE_SENSITIVE 0 -#else -// Mac OSX case sensitivity defaults off, but is user configurable (when -// creating a filesytem), so assume the worst: -#define HOST_IS_CASE_SENSITIVE 1 -#endif - -#elif defined(_WIN32) -#define HOST_IS_CASE_SENSITIVE 0 - -#else // Android, Linux, BSD (and the rest?) -#define HOST_IS_CASE_SENSITIVE 1 - -#endif - -#if HOST_IS_CASE_SENSITIVE -enum FixPathCaseBehavior { - FPC_FILE_MUST_EXIST, // all path components must exist (rmdir, move from) - FPC_PATH_MUST_EXIST, // all except the last one must exist - still tries to fix last one (fopen, move to) - FPC_PARTIAL_ALLOWED, // don't care how many exist (mkdir recursive) -}; - -bool FixPathCase(const Path &basePath, std::string &path, FixPathCaseBehavior behavior); -#endif - struct DirectoryFileHandle { enum Flags { NORMAL, From f348adb4b3373cd82ea82b4abc603682a27eef81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 11 Sep 2021 21:45:31 +0200 Subject: [PATCH 305/336] Auto-fix case of manually specified paths. Fixes remaining issue in #14821 --- UI/MemStickScreen.cpp | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/UI/MemStickScreen.cpp b/UI/MemStickScreen.cpp index 812a8e80c5..8f15edc91d 100644 --- a/UI/MemStickScreen.cpp +++ b/UI/MemStickScreen.cpp @@ -201,9 +201,37 @@ UI::EventReturn MemStickScreen::OnSetFolderManually(UI::EventParams ¶ms) { newPath = newPath.substr(0, pos + 1); } + if (newPath.empty()) { + // Reuse below message instead of adding yet another string. + SystemToast(sy->T("Path does not exist!")); + return; + } + Path pendingMemStickFolder(newPath); + + if (!File::Exists(pendingMemStickFolder)) { + // Try to fix the path string, apparently some users got used to leaving out the /. + if (newPath[0] != '/') { + newPath = "/" + newPath; + } + + pendingMemStickFolder = Path(newPath); + } + + if (!File::Exists(pendingMemStickFolder) && pendingMemStickFolder.Type() == PathType::NATIVE) { + // Still no path? Try to automatically fix the case. + std::string oldNewPath = newPath; + FixPathCase(Path(""), newPath, FixPathCaseBehavior::FPC_FILE_MUST_EXIST); + if (oldNewPath != newPath) { + NOTICE_LOG(IO, "Fixed path case: %s -> %s", oldNewPath.c_str(), newPath.c_str()); + pendingMemStickFolder = Path(newPath); + } else { + NOTICE_LOG(IO, "Failed to fix case of path %s (result: %s)", newPath.c_str(), oldNewPath.c_str()); + } + } + if (pendingMemStickFolder == g_Config.memStickDirectory) { - // Same directory as before - all good. + // Same directory as before - all good. Nothing to do. TriggerFinish(DialogResult::DR_OK); return; } From db21d0e7fcc60cd86f8a20e72e7805d457cf6759 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 11 Sep 2021 20:11:22 -0700 Subject: [PATCH 306/336] Android: Avoid crash without ext dir. This can return null on some older Androids. See #14821. --- android/src/org/ppsspp/ppsspp/NativeActivity.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/android/src/org/ppsspp/ppsspp/NativeActivity.java b/android/src/org/ppsspp/ppsspp/NativeActivity.java index b7df0bca47..221fce3296 100644 --- a/android/src/org/ppsspp/ppsspp/NativeActivity.java +++ b/android/src/org/ppsspp/ppsspp/NativeActivity.java @@ -400,7 +400,8 @@ public abstract class NativeActivity extends Activity { String extStorageState = Environment.getExternalStorageState(); String extStorageDir = Environment.getExternalStorageDirectory().getAbsolutePath(); - String externalFilesDir = this.getExternalFilesDir(null).getAbsolutePath(); + File externalFiles = this.getExternalFilesDir(null); + String externalFilesDir = externalFiles == null ? "" : externalFiles.getAbsolutePath(); Log.i(TAG, "Ext storage: " + extStorageState + " " + extStorageDir); Log.i(TAG, "Ext files dir: " + externalFilesDir); From a2f016b2d189353b7df9784b46e308429a9af3f9 Mon Sep 17 00:00:00 2001 From: iota97 Date: Sun, 12 Sep 2021 01:17:24 +0200 Subject: [PATCH 307/336] Fix setting info on multi choice --- UI/GameSettingsScreen.cpp | 10 ++++++++++ UI/GameSettingsScreen.h | 4 ++++ UI/MiscScreens.cpp | 5 +++++ UI/MiscScreens.h | 2 ++ 4 files changed, 21 insertions(+) diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index dcd18cf21c..5c3ff01a7c 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -218,6 +218,11 @@ void GameSettingsScreen::CreateViews() { settingInfo_->SetBottomCutoff(dp_yres - 200.0f); root_->Add(settingInfo_); + // Show it again if we recreated the view + if (oldSettingInfo_ != "") { + settingInfo_->Show(oldSettingInfo_, nullptr); + } + // TODO: These currently point to global settings, not game specific ones. // Graphics @@ -1273,6 +1278,11 @@ void GameSettingsScreen::dialogFinished(const Screen *dialog, DialogResult resul } } +void GameSettingsScreen::RecreateViews() { + oldSettingInfo_ = settingInfo_->GetText(); + UIScreen::RecreateViews(); +} + void GameSettingsScreen::CallbackMemstickFolder(bool yes) { auto sy = GetI18NCategory("System"); diff --git a/UI/GameSettingsScreen.h b/UI/GameSettingsScreen.h index 4346b948fd..9c4a8ecb91 100644 --- a/UI/GameSettingsScreen.h +++ b/UI/GameSettingsScreen.h @@ -44,6 +44,7 @@ protected: void CallbackMemstickFolder(bool yes); bool UseVerticalLayout() const; void dialogFinished(const Screen *dialog, DialogResult result) override; + void RecreateViews() override; private: void TriggerRestart(const char *why); @@ -137,6 +138,9 @@ private: // Android-only std::string pendingMemstickFolder_; + + // If we recreate the views while this is active we show it again + std::string oldSettingInfo_; }; class DeveloperToolsScreen : public UIDialogScreenWithBackground { diff --git a/UI/MiscScreens.cpp b/UI/MiscScreens.cpp index 683b35918a..26fd1101da 100644 --- a/UI/MiscScreens.cpp +++ b/UI/MiscScreens.cpp @@ -1086,4 +1086,9 @@ void SettingInfoMessage::Draw(UIContext &dc) { text_->SetTextColor(whiteAlpha(alpha)); ViewGroup::Draw(dc); + showing_ = sinceShow <= timeToShow; // Don't consider fade time } + +std::string SettingInfoMessage::GetText() const { + return showing_ && text_ ? text_->GetText() : ""; +} \ No newline at end of file diff --git a/UI/MiscScreens.h b/UI/MiscScreens.h index d1fc2bc6a7..05a4708578 100644 --- a/UI/MiscScreens.h +++ b/UI/MiscScreens.h @@ -175,9 +175,11 @@ public: void Show(const std::string &text, UI::View *refView = nullptr); void Draw(UIContext &dc); + std::string GetText() const; private: UI::TextView *text_ = nullptr; double timeShown_ = 0.0; float cutOffY_; + bool showing_ = false; }; From 8d120af1686151e05f9dd6e78c23991aa8acc30a Mon Sep 17 00:00:00 2001 From: iota97 Date: Sun, 12 Sep 2021 15:11:58 +0200 Subject: [PATCH 308/336] Edit psp screen a bit --- UI/ControlMappingScreen.cpp | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/UI/ControlMappingScreen.cpp b/UI/ControlMappingScreen.cpp index fa404f1c47..1aee00dedd 100644 --- a/UI/ControlMappingScreen.cpp +++ b/UI/ControlMappingScreen.cpp @@ -888,8 +888,10 @@ public: V(64.0f, 184.0f); V(76.0f, 200.0f); V(76.0f, 184.0f); R(64.0f, 13.0f, 76.0f, 184.0f); // Center. - V(76.0f, 0.0f); V(400.0f, 0.0f); V(400.0f, 200.0f); - V(76.0f, 0.0f); V(400.0f, 200.0f); V(76.0f, 200.0f); + R(76.0f, 0.0f, 400.0f, 13.0f); + R(76.0f, 167.0f, 400.0f, 200.0f); + R(76.0f, 13.0f, 99.0f, 167.0f); + R(377.0f, 13.0f, 400.0f, 167.0f); // Right side. V(400.0f, 0.0f); V(412.0f, 13.0f); V(400.0f, 13.0f); V(400.0f, 184.0f); V(412.0f, 184.0f); V(400.0f, 200.0f); @@ -921,15 +923,8 @@ public: } void Draw(UIContext &dc) override { - ImageID bg = ImageID("I_BG"); - dc.Draw()->DrawImageStretch(bg, bounds_, 0xFFFFFFFF); - - if (System_GetPropertyBool(SYSPROP_APP_GOLD)) { - dc.Draw()->DrawImage(ImageID("I_ICONGOLD"), bounds_.centerX() - 120, bounds_.centerY() - 30, 1.2f, 0xFFFFFFFF, ALIGN_CENTER); - } else { - dc.Draw()->DrawImage(ImageID("I_ICON"), bounds_.centerX() - 120, bounds_.centerY() - 30, 1.2f, 0xFFFFFFFF, ALIGN_CENTER); - } - dc.Draw()->DrawImage(ImageID("I_LOGO"), bounds_.centerX() + 40, bounds_.centerY() - 30, 1.5f, 0xFFFFFFFF, ALIGN_CENTER); + ImageID bg = ImageID("I_PSP_DISPLAY"); + dc.Draw()->DrawImageStretch(bg, bounds_, 0x7FFFFFFF); } }; @@ -948,14 +943,21 @@ public: if (bgImg_.isValid()) dc.Draw()->DrawImageRotatedStretch(bgImg_, bounds_, scales, angle_, c, flipHBG_); if (img_.isValid()) { - scales[0] *= scale_; - scales[1] *= scale_; + scales[0] *= scaleX_; + scales[1] *= scaleY_; dc.Draw()->DrawImageRotatedStretch(img_, bounds_.Offset(offsetX_, offsetY_), scales, angle_, c); } } MockButton *SetScale(float s) { - scale_ = s; + scaleX_ = s; + scaleY_ = s; + return this; + } + + MockButton *SetScale(float x, float y) { + scaleX_ = x; + scaleY_ = y; return this; } @@ -988,7 +990,8 @@ private: ImageID img_; ImageID bgImg_; float angle_; - float scale_ = 1.0f; + float scaleX_ = 1.0f; + float scaleY_ = 1.0f; float offsetX_ = 0.0f; float offsetY_ = 0.0f; bool flipHBG_ = false; @@ -1033,7 +1036,7 @@ MockPSP::MockPSP(UI::LayoutParams *layoutParams) : AnchorLayout(layoutParams) { AddButton(CTRL_RTRIGGER, ImageID("I_R"), ImageID("I_SHOULDER_LINE"), 0.0f, LayoutSize(50.0f, 16.0f, 397.0f, 0.0f))->SetFlipHBG(true); // Bottom. - AddButton(CTRL_HOME, ImageID("I_ICON"), ImageID("I_RECT_LINE"), 0.0f, LayoutSize(28.0f, 14.0f, 88.0f, 181.0f))->SetScale(0.4f); + AddButton(CTRL_HOME, ImageID("I_HOME"), ImageID("I_RECT_LINE"), 0.0f, LayoutSize(28.0f, 14.0f, 88.0f, 181.0f))->SetScale(1.0f, 0.65f); AddButton(CTRL_SELECT, ImageID("I_SELECT"), ImageID("I_RECT_LINE"), 0.0f, LayoutSize(28.0f, 14.0f, 330.0f, 181.0f)); AddButton(CTRL_START, ImageID("I_START"), ImageID("I_RECT_LINE"), 0.0f, LayoutSize(28.0f, 14.0f, 361.0f, 181.0f)); From 29aa81be9e907c6249913236312566e65775767a Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 12 Sep 2021 07:05:51 -0700 Subject: [PATCH 309/336] Savedata: Respect IO timing method setting. --- Core/Dialog/PSPSaveDialog.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Core/Dialog/PSPSaveDialog.cpp b/Core/Dialog/PSPSaveDialog.cpp index 2ff51d7301..c74b3980a9 100755 --- a/Core/Dialog/PSPSaveDialog.cpp +++ b/Core/Dialog/PSPSaveDialog.cpp @@ -1018,6 +1018,10 @@ int PSPSaveDialog::Update(int animSpeed) case SAVEIO_PENDING: case SAVEIO_DONE: // To make sure there aren't any timing variations, we sync the next frame. + if (g_Config.iIOTimingMethod == IOTIMING_HOST && ioThreadStatus == SAVEIO_PENDING) { + // ... except in Host IO timing, where we wait as long as needed. + break; + } JoinIOThread(); ChangeStatus(SCE_UTILITY_STATUS_FINISHED, 0); break; From 1ee5352d3eccd9886de99dad1ac57d98bc913545 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 12 Sep 2021 09:35:53 -0700 Subject: [PATCH 310/336] TexCache: Correct DXT5 alpha calculation. This matches PSP alpha values from an exhaustive test. --- GPU/Common/TextureDecoder.cpp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/GPU/Common/TextureDecoder.cpp b/GPU/Common/TextureDecoder.cpp index 750fc3f9b7..72da3fd761 100644 --- a/GPU/Common/TextureDecoder.cpp +++ b/GPU/Common/TextureDecoder.cpp @@ -375,20 +375,19 @@ void DXTDecoder::DecodeColors(const DXT1Block *src, bool ignore1bitAlpha) { } static inline u8 lerp8(const DXT5Block *src, int n) { - // These weights translate alpha1/alpha2 to fixed 8.8 point, pre-divided by 7. - int weight1 = ((7 - n) << 8) / 7; - int weight2 = (n << 8) / 7; - return (u8)((src->alpha1 * weight1 + src->alpha2 * weight2 + 255) >> 8); + // These weights multiple alpha1/alpha2 to fixed 8.8 point. + int alpha1 = (src->alpha1 * ((7 - n) << 8)) / 7; + int alpha2 = (src->alpha2 * (n << 8)) / 7; + return (u8)((alpha1 + alpha2 + 31) >> 8); } static inline u8 lerp6(const DXT5Block *src, int n) { - int weight1 = ((5 - n) << 8) / 5; - int weight2 = (n << 8) / 5; - return (u8)((src->alpha1 * weight1 + src->alpha2 * weight2 + 255) >> 8); + int alpha1 = (src->alpha1 * ((5 - n) << 8)) / 5; + int alpha2 = (src->alpha2 * (n << 8)) / 5; + return (u8)((alpha1 + alpha2 + 31) >> 8); } void DXTDecoder::DecodeAlphaDXT5(const DXT5Block *src) { - // TODO: Check if alpha is still not 100% correct. alpha_[0] = src->alpha1; alpha_[1] = src->alpha2; if (alpha_[0] > alpha_[1]) { @@ -460,7 +459,6 @@ void DecodeDXT3Block(u32 *dst, const DXT3Block *src, int pitch, int height) { dxt.WriteColorsDXT3(dst, src, pitch, height); } -// The alpha channel is not 100% correct void DecodeDXT5Block(u32 *dst, const DXT5Block *src, int pitch, int height) { DXTDecoder dxt; dxt.DecodeColors(&src->color, true); From a0eeb52444339dfef5f2e9dc4dad10b2368c9966 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 12 Sep 2021 09:37:34 -0700 Subject: [PATCH 311/336] softgpu: Decode DXT texels directly. This improves performance a lot compared to decoding the whole block. Eventually we may implement a cache, but threading makes that complex to make properly fast. --- GPU/Common/TextureDecoder.cpp | 64 +++++++++++++++++++++++++++++++++++ GPU/Common/TextureDecoder.h | 4 +++ GPU/Software/Sampler.cpp | 12 ++----- 3 files changed, 71 insertions(+), 9 deletions(-) diff --git a/GPU/Common/TextureDecoder.cpp b/GPU/Common/TextureDecoder.cpp index 72da3fd761..adb00e9ad9 100644 --- a/GPU/Common/TextureDecoder.cpp +++ b/GPU/Common/TextureDecoder.cpp @@ -19,6 +19,7 @@ #include "ext/xxhash.h" #include "Common/Data/Convert/ColorConv.h" #include "Common/CPUDetect.h" +#include "Common/Log.h" #include "GPU/GPU.h" #include "GPU/GPUState.h" @@ -446,6 +447,69 @@ void DXTDecoder::WriteColorsDXT5(u32 *dst, const DXT5Block *src, int pitch, int } } +uint32_t GetDXTTexelColor(const DXT1Block *src, int x, int y, int alpha) { + _dbg_assert_(x >= 0 && x < 4); + _dbg_assert_(y >= 0 && y < 4); + + uint16_t c1 = src->color1; + uint16_t c2 = src->color2; + int red1 = (c1 << 3) & 0xF8; + int red2 = (c2 << 3) & 0xF8; + int green1 = (c1 >> 3) & 0xFC; + int green2 = (c2 >> 3) & 0xFC; + int blue1 = (c1 >> 8) & 0xF8; + int blue2 = (c2 >> 8) & 0xF8; + + int colorIndex = (src->lines[y] >> (x * 2)) & 3; + if (colorIndex == 0) { + return makecol(red1, green1, blue1, alpha); + } else if (colorIndex == 1) { + return makecol(red2, green2, blue2, alpha); + } else if (c1 > c2) { + if (colorIndex == 2) { + return makecol(mix_2_3(red1, red2), mix_2_3(green1, green2), mix_2_3(blue1, blue2), alpha); + } + return makecol(mix_2_3(red2, red1), mix_2_3(green2, green1), mix_2_3(blue2, blue1), alpha); + } else if (colorIndex == 3) { + return makecol(0, 0, 0, 0); + } + + // Average - these are always left shifted, so no need to worry about ties. + int red3 = (red1 + red2) / 2; + int green3 = (green1 + green2) / 2; + int blue3 = (blue1 + blue2) / 2; + return makecol(red3, green3, blue3, alpha); +} + +uint32_t GetDXT1Texel(const DXT1Block *src, int x, int y) { + return GetDXTTexelColor(src, x, y, 255); +} + +uint32_t GetDXT3Texel(const DXT3Block *src, int x, int y) { + uint32_t color = GetDXTTexelColor(&src->color, x, y, 0); + u32 alpha = (src->alphaLines[y] >> (x * 4)) & 0xF; + return color | (alpha << 28); +} + +uint32_t GetDXT5Texel(const DXT5Block *src, int x, int y) { + uint32_t color = GetDXTTexelColor(&src->color, x, y, 0); + uint64_t alphadata = ((uint64_t)(uint16_t)src->alphadata1 << 32) | (uint32_t)src->alphadata2; + int alphaIndex = (alphadata >> (y * 12 + x * 3)) & 7; + + if (alphaIndex == 0) { + return color | (src->alpha1 << 24); + } else if (alphaIndex == 1) { + return color | (src->alpha2 << 24); + } else if (src->alpha1 > src->alpha2) { + return color | (lerp8(src, alphaIndex - 1) << 24); + } else if (alphaIndex == 6) { + return color; + } else if (alphaIndex == 7) { + return color | 0xFF000000; + } + return color | (lerp6(src, alphaIndex - 1) << 24); +} + // This could probably be done faster by decoding two or four blocks at a time with SSE/NEON. void DecodeDXT1Block(u32 *dst, const DXT1Block *src, int pitch, int height, bool ignore1bitAlpha) { DXTDecoder dxt; diff --git a/GPU/Common/TextureDecoder.h b/GPU/Common/TextureDecoder.h index 863e509cba..2b03bc4102 100644 --- a/GPU/Common/TextureDecoder.h +++ b/GPU/Common/TextureDecoder.h @@ -92,6 +92,10 @@ void DecodeDXT1Block(u32 *dst, const DXT1Block *src, int pitch, int height, bool void DecodeDXT3Block(u32 *dst, const DXT3Block *src, int pitch, int height); void DecodeDXT5Block(u32 *dst, const DXT5Block *src, int pitch, int height); +uint32_t GetDXT1Texel(const DXT1Block *src, int x, int y); +uint32_t GetDXT3Texel(const DXT3Block *src, int x, int y); +uint32_t GetDXT5Texel(const DXT5Block *src, int x, int y); + static const u8 textureBitsPerPixel[16] = { 16, //GE_TFMT_5650, 16, //GE_TFMT_5551, diff --git a/GPU/Software/Sampler.cpp b/GPU/Software/Sampler.cpp index 607aafd3dd..7bc9a7a43c 100644 --- a/GPU/Software/Sampler.cpp +++ b/GPU/Software/Sampler.cpp @@ -379,27 +379,21 @@ inline static Nearest4 SampleNearest(int u[N], int v[N], const u8 *srcptr, int t case GE_TFMT_DXT1: for (int i = 0; i < N; ++i) { const DXT1Block *block = (const DXT1Block *)srcptr + (v[i] / 4) * (texbufw / 4) + (u[i] / 4); - u32 data[4 * 4]; - DecodeDXT1Block(data, block, 4, 4, false); - res.v[i] = data[4 * (v[i] % 4) + (u[i] % 4)]; + res.v[i] = GetDXT1Texel(block, u[i] % 4, v[i] % 4); } return res; case GE_TFMT_DXT3: for (int i = 0; i < N; ++i) { const DXT3Block *block = (const DXT3Block *)srcptr + (v[i] / 4) * (texbufw / 4) + (u[i] / 4); - u32 data[4 * 4]; - DecodeDXT3Block(data, block, 4, 4); - res.v[i] = data[4 * (v[i] % 4) + (u[i] % 4)]; + res.v[i] = GetDXT3Texel(block, u[i] % 4, v[i] % 4); } return res; case GE_TFMT_DXT5: for (int i = 0; i < N; ++i) { const DXT5Block *block = (const DXT5Block *)srcptr + (v[i] / 4) * (texbufw / 4) + (u[i] / 4); - u32 data[4 * 4]; - DecodeDXT5Block(data, block, 4, 4); - res.v[i] = data[4 * (v[i] % 4) + (u[i] % 4)]; + res.v[i] = GetDXT5Texel(block, u[i] % 4, v[i] % 4); } return res; From ee9d19430fce648f5c3de48b3e9b573efb9ff44c Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 12 Sep 2021 13:57:28 -0700 Subject: [PATCH 312/336] softgpu: Implement DXT1 decoding in samplerx86. --- GPU/Software/Sampler.h | 1 + GPU/Software/SamplerX86.cpp | 189 +++++++++++++++++++++++++++++++++++- 2 files changed, 189 insertions(+), 1 deletion(-) diff --git a/GPU/Software/Sampler.h b/GPU/Software/Sampler.h index 0e7604dc63..85381fb3b7 100644 --- a/GPU/Software/Sampler.h +++ b/GPU/Software/Sampler.h @@ -130,6 +130,7 @@ private: bool Jit_Decode4444(); bool Jit_TransformClutIndex(const SamplerID &id, int bitsPerIndex); bool Jit_ReadClutColor(const SamplerID &id); + bool Jit_GetDXT1Color(const SamplerID &id, int blockSize, int alpha); #if PPSSPP_ARCH(ARM64) Arm64Gen::ARM64FloatEmitter fp; diff --git a/GPU/Software/SamplerX86.cpp b/GPU/Software/SamplerX86.cpp index 2fb08e88d3..cb67d844b5 100644 --- a/GPU/Software/SamplerX86.cpp +++ b/GPU/Software/SamplerX86.cpp @@ -77,6 +77,7 @@ NearestFunc SamplerJitCache::Compile(const SamplerID &id) { SetJumpTarget(nonZeroSrc); } + // This reads the pixel data into resultReg from the args. if (!Jit_ReadTextureFormat(id)) { EndWrite(); ResetCodePtr(GetOffset(start)); @@ -160,6 +161,7 @@ LinearFunc SamplerJitCache::CompileLinear(const SamplerID &id) { // At this point: // R12=uptr, R13=vptr, stack+24=frac_u, stack+32=frac_v, R14=src, R15=bufw, stack+X=level + // This stores the result on the stack for later processing. auto doNearestCall = [&](int off) { MOV(32, R(uReg), MDisp(R12, off)); MOV(32, R(vReg), MDisp(R13, off)); @@ -340,6 +342,10 @@ bool SamplerJitCache::Jit_ReadTextureFormat(const SamplerID &id) { success = Jit_ReadClutColor(id); break; + case GE_TFMT_DXT1: + success = Jit_GetDXT1Color(id, 8, 255); + break; + // TODO: DXT? default: success = false; @@ -348,6 +354,187 @@ bool SamplerJitCache::Jit_ReadTextureFormat(const SamplerID &id) { return success; } +// Note: afterward, srcReg points at the block, and uReg/vReg have offset into block. +bool SamplerJitCache::Jit_GetDXT1Color(const SamplerID &id, int blockSize, int alpha) { + // Like Jit_GetTexData, this gets the color into resultReg. + // Note: color low bits are red, high bits are blue. + _assert_msg_(blockSize == 8 || blockSize == 16, "Invalid DXT block size"); + + // First, we need to get the block's offset, which is: + // blockPos = src + (v/4 * bufw/4 + u/4) * blockSize + // We distribute the blockSize constant for convenience: + // blockPos = src + (blockSize*v/4 * bufw/4 + blockSize*u/4) + + // Copy u (we'll need it later), and round down to the nearest 4 after scaling. + LEA(32, tempReg1, MScaled(uReg, blockSize / 4, 0)); + AND(32, R(tempReg1), Imm32(blockSize == 8 ? ~7 : ~15)); + // Add in srcReg already, since we'll be multiplying soon. + ADD(64, R(tempReg1), R(srcReg)); + + LEA(32, tempReg2, MScaled(vReg, blockSize / 4, 0)); + AND(32, R(tempReg2), Imm32(blockSize == 8 ? ~7 : ~15)); + // Modify bufw in place and then multiply. + SHR(32, R(bufwReg), Imm8(2)); + IMUL(32, tempReg2, R(bufwReg)); + + // And now let's chop off the offset for u and v. + AND(32, R(uReg), Imm32(3)); + AND(32, R(vReg), Imm32(3)); + + // Okay, at this point tempReg1 + tempReg2 = blockPos. To free up regs, put back in srcReg. + LEA(64, srcReg, MRegSum(tempReg1, tempReg2)); + + // The colorIndex is simply the 2 bits at blockPos + (v & 3), shifted right by (u & 3) twice. + MOVZX(32, 8, tempReg1, MRegSum(srcReg, vReg)); + if (uReg == ECX) { + SHR(32, R(tempReg1), R(CL)); + SHR(32, R(tempReg1), R(CL)); + } else { + LEA(32, ECX, MScaled(uReg, SCALE_2, 0)); + SHR(32, R(tempReg1), R(CL)); + } + AND(32, R(tempReg1), Imm32(3)); + + // For colorIndex 0 or 1, we'll simply take the 565 color and convert. + CMP(32, R(tempReg1), Imm32(1)); + FixupBranch handleSimple565 = J_CC(CC_BE); + + // Otherwise, it depends if color1 or color2 is higher, so fetch them. + MOVZX(32, 16, bufwReg, MDisp(srcReg, 4)); + MOVZX(32, 16, tempReg2, MDisp(srcReg, 6)); + + CMP(32, R(bufwReg), R(tempReg2)); + FixupBranch handleMix23 = J_CC(CC_A, true); + + // If we're still here, then colorIndex is either 3 for 0 (easy) or 2 for 50% mix. + XOR(32, R(resultReg), R(resultReg)); + CMP(32, R(tempReg1), Imm32(3)); + FixupBranch finishZero = J_CC(CC_E, true); + + // We'll need more regs. Grab two more. + PUSH(R12); + PUSH(R13); + + // At this point, bufwReg=c1, tempReg2=c2, resultReg=FREE, tempReg1=FREE, R12=FREE, R13=FREE + // We'll add, then shift from 565 a bit less to "divide" by 2 for a 50/50 mix. + + // Start with summing R, then shift into position. + MOV(32, R(resultReg), R(bufwReg)); + AND(32, R(resultReg), Imm32(0x0000F800)); + MOV(32, R(tempReg1), R(tempReg2)); + AND(32, R(tempReg1), Imm32(0x0000F800)); + LEA(32, R12, MRegSum(resultReg, tempReg1)); + // The position is 9, instead of 8, due to doubling. + SHR(32, R(R12), Imm8(9)); + + // For G, summing leaves it 4 right (doubling made it not need more.) + MOV(32, R(resultReg), R(bufwReg)); + AND(32, R(resultReg), Imm32(0x000007E0)); + MOV(32, R(tempReg1), R(tempReg2)); + AND(32, R(tempReg1), Imm32(0x000007E0)); + LEA(32, resultReg, MRegSum(resultReg, tempReg1)); + SHL(32, R(resultReg), Imm8(5 - 1)); + // Now add G and R together. + OR(32, R(resultReg), R(R12)); + + // At B, we're free to modify the regs in place, finally. + AND(32, R(bufwReg), Imm32(0x0000001F)); + AND(32, R(tempReg2), Imm32(0x0000001F)); + LEA(32, tempReg1, MRegSum(bufwReg, tempReg2)); + // We shift left 2 into position (not 3 due to doubling), then 16 more into the B slot. + SHL(32, R(tempReg1), Imm8(16 + 2)); + // And combine into the result. + OR(32, R(resultReg), R(tempReg1)); + + POP(R13); + POP(R12); + FixupBranch finishMix50 = J(true); + + // Simply load the 565 color, and convert to 0888. + SetJumpTarget(handleSimple565); + MOVZX(32, 16, tempReg1, MComplex(srcReg, tempReg1, SCALE_2, 4)); + + // Start with R, shifting it into place. + MOV(32, R(resultReg), R(tempReg1)); + AND(32, R(resultReg), Imm32(0x0000F800)); + SHR(32, R(resultReg), Imm8(8)); + + // Then take G and shift it too. + MOV(32, R(tempReg2), R(tempReg1)); + AND(32, R(tempReg2), Imm32(0x000007E0)); + SHL(32, R(tempReg2), Imm8(5)); + // And now combine with R, shifting that in the process. + OR(32, R(resultReg), R(tempReg2)); + + // Modify B in place and OR in. + AND(32, R(tempReg1), Imm32(0x0000001F)); + SHL(32, R(tempReg1), Imm8(16 + 3)); + OR(32, R(resultReg), R(tempReg1)); + FixupBranch finish565 = J(true); + + // Here we'll mix color1 and color2 by 2/3 (which gets the 2 depends on tempReg1.) + SetJumpTarget(handleMix23); + // We'll need more regs. Grab two more to keep the stack aligned. + PUSH(R12); + PUSH(R13); + + // If tempReg1 is 2, it's bufwReg * 2 + tempReg2, but if tempReg1 is 3, it's reversed. + // Let's swap the regs in that case. + CMP(32, R(tempReg1), Imm32(2)); + FixupBranch skipSwap23 = J_CC(CC_E); + XCHG(32, R(bufwReg), R(tempReg2)); + SetJumpTarget(skipSwap23); + + // Start off with R, adding together first... + MOV(32, R(resultReg), R(bufwReg)); + AND(32, R(resultReg), Imm32(0x0000F800)); + MOV(32, R(tempReg1), R(tempReg2)); + AND(32, R(tempReg1), Imm32(0x0000F800)); + LEA(32, resultReg, MComplex(tempReg1, resultReg, SCALE_2, 0)); + // We'll overflow if we divide here, so shift into place already. + SHR(32, R(resultReg), Imm8(8)); + // Now we divide that by 3, by actually multiplying by AAAB and shifting off. + IMUL(32, R12, R(resultReg), Imm32(0x0000AAAB)); + // Now we SHR off the extra bits we added on. + SHR(32, R(R12), Imm8(17)); + + // Now add up G. We leave this in place and shift right more. + MOV(32, R(resultReg), R(bufwReg)); + AND(32, R(resultReg), Imm32(0x000007E0)); + MOV(32, R(tempReg1), R(tempReg2)); + AND(32, R(tempReg1), Imm32(0x000007E0)); + LEA(32, resultReg, MComplex(tempReg1, resultReg, SCALE_2, 0)); + // Again, multiply and now we use AAAB, this time masking. + IMUL(32, resultReg, R(resultReg), Imm32(0x0000AAAB)); + SHR(32, R(resultReg), Imm8(17 - 5)); + AND(32, R(resultReg), Imm32(0x0000FF00)); + // Let's combine R in already. + OR(32, R(resultReg), R(R12)); + + // Now for B, it starts in the lowest place so we'll need to mask. + AND(32, R(bufwReg), Imm32(0x0000001F)); + AND(32, R(tempReg2), Imm32(0x0000001F)); + LEA(32, tempReg1, MComplex(tempReg2, bufwReg, SCALE_2, 0)); + // Instead of shifting left, though, we multiply by a bit more. + IMUL(32, tempReg1, R(tempReg1), Imm32(0x0002AAAB)); + AND(32, R(tempReg1), Imm32(0x00FF0000)); + OR(32, R(resultReg), R(tempReg1)); + + POP(R13); + POP(R12); + + SetJumpTarget(finishMix50); + SetJumpTarget(finish565); + // In all these cases, it's time to add in alpha. Zero doesn't get it. + if (alpha != 0) { + OR(32, R(resultReg), Imm32(alpha << 24)); + } + + SetJumpTarget(finishZero); + + return true; +} + bool SamplerJitCache::Jit_GetTexData(const SamplerID &id, int bitsPerTexel) { if (id.swizzle) { return Jit_GetTexDataSwizzled(id, bitsPerTexel); @@ -529,7 +716,7 @@ bool SamplerJitCache::Jit_Decode5650() { SHR(32, R(tempReg1), Imm8(2 + 4)); OR(32, R(resultReg), R(tempReg1)); AND(32, R(resultReg), Imm32(0x0000FF00)); - OR(32, R(resultReg), R(tempReg2));; + OR(32, R(resultReg), R(tempReg2)); return true; } From c4de5bfb9f882e743ab02d0910aae54bf0a692b2 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 12 Sep 2021 14:53:55 -0700 Subject: [PATCH 313/336] softgpu: Implement DXT3 in samplerx86. --- GPU/Software/Sampler.h | 1 + GPU/Software/SamplerX86.cpp | 30 +++++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/GPU/Software/Sampler.h b/GPU/Software/Sampler.h index 85381fb3b7..5d72cf2cd9 100644 --- a/GPU/Software/Sampler.h +++ b/GPU/Software/Sampler.h @@ -131,6 +131,7 @@ private: bool Jit_TransformClutIndex(const SamplerID &id, int bitsPerIndex); bool Jit_ReadClutColor(const SamplerID &id); bool Jit_GetDXT1Color(const SamplerID &id, int blockSize, int alpha); + bool Jit_ApplyDXTAlpha(const SamplerID &id); #if PPSSPP_ARCH(ARM64) Arm64Gen::ARM64FloatEmitter fp; diff --git a/GPU/Software/SamplerX86.cpp b/GPU/Software/SamplerX86.cpp index cb67d844b5..8e7fee5fc1 100644 --- a/GPU/Software/SamplerX86.cpp +++ b/GPU/Software/SamplerX86.cpp @@ -346,7 +346,18 @@ bool SamplerJitCache::Jit_ReadTextureFormat(const SamplerID &id) { success = Jit_GetDXT1Color(id, 8, 255); break; - // TODO: DXT? + case GE_TFMT_DXT3: + success = Jit_GetDXT1Color(id, 16, 0); + if (success) + success = Jit_ApplyDXTAlpha(id); + break; + + case GE_TFMT_DXT5: + success = Jit_GetDXT1Color(id, 16, 0); + if (success) + success = Jit_ApplyDXTAlpha(id); + break; + default: success = false; } @@ -535,6 +546,23 @@ bool SamplerJitCache::Jit_GetDXT1Color(const SamplerID &id, int blockSize, int a return true; } +bool SamplerJitCache::Jit_ApplyDXTAlpha(const SamplerID &id) { + GETextureFormat fmt = (GETextureFormat)id.texfmt; + if (fmt == GE_TFMT_DXT3) { + MOVZX(32, 16, tempReg1, MComplex(srcReg, vReg, SCALE_2, 8)); + LEA(32, RCX, MScaled(uReg, SCALE_4, 0)); + SHR(32, R(tempReg1), R(CL)); + SHL(32, R(tempReg1), Imm8(28)); + OR(32, R(resultReg), R(tempReg1)); + return true; + } else if (fmt == GE_TFMT_DXT5) { + return false; + } + + _dbg_assert_(false); + return false; +} + bool SamplerJitCache::Jit_GetTexData(const SamplerID &id, int bitsPerTexel) { if (id.swizzle) { return Jit_GetTexDataSwizzled(id, bitsPerTexel); From d32a1fa91e172f4a1b669e3916446c2709506323 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 13 Sep 2021 01:07:18 +0200 Subject: [PATCH 314/336] it_IT translation update, thanks giona. --- assets/lang/it_IT.ini | 86 +++++++++++++++++++++---------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/assets/lang/it_IT.ini b/assets/lang/it_IT.ini index d7db6ddc6a..5aa296ed92 100644 --- a/assets/lang/it_IT.ini +++ b/assets/lang/it_IT.ini @@ -1,4 +1,4 @@ -[Audio] +[Audio] Alternate speed volume = Volume velocizzato alternativo Audio backend = Renderer Audio (necessita il riavvio) AudioBufferingForBluetooth = Buffer per Bluetooth (lento) @@ -64,7 +64,7 @@ Off = Disattiva OnScreen = Controlli Touchscreen Portrait = Ritratto Portrait Reversed = Ritratto invertito -PSP Action Buttons = Pulsanti Azione PSP (△◯☓☐) +PSP Action Buttons = Pulsanti Azione PSP (△◯✕☐) Screen Rotation = Rotazione Schermo seconds, 0 : off = secondi, 0 = disattiva Sensitivity = Sensibilità @@ -104,13 +104,13 @@ Bicubic = Bicubico Break = Interruzione Break on Load = Fermati al caricamento Buffered Rendering = Rendering con buffer -Buy Gold = Acquista la Versione &Gold +Buy Gold = Acquista la Versione Gold Control Mapping... = Impostazioni dei Controlli... Debugging = Debug Deposterize = De-posterizza -Direct3D9 = &Direct3D9 +Direct3D9 = Direct3D9 Direct3D11 = Direct3D &11 -Disassembly = &Disassemblatore... +Disassembly = Disassemblatore... Discord = Discord Display Layout Editor = Editor visualizzazione layout... Display Rotation = Rotazione display @@ -121,10 +121,10 @@ Enable Cheats = Attiva i trucchi Enable Sound = Attiva il sonoro Exit = Esci Extract File... = Estrazione File... -File = &File -Frame Skipping = &Salto frame +File = File +Frame Skipping = Salto frame Frame Skipping Type = Tipo di Salto frame -Fullscreen = Allarga a Tutto Schermo +Fullscreen = Schermo Intero Game Settings = Impostazioni di Gioco GE Debugger... = Debugger GE... GitHub = Git&Hub @@ -137,14 +137,14 @@ Ignore Windows Key = Ignora il tasto "Windows" Keep PPSSPP On Top = Mantieni PPSSPP Sempre in Primo Piano Landscape = Panoramico Landscape reversed = Panoramico invertito -Language... = Lingua... +Language... = Lingua dell'interfaccia... Linear = Lineare Load = Carica File... Load .sym File... = Carica File .sym... Load Map File... = Carica File Map... Load State = Carica Stato Load State File... = Carica File di Stato... -Log Console = &Log Console +Log Console = Log Console Memory View... = Visualizzazione Memoria... More Settings... = Altre Impostazioni... Nearest = Pixel perfect @@ -160,7 +160,7 @@ Pause When Not Focused = Pausa quando non attivo Portrait = Ritratto Portrait reversed = Ritratto invertito Postprocessing Shader = Shader di post-elaborazione -PPSSPP Forums = Forums PPSSPP +PPSSPP Forums = Forum PPSSPP Record = Registra Record Audio = Registra Audio Record Display = Registra Display @@ -168,7 +168,7 @@ Rendering Mode = Modalità di Rendering Rendering Resolution = Rendering della Risoluzione Reset = Reset Reset Symbol Table = Reimposta la Tabella dei Simboli -Run = &Avvia +Run = Avvia Save .sym File... = Salva File .sym... Save Map File... = Salva File Map... Save State = Salva Stato @@ -177,7 +177,7 @@ Savestate Slot = Slot del salvataggio di stato Screen Scaling Filter = Filtro Scalatura Schermo Show Debug Statistics = Mostra Statistiche di Debug Show FPS Counter = Mostra FPS -Skip Number of Frames = Salta numero di frames +Skip Number of Frames = Salta numero di frame Skip Percent of FPS = Salta percentuale di FPS Stop = &Interrompi Switch UMD = Cambia UMD @@ -204,15 +204,15 @@ Create/Open textures.ini file for current game = Crea/Apri il file textures.ini Current = Corrente Dev Tools = Tools di sviluppo DevMenu = DevMenu -Disabled JIT functionality = JIT Funzionalità JIT disattivata +Disabled JIT functionality = Disattivata Funzionalità JIT Draw Frametimes Graph = Disegna grafica dei frametimes Dump Decrypted Eboot = Crea EBOOT.BIN decriptato all'avvio del gioco -Dump Frame GPU Commands = Comandi Dump frame GPU -Enable driver bug workarounds = Enable driver bug workarounds +Dump Frame GPU Commands = Comandi GPU Dump frame +Enable driver bug workarounds = Abilita espediente per superare i bug dei driver Enable Logging = Attiva Log del Debug Enter address = Inserire indirizzo FPU = FPU -Framedump tests = Framedump tests +Framedump tests = Test del framedump Frame Profiler = Profilo Frame GPU Driver Test = Test dei driver GPU GPU Profile = Profilo GPU @@ -230,15 +230,15 @@ Prev = Indietro Random = Casuale Replace textures = Sostituisci textures Reset limited logging = Reset del logging limitato -RestoreDefaultSettings = Sei sicuro di voler ripristinare le impostazioni?\nImpostazioni dei Controlli non sono cambiate.\n\n\nQuesta azione non si può annullare.\nRiavviare PPSSPP per caricare i cambiamenti. -RestoreGameDefaultSettings = Sei sicuro di voler ripristinare le impostazioni specifiche per il gioco\nai valori predefiniti? +RestoreDefaultSettings = Si desidera davvero ripristinare le impostazioni?\nImpostazioni dei Controlli non sono cambiate.\n\n\nQuest'azione non può essere annullata.\nRiavviare PPSSPP per caricare i cambiamenti. +RestoreGameDefaultSettings = Si desidera davvero ripristinare le impostazioni specifiche per il gioco\nai valori predefiniti? Resume = Ripristina Run CPU Tests = Fai Test CPU Save language ini = Salva *.ini della lingua Save new textures = Salva nuove texture Shader Viewer = Visualizzatore shader Show Developer Menu = Mostra Menu Sviluppatore -Show on-screen messages = Show on-screen messages +Show on-screen messages = Mostra i messaggi on-screen Stats = Statistiche System Information = Informazioni Sistema Texture Replacement = Sostituzione Texture @@ -568,7 +568,7 @@ Browse = Sfoglia... Buy PPSSPP Gold = Acquista PPSSPP Gold Choose folder = Scegli cartella Credits = Riconoscimenti -PPSSPP Homebrew Store = Store PPSSPP Homebrew +DownloadFromStore = Scarica dal PPSSPP Homebrew Store Exit = Esci Game Settings = Impostazioni Games = Giochi @@ -653,16 +653,16 @@ Texture Replacement = Sostituzione delle texture Toggle Fullscreen = Passa a Schermo Intero Toggle mode = Modalità Scambio Triangle = Triangolo -Fast-forward = Avanti veloce +Unthrottle = Non velocizzare Up = D-Pad Su -Vol + = Vol + -Vol - = Vol - +Vol + = Volume + +Vol - = Volume - Wlan = WLAN [Networking] Adhoc Multiplayer forum = Visita il forum Ad Hoc Multigiocatore -AdHoc Server = Ad hoc server -AdhocServer Failed to Bind Port = Ad hoc server failed to bind port +AdHoc Server = Server Ad hoc +AdhocServer Failed to Bind Port = Il server Ad hoc non è riuscito a collegarsi alla porta Auto = Auto Bottom Center = In basso al centro Bottom Left = In basso a sinistra @@ -694,10 +694,10 @@ Failed to Bind Port = Impossibile correlare la porta Failed to connect to Adhoc Server = Impossibile connettersi al sever ad hoc Forced First Connect = Prima connessione forzata (connessione più rapida) Invalid IP or hostname = Indirizzo IP o nome del dominio non valido -Minimum Timeout = Minimum timeout (override in ms, 0 = predefinito) +Minimum Timeout = Timeout minimo (forza in ms, 0 = predefinito) Misc = Varie (predefinito = compatibilità PSP) Network Initialized = Rete inizializzata -Please change your Port Offset = Prego, cambiare l'offset della porta +Please change your Port Offset = Prego, cambiare l'offset della porta Port offset = Offset Porta (0 = compatibilità PSP) proAdhocServer Address: = Indirizzo server ad hoc: Quick Chat 1 = Chat rapida 1 @@ -721,7 +721,7 @@ WLAN Channel = Canale WLAN You're in Offline Mode, go to lobby or online hall = Sei in modalità offline, vai alla lobby online. [Pause] -Cheats = Trucchi +Cheats = Cheat Continue = Continua Create Game Config = Crea game config Delete Game Config = Elimina game config @@ -796,12 +796,12 @@ tools = Strumenti Liberi utilizzati: # Add translators or contributors who translated PPSSPP into your language here. # Add translators1-6 for up to 6 lines of translator credits. # Leave extra lines blank. 4 contributors per line seems to look best. -translators1 = MrYadro, mgaver, VIRGINKLM, raven02 +translators1 = MrYadro, mgaver, adrian17, raven02, papel translators2 = sum2012, vnctdj, unknownbrackets, ufdada -translators3 = The Dax, wuspring, hrydgard, adrian17 -translators4 = papel -translators5 = -translators6 = +translators3 = The Dax, wuspring, hrydgard, VIRGINKLM +translators4 = +translators5 = +translators6 = Twitter @PPSSPP_emu = Twitter website = Visita il sito web: written = Scritto in C++ per velocità e portabilità @@ -870,7 +870,7 @@ View Feedback = Mostra i Feedback Date = Data Filename = Nome del file No screenshot = Nessuno screenshot -None yet. Things will appear here after you save. = Ancora niente. Si inizierà a vedere qualcosa dopo il salvataggio. +None yet. Things will appear here after you save. = Ancora niente. Si inizierà a vedere qualcosa dopo il salvataggio. Save Data = Salvataggi Save States = Salvataggio stati Savedata Manager = Gestione dei Salvataggi @@ -886,10 +886,10 @@ GLToolsWarning = AVVISO: rilevato GLTools, potrebbe causare problemi In menu = Nei menu Load savestate failed = Caricamento salvataggio di stato fallito Loaded State = Stato Caricato -Loaded. Save in game, restart, and load for less bugs. = Caricato. Salvataggio in gioco, riavvio, e caricamento per meno bug. +Loaded. Save in game, restart, and load for less bugs. = Caricato. Salvataggio in gioco, riavvia, e carica per meno bug. LoadStateDoesntExist = Caricamento stato fallito: lo stato non esiste! LoadStateWrongVersion = Caricamento stato fallito: lo stato è di una versione precedente di PPSSPP! -norewind = Nessun riavvolgimento di savestates disponibile. +norewind = Nessun riavvolgimento degli stati salvati disponibile. Playing = Sta giocando PressESC = Premere ESC per aprire il Menu Pausa replaceTextures_false = Le texture non verranno più sostituite. @@ -936,7 +936,7 @@ Device Info = Informazioni dispositivo Display Information = Informazioni display Driver Version = Versione dei Driver EGL Extensions = Estensioni EGL -Frames per buffer = Frames per buffer +Frames per buffer = Frame per buffer GPU Information = Informazioni GPU High precision float range = Ampiezza di float ad alta precisione High precision int range = Ampiezza interi ad alta precisione @@ -947,7 +947,7 @@ OGL Extensions = Estensioni OGL OpenGL ES 2.0 Extensions = Estensioni OpenGL ES 2.0 OpenGL ES 3.0 Extensions = Estensioni OpenGL ES 3.0 OpenGL Extensions = Estensioni OpenGL -Optimal frames per buffer = Frames per buffer ottimali +Optimal frames per buffer = Frame per buffer ottimali Optimal sample rate = Frequenza di campionamento ottimale OS Information = Informazioni OS PPSSPP build = Versione PPSSPP @@ -983,7 +983,7 @@ Change Nickname = Cambia Nick ChangingMemstickPath = I salvataggi, gli stati e altri dati non verranno copiati in questa cartella.\n\nCambiare la cartella del Memory Stick? ChangingMemstickPathInvalid = Quel percorso non può essere usato per salvare i file Memory Stick. ChangingMemstickPathNotExists = Quella cartella non esiste.\n\nI salvataggi, gli stati e altri dati non verranno copiati nella cartella.\n\nCambiare la cartella del Memory Stick? -Cheats = Trucchi +Cheats = Trucchi (sperimentale, consultare il forum) Clear Recent = Svuota "Recenti" Clear Recent Games List = Svuota Lista Giochi Recenti Clear UI background = Svuota fondo UI @@ -1040,7 +1040,7 @@ Save path in My Documents = Salva il percorso in "Documenti" Savestate Slot = Slot di salvataggio stato Savestate slot backups = Backup dello slot di salvataggio stato Screenshots as PNG = Salva screenshot in formato PNG -Set UI background... = Imposta sfondo UI... +Set UI background... = Imposta sfondo interfaccia... Show ID = Mostra ID Show region flag = Mostra flag regione Simulate UMD delays = Simula ritardo UMD @@ -1052,14 +1052,14 @@ Slot 5 = Slot 5 Storage full = Spazio su disco pieno Sustained performance mode = Modalità prestazioni prolungate Time Format = Formato Data/Ora -UI = Interfaccia utente +UI Language = Lingua dell'Interfaccia UI Sound = Suoni dell'Interfaccia undo %c = salva %c Use Lossless Video Codec (FFV1) = Usa Codec Video senza perdite (FFV1) Use O to confirm = Usa ◯ come tasto di conferma Use output buffer (with overlay) for recording = Usa la memoria di buffer per la registrazione (compresi i messaggi) Use system native keyboard = Usa tastiera nativa di sistema -Use X to confirm = Usa ☓ come tasto di conferma +Use X to confirm = Usa ✕ come tasto di conferma VersionCheck = Controlla se ci sono aggiornamenti per PPSSPP WARNING: Android battery save mode is on = ATTENZIONE: La modalità Risparmio Energetico di Android è attivata WARNING: Battery save mode is on = ATTENZIONE: La modalità Risparmio Energetico è attivata From 08816a544dd27a013e4e13d3146128f48511e224 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 12 Sep 2021 17:17:09 -0700 Subject: [PATCH 315/336] softgpu: Implement DXT5 in samplerx86. --- GPU/Software/SamplerX86.cpp | 89 ++++++++++++++++++++++++++++++++++++- 1 file changed, 88 insertions(+), 1 deletion(-) diff --git a/GPU/Software/SamplerX86.cpp b/GPU/Software/SamplerX86.cpp index 8e7fee5fc1..cdc1ace76c 100644 --- a/GPU/Software/SamplerX86.cpp +++ b/GPU/Software/SamplerX86.cpp @@ -556,7 +556,94 @@ bool SamplerJitCache::Jit_ApplyDXTAlpha(const SamplerID &id) { OR(32, R(resultReg), R(tempReg1)); return true; } else if (fmt == GE_TFMT_DXT5) { - return false; + // Let's figure out the alphaIndex bit offset so we can read the right byte. + // bitOffset = (u + v * 4) * 3; + LEA(32, uReg, MComplex(uReg, vReg, SCALE_4, 0)); + LEA(32, uReg, MComplex(uReg, uReg, SCALE_2, 0)); + // And now the byte offset and bit from there, from those. + MOV(32, R(vReg), R(uReg)); + SHR(32, R(vReg), Imm8(3)); + AND(32, R(uReg), Imm32(7)); + + // Load 16 bits and mask, in case it straddles bytes. + MOVZX(32, 16, vReg, MComplex(srcReg, vReg, SCALE_1, 8)); + // If not, it's in bufwReg. + if (uReg != RCX) + MOV(32, R(RCX), R(uReg)); + SHR(32, R(vReg), R(CL)); + AND(32, R(vReg), Imm32(7)); + + // Okay, now check for 0 or 1 alphaIndex in tempReg1, those are simple. + CMP(32, R(vReg), Imm32(1)); + FixupBranch handleSimple = J_CC(CC_BE, true); + + // Now load a1 and a2, since the rest depend on those values. Frees up srcReg. + MOVZX(32, 8, tempReg1, MDisp(srcReg, 14)); + MOVZX(32, 8, tempReg2, MDisp(srcReg, 15)); + + CMP(32, R(tempReg1), R(tempReg2)); + FixupBranch handleLerp8 = J_CC(CC_A); + + // Okay, check for zero or full alpha, at alphaIndex 6 or 7. + XOR(32, R(srcReg), R(srcReg)); + CMP(32, R(vReg), Imm32(6)); + FixupBranch finishZero = J_CC(CC_E, true); + // Remember, MOV doesn't affect flags. + MOV(32, R(srcReg), Imm32(0xFF)); + FixupBranch finishFull = J_CC(CC_A, true); + + // At this point, we're handling a 6-step lerp between alpha1 and alpha2. + SHL(32, R(vReg), Imm8(8)); + // Prepare a multiplier in uReg and multiply alpha1 by it. + MOV(32, R(uReg), Imm32(6 << 8)); + SUB(32, R(uReg), R(vReg)); + IMUL(32, tempReg1, R(uReg)); + // And now the same for alpha2, using vReg. + SUB(32, R(vReg), Imm32(1 << 8)); + IMUL(32, tempReg2, R(vReg)); + + // Let's skip a step and sum before dividing by 5, also adding the 31. + LEA(32, srcReg, MComplex(tempReg1, tempReg2, SCALE_1, 5 * 31)); + // To divide by 5, we will actually multiply by 0x3334 and shift. + IMUL(32, srcReg, Imm32(0x3334)); + SHR(32, R(srcReg), Imm8(24)); + FixupBranch finishLerp6 = J(true); + + // This will be a 8-step lerp between alpha1 and alpha2. + SetJumpTarget(handleLerp8); + SHL(32, R(vReg), Imm8(8)); + // Prepare a multiplier in uReg and multiply alpha1 by it. + MOV(32, R(uReg), Imm32(8 << 8)); + SUB(32, R(uReg), R(vReg)); + IMUL(32, tempReg1, R(uReg)); + // And now the same for alpha2, using vReg. + SUB(32, R(vReg), Imm32(1 << 8)); + IMUL(32, tempReg2, R(vReg)); + + // And divide by 7 together here too, also adding the 31. + LEA(32, srcReg, MComplex(tempReg1, tempReg2, SCALE_1, 7 * 31)); + // Our magic constant here is 0x124A, but it's a bit more complex than just a shift. + IMUL(32, tempReg1, R(srcReg), Imm32(0x124A)); + SHR(32, R(tempReg1), Imm8(15)); + SUB(32, R(srcReg), R(tempReg1)); + SHR(32, R(srcReg), Imm8(1)); + ADD(32, R(srcReg), R(tempReg1)); + SHR(32, R(srcReg), Imm8(10)); + + FixupBranch finishLerp8 = J(); + + SetJumpTarget(handleSimple); + // Just load the specified alpha byte. + MOVZX(32, 8, srcReg, MComplex(srcReg, vReg, SCALE_1, 14)); + + SetJumpTarget(finishFull); + SetJumpTarget(finishZero); + SetJumpTarget(finishLerp6); + SetJumpTarget(finishLerp8); + + SHL(32, R(srcReg), Imm8(24)); + OR(32, R(resultReg), R(srcReg)); + return true; } _dbg_assert_(false); From 6762903087b5e4d4bfc4be7be7877c2dc8c9b6a5 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 12 Sep 2021 17:21:45 -0700 Subject: [PATCH 316/336] TexCache: Correct confusing red/blue var names. This decodes to RGBA (R least significant), so it's confusing to refer to it as BGRA. It's actually the 565 colors in the DXT data that are BGR. --- GPU/Common/TextureDecoder.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/GPU/Common/TextureDecoder.cpp b/GPU/Common/TextureDecoder.cpp index adb00e9ad9..ed3be14836 100644 --- a/GPU/Common/TextureDecoder.cpp +++ b/GPU/Common/TextureDecoder.cpp @@ -339,7 +339,7 @@ protected: }; static inline u32 makecol(int r, int g, int b, int a) { - return (a << 24) | (r << 16) | (g << 8) | b; + return (a << 24) | (b << 16) | (g << 8) | r; } static inline int mix_2_3(int c1, int c2) { @@ -350,12 +350,12 @@ static inline int mix_2_3(int c1, int c2) { void DXTDecoder::DecodeColors(const DXT1Block *src, bool ignore1bitAlpha) { u16 c1 = src->color1; u16 c2 = src->color2; - int red1 = (c1 << 3) & 0xF8; - int red2 = (c2 << 3) & 0xF8; + int blue1 = (c1 << 3) & 0xF8; + int blue2 = (c2 << 3) & 0xF8; int green1 = (c1 >> 3) & 0xFC; int green2 = (c2 >> 3) & 0xFC; - int blue1 = (c1 >> 8) & 0xF8; - int blue2 = (c2 >> 8) & 0xF8; + int red1 = (c1 >> 8) & 0xF8; + int red2 = (c2 >> 8) & 0xF8; // Keep alpha zero for non-DXT1 to skip masking the colors. int alpha = ignore1bitAlpha ? 0 : 255; @@ -453,12 +453,12 @@ uint32_t GetDXTTexelColor(const DXT1Block *src, int x, int y, int alpha) { uint16_t c1 = src->color1; uint16_t c2 = src->color2; - int red1 = (c1 << 3) & 0xF8; - int red2 = (c2 << 3) & 0xF8; + int blue1 = (c1 << 3) & 0xF8; + int blue2 = (c2 << 3) & 0xF8; int green1 = (c1 >> 3) & 0xFC; int green2 = (c2 >> 3) & 0xFC; - int blue1 = (c1 >> 8) & 0xF8; - int blue2 = (c2 >> 8) & 0xF8; + int red1 = (c1 >> 8) & 0xF8; + int red2 = (c2 >> 8) & 0xF8; int colorIndex = (src->lines[y] >> (x * 2)) & 3; if (colorIndex == 0) { From 96fd29c86f89e8b3fcb30a3729be9572d23027aa Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 12 Sep 2021 19:41:47 -0700 Subject: [PATCH 317/336] UI: Allow UI keys on emuscreen of focused. This is only if you already focus something. --- UI/EmuScreen.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index 6d9f0360cc..ff383d82fc 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -728,6 +728,12 @@ void EmuScreen::onVKeyUp(int virtualKeyCode) { bool EmuScreen::key(const KeyInput &key) { Core_NotifyActivity(); + if (UI::IsFocusMovementEnabled()) { + if (UIScreen::key(key)) { + return true; + } + } + return controlMapper_.Key(key, &pauseTrigger_); } From f45c5186ca734cdf37d81e9f5444eab5b6da80b1 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 12 Sep 2021 19:44:44 -0700 Subject: [PATCH 318/336] UI: Move the chat message box to just a view. Instead of being a popup. This should make it easier to make sure things work normally, and avoids some of the strange overrides of PopupScreen it previously had. --- UI/ChatScreen.cpp | 58 +++++++++++------------------------------------ UI/ChatScreen.h | 25 ++++++++++++-------- UI/EmuScreen.cpp | 29 ++++++++++++++++++++++-- UI/EmuScreen.h | 2 ++ 4 files changed, 58 insertions(+), 56 deletions(-) diff --git a/UI/ChatScreen.cpp b/UI/ChatScreen.cpp index c93d755e42..e72b14f9ef 100644 --- a/UI/ChatScreen.cpp +++ b/UI/ChatScreen.cpp @@ -15,7 +15,7 @@ #include "Core/HLE/proAdhoc.h" #include "UI/ChatScreen.h" -void ChatMenu::CreatePopupContents(UI::ViewGroup *parent) { +void ChatMenu::CreateContents(UI::ViewGroup *parent) { using namespace UI; auto n = GetI18NCategory("Networking"); LinearLayout *outer = new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT,400)); @@ -53,37 +53,31 @@ void ChatMenu::CreatePopupContents(UI::ViewGroup *parent) { parent->Add(outer); } -void ChatMenu::CreateViews() { +void ChatMenu::CreateSubviews(const Bounds &screenBounds) { using namespace UI; auto n = GetI18NCategory("Networking"); - UIContext &dc = *screenManager()->getUIContext(); - - AnchorLayout *anchor = new AnchorLayout(new LayoutParams(FILL_PARENT, FILL_PARENT)); - anchor->Overflow(false); - root_ = anchor; - - float yres = screenManager()->getUIContext()->GetBounds().h; + float width = 550.0f; switch (g_Config.iChatScreenPosition) { // the chat screen size is still static 280x240 need a dynamic size based on device resolution case 0: - box_ = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(PopupWidth(), FillVertical() ? yres - 30 : WRAP_CONTENT, 280, NONE, NONE, 240, true)); + box_ = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(width, WRAP_CONTENT, 280, NONE, NONE, 240, true)); break; case 1: - box_ = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(PopupWidth(), FillVertical() ? yres - 30 : WRAP_CONTENT, dc.GetBounds().centerX(), NONE, NONE, 240, true)); + box_ = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(width, WRAP_CONTENT, screenBounds.centerX(), NONE, NONE, 240, true)); break; case 2: - box_ = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(PopupWidth(), FillVertical() ? yres - 30 : WRAP_CONTENT, NONE, NONE, 280, 240, true)); + box_ = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(width, WRAP_CONTENT, NONE, NONE, 280, 240, true)); break; case 3: - box_ = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(PopupWidth(), FillVertical() ? yres - 30 : WRAP_CONTENT, 280, 240, NONE, NONE, true)); + box_ = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(width, WRAP_CONTENT, 280, 240, NONE, NONE, true)); break; case 4: - box_ = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(PopupWidth(), FillVertical() ? yres - 30 : WRAP_CONTENT, dc.GetBounds().centerX(), 240, NONE, NONE, true)); + box_ = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(width, WRAP_CONTENT, screenBounds.centerX(), 240, NONE, NONE, true)); break; case 5: - box_ = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(PopupWidth(), FillVertical() ? yres - 30 : WRAP_CONTENT, NONE, 240, 280, NONE, true)); + box_ = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(width, WRAP_CONTENT, NONE, 240, 280, NONE, true)); break; default: box_ = nullptr; @@ -91,24 +85,14 @@ void ChatMenu::CreateViews() { } if (box_) { - root_->Add(box_); + Add(box_); box_->SetBG(UI::Drawable(0x99303030)); box_->SetHasDropShadow(false); View *title = new PopupHeader(n->T("Chat")); box_->Add(title); - CreatePopupContents(box_); -#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(SDL) - UI::EnableFocusMovement(true); - root_->SetDefaultFocusView(box_); - box_->SubviewFocused(chatEdit_); - root_->SetFocus(); -#else - //root_->SetDefaultFocusView(box_); - //box_->SubviewFocused(scroll_); - //root_->SetFocus(); -#endif + CreateContents(box_); } chatScreenVisible = true; newChat = 0; @@ -116,10 +100,6 @@ void ChatMenu::CreateViews() { UpdateChat(); } -void ChatMenu::dialogFinished(const Screen *dialog, DialogResult result) { - UpdateUIState(UISTATE_INGAME); -} - UI::EventReturn ChatMenu::OnSubmit(UI::EventParams &e) { #if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(SDL) std::string chat = chatEdit_->GetText(); @@ -195,20 +175,8 @@ void ChatMenu::UpdateChat() { } } -bool ChatMenu::touch(const TouchInput &touch) { - if (!box_ || (touch.flags & TOUCH_DOWN) == 0) { - return UIDialogScreen::touch(touch); - } - - if (!box_->GetBounds().Contains(touch.x, touch.y)){ - screenManager()->finishDialog(this, DR_BACK); - } - - return UIDialogScreen::touch(touch); -} - -void ChatMenu::update() { - PopupScreen::update(); +void ChatMenu::Update() { + AnchorLayout::Update(); if (scroll_ && toBottom_) { toBottom_ = false; scroll_->ScrollToBottom(); diff --git a/UI/ChatScreen.h b/UI/ChatScreen.h index 48fe7165f1..54c791af09 100644 --- a/UI/ChatScreen.h +++ b/UI/ChatScreen.h @@ -3,20 +3,25 @@ #include "ppsspp_config.h" #include "Common/UI/UIScreen.h" -class ChatMenu : public PopupScreen { +class ChatMenu : public UI::AnchorLayout { public: - ChatMenu(): PopupScreen("Chat") {} + ChatMenu(const Bounds &screenBounds, UI::LayoutParams *lp = nullptr): UI::AnchorLayout(lp) { + CreateSubviews(screenBounds); + } ~ChatMenu(); - void CreatePopupContents(UI::ViewGroup *parent) override; - void CreateViews() override; - void dialogFinished(const Screen *dialog, DialogResult result) override; - bool touch(const TouchInput &touch) override; - void update() override; - void UpdateChat(); + void Update() override; - bool toBottom_ = true; + bool Contains(float x, float y) const { + if (box_) + return box_->GetBounds().Contains(x, y); + return false; + } private: + void CreateSubviews(const Bounds &screenBounds); + void CreateContents(UI::ViewGroup *parent); + void UpdateChat(); + UI::EventReturn OnSubmit(UI::EventParams &e); UI::EventReturn OnQuickChat1(UI::EventParams &e); UI::EventReturn OnQuickChat2(UI::EventParams &e); @@ -30,4 +35,6 @@ private: UI::ScrollView *scroll_ = nullptr; UI::LinearLayout *chatVert_ = nullptr; UI::ViewGroup *box_ = nullptr; + + bool toBottom_ = true; }; diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index ff383d82fc..9ce3c2820f 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -541,6 +541,13 @@ inline float clamp1(float x) { bool EmuScreen::touch(const TouchInput &touch) { Core_NotifyActivity(); + if (chatMenu_ && (touch.flags & TOUCH_DOWN) != 0 && !chatMenu_->Contains(touch.x, touch.y)) { + chatMenu_->SetVisibility(UI::V_GONE); + if (chatButton_) + chatButton_->SetVisibility(UI::V_VISIBLE); + UI::EnableFocusMovement(false); + } + if (root_) { root_->Touch(touch); return true; @@ -729,7 +736,14 @@ bool EmuScreen::key(const KeyInput &key) { Core_NotifyActivity(); if (UI::IsFocusMovementEnabled()) { - if (UIScreen::key(key)) { + if ((key.flags & KEY_DOWN) != 0 && UI::IsEscapeKey(key)) { + if (chatMenu_) + chatMenu_->SetVisibility(UI::V_GONE); + if (chatButton_) + chatButton_->SetVisibility(UI::V_VISIBLE); + UI::EnableFocusMovement(false); + return true; + } else if (UIScreen::key(key)) { return true; } } @@ -851,8 +865,11 @@ void EmuScreen::CreateViews() { ChoiceWithValueDisplay *btn = new ChoiceWithValueDisplay(&newChat, n->T("Chat"), layoutParams); root_->Add(btn)->OnClick.Handle(this, &EmuScreen::OnChat); chatButton_ = btn; + chatMenu_ = root_->Add(new ChatMenu(screenManager()->getUIContext()->GetBounds(), new LayoutParams(FILL_PARENT, FILL_PARENT))); + chatMenu_->SetVisibility(UI::V_GONE); } else { chatButton_ = nullptr; + chatMenu_ = nullptr; } saveStatePreview_ = new AsyncImageFileView(Path(), IS_FIXED, new AnchorLayoutParams(bounds.centerX(), 100, NONE, NONE, true)); @@ -929,7 +946,15 @@ UI::EventReturn EmuScreen::OnChat(UI::EventParams ¶ms) { if (chatButton_ != nullptr && chatButton_->GetVisibility() == UI::V_VISIBLE) { chatButton_->SetVisibility(UI::V_GONE); } - screenManager()->push(new ChatMenu()); + if (chatMenu_ != nullptr) { + chatMenu_->SetVisibility(UI::V_VISIBLE); + +#if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(SDL) + UI::EnableFocusMovement(true); + root_->SetDefaultFocusView(chatMenu_); + chatMenu_->SetFocus(); +#endif + } return UI::EVENT_DONE; } diff --git a/UI/EmuScreen.h b/UI/EmuScreen.h index a61d6a2b11..79f47982d6 100644 --- a/UI/EmuScreen.h +++ b/UI/EmuScreen.h @@ -33,6 +33,7 @@ struct AxisInput; class AsyncImageFileView; class OnScreenMessagesView; +class ChatMenu; class EmuScreen : public UIScreen { public: @@ -101,6 +102,7 @@ private: UI::Button *resumeButton_ = nullptr; UI::Button *resetButton_ = nullptr; UI::View *chatButton_ = nullptr; + ChatMenu *chatMenu_ = nullptr; UI::Button *cardboardDisableButton_ = nullptr; OnScreenMessagesView *onScreenMessagesView_ = nullptr; From 6b107a884b50d272bf907277341828aad9732ccd Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 12 Sep 2021 20:16:05 -0700 Subject: [PATCH 319/336] UI: Cleanup input box for chat. --- UI/ChatScreen.cpp | 33 +++++++++++++++++++++++---------- UI/ChatScreen.h | 2 ++ UI/EmuScreen.cpp | 5 +++++ 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/UI/ChatScreen.cpp b/UI/ChatScreen.cpp index e72b14f9ef..1e3ad6ed90 100644 --- a/UI/ChatScreen.cpp +++ b/UI/ChatScreen.cpp @@ -23,16 +23,6 @@ void ChatMenu::CreateContents(UI::ViewGroup *parent) { LinearLayout *bottom = outer->Add(new LinearLayout(ORIENT_HORIZONTAL, new LayoutParams(FILL_PARENT, WRAP_CONTENT))); #if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(SDL) chatEdit_ = bottom->Add(new TextEdit("", n->T("Chat message"), n->T("Chat Here"), new LinearLayoutParams(1.0))); -#if defined(USING_WIN_UI) - // freeze the ui when using ctrl + C hotkey need workaround - if (g_Config.bBypassOSKWithKeyboard && !g_Config.bFullScreen) { - System_InputBoxGetString(n->T("Chat"), n->T("Chat Here"), [](bool result, const std::string &value) { - if (result) { - sendChat(value); - } - }); - } -#endif chatEdit_->OnEnter.Handle(this, &ChatMenu::OnSubmit); #elif PPSSPP_PLATFORM(ANDROID) @@ -176,6 +166,8 @@ void ChatMenu::UpdateChat() { } void ChatMenu::Update() { + auto n = GetI18NCategory("Networking"); + AnchorLayout::Update(); if (scroll_ && toBottom_) { toBottom_ = false; @@ -186,6 +178,27 @@ void ChatMenu::Update() { UpdateChat(); updateChatScreen = false; } + +#if defined(USING_WIN_UI) + // Could remove the fullscreen check here, it works now. + if (promptInput_ && g_Config.bBypassOSKWithKeyboard && !g_Config.bFullScreen) { + System_InputBoxGetString(n->T("Chat"), n->T("Chat Here"), [](bool result, const std::string &value) { + if (result) { + sendChat(value); + } + }); + promptInput_ = false; + } +#endif +} + +bool ChatMenu::SubviewFocused(UI::View *view) { + if (!AnchorLayout::SubviewFocused(view)) + return false; + + promptInput_ = true; + + return true; } ChatMenu::~ChatMenu() { diff --git a/UI/ChatScreen.h b/UI/ChatScreen.h index 54c791af09..11fa3ac880 100644 --- a/UI/ChatScreen.h +++ b/UI/ChatScreen.h @@ -10,6 +10,7 @@ public: } ~ChatMenu(); void Update() override; + bool SubviewFocused(UI::View *view) override; bool Contains(float x, float y) const { if (box_) @@ -37,4 +38,5 @@ private: UI::ViewGroup *box_ = nullptr; bool toBottom_ = true; + bool promptInput_ = false; }; diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index 9ce3c2820f..619bf70c1f 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -952,7 +952,12 @@ UI::EventReturn EmuScreen::OnChat(UI::EventParams ¶ms) { #if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(SDL) UI::EnableFocusMovement(true); root_->SetDefaultFocusView(chatMenu_); + chatMenu_->SetFocus(); + UI::View *focused = UI::GetFocusedView(); + if (focused) { + root_->SubviewFocused(focused); + } #endif } return UI::EVENT_DONE; From 40c233fa777c4728f8c8de4294e9a9ee1e3d8c9a Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 12 Sep 2021 20:20:17 -0700 Subject: [PATCH 320/336] UI: Update flags more correctly in chat. Not the ideal interface here, though... --- UI/ChatScreen.cpp | 9 +++++---- UI/ChatScreen.h | 3 ++- UI/EmuScreen.cpp | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/UI/ChatScreen.cpp b/UI/ChatScreen.cpp index 1e3ad6ed90..dfb1acb14d 100644 --- a/UI/ChatScreen.cpp +++ b/UI/ChatScreen.cpp @@ -84,8 +84,6 @@ void ChatMenu::CreateSubviews(const Bounds &screenBounds) { CreateContents(box_); } - chatScreenVisible = true; - newChat = 0; UpdateChat(); } @@ -179,6 +177,9 @@ void ChatMenu::Update() { updateChatScreen = false; } + chatScreenVisible = true; + newChat = 0; + #if defined(USING_WIN_UI) // Could remove the fullscreen check here, it works now. if (promptInput_ && g_Config.bBypassOSKWithKeyboard && !g_Config.bFullScreen) { @@ -197,10 +198,10 @@ bool ChatMenu::SubviewFocused(UI::View *view) { return false; promptInput_ = true; - return true; } -ChatMenu::~ChatMenu() { +void ChatMenu::Close() { + SetVisibility(UI::V_GONE); chatScreenVisible = false; } diff --git a/UI/ChatScreen.h b/UI/ChatScreen.h index 11fa3ac880..83ca61b7b4 100644 --- a/UI/ChatScreen.h +++ b/UI/ChatScreen.h @@ -8,10 +8,11 @@ public: ChatMenu(const Bounds &screenBounds, UI::LayoutParams *lp = nullptr): UI::AnchorLayout(lp) { CreateSubviews(screenBounds); } - ~ChatMenu(); void Update() override; bool SubviewFocused(UI::View *view) override; + void Close(); + bool Contains(float x, float y) const { if (box_) return box_->GetBounds().Contains(x, y); diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index 619bf70c1f..1b499a4708 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -542,7 +542,7 @@ bool EmuScreen::touch(const TouchInput &touch) { Core_NotifyActivity(); if (chatMenu_ && (touch.flags & TOUCH_DOWN) != 0 && !chatMenu_->Contains(touch.x, touch.y)) { - chatMenu_->SetVisibility(UI::V_GONE); + chatMenu_->Close(); if (chatButton_) chatButton_->SetVisibility(UI::V_VISIBLE); UI::EnableFocusMovement(false); @@ -738,7 +738,7 @@ bool EmuScreen::key(const KeyInput &key) { if (UI::IsFocusMovementEnabled()) { if ((key.flags & KEY_DOWN) != 0 && UI::IsEscapeKey(key)) { if (chatMenu_) - chatMenu_->SetVisibility(UI::V_GONE); + chatMenu_->Close(); if (chatButton_) chatButton_->SetVisibility(UI::V_VISIBLE); UI::EnableFocusMovement(false); From d9f62d690a934b9be028296cd196b0e3e9939e4b Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 13 Sep 2021 00:03:42 -0700 Subject: [PATCH 321/336] Vulkan: Expand 16-bit textures to generate mips. When using "Auto Max Quality", we can't use 16-bit formats. See #14804. --- GPU/Vulkan/TextureCacheVulkan.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/GPU/Vulkan/TextureCacheVulkan.cpp b/GPU/Vulkan/TextureCacheVulkan.cpp index fadb043b22..35504f6d75 100644 --- a/GPU/Vulkan/TextureCacheVulkan.cpp +++ b/GPU/Vulkan/TextureCacheVulkan.cpp @@ -754,10 +754,11 @@ void TextureCacheVulkan::BuildTexture(TexCacheEntry *const entry) { VkFormat dstFmt = GetDestFormat(GETextureFormat(entry->format), gstate.getClutPaletteFormat()); // TODO: Really should inspect the format capabilities. - if (g_Config.iTexFiltering == TEX_FILTER_AUTO_MAX_QUALITY && dstFmt == VK_FORMAT_R8G8B8A8_UNORM) { + if (g_Config.iTexFiltering == TEX_FILTER_AUTO_MAX_QUALITY) { // Boost the number of mipmaps. int maxPossibleMipmaps = log2i(std::min(gstate.getTextureWidth(0), gstate.getTextureHeight(0))); maxLevelToGenerate = maxPossibleMipmaps; + dstFmt = VK_FORMAT_R8G8B8A8_UNORM; } int scaleFactor = standardScaleFactor_; @@ -1092,7 +1093,7 @@ void TextureCacheVulkan::LoadTextureLevel(TexCacheEntry &entry, uint8_t *writePt decPitch = w * bpp; } - bool expand32 = !gstate_c.Supports(GPU_SUPPORTS_16BIT_FORMATS); + bool expand32 = !gstate_c.Supports(GPU_SUPPORTS_16BIT_FORMATS) || dstFmt == VK_FORMAT_R8G8B8A8_UNORM; DecodeTextureLevel((u8 *)pixelData, decPitch, tfmt, clutformat, texaddr, level, bufw, false, false, expand32); gpuStats.numTexturesDecoded++; From c37c07825467a375ab09042dda78f7fb00ace578 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 13 Sep 2021 00:07:01 -0700 Subject: [PATCH 322/336] Vulkan: Only force 32-bit if needed. If there are mips already, we can keep 16-bit. --- GPU/Vulkan/TextureCacheVulkan.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/GPU/Vulkan/TextureCacheVulkan.cpp b/GPU/Vulkan/TextureCacheVulkan.cpp index 35504f6d75..282035ddb4 100644 --- a/GPU/Vulkan/TextureCacheVulkan.cpp +++ b/GPU/Vulkan/TextureCacheVulkan.cpp @@ -757,8 +757,10 @@ void TextureCacheVulkan::BuildTexture(TexCacheEntry *const entry) { if (g_Config.iTexFiltering == TEX_FILTER_AUTO_MAX_QUALITY) { // Boost the number of mipmaps. int maxPossibleMipmaps = log2i(std::min(gstate.getTextureWidth(0), gstate.getTextureHeight(0))); - maxLevelToGenerate = maxPossibleMipmaps; - dstFmt = VK_FORMAT_R8G8B8A8_UNORM; + if (maxPossibleMipmaps > maxLevelToGenerate) { + maxLevelToGenerate = maxPossibleMipmaps; + dstFmt = VK_FORMAT_R8G8B8A8_UNORM; + } } int scaleFactor = standardScaleFactor_; From 4ec1a8d12a3d4667a60c0c6ff0a69d6a342fb4af Mon Sep 17 00:00:00 2001 From: iota97 Date: Mon, 13 Sep 2021 13:22:27 +0200 Subject: [PATCH 323/336] Allow drag over touch DPAD and avoid analog drag to trigger other button --- UI/GamepadEmu.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/UI/GamepadEmu.cpp b/UI/GamepadEmu.cpp index b38ec5505f..1c72a3879c 100644 --- a/UI/GamepadEmu.cpp +++ b/UI/GamepadEmu.cpp @@ -35,6 +35,7 @@ #include "UI/GamepadEmu.h" static uint32_t usedPointerMask = 0; +static uint32_t analogPointerMask = 0; static u32 GetButtonColor() { return g_Config.iTouchButtonStyle != 0 ? 0xFFFFFF : 0xc0b080; @@ -96,6 +97,9 @@ void MultiTouchButton::GetContentDimensions(const UIContext &dc, float &w, float } void MultiTouchButton::Touch(const TouchInput &input) { + if (analogPointerMask & (1 << input.id)) + return; + GamepadView::Touch(input); if ((input.flags & TOUCH_DOWN) && bounds_.Contains(input.x, input.y)) { pointerDownMask_ |= 1 << input.id; @@ -152,6 +156,9 @@ void MultiTouchButton::Draw(UIContext &dc) { } void BoolButton::Touch(const TouchInput &input) { + if (analogPointerMask & (1 << input.id)) + return; + bool lastDown = pointerDownMask_ != 0; MultiTouchButton::Touch(input); bool down = pointerDownMask_ != 0; @@ -165,6 +172,9 @@ void BoolButton::Touch(const TouchInput &input) { } void PSPButton::Touch(const TouchInput &input) { + if (analogPointerMask & (1 << input.id)) + return; + bool lastDown = pointerDownMask_ != 0; MultiTouchButton::Touch(input); bool down = pointerDownMask_ != 0; @@ -192,6 +202,9 @@ void ComboKey::GetContentDimensions(const UIContext &dc, float &w, float &h) con } void ComboKey::Touch(const TouchInput &input) { + if (analogPointerMask & (1 << input.id)) + return; + using namespace CustomKey; bool lastDown = pointerDownMask_ != 0; MultiTouchButton::Touch(input); @@ -231,6 +244,9 @@ void PSPDpad::GetContentDimensions(const UIContext &dc, float &w, float &h) cons } void PSPDpad::Touch(const TouchInput &input) { + if (analogPointerMask & (1 << input.id)) + return; + GamepadView::Touch(input); if (input.flags & TOUCH_DOWN) { @@ -241,6 +257,9 @@ void PSPDpad::Touch(const TouchInput &input) { } } if (input.flags & TOUCH_MOVE) { + if (dragPointerId_ == -1 && bounds_.Contains(input.x, input.y)) { + dragPointerId_ = input.id; + } if (input.id == dragPointerId_) { ProcessTouch(input.x, input.y, true); } @@ -397,6 +416,7 @@ void PSPStick::Touch(const TouchInput &input) { centerY_ = bounds_.centerY(); __CtrlSetAnalogXY(stick_, 0.0f, 0.0f); usedPointerMask = 0; + analogPointerMask = 0; return; } if (input.flags & TOUCH_DOWN) { @@ -410,6 +430,7 @@ void PSPStick::Touch(const TouchInput &input) { } dragPointerId_ = input.id; usedPointerMask |= 1 << input.id; + analogPointerMask |= 1 << input.id; ProcessTouch(input.x, input.y, true); } } @@ -424,6 +445,7 @@ void PSPStick::Touch(const TouchInput &input) { centerX_ = bounds_.centerX(); centerY_ = bounds_.centerY(); usedPointerMask &= ~(1 << input.id); + analogPointerMask &= ~(1 << input.id); ProcessTouch(input.x, input.y, false); } } @@ -497,6 +519,7 @@ void PSPCustomStick::Touch(const TouchInput &input) { posX_ = 0.0f; posY_ = 0.0f; usedPointerMask = 0; + analogPointerMask = 0; return; } if (input.flags & TOUCH_DOWN) { @@ -510,6 +533,7 @@ void PSPCustomStick::Touch(const TouchInput &input) { } dragPointerId_ = input.id; usedPointerMask |= 1 << input.id; + analogPointerMask |= 1 << input.id; ProcessTouch(input.x, input.y, true); } } @@ -524,6 +548,7 @@ void PSPCustomStick::Touch(const TouchInput &input) { centerX_ = bounds_.centerX(); centerY_ = bounds_.centerY(); usedPointerMask &= ~(1 << input.id); + analogPointerMask &= ~(1 << input.id); ProcessTouch(input.x, input.y, false); } } From 2ecaa61fa5694474e43987c39a25c2ab4ca348ad Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 13 Sep 2021 07:24:59 -0700 Subject: [PATCH 324/336] headless: Fix some Python warnings. Also, on newer pythons, this was crashing entirely. --- test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test.py b/test.py index b4595ede9d..cd51a83f81 100755 --- a/test.py +++ b/test.py @@ -43,7 +43,7 @@ class Command(object): def run(self, timeout): def target(): - self.process = subprocess.Popen(self.cmd, bufsize=1, stdin=subprocess.PIPE, stdout=sys.stdout, stderr=subprocess.STDOUT) + self.process = subprocess.Popen(self.cmd, stdin=subprocess.PIPE, stdout=sys.stdout, stderr=subprocess.STDOUT) self.process.stdin.write(self.data.encode('utf-8')) self.process.stdin.close() self.process.communicate() @@ -52,7 +52,7 @@ class Command(object): thread.start() thread.join(timeout) - if thread.isAlive(): + if thread.is_alive(): self.timeout = True if sys.version_info < (2, 6): os.kill(self.process.pid, signal.SIGKILL) From 3ac669f80bbdd50486a2cb68fb65c04c1b052d48 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 13 Sep 2021 08:13:14 -0700 Subject: [PATCH 325/336] Core: Fix some minor gcc warnings. --- Common/Thread/ThreadUtil.cpp | 2 +- Core/HLE/sceNetAdhoc.cpp | 9 ++++----- Core/TextureReplacer.cpp | 11 +++++++---- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Common/Thread/ThreadUtil.cpp b/Common/Thread/ThreadUtil.cpp index 7381279295..a2016e2f92 100644 --- a/Common/Thread/ThreadUtil.cpp +++ b/Common/Thread/ThreadUtil.cpp @@ -22,7 +22,7 @@ #include "Common/Log.h" #include "Common/Thread/ThreadUtil.h" -#if PPSSPP_PLATFORM(ANDROID) || PPSSPP_PLATFORM(LINUX) +#if (PPSSPP_PLATFORM(ANDROID) || PPSSPP_PLATFORM(LINUX)) && !defined(_GNU_SOURCE) #define _GNU_SOURCE #endif diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index ea7347272a..a09aec0082 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -5597,17 +5597,16 @@ void __NetMatchingCallbacks() //(int matchingId) int delayus = adhocDefaultDelay; auto params = matchingEvents.begin(); - if (params != matchingEvents.end()) - { - u32_le* args = (u32_le*)&(*params); + if (params != matchingEvents.end()) { + u32_le *args = params->data; //auto context = findMatchingContext(args[0]); if (actionAfterMatchingMipsCall < 0) { actionAfterMatchingMipsCall = __KernelRegisterActionType(AfterMatchingMipsCall::Create); } DEBUG_LOG(SCENET, "AdhocMatching - Remaining Events: %zu", matchingEvents.size()); - DEBUG_LOG(SCENET, "AdhocMatchingCallback: [ID=%i][EVENT=%i][%s]", args[0], args[1], mac2str((SceNetEtherAddr*)Memory::GetPointer(args[2])).c_str()); - AfterMatchingMipsCall* after = (AfterMatchingMipsCall*)__KernelCreateAction(actionAfterMatchingMipsCall); + DEBUG_LOG(SCENET, "AdhocMatchingCallback: [ID=%i][EVENT=%i][%s]", args[0], args[1], mac2str((SceNetEtherAddr *)Memory::GetPointer(args[2])).c_str()); + AfterMatchingMipsCall *after = (AfterMatchingMipsCall *)__KernelCreateAction(actionAfterMatchingMipsCall); after->SetData(args[0], args[1], args[2]); hleEnqueueCall(args[5], 5, args, after); matchingEvents.pop_front(); diff --git a/Core/TextureReplacer.cpp b/Core/TextureReplacer.cpp index 3e7f3dcdec..356228038b 100644 --- a/Core/TextureReplacer.cpp +++ b/Core/TextureReplacer.cpp @@ -455,10 +455,10 @@ bool TextureReplacer::PopulateLevel(ReplacedTextureLevel &level) { auto imageType = Identify(fp); if (imageType == ReplacedImageType::ZIM) { fseek(fp, 4, SEEK_SET); - fread(&level.w, 1, 4, fp); - fread(&level.h, 1, 4, fp); + good = good && fread(&level.w, 4, 1, fp) == 1; + good = good && fread(&level.h, 4, 1, fp) == 1; int flags; - if (fread(&flags, 1, 4, fp) == 4) { + if (good && fread(&flags, 4, 1, fp) == 1) { good = (flags & ZIM_FORMAT_MASK) == ZIM_RGBA8888; } } else if (imageType == ReplacedImageType::PNG) { @@ -744,7 +744,10 @@ void ReplacedTexture::Load(int level, void *out, int rowPitch) { if (imageType == ReplacedImageType::ZIM) { size_t zimSize = File::GetFileSize(fp); std::unique_ptr zim(new uint8_t[zimSize]); - fread(&zim[0], 1, zimSize, fp); + if (fread(&zim[0], 1, zimSize, fp) != zimSize) { + ERROR_LOG(G3D, "Could not load texture replacement: %s - failed to read ZIM", info.file.c_str()); + return; + } int w, h, f; uint8_t *image; From 10ffdc9f543ed4686604ea84f6b60d6f020258e3 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 13 Sep 2021 08:29:45 -0700 Subject: [PATCH 326/336] Font: Cleanup logging for invalid pointers. Also fixes some duplicate logging and includes return code/error code. --- Core/HLE/sceFont.cpp | 98 +++++++++++++++++++------------------------- 1 file changed, 42 insertions(+), 56 deletions(-) diff --git a/Core/HLE/sceFont.cpp b/Core/HLE/sceFont.cpp index 251dbebdf5..951b0700c0 100644 --- a/Core/HLE/sceFont.cpp +++ b/Core/HLE/sceFont.cpp @@ -599,13 +599,13 @@ public: foundFontIndex = FindFreeIndex(); if (foundFontIndex < 0 || fontRefCount_[foundFontIndex] >= MAX_FONT_REFS) { - ERROR_LOG(SCEFONT, "Too many fonts opened in FontLib"); error = ERROR_FONT_TOO_MANY_OPEN_FONTS; + hleLogError(SCEFONT, 0, "Too many fonts opened in FontLib"); return nullptr; } if (!font->IsValid()) { - ERROR_LOG(SCEFONT, "Invalid font data"); error = ERROR_FONT_INVALID_FONT_DATA; + hleLogError(SCEFONT, 0, "Invalid font data"); return nullptr; } @@ -833,10 +833,8 @@ inline void LoadedFont::DrawCharacter(const GlyphImage *image, int clipX, int cl static FontLib *GetFontLib(u32 handle) { if (fontLibMap.find(handle) != fontLibMap.end()) { return fontLibList[fontLibMap[handle]]; - } else { - ERROR_LOG(SCEFONT, "No fontlib with handle %08x", handle); - return 0; } + return nullptr; } static LoadedFont *GetLoadedFont(u32 handle, bool allowClosed) { @@ -1010,12 +1008,13 @@ static u32 sceFontNewLib(u32 paramPtr, u32 errorCodePtr) { } static int sceFontDoneLib(u32 fontLibHandle) { - INFO_LOG(SCEFONT, "sceFontDoneLib(%08x)", fontLibHandle); FontLib *fl = GetFontLib(fontLibHandle); if (fl) { fl->Done(); + return hleLogSuccessInfoI(SCEFONT, 0); } - return 0; + + return hleLogWarning(SCEFONT, 0, "invalid font lib"); } // Open internal font into a FontLib @@ -1023,19 +1022,17 @@ static u32 sceFontOpen(u32 libHandle, u32 index, u32 mode, u32 errorCodePtr) { auto errorCode = PSPPointer::Create(errorCodePtr); if (!errorCode.IsValid()) { // Would crash on the PSP. - ERROR_LOG(SCEFONT, "sceFontOpen(%x, %x, %x, %x): invalid pointer", libHandle, index, mode, errorCodePtr); - return -1; + return hleLogError(SCEFONT, -1, "invalid error address"); } - DEBUG_LOG(SCEFONT, "sceFontOpen(%x, %x, %x, %x)", libHandle, index, mode, errorCodePtr); FontLib *fontLib = GetFontLib(libHandle); - if (fontLib == NULL) { + if (!fontLib) { *errorCode = ERROR_FONT_INVALID_LIBID; - return 0; + return hleLogDebug(SCEFONT, 0, "invalid font lib"); } if (index >= internalFonts.size()) { *errorCode = ERROR_FONT_INVALID_PARAMETER; - return 0; + return hleLogDebug(SCEFONT, 0, "invalid font index"); } FontOpenMode openMode = mode != 1 ? FONT_OPEN_INTERNAL_STINGY : FONT_OPEN_INTERNAL_FULL; @@ -1044,103 +1041,91 @@ static u32 sceFontOpen(u32 libHandle, u32 index, u32 mode, u32 errorCodePtr) { *errorCode = 0; // Delay only on the first open. if (fontLib->GetFontRefCount(internalFonts[index]) == 1) - return hleDelayResult(font->Handle(), "font open", 10000); - return font->Handle(); + return hleDelayResult(hleLogSuccessX(SCEFONT, font->Handle()), "font open", 10000); + return hleLogSuccessX(SCEFONT, font->Handle()); } return 0; } // Open a user font in RAM into a FontLib -static u32 sceFontOpenUserMemory(u32 libHandle, u32 memoryFontAddrPtr, u32 memoryFontLength, u32 errorCodePtr) { +static u32 sceFontOpenUserMemory(u32 libHandle, u32 memoryFontPtr, u32 memoryFontLength, u32 errorCodePtr) { auto errorCode = PSPPointer::Create(errorCodePtr); if (!errorCode.IsValid()) { - ERROR_LOG_REPORT(SCEFONT, "sceFontOpenUserMemory(%08x, %08x, %08x, %08x): invalid error address", libHandle, memoryFontAddrPtr, memoryFontLength, errorCodePtr); - return -1; + return hleReportError(SCEFONT, -1, "invalid error address"); } - if (!Memory::IsValidAddress(memoryFontAddrPtr)) { - ERROR_LOG_REPORT(SCEFONT, "sceFontOpenUserMemory(%08x, %08x, %08x, %08x): invalid address", libHandle, memoryFontAddrPtr, memoryFontLength, errorCodePtr); + if (!Memory::IsValidAddress(memoryFontPtr)) { *errorCode = ERROR_FONT_INVALID_PARAMETER; - return 0; + return hleReportError(SCEFONT, 0, "invalid address"); } FontLib *fontLib = GetFontLib(libHandle); if (!fontLib) { - ERROR_LOG_REPORT(SCEFONT, "sceFontOpenUserMemory(%08x, %08x, %08x, %08x): bad font lib", libHandle, memoryFontAddrPtr, memoryFontLength, errorCodePtr); *errorCode = ERROR_FONT_INVALID_LIBID; - return 0; + return hleReportError(SCEFONT, 0, "invalid font lib"); } if (memoryFontLength == 0) { - ERROR_LOG_REPORT(SCEFONT, "sceFontOpenUserMemory(%08x, %08x, %08x, %08x): invalid size", libHandle, memoryFontAddrPtr, memoryFontLength, errorCodePtr); *errorCode = ERROR_FONT_INVALID_PARAMETER; - return 0; + return hleReportError(SCEFONT, 0, "invalid size"); } - DEBUG_LOG(SCEFONT, "sceFontOpenUserMemory(%08x, %08x, %08x, %08x)", libHandle, memoryFontAddrPtr, memoryFontLength, errorCodePtr); - const u8 *fontData = Memory::GetPointer(memoryFontAddrPtr); + const u8 *fontData = Memory::GetPointer(memoryFontPtr); // Games are able to overstate the size of a font. Let's avoid crashing when we memcpy() it. // Unsigned 0xFFFFFFFF is treated as max, but that's impossible, so let's clamp to 64MB. if (memoryFontLength > 0x03FFFFFF) memoryFontLength = 0x03FFFFFF; - while (!Memory::IsValidAddress(memoryFontAddrPtr + memoryFontLength - 1)) { + while (!Memory::IsValidAddress(memoryFontPtr + memoryFontLength - 1)) { --memoryFontLength; } Font *f = new Font(fontData, memoryFontLength); LoadedFont *font = fontLib->OpenFont(f, FONT_OPEN_USERBUFFER, *errorCode); if (font) { *errorCode = 0; - return font->Handle(); - } else { - delete f; - return 0; + return hleLogSuccessX(SCEFONT, font->Handle()); } + delete f; + return 0; } // Open a user font in a file into a FontLib static u32 sceFontOpenUserFile(u32 libHandle, const char *fileName, u32 mode, u32 errorCodePtr) { auto errorCode = PSPPointer::Create(errorCodePtr); - if (!errorCode.IsValid()) { - ERROR_LOG_REPORT(SCEFONT, "sceFontOpenUserFile(%08x, %s, %08x, %08x): invalid error address", libHandle, fileName, mode, errorCodePtr); - return ERROR_FONT_INVALID_PARAMETER; + return hleReportError(SCEFONT, ERROR_FONT_INVALID_PARAMETER, "invalid error address"); } - if (fileName == NULL) { - ERROR_LOG_REPORT(SCEFONT, "sceFontOpenUserFile(%08x, %s, %08x, %08x): invalid filename", libHandle, fileName, mode, errorCodePtr); + if (!fileName) { *errorCode = ERROR_FONT_INVALID_PARAMETER; - return 0; + return hleReportError(SCEFONT, 0, "invalid filename"); } FontLib *fontLib = GetFontLib(libHandle); if (!fontLib) { - ERROR_LOG_REPORT(SCEFONT, "sceFontOpenUserFile(%08x, %s, %08x, %08x): invalid font lib", libHandle, fileName, mode, errorCodePtr); *errorCode = ERROR_FONT_INVALID_LIBID; - return 0; + return hleReportError(SCEFONT, 0, "invalid font lib"); } // TODO: Technically, we only do this if mode = 1. Mode 0 uses the handlers. if (mode != 1) { WARN_LOG_REPORT(SCEFONT, "Loading file directly instead of using handlers: %s", fileName); } - PSPFileInfo info = pspFileSystem.GetFileInfo(fileName); - if (!info.exists) { - ERROR_LOG_REPORT(SCEFONT, "sceFontOpenUserFile(%08x, %s, %08x, %08x): file does not exist", libHandle, fileName, mode, errorCodePtr); + + std::vector buffer; + if (pspFileSystem.ReadEntireFile(fileName, buffer) != 0) { *errorCode = ERROR_FONT_HANDLER_OPEN_FAILED; - return 0; + return hleLogError(SCEFONT, 0, "file does not exist"); } - INFO_LOG(SCEFONT, "sceFontOpenUserFile(%08x, %s, %08x, %08x)", libHandle, fileName, mode, errorCodePtr); - std::vector buffer; - pspFileSystem.ReadEntireFile(fileName, buffer); Font *f = new Font(buffer); FontOpenMode openMode = mode == 0 ? FONT_OPEN_USERFILE_HANDLERS : FONT_OPEN_USERFILE_FULL; LoadedFont *font = fontLib->OpenFont(f, openMode, *errorCode); if (font) { *errorCode = 0; - return font->Handle(); - } else { - delete f; - return 0; + return hleLogSuccessInfoX(SCEFONT, font->Handle()); } + + delete f; + // Message was already logged. + return 0; } static int sceFontClose(u32 fontHandle) { @@ -1335,7 +1320,7 @@ static int sceFontGetCharInfo(u32 fontHandle, u32 charCode, u32 charInfoPtr) { return 0; u32 allocSize = charInfo->bitmapWidth * charInfo->bitmapHeight; - if (charInfo->sfp26AdvanceH != 0 || charInfo->sfp26AdvanceV != 0) { + if (font->GetFontLib() && (charInfo->sfp26AdvanceH != 0 || charInfo->sfp26AdvanceV != 0)) { if (font->GetFontLib()->GetCharInfoBitmapAddress() != 0) { PostCharInfoFreeCallback *action = (PostCharInfoFreeCallback *)__KernelCreateAction(actionPostCharInfoFreeCallback); action->SetFontLib(font->GetFontLib()->GetListID()); @@ -1474,7 +1459,8 @@ static int sceFontFlush(u32 fontHandle) { return ERROR_FONT_INVALID_PARAMETER; } - font->GetFontLib()->flushFont(); + if (font->GetFontLib()) + font->GetFontLib()->flushFont(); return 0; } @@ -1656,9 +1642,9 @@ const HLEFunction sceLibFont[] = { {0X681E61A7, &WrapI_UUU, "sceFontFindFont", 'i', "xxx", HLE_CLEAR_STACK_BYTES, 0x40 }, {0X2F67356A, &WrapI_V, "sceFontCalcMemorySize", 'i', "" }, {0X5333322D, &WrapI_UUU, "sceFontGetFontInfoByIndexNumber", 'i', "xxx", HLE_CLEAR_STACK_BYTES, 0x20 }, - {0XA834319D, &WrapU_UUUU, "sceFontOpen", 'x', "xxxx", HLE_CLEAR_STACK_BYTES, 0x460 }, - {0X57FCB733, &WrapU_UCUU, "sceFontOpenUserFile", 'x', "xsxx" }, - {0XBB8E7FE6, &WrapU_UUUU, "sceFontOpenUserMemory", 'x', "xxxx", HLE_CLEAR_STACK_BYTES, 0x440 /*from JPCSP*/ }, + {0XA834319D, &WrapU_UUUU, "sceFontOpen", 'x', "xxxp", HLE_CLEAR_STACK_BYTES, 0x460 }, + {0X57FCB733, &WrapU_UCUU, "sceFontOpenUserFile", 'x', "xsxp" }, + {0XBB8E7FE6, &WrapU_UUUU, "sceFontOpenUserMemory", 'x', "xxxp", HLE_CLEAR_STACK_BYTES, 0x440 /*from JPCSP*/ }, {0X3AEA8CB6, &WrapI_U, "sceFontClose", 'i', "x", HLE_CLEAR_STACK_BYTES, 0x54 }, {0X0DA7535E, &WrapI_UU, "sceFontGetFontInfo", 'i', "xx" }, {0XDCC80C2F, &WrapI_UUU, "sceFontGetCharInfo", 'i', "xxx", HLE_CLEAR_STACK_BYTES, 0x110 }, From f53b4b5eac66bf8bb8572500c0dcc54a072156f5 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 13 Sep 2021 08:54:33 -0700 Subject: [PATCH 327/336] UI: Correct enable reporting setting resetting. --- UI/GameSettingsScreen.cpp | 9 ++++++--- UI/GameSettingsScreen.h | 3 ++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 5c3ff01a7c..74a746417d 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -88,7 +88,7 @@ extern AndroidAudioState *g_audioState; #endif GameSettingsScreen::GameSettingsScreen(const Path &gamePath, std::string gameID, bool editThenRestore) - : UIDialogScreenWithGameBackground(gamePath), gameID_(gameID), enableReports_(false), editThenRestore_(editThenRestore) { + : UIDialogScreenWithGameBackground(gamePath), gameID_(gameID), editThenRestore_(editThenRestore) { lastVertical_ = UseVerticalLayout(); prevInflightFrames_ = g_Config.iInflightFrames; } @@ -889,7 +889,9 @@ void GameSettingsScreen::CreateViews() { systemSettings->Add(new PopupMultiChoice(&g_Config.iBackgroundAnimation, sy->T("UI background animation"), backgroundAnimations, 0, ARRAY_SIZE(backgroundAnimations), sy->GetName(), screenManager())); systemSettings->Add(new ItemHeader(sy->T("Help the PPSSPP team"))); - enableReports_ = Reporting::IsEnabled(); + if (!enableReportsSet_) + enableReports_ = Reporting::IsEnabled(); + enableReportsSet_ = true; enableReportsCheckbox_ = new CheckBox(&enableReports_, sy->T("Enable Compatibility Server Reports")); enableReportsCheckbox_->SetEnabled(Reporting::IsSupported()); systemSettings->Add(enableReportsCheckbox_); @@ -1094,8 +1096,9 @@ UI::EventReturn GameSettingsScreen::OnRenderingMode(UI::EventParams &e) { // We do not want to report when rendering mode is Framebuffer to memory - so many issues // are caused by that (framebuffer copies overwriting display lists, etc). Reporting::UpdateConfig(); - enableReports_ = Reporting::IsEnabled(); enableReportsCheckbox_->SetEnabled(Reporting::IsSupported()); + if (!Reporting::IsSupported()) + enableReports_ = Reporting::IsEnabled(); if (g_Config.iRenderingMode == FB_NON_BUFFERED_MODE) { g_Config.bAutoFrameSkip = false; diff --git a/UI/GameSettingsScreen.h b/UI/GameSettingsScreen.h index 9c4a8ecb91..c82bef73ca 100644 --- a/UI/GameSettingsScreen.h +++ b/UI/GameSettingsScreen.h @@ -129,7 +129,8 @@ private: int iAlternateSpeedPercent1_; int iAlternateSpeedPercent2_; int prevInflightFrames_; - bool enableReports_; + bool enableReports_ = false; + bool enableReportsSet_ = false; bool tessHWEnable_; std::string shaderNames_[256]; From dab1a3aa3cdd4f7c0fc317339c3ef8c19f412153 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 13 Sep 2021 10:27:42 -0700 Subject: [PATCH 328/336] Android: Fix UI background on scoped storage. --- .../src/org/ppsspp/ppsspp/NativeActivity.java | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/android/src/org/ppsspp/ppsspp/NativeActivity.java b/android/src/org/ppsspp/ppsspp/NativeActivity.java index 221fce3296..b62af3fbc3 100644 --- a/android/src/org/ppsspp/ppsspp/NativeActivity.java +++ b/android/src/org/ppsspp/ppsspp/NativeActivity.java @@ -1120,13 +1120,20 @@ public abstract class NativeActivity extends Activity { if (requestCode == RESULT_LOAD_IMAGE) { Uri selectedImage = data.getData(); if (selectedImage != null) { - String[] filePathColumn = {MediaStore.Images.Media.DATA}; - Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); - cursor.moveToFirst(); - int columnIndex = cursor.getColumnIndex(filePathColumn[0]); - String picturePath = cursor.getString(columnIndex); - cursor.close(); - NativeApp.sendMessage("bgImage_updated", picturePath); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + NativeApp.sendMessage("bgImage_updated", selectedImage.toString()); + } else { + String[] filePathColumn = {MediaStore.Images.Media.DATA}; + Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); + if (cursor != null) { + cursor.moveToFirst(); + int columnIndex = cursor.getColumnIndex(filePathColumn[0]); + String picturePath = cursor.getString(columnIndex); + cursor.close(); + + NativeApp.sendMessage("bgImage_updated", picturePath); + } + } } } else if (requestCode == RESULT_OPEN_DOCUMENT) { Uri selectedFile = data.getData(); From e3088e5f96bd76f02951fd73da4767c73aab72c7 Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Tue, 14 Sep 2021 05:27:17 +0700 Subject: [PATCH 329/336] Fix Socket error 10014 on Windows when hosting a game of Vulcanus Seek and Destroy --- Core/HLE/sceNetAdhoc.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index a09aec0082..9b130a2a65 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -440,7 +440,7 @@ int DoBlockingPdpRecv(int uid, AdhocSocketRequest& req, s64& result) { if (ret >= 0 && ret <= *req.length) { sinlen = sizeof(sin); memset(&sin, 0, sinlen); - ret = recvfrom(uid, (char*)req.buffer, *req.length, MSG_NOSIGNAL, (struct sockaddr*)&sin, &sinlen); + ret = recvfrom(uid, (char*)req.buffer, std::max(0, *req.length), MSG_NOSIGNAL, (struct sockaddr*)&sin, &sinlen); // UDP can also receives 0 data, while on TCP receiving 0 data = connection gracefully closed, but not sure whether PDP can send/recv 0 data or not tho *req.length = 0; if (ret >= 0) { @@ -635,7 +635,7 @@ int DoBlockingPtpRecv(int uid, AdhocSocketRequest& req, s64& result) { return 0; } - int ret = recv(uid, (char*)req.buffer, *req.length, MSG_NOSIGNAL); + int ret = recv(uid, (char*)req.buffer, std::max(0, *req.length), MSG_NOSIGNAL); int sockerr = errno; // Received Data. POSIX: May received 0 bytes when the remote peer already closed the connection. @@ -1499,7 +1499,7 @@ static int sceNetAdhocPdpSend(int id, const char *mac, u32 port, void *data, int target.sin_family = AF_INET; target.sin_port = htons(dport + portOffset); - // Get Peer IP + // Get Peer IP. Some games (ie. Vulcanus Seek and Destroy) seems to try to send to zero-MAC (ie. 00:00:00:00:00:00) first before sending to the actual destination MAC.. So may be sending to zero-MAC has a special meaning? (ie. to peek send buffer availability may be?) if (resolveMAC((SceNetEtherAddr *)daddr, (uint32_t *)&target.sin_addr.s_addr)) { // Some games (ie. PSP2) might try to talk to it's self, not sure if they talked through WAN or LAN when using public Adhoc Server tho target.sin_port = htons(dport + ((isOriPort && !isPrivateIP(target.sin_addr.s_addr)) ? 0 : portOffset)); @@ -1772,7 +1772,8 @@ static int sceNetAdhocPdpRecv(int id, void *addr, void * port, void *buf, void * } sinlen = sizeof(sin); memset(&sin, 0, sinlen); - received = recvfrom(pdpsocket.id, (char*)buf, *len, MSG_NOSIGNAL, (struct sockaddr*)&sin, &sinlen); + // On Windows: Socket Error 10014 may happen when buffer size is less than the minimum allowed/required (ie. negative number on Vulcanus Seek and Destroy), the address is not a valid part of the user address space (ie. on the stack or when buffer overflow occurred), or the address is not properly aligned (ie. multiple of 4 on 32bit and multiple of 8 on 64bit) https://stackoverflow.com/questions/861154/winsock-error-code-10014 + received = recvfrom(pdpsocket.id, (char*)buf, std::max(0, *len), MSG_NOSIGNAL, (struct sockaddr*)&sin, &sinlen); error = errno; // On Windows: recvfrom on UDP can get error WSAECONNRESET when previous sendto's destination is unreachable (or destination port is not bound), may need to disable SIO_UDP_CONNRESET @@ -4016,7 +4017,7 @@ static int sceNetAdhocPtpRecv(int id, u32 dataAddr, u32 dataSizeAddr, int timeou int error = 0; // Receive Data. POSIX: May received 0 bytes when the remote peer already closed the connection. - received = recv(ptpsocket.id, (char*)buf, *len, MSG_NOSIGNAL); + received = recv(ptpsocket.id, (char*)buf, std::max(0, *len), MSG_NOSIGNAL); error = errno; if (received == SOCKET_ERROR && (error == EAGAIN || error == EWOULDBLOCK || (ptpsocket.state == ADHOC_PTP_STATE_SYN_SENT && (error == ENOTCONN || connectInProgress(error))))) { From 39836e704af74fd619ac3ca709463adf5ed9e464 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 13 Sep 2021 21:50:51 -0700 Subject: [PATCH 330/336] Unix: Use shm_open in case not /dev/shm/. Still falls back to the old behavior if that fails. --- Common/MemArena.h | 2 +- Common/MemArenaPosix.cpp | 32 +++++++++++++++++++++++--------- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/Common/MemArena.h b/Common/MemArena.h index b7409e16b9..3c5243ddff 100644 --- a/Common/MemArena.h +++ b/Common/MemArena.h @@ -53,6 +53,6 @@ private: size_t vm_size; vm_address_t vm_mem; // same type as vm_address_t #else - int fd; + int fd = -1; #endif }; diff --git a/Common/MemArenaPosix.cpp b/Common/MemArenaPosix.cpp index 47698f1e1e..f55e97e5a0 100644 --- a/Common/MemArenaPosix.cpp +++ b/Common/MemArenaPosix.cpp @@ -19,6 +19,7 @@ #if !defined(_WIN32) && !defined(ANDROID) && !defined(__APPLE__) +#include #include #include #include @@ -51,21 +52,34 @@ bool MemArena::NeedsProbing() { } bool MemArena::GrabMemSpace(size_t size) { - mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; + constexpr mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; - // Some platforms (like Raspberry Pi) end up flushing to disk. - // To avoid this, we try to use /dev/shm (tmpfs) if it exists. - fd = -1; - if (File::Exists(Path(tmpfs_location))) { + // Try a few times in case multiple instances are started near each other. + char ram_temp_filename[128]{}; + bool is_shm = false; + for (int i = 0; i < 256; ++i) { + snprintf(ram_temp_filename, sizeof(ram_temp_filename), "/ppsspp_%d.ram", i); + // This opens atomically, so will fail if another process is starting. + fd = open(ram_temp_filename, O_RDWR | O_CREAT | O_EXCL, mode); + if (fd >= 0) { + INFO_LOG(MEMMAP, "Got shm file: %s", ram_temp_filename); + is_shm = true; + // Our handle persists per POSIX, so no need to keep it around. + if (shm_unlink(ram_temp_filename) != 0) { + WARN_LOG(MEMMAP, "Failed to shm_unlink %s", ram_temp_file.c_str()); + } + break; + } + } + + // Fall back to old tmpfs behavior. + if (fd < 0 && File::Exists(Path(tmpfs_location))) { fd = open(tmpfs_ram_temp_file.c_str(), O_RDWR | O_CREAT, mode); if (fd >= 0) { // Great, this definitely shouldn't flush to disk. ram_temp_file = tmpfs_ram_temp_file; - } else { INFO_LOG(MEMMAP, "Got tmpfs ram file: %s", tmpfs_ram_temp_file.c_str()); } - } else { - INFO_LOG(MEMMAP, "'%s' does not exist. Trying other ram file options.", tmpfs_location.c_str()); } if (fd < 0) { @@ -77,7 +91,7 @@ bool MemArena::GrabMemSpace(size_t size) { return false; } // delete immediately, we keep the fd so it still lives - if (unlink(ram_temp_file.c_str()) != 0) { + if (!is_shm && unlink(ram_temp_file.c_str()) != 0) { WARN_LOG(MEMMAP, "Failed to unlink %s", ram_temp_file.c_str()); } if (ftruncate(fd, size) != 0) { From 704d1f94a67d43bb85a80b2fd40a17110a99e50e Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Wed, 15 Sep 2021 01:13:39 +0700 Subject: [PATCH 331/336] Fix freezing issue during GameMode initialization on some games (ie. Hammerin' Hero) --- Core/HLE/sceNetAdhoc.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 9b130a2a65..d792b16cc6 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -4201,10 +4201,12 @@ static int sceNetAdhocGameModeCreateMaster(u32 dataAddr, int size) { masterGameModeArea = { 0, size, dataAddr, CoreTiming::GetGlobalTimeUsScaled(), 1, 0, localMac, data }; StartGameModeScheduler(); - // Block current thread to sync initial master data + // Block current thread to sync initial master data after Master and all Replicas have been created if (replicaGameModeAreas.size() == (gameModeMacs.size() - 1)) { - __KernelWaitCurThread(WAITTYPE_NET, GAMEMODE_WAITID, 0, 0, false, "syncing master data"); - DEBUG_LOG(SCENET, "GameMode: Blocking Thread %d to Sync initial Master data", __KernelGetCurThread()); + if (CoreTiming::IsScheduled(gameModeNotifyEvent)) { + __KernelWaitCurThread(WAITTYPE_NET, GAMEMODE_WAITID, 0, 0, false, "syncing master data"); + DEBUG_LOG(SCENET, "GameMode: Blocking Thread %d to Sync initial Master data", __KernelGetCurThread()); + } } return hleLogDebug(SCENET, 0, "success"); // returned an id just like CreateReplica? always return 0? } @@ -4259,10 +4261,12 @@ static int sceNetAdhocGameModeCreateReplica(const char *mac, u32 dataAddr, int s replicaGameModeAreas.push_back(gma); ret = gma.id; // Valid id for replica is higher than 0? - // Block current thread to sync initial master data + // Block current thread to sync initial master data after Master and all Replicas have been created if (replicaGameModeAreas.size() == (gameModeMacs.size() - 1)) { - __KernelWaitCurThread(WAITTYPE_NET, GAMEMODE_WAITID, ret, 0, false, "syncing master data"); - DEBUG_LOG(SCENET, "GameMode: Blocking Thread %d to Sync initial Master data", __KernelGetCurThread()); + if (CoreTiming::IsScheduled(gameModeNotifyEvent)) { + __KernelWaitCurThread(WAITTYPE_NET, GAMEMODE_WAITID, ret, 0, false, "syncing master data"); + DEBUG_LOG(SCENET, "GameMode: Blocking Thread %d to Sync initial Master data", __KernelGetCurThread()); + } } return hleLogSuccessInfoI(SCENET, ret, "success"); } From be0b0cd88d782604d7fc20f4c74d6e87829c5d50 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Tue, 14 Sep 2021 17:51:57 -0700 Subject: [PATCH 332/336] UI: Track chat log changes more clearly. This also makes it easier to have multiple views or etc. reading from it. We want data flowing a single direction, chat system -> UI. --- Core/HLE/proAdhoc.cpp | 33 +++++++++++++-------------------- Core/HLE/proAdhoc.h | 3 ++- UI/ChatScreen.cpp | 4 ++-- UI/ChatScreen.h | 1 + 4 files changed, 18 insertions(+), 23 deletions(-) diff --git a/Core/HLE/proAdhoc.cpp b/Core/HLE/proAdhoc.cpp index 7a7033b91d..270d9ee322 100644 --- a/Core/HLE/proAdhoc.cpp +++ b/Core/HLE/proAdhoc.cpp @@ -116,7 +116,6 @@ std::string name = ""; std::string incoming = ""; std::string message = ""; bool chatScreenVisible = false; -bool updateChatScreen = false; int newChat = 0; bool isOriPort = false; bool isLocalServer = false; @@ -125,6 +124,8 @@ SockAddrIN4 g_localhostIP; sockaddr LocalIP; int defaultWlanChannel = PSP_SYSTEMPARAM_ADHOC_CHANNEL_11; // Don't put 0(Auto) here, it needed to be a valid/actual channel number +static int chatMessageGeneration = 0; + bool isMacMatch(const SceNetEtherAddr* addr1, const SceNetEtherAddr* addr2) { // Ignoring the 1st byte since there are games (ie. Gran Turismo) who tamper with the 1st byte of OUI to change the unicast/multicast bit return (memcmp(((const char*)addr1)+1, ((const char*)addr2)+1, ETHER_ADDR_LEN-1) == 0); @@ -1290,8 +1291,7 @@ void sendChat(std::string chatString) { auto n = GetI18NCategory("Networking"); chat.base.opcode = OPCODE_CHAT; //TODO check network inited, check send success or not, chatlog.pushback error on failed send, pushback error on not connected - if (friendFinderRunning) - { + if (friendFinderRunning) { // Send Chat to Server if (!chatString.empty()) { //maximum char allowed is 64 character for compability with original server (pro.coldbird.net) @@ -1303,17 +1303,12 @@ void sendChat(std::string chatString) { NOTICE_LOG(SCENET, "Send Chat %s to Adhoc Server", chat.message); name = g_Config.sNickName.c_str(); chatLog.push_back(name.substr(0, 8) + ": " + chat.message); - if (chatScreenVisible) { - updateChatScreen = true; - } + chatMessageGeneration++; } } - } - else { + } else { chatLog.push_back(n->T("You're in Offline Mode, go to lobby or online hall")); - if (chatScreenVisible) { - updateChatScreen = true; - } + chatMessageGeneration++; } } @@ -1326,6 +1321,10 @@ std::vector getChatLog() { return chatLog; } +int GetChatChangeID() { + return chatMessageGeneration; +} + int friendFinder(){ SetCurrentThreadName("FriendFinder"); auto n = GetI18NCategory("Networking"); @@ -1522,11 +1521,8 @@ int friendFinder(){ incoming.append(": "); incoming.append((char*)packet->base.message); chatLog.push_back(incoming); - //im new to pointer btw :( doesn't know its safe or not this should update the chat screen when data coming - if (chatScreenVisible) { - updateChatScreen = true; - } - else { + chatMessageGeneration++; + if (!chatScreenVisible) { if (newChat < 50) { newChat += 1; } @@ -1598,10 +1594,7 @@ int friendFinder(){ //do we need ip? //joined.append((char *)packet->ip); chatLog.push_back(incoming); - //im new to pointer btw :( doesn't know its safe or not this should update the chat screen when data coming - if (chatScreenVisible) { - updateChatScreen = true; - } + chatMessageGeneration++; #ifdef LOCALHOST_AS_PEER setUserCount(getActivePeerCount()); diff --git a/Core/HLE/proAdhoc.h b/Core/HLE/proAdhoc.h index 22b88059bd..0a261ff245 100644 --- a/Core/HLE/proAdhoc.h +++ b/Core/HLE/proAdhoc.h @@ -1015,8 +1015,9 @@ void addFriend(SceNetAdhocctlConnectPacketS2C * packet); */ void sendChat(std::string chatString); std::vector getChatLog(); +int GetChatChangeID(); + extern bool chatScreenVisible; -extern bool updateChatScreen; extern int newChat; /* diff --git a/UI/ChatScreen.cpp b/UI/ChatScreen.cpp index dfb1acb14d..39907c031d 100644 --- a/UI/ChatScreen.cpp +++ b/UI/ChatScreen.cpp @@ -172,9 +172,9 @@ void ChatMenu::Update() { scroll_->ScrollToBottom(); } - if (updateChatScreen) { + if (chatChangeID_ != GetChatChangeID()) { + chatChangeID_ = GetChatChangeID(); UpdateChat(); - updateChatScreen = false; } chatScreenVisible = true; diff --git a/UI/ChatScreen.h b/UI/ChatScreen.h index 83ca61b7b4..b068ddb1f0 100644 --- a/UI/ChatScreen.h +++ b/UI/ChatScreen.h @@ -38,6 +38,7 @@ private: UI::LinearLayout *chatVert_ = nullptr; UI::ViewGroup *box_ = nullptr; + int chatChangeID_ = 0; bool toBottom_ = true; bool promptInput_ = false; }; From 9403947b6791903b314fe428dabc082f1cd4b5bd Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Tue, 14 Sep 2021 17:59:46 -0700 Subject: [PATCH 333/336] UI: Decouple new chat display and tracking logic. --- Core/HLE/proAdhoc.cpp | 13 ++++++------- Core/HLE/proAdhoc.h | 4 +--- UI/ChatScreen.cpp | 4 ---- UI/EmuScreen.cpp | 14 +++++++++++++- UI/EmuScreen.h | 4 ++++ 5 files changed, 24 insertions(+), 15 deletions(-) diff --git a/Core/HLE/proAdhoc.cpp b/Core/HLE/proAdhoc.cpp index 270d9ee322..bf88907b87 100644 --- a/Core/HLE/proAdhoc.cpp +++ b/Core/HLE/proAdhoc.cpp @@ -115,8 +115,6 @@ std::vector chatLog; std::string name = ""; std::string incoming = ""; std::string message = ""; -bool chatScreenVisible = false; -int newChat = 0; bool isOriPort = false; bool isLocalServer = false; SockAddrIN4 g_adhocServerIP; @@ -125,6 +123,7 @@ sockaddr LocalIP; int defaultWlanChannel = PSP_SYSTEMPARAM_ADHOC_CHANNEL_11; // Don't put 0(Auto) here, it needed to be a valid/actual channel number static int chatMessageGeneration = 0; +static int chatMessageCount = 0; bool isMacMatch(const SceNetEtherAddr* addr1, const SceNetEtherAddr* addr2) { // Ignoring the 1st byte since there are games (ie. Gran Turismo) who tamper with the 1st byte of OUI to change the unicast/multicast bit @@ -1325,6 +1324,10 @@ int GetChatChangeID() { return chatMessageGeneration; } +int GetChatMessageCount() { + return chatMessageCount; +} + int friendFinder(){ SetCurrentThreadName("FriendFinder"); auto n = GetI18NCategory("Networking"); @@ -1522,11 +1525,7 @@ int friendFinder(){ incoming.append((char*)packet->base.message); chatLog.push_back(incoming); chatMessageGeneration++; - if (!chatScreenVisible) { - if (newChat < 50) { - newChat += 1; - } - } + chatMessageCount++; // Move RX Buffer memmove(rx, rx + sizeof(SceNetAdhocctlChatPacketS2C), sizeof(rx) - sizeof(SceNetAdhocctlChatPacketS2C)); diff --git a/Core/HLE/proAdhoc.h b/Core/HLE/proAdhoc.h index 0a261ff245..a1343d25dd 100644 --- a/Core/HLE/proAdhoc.h +++ b/Core/HLE/proAdhoc.h @@ -1016,9 +1016,7 @@ void addFriend(SceNetAdhocctlConnectPacketS2C * packet); void sendChat(std::string chatString); std::vector getChatLog(); int GetChatChangeID(); - -extern bool chatScreenVisible; -extern int newChat; +int GetChatMessageCount(); /* * Find a Peer/Friend by MAC address diff --git a/UI/ChatScreen.cpp b/UI/ChatScreen.cpp index 39907c031d..41eef866ae 100644 --- a/UI/ChatScreen.cpp +++ b/UI/ChatScreen.cpp @@ -177,9 +177,6 @@ void ChatMenu::Update() { UpdateChat(); } - chatScreenVisible = true; - newChat = 0; - #if defined(USING_WIN_UI) // Could remove the fullscreen check here, it works now. if (promptInput_ && g_Config.bBypassOSKWithKeyboard && !g_Config.bFullScreen) { @@ -203,5 +200,4 @@ bool ChatMenu::SubviewFocused(UI::View *view) { void ChatMenu::Close() { SetVisibility(UI::V_GONE); - chatScreenVisible = false; } diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index 1b499a4708..f85f65243a 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -862,7 +862,7 @@ void EmuScreen::CreateViews() { break; } - ChoiceWithValueDisplay *btn = new ChoiceWithValueDisplay(&newChat, n->T("Chat"), layoutParams); + ChoiceWithValueDisplay *btn = new ChoiceWithValueDisplay(&newChatMessages_, n->T("Chat"), layoutParams); root_->Add(btn)->OnClick.Handle(this, &EmuScreen::OnChat); chatButton_ = btn; chatMenu_ = root_->Add(new ChatMenu(screenManager()->getUIContext()->GetBounds(), new LayoutParams(FILL_PARENT, FILL_PARENT))); @@ -987,6 +987,18 @@ void EmuScreen::update() { resumeButton_->SetVisibility(coreState == CoreState::CORE_RUNTIME_ERROR && Memory::MemFault_MayBeResumable() ? V_VISIBLE : V_GONE); resetButton_->SetVisibility(coreState == CoreState::CORE_RUNTIME_ERROR ? V_VISIBLE : V_GONE); + if (chatButton_ && chatMenu_) { + if (chatMenu_->GetVisibility() != V_GONE) { + chatMessages_ = GetChatMessageCount(); + newChatMessages_ = 0; + } else { + int diff = GetChatMessageCount() - chatMessages_; + chatMessages_ += diff; + // Cap the count at 50. + newChatMessages_ = diff > 50 ? 50 : diff; + } + } + if (bootPending_) { bootGame(gamePath_); } diff --git a/UI/EmuScreen.h b/UI/EmuScreen.h index 79f47982d6..ff41bd81a4 100644 --- a/UI/EmuScreen.h +++ b/UI/EmuScreen.h @@ -86,6 +86,10 @@ private: // If set, pauses at the end of the frame. bool pauseTrigger_ = false; + // The last read chat message count, and how many new ones there are. + int chatMessages_ = 0; + int newChatMessages_ = 0; + // In-memory save state used for freezeFrame, which is useful for debugging. std::vector freezeState_; From c79bb6ba71483876c10482a708caf9363c68b623 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Tue, 14 Sep 2021 18:06:57 -0700 Subject: [PATCH 334/336] Net: Fix various chat threading hazards. --- Core/HLE/proAdhoc.cpp | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/Core/HLE/proAdhoc.cpp b/Core/HLE/proAdhoc.cpp index bf88907b87..f751037dd9 100644 --- a/Core/HLE/proAdhoc.cpp +++ b/Core/HLE/proAdhoc.cpp @@ -51,6 +51,7 @@ #define TCP_MAXSEG 2 #endif // defined(HAVE_LIBNX) || PPSSPP_PLATFORM(SWITCH) +#include #include #include "Common/Data/Text/I18n.h" @@ -111,10 +112,6 @@ SceNetAdhocctlAdhocId product_code; std::thread friendFinderThread; std::recursive_mutex peerlock; AdhocSocket* adhocSockets[MAX_SOCKET]; -std::vector chatLog; -std::string name = ""; -std::string incoming = ""; -std::string message = ""; bool isOriPort = false; bool isLocalServer = false; SockAddrIN4 g_adhocServerIP; @@ -122,6 +119,8 @@ SockAddrIN4 g_localhostIP; sockaddr LocalIP; int defaultWlanChannel = PSP_SYSTEMPARAM_ADHOC_CHANNEL_11; // Don't put 0(Auto) here, it needed to be a valid/actual channel number +static std::mutex chatLogLock; +static std::vector chatLog; static int chatMessageGeneration = 0; static int chatMessageCount = 0; @@ -1294,28 +1293,31 @@ void sendChat(std::string chatString) { // Send Chat to Server if (!chatString.empty()) { //maximum char allowed is 64 character for compability with original server (pro.coldbird.net) - message = chatString.substr(0, 60); // 64 return chat variable corrupted is it out of memory? + std::string message = chatString.substr(0, 60); // 64 return chat variable corrupted is it out of memory? strcpy(chat.message, message.c_str()); //Send Chat Messages if (IsSocketReady(metasocket, false, true) > 0) { int chatResult = send(metasocket, (const char*)&chat, sizeof(chat), MSG_NOSIGNAL); NOTICE_LOG(SCENET, "Send Chat %s to Adhoc Server", chat.message); - name = g_Config.sNickName.c_str(); + std::string name = g_Config.sNickName.c_str(); + + std::lock_guard guard(chatLogLock); chatLog.push_back(name.substr(0, 8) + ": " + chat.message); chatMessageGeneration++; } } } else { + std::lock_guard guard(chatLogLock); chatLog.push_back(n->T("You're in Offline Mode, go to lobby or online hall")); chatMessageGeneration++; } } std::vector getChatLog() { - // this log used by chat screen + std::lock_guard guard(chatLogLock); + // If the log gets large, trim it down. if (chatLog.size() > 50) { - //erase the first 40 element limit the chatlog size - chatLog.erase(chatLog.begin(), chatLog.begin() + 40); + chatLog.erase(chatLog.begin(), chatLog.begin() + (chatLog.size() - 50)); } return chatLog; } @@ -1518,11 +1520,13 @@ int friendFinder(){ // Add Incoming Chat to HUD NOTICE_LOG(SCENET, "Received chat message %s", packet->base.message); - incoming = ""; - name = (char*)packet->name.data; + std::string incoming = ""; + std::string name = (char*)packet->name.data; incoming.append(name.substr(0, 8)); incoming.append(": "); incoming.append((char*)packet->base.message); + + std::lock_guard guard(chatLogLock); chatLog.push_back(incoming); chatMessageGeneration++; chatMessageCount++; @@ -1586,12 +1590,14 @@ int friendFinder(){ } // Update HUD User Count - name = (char*)packet->name.data; - incoming = ""; + std::string name = (char*)packet->name.data; + std::string incoming = ""; incoming.append(name.substr(0, 8)); incoming.append(" Joined "); //do we need ip? //joined.append((char *)packet->ip); + + std::lock_guard guard(chatLogLock); chatLog.push_back(incoming); chatMessageGeneration++; @@ -1601,7 +1607,7 @@ int friendFinder(){ // setUserCount(getActivePeerCount()+1); #endif - // Move RX Buffer + // Move RX Buffer memmove(rx, rx + sizeof(SceNetAdhocctlConnectPacketS2C), sizeof(rx) - sizeof(SceNetAdhocctlConnectPacketS2C)); // Fix RX Buffer Length From b6c6a5bb3f4b3bf930af7b9cf067c815ae4aba65 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Tue, 14 Sep 2021 23:43:29 -0700 Subject: [PATCH 335/336] GPU: Default vertex cache to off. Previously, it was defaulted on only for OpenGL, where it didn't work. --- Core/Config.cpp | 6 +----- headless/Headless.cpp | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index 5ab92acb28..79d7a745c7 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -795,10 +795,6 @@ bool Config::IsBackendEnabled(GPUBackend backend, bool validate) { return true; } -static bool DefaultVertexCache() { - return DefaultGPUBackend() == (int)GPUBackend::OPENGL; -} - template struct ConfigTranslator { static std::string To(int v) { @@ -875,7 +871,7 @@ static ConfigSetting graphicsSettings[] = { // Most low-performance (and many high performance) mobile GPUs do not support aniso anyway so defaulting to 4 is fine. ConfigSetting("AnisotropyLevel", &g_Config.iAnisotropyLevel, 4, true, true), - ReportedConfigSetting("VertexDecCache", &g_Config.bVertexCache, &DefaultVertexCache, true, true), + ReportedConfigSetting("VertexDecCache", &g_Config.bVertexCache, false, true, true), ReportedConfigSetting("TextureBackoffCache", &g_Config.bTextureBackoffCache, false, true, true), ReportedConfigSetting("TextureSecondaryCache", &g_Config.bTextureSecondaryCache, false, true, true), ReportedConfigSetting("VertexDecJit", &g_Config.bVertexDecoderJit, &DefaultCodeGen, false), diff --git a/headless/Headless.cpp b/headless/Headless.cpp index 9a860018e5..0f537ac9d9 100644 --- a/headless/Headless.cpp +++ b/headless/Headless.cpp @@ -381,7 +381,7 @@ int main(int argc, const char* argv[]) g_Config.iRenderingMode = FB_BUFFERED_MODE; g_Config.bHardwareTransform = true; g_Config.iAnisotropyLevel = 0; // When testing mipmapping we really don't want this. - g_Config.bVertexCache = true; + g_Config.bVertexCache = false; g_Config.iLanguage = PSP_SYSTEMPARAM_LANGUAGE_ENGLISH; g_Config.iTimeFormat = PSP_SYSTEMPARAM_TIME_FORMAT_24HR; g_Config.bEncryptSave = true; From 433daf1ee87d524381acb8a48a59c3e5cc034187 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Wed, 15 Sep 2021 00:24:06 -0700 Subject: [PATCH 336/336] UI: Oops, remove silly mistake. Of course, I meant to keep showing the new messages. --- UI/EmuScreen.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index f85f65243a..93a42e8e61 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -993,7 +993,6 @@ void EmuScreen::update() { newChatMessages_ = 0; } else { int diff = GetChatMessageCount() - chatMessages_; - chatMessages_ += diff; // Cap the count at 50. newChatMessages_ = diff > 50 ? 50 : diff; }