Compare commits

..

50 Commits

Author SHA1 Message Date
psucien 4182740384 Don't load `sync2` ext if `nv_checkpoints` isn't used 2024-08-31 00:10:47 +02:00
psucien ca1613258f
video_core: added support for indirect draws (#678)
* video_core: added support for indirect draws

* barriers simplified
2024-08-30 22:59:56 +02:00
georgemoralis 3d375a28eb
Merge pull request #671 from Xphalnos/main
Reorganization of includes (Part 2)
2024-08-30 22:10:49 +03:00
jnack 69d4fecdfe
Allow graphics/compute shader list for skipping (#674)
* Allow graphics/compute shader list for skipping

* nintendo ultra 64 + formatting

* indentation..

* allow empty array in ShouldSkipShader

* simpler check for skip hashes
2024-08-30 21:51:20 +03:00
Xphalnos 7886761476 Reorganization of includes (Part 2) 2024-08-30 15:48:21 +02:00
squidbus 6080066f75
vulkan: Few fixes for MoltenVK (#670)
* vulkan: Use SPIR-V 1.5 when Vulkan version is 1.2

* vulkan: Fix Format2_10_10_10 mismap
2024-08-30 16:40:39 +03:00
georgemoralis f1fe6b9f96
Merge pull request #668 from squidbus/fix-patch-stack
Initialize patch stack before thread TLS.
2024-08-30 14:58:34 +03:00
squidbus 6e552aac6a Initialize patch stack before thread TLS. 2024-08-30 04:43:11 -07:00
adjonesey 0f87d1e3d4 Remove from_compute check in texture cache invalidation (#665)
* Remove from_compute check in texture cache invalidation (hack)

* Remove from_compute parameter

---------

Co-authored-by: Adam Jones <a.c.jones@outlook.com>
2024-08-30 13:01:59 +03:00
georgemoralis 68fa5e292f
Merge pull request #666 from bigol83/patch-3
Update Italian translation
2024-08-30 12:39:30 +03:00
bigol83 bdfff5e8ea
Update it.ts 2024-08-30 11:01:48 +02:00
georgemoralis cdd193d5b1
Merge pull request #638 from squidbus/f16c
Add patches for F16C instructions under Rosetta 2.
2024-08-30 11:16:21 +03:00
georgemoralis 30ab2b7f71
Merge pull request #658 from DanielSvoboda/main
fix tr
2024-08-30 11:15:09 +03:00
DanielSvoboda f2b6843f9d fix tr 2024-08-29 23:11:20 -03:00
squidbus a17150960f Add patches for F16C instructions under Rosetta 2. 2024-08-29 17:31:25 -07:00
Grégoire Hage 1651db24fe
Implement S_XNOR_B64 (#654) 2024-08-30 02:43:12 +03:00
IndecisiveTurtle 6bf42aa985 vk_graphics_pipeline: Fix texel buffer offset 2024-08-30 01:09:39 +03:00
georgemoralis 8d41695e74
Merge pull request #651 from LeDragoX/pt-br-update-1
Update PT-BR localization
2024-08-30 01:08:07 +03:00
IndecisiveTurtle cb5190e31a vk_graphics_pipeline: Fix copy paste error 2024-08-30 00:59:12 +03:00
IndecisiveTurtle cf706f8cc7 buffer: Don't leak texel buffers, blacklist stream buffer with texel buffers 2024-08-30 00:26:08 +03:00
IndecisiveTurtle 6fbbe3d79b translator: Add missed flow instruction 2024-08-30 00:26:01 +03:00
IndecisiveTurtle fab390b860 spirv: More correct texel buffer usage 2024-08-30 00:25:56 +03:00
Plínio Larrubia 5a96ac1a4f
Update PT-BR translation
- Support DLC texts
- Fixed some errors on Cheats (Trapaças) translation
2024-08-29 18:22:36 -03:00
georgemoralis ac2fa103fa
Merge pull request #649 from f1amy/ru-translation-fixes
ru DLC translation and translation fixes
2024-08-29 23:47:47 +03:00
georgemoralis 7e7854346d
Merge pull request #650 from DanielSvoboda/main
Fix creation files.json in 'Download All Patches'
2024-08-29 23:47:25 +03:00
DanielSvoboda 751f6f9bab Fix creation files.json in 'Download ALL' 2024-08-29 17:26:06 -03:00
Flamy 1c835a1aa4
ru DLC translation and translation fixes 2024-08-29 23:59:52 +05:00
georgemoralis 07c8c28000
Merge pull request #647 from DanielSvoboda/main
fix tr cheats_patches.cpp
2024-08-29 19:44:04 +03:00
TheTurtle 66e96dd944
video_core: Account of runtime state changes when compiling shaders (#575)
* video_core: Compile shader permutations

* spirv: Only specific storage image format for atomics

* ir: Avoid cube coord patching for storage image

* spirv: Fix default attributes

* data_share: Add more instructions

* video_core: Query storage flag with runtime state

* kernel: Use std::list for semaphore

* video_core: Use texture buffers for untyped format load/store

* buffer_cache: Limit view usage

* vk_pipeline_cache: Fix invalid iterator

* image_view: Reduce log spam when alpha=1 in storage swizzle

* video_core: More features and proper spirv feature detection

* video_core: Attempt no2 for specialization

* spirv: Remove conflict

* vk_shader_cache: Small cleanup
2024-08-29 19:29:54 +03:00
DanielSvoboda aef7498c49
fix tr cheats_patches.cpp
the 2 words were not being translated
2024-08-29 13:21:58 -03:00
georgemoralis 790d19e59b
Merge pull request #646 from kiwidoggie/patch-1
Add /hostapp support
2024-08-29 17:03:35 +03:00
georgemoralis 3ae18c9073
Merge pull request #645 from mavethee/dlc-polish-localization
DLCs - Polish localization
2024-08-29 17:02:55 +03:00
georgemoralis 83e343f77e
Merge pull request #637 from shadps4-emu/amdgpu/indirect_dispatch
video_core: added support for indirect dispatches (gfx only)
2024-08-29 17:02:37 +03:00
kiwipuppeh 81eb3a4d14
Add /hostapp support
In the case of certain games, such as Battlefield 4 (CUSA00110), the local pathing will resolve to /hostapp instead of /app0, which works fine on PS4, but was failing to resolve to any meaningful mount in shadPS4, this corrects this issue when running from eboot.bin directly.
2024-08-29 08:22:19 -04:00
Marcin Mitura 37786e06c2 DLCs - Polish localization
Translates strings introduced in #596.
2024-08-29 13:27:11 +02:00
psucien 9d349a1308 video_core: added support for indirect dispatches (gfx only) 2024-08-29 12:32:37 +02:00
bigol83 c997490645
DLC Italian translation (#644) 2024-08-29 13:31:48 +03:00
bigol83 600c5079ce
Cheats/patches Italian translation (#642)
* Update it.ts

* Update it.ts
2024-08-29 13:11:17 +03:00
Dzmitry Dubrova 8827c72a1c
Add DLC support (#596)
* fs/core: Add DLC support

* fs/core: Fix extraction paths

* Fix DLC mounting

* gui: Add translations
2024-08-29 12:55:40 +03:00
¥IGA e1382b43c8
Update French translation (#641) 2024-08-29 10:02:36 +03:00
DanielSvoboda 614a23b369
Cheats/Patches (#493)
* Cheats/Patches

Adds the possibility of applying cheats/patches according to the specific game serial+version

The logic for adding modifications has not yet been implemented!

Interface based on issues/372 https://github.com/shadps4-emu/shadPS4/issues/372

[X]Front-end
[]Back-end

Create a synchronized fork of the cheats/patches repository

* Clang Format

* separate files

The code has been separated into separate files as suggested by georgemoralis.
Added the Patch tab, which has not been implemented yet.
Added the 'applyCheat' area to apply the modification, not implemented yet...
And added LOG_INFO.

* reuse

* initial implementation of cheat functionality

* Update cheats_patches.cpp

sets all added buttons to the size of the largest button.
and fixes some aesthetic issues.

* move eboot_address to module.h

fixes the non-qt builds and makes more sense to be there anyway

* Patchs menu and fixes

adds the possibility to download Patches, it does not modify the memory yet.
and some other fixes

* MemoryPatcher namespace, activate cheats on start

* format

* initial patch implementation

* format

* format again...

* convertValueToHex

* Fixes

Choosing which cheat file to use.
And some other fixes

* fix bytes16, bytes32, bytes64 type patches

If a patch is any of these types we convert it from little endian to big endian

* format

* format again :(

* Implement pattern scanning for mask type patches

* add check to stop patches applying to wrong game

previously if you added a patch to a game, but closed the window and opened a different game it would still try to apply the patch, this is now fixed

* format

* Fix 'Hint' 0x400000 |  and Author

* Management |save checkbox | shadps4 repository

MENU - Cheats/Patches Management (implementing Patches)
save patches checkbox
add shadps4 repository

* Load saved patches, miscellaneous fixes

* Fix an issue with mask patches not being saved

* format + remove debug log

* multiple patches | TR translation for cheats/patches

* clang

* ENABLE_QT_GUI

* OK

* move memory_patcher to qt_gui

* clang

* add cheats hu_HU

* fix log

* Remove the item from the patchesListView if no patches were added (the game has patches, but not for the current version)

---------

Co-authored-by: CrazyBloo <CrazyBloo@users.noreply.github.com>
2024-08-29 07:18:50 +03:00
georgemoralis a6a9fff666
Merge pull request #636 from CyntexMore/main
Added HU translation
2024-08-29 00:08:51 +03:00
psucien 3fbb68048e
shader_recompiler: frontend: `SOPC` and `SOPK` handling separated; more cmp opcodes (#634) 2024-08-28 22:27:47 +02:00
CyntexMore 55be97bca3 feat(translation): hu_HU translated 2024-08-28 22:15:03 +02:00
georgemoralis d2e4a200fb
Merge pull request #631 from Emulator-Team-2/Fix
Misc fixes
2024-08-28 22:26:50 +03:00
georgemoralis a291800418
Merge pull request #632 from bigol83/patch-2
Update Italian translation
2024-08-28 21:13:47 +03:00
bigol83 365e17f64e
Update it.ts 2024-08-28 19:14:33 +02:00
Emulator-Team-2 af18728962
clang-format fix 2024-08-28 18:45:32 +02:00
Emulator-Team-2 6f938a10ce
added data_format=3 and num_format=4 2024-08-28 18:12:59 +02:00
Emulator-Team-2 08036d2b49
added data_format=36 and num_format=9 2024-08-28 18:10:23 +02:00
142 changed files with 14496 additions and 2498 deletions

3
.gitmodules vendored
View File

@ -82,3 +82,6 @@
path = externals/ffmpeg-core path = externals/ffmpeg-core
url = https://github.com/shadps4-emu/ext-ffmpeg-core.git url = https://github.com/shadps4-emu/ext-ffmpeg-core.git
shallow = true shallow = true
[submodule "externals/half"]
path = externals/half
url = https://github.com/ROCm/half.git

View File

@ -109,7 +109,7 @@ add_subdirectory(externals)
include_directories(src) include_directories(src)
if(ENABLE_QT_GUI) if(ENABLE_QT_GUI)
find_package(Qt6 REQUIRED COMPONENTS Widgets Concurrent LinguistTools) find_package(Qt6 REQUIRED COMPONENTS Widgets Concurrent LinguistTools Network)
qt_standard_project_setup() qt_standard_project_setup()
set(CMAKE_AUTORCC ON) set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOMOC ON)
@ -231,8 +231,6 @@ set(SYSTEM_LIBS src/core/libraries/system/commondialog.cpp
src/core/libraries/ngs2/ngs2_impl.cpp src/core/libraries/ngs2/ngs2_impl.cpp
src/core/libraries/ngs2/ngs2_impl.h src/core/libraries/ngs2/ngs2_impl.h
src/core/libraries/ajm/ajm_error.h src/core/libraries/ajm/ajm_error.h
src/core/libraries/mouse/mouse.cpp
src/core/libraries/mouse/mouse.h
) )
set(VIDEOOUT_LIB src/core/libraries/videoout/buffer.h set(VIDEOOUT_LIB src/core/libraries/videoout/buffer.h
@ -523,6 +521,8 @@ set(VIDEO_CORE src/video_core/amdgpu/liverpool.cpp
src/video_core/renderer_vulkan/vk_resource_pool.h src/video_core/renderer_vulkan/vk_resource_pool.h
src/video_core/renderer_vulkan/vk_scheduler.cpp src/video_core/renderer_vulkan/vk_scheduler.cpp
src/video_core/renderer_vulkan/vk_scheduler.h src/video_core/renderer_vulkan/vk_scheduler.h
src/video_core/renderer_vulkan/vk_shader_cache.cpp
src/video_core/renderer_vulkan/vk_shader_cache.h
src/video_core/renderer_vulkan/vk_shader_util.cpp src/video_core/renderer_vulkan/vk_shader_util.cpp
src/video_core/renderer_vulkan/vk_shader_util.h src/video_core/renderer_vulkan/vk_shader_util.h
src/video_core/renderer_vulkan/vk_swapchain.cpp src/video_core/renderer_vulkan/vk_swapchain.cpp
@ -549,8 +549,6 @@ set(VIDEO_CORE src/video_core/amdgpu/liverpool.cpp
set(INPUT src/input/controller.cpp set(INPUT src/input/controller.cpp
src/input/controller.h src/input/controller.h
src/input/mouse.cpp
src/input/mouse.h
) )
set(EMULATOR src/emulator.cpp set(EMULATOR src/emulator.cpp
@ -567,6 +565,10 @@ qt_add_resources(RESOURCE_FILES src/shadps4.qrc)
set(QT_GUI src/qt_gui/about_dialog.cpp set(QT_GUI src/qt_gui/about_dialog.cpp
src/qt_gui/about_dialog.h src/qt_gui/about_dialog.h
src/qt_gui/about_dialog.ui src/qt_gui/about_dialog.ui
src/qt_gui/cheats_patches.cpp
src/qt_gui/cheats_patches.h
src/qt_gui/memory_patcher.cpp
src/qt_gui/memory_patcher.h
src/qt_gui/main_window_ui.h src/qt_gui/main_window_ui.h
src/qt_gui/main_window.cpp src/qt_gui/main_window.cpp
src/qt_gui/main_window.h src/qt_gui/main_window.h
@ -642,6 +644,9 @@ if (APPLE)
# Replacement for std::chrono::time_zone # Replacement for std::chrono::time_zone
target_link_libraries(shadps4 PRIVATE date::date-tz) target_link_libraries(shadps4 PRIVATE date::date-tz)
# Half float conversions for F16C patches
target_link_libraries(shadps4 PRIVATE half)
endif() endif()
if (NOT ENABLE_QT_GUI) if (NOT ENABLE_QT_GUI)
@ -655,7 +660,8 @@ else()
endif() endif()
if (ENABLE_QT_GUI) if (ENABLE_QT_GUI)
target_link_libraries(shadps4 PRIVATE Qt6::Widgets Qt6::Concurrent) target_link_libraries(shadps4 PRIVATE Qt6::Widgets Qt6::Concurrent Qt6::Network)
add_definitions(-DENABLE_QT_GUI)
endif() endif()
if (WIN32) if (WIN32)

View File

@ -142,11 +142,17 @@ if (WIN32)
target_compile_options(sirit PUBLIC "-Wno-error=unused-command-line-argument") target_compile_options(sirit PUBLIC "-Wno-error=unused-command-line-argument")
endif() endif()
# date if (APPLE)
if (APPLE AND NOT TARGET date::date-tz) # half
option(BUILD_TZ_LIB "" ON) add_library(half INTERFACE)
option(USE_SYSTEM_TZ_DB "" ON) target_include_directories(half INTERFACE half/include)
add_subdirectory(date)
# date
if (NOT TARGET date::date-tz)
option(BUILD_TZ_LIB "" ON)
option(USE_SYSTEM_TZ_DB "" ON)
add_subdirectory(date)
endif()
endif() endif()
# Tracy # Tracy

2
externals/glslang vendored

@ -1 +1 @@
Subproject commit d59c84d388c805022e2bddea08aa41cbe7e43e55 Subproject commit 12cbda959b6df2af119a76a73ff906c2bed36884

1
externals/half vendored Submodule

@ -0,0 +1 @@
Subproject commit 1ddada225144cac0de8f6b5c0dd9acffd99a2e68

2
externals/robin-map vendored

@ -1 +1 @@
Subproject commit 1115dad3ffa0994e3f43b693d9b9cc99944c64c1 Subproject commit 2c48a1a50203bbaf1e3d0d64c5d726d56f8d3bb3

2
externals/sirit vendored

@ -1 +1 @@
Subproject commit 8db09231c448b913ae905d5237ce2eca46e3fe87 Subproject commit 37090c74cc6e680f2bc334cac8fd182f7634a1f6

2
externals/toml11 vendored

@ -1 +1 @@
Subproject commit cc0bee4fd46ea1f5db147d63ea545208cc9e8405 Subproject commit 4b740127230472779c4a4d71e1a75aaa3a367a2d

2
externals/xbyak vendored

@ -1 +1 @@
Subproject commit aabb091ae37068498751fd58202a9854408ecb0e Subproject commit ccdf68421bc8eb85693f573080fc0a5faad862db

View File

@ -113,7 +113,6 @@ bool ParseFilterRule(Filter& instance, Iterator begin, Iterator end) {
SUB(Lib, ImeDialog) \ SUB(Lib, ImeDialog) \
SUB(Lib, AvPlayer) \ SUB(Lib, AvPlayer) \
SUB(Lib, Ngs2) \ SUB(Lib, Ngs2) \
SUB(Lib, Mouse) \
CLS(Frontend) \ CLS(Frontend) \
CLS(Render) \ CLS(Render) \
SUB(Render, Vulkan) \ SUB(Render, Vulkan) \

View File

@ -80,7 +80,6 @@ enum class Class : u8 {
Lib_ImeDialog, ///< The LibSceImeDialog implementation. Lib_ImeDialog, ///< The LibSceImeDialog implementation.
Lib_AvPlayer, ///< The LibSceAvPlayer implementation. Lib_AvPlayer, ///< The LibSceAvPlayer implementation.
Lib_Ngs2, ///< The LibSceNgs2 implementation. Lib_Ngs2, ///< The LibSceNgs2 implementation.
Lib_Mouse, ///< The LibSceMouse implementation
Frontend, ///< Emulator UI Frontend, ///< Emulator UI
Render, ///< Video Core Render, ///< Video Core
Render_Vulkan, ///< Vulkan backend Render_Vulkan, ///< Vulkan backend

View File

@ -104,6 +104,9 @@ static auto UserPaths = [] {
create_path(PathType::SysModuleDir, user_dir / SYSMODULES_DIR); create_path(PathType::SysModuleDir, user_dir / SYSMODULES_DIR);
create_path(PathType::DownloadDir, user_dir / DOWNLOAD_DIR); create_path(PathType::DownloadDir, user_dir / DOWNLOAD_DIR);
create_path(PathType::CapturesDir, user_dir / CAPTURES_DIR); create_path(PathType::CapturesDir, user_dir / CAPTURES_DIR);
create_path(PathType::CheatsDir, user_dir / CHEATS_DIR);
create_path(PathType::PatchesDir, user_dir / PATCHES_DIR);
create_path(PathType::AddonsDir, user_dir / ADDONS_DIR);
return paths; return paths;
}(); }();

View File

@ -20,6 +20,9 @@ enum class PathType {
SysModuleDir, // Where system modules are stored. SysModuleDir, // Where system modules are stored.
DownloadDir, // Where downloads/temp files are stored. DownloadDir, // Where downloads/temp files are stored.
CapturesDir, // Where rdoc captures are stored. CapturesDir, // Where rdoc captures are stored.
CheatsDir, // Where cheats are stored.
PatchesDir, // Where patches are stored.
AddonsDir, // Where additional content is stored.
}; };
constexpr auto PORTABLE_DIR = "user"; constexpr auto PORTABLE_DIR = "user";
@ -35,6 +38,9 @@ constexpr auto TEMPDATA_DIR = "temp";
constexpr auto SYSMODULES_DIR = "sys_modules"; constexpr auto SYSMODULES_DIR = "sys_modules";
constexpr auto DOWNLOAD_DIR = "download"; constexpr auto DOWNLOAD_DIR = "download";
constexpr auto CAPTURES_DIR = "captures"; constexpr auto CAPTURES_DIR = "captures";
constexpr auto CHEATS_DIR = "cheats";
constexpr auto PATCHES_DIR = "patches";
constexpr auto ADDONS_DIR = "addcont";
// Filenames // Filenames
constexpr auto LOG_FILE = "shad_log.txt"; constexpr auto LOG_FILE = "shad_log.txt";

View File

@ -15,6 +15,7 @@
#else #else
#include <pthread.h> #include <pthread.h>
#ifdef __APPLE__ #ifdef __APPLE__
#include <half.hpp>
#include <sys/sysctl.h> #include <sys/sysctl.h>
#endif #endif
#endif #endif
@ -30,6 +31,12 @@ static Xbyak::Reg ZydisToXbyakRegister(const ZydisRegister reg) {
if (reg >= ZYDIS_REGISTER_RAX && reg <= ZYDIS_REGISTER_R15) { if (reg >= ZYDIS_REGISTER_RAX && reg <= ZYDIS_REGISTER_R15) {
return Xbyak::Reg64(reg - ZYDIS_REGISTER_RAX + Xbyak::Operand::RAX); return Xbyak::Reg64(reg - ZYDIS_REGISTER_RAX + Xbyak::Operand::RAX);
} }
if (reg >= ZYDIS_REGISTER_XMM0 && reg <= ZYDIS_REGISTER_XMM31) {
return Xbyak::Xmm(reg - ZYDIS_REGISTER_XMM0 + xmm0.getIdx());
}
if (reg >= ZYDIS_REGISTER_YMM0 && reg <= ZYDIS_REGISTER_YMM31) {
return Xbyak::Ymm(reg - ZYDIS_REGISTER_YMM0 + ymm0.getIdx());
}
UNREACHABLE_MSG("Unsupported register: {}", static_cast<u32>(reg)); UNREACHABLE_MSG("Unsupported register: {}", static_cast<u32>(reg));
} }
@ -66,6 +73,12 @@ static Xbyak::Address ZydisToXbyakMemoryOperand(const ZydisDecodedOperand& opera
return ptr[expression]; return ptr[expression];
} }
static u64 ZydisToXbyakImmediateOperand(const ZydisDecodedOperand& operand) {
ASSERT_MSG(operand.type == ZYDIS_OPERAND_TYPE_IMMEDIATE,
"Expected immediate operand, got type: {}", static_cast<u32>(operand.type));
return operand.imm.value.u;
}
static std::unique_ptr<Xbyak::Operand> ZydisToXbyakOperand(const ZydisDecodedOperand& operand) { static std::unique_ptr<Xbyak::Operand> ZydisToXbyakOperand(const ZydisDecodedOperand& operand) {
switch (operand.type) { switch (operand.type) {
case ZYDIS_OPERAND_TYPE_REGISTER: { case ZYDIS_OPERAND_TYPE_REGISTER: {
@ -110,51 +123,135 @@ static Xbyak::Reg AllocateScratchRegister(
#ifdef __APPLE__ #ifdef __APPLE__
static constexpr u32 MaxSavedRegisters = 3; static pthread_key_t stack_pointer_slot;
static pthread_key_t register_save_slots[MaxSavedRegisters]; static pthread_key_t patch_stack_slot;
static std::once_flag register_save_init_flag; static std::once_flag patch_context_slots_init_flag;
static_assert(sizeof(void*) == sizeof(u64), static_assert(sizeof(void*) == sizeof(u64),
"Cannot fit a register inside a thread local storage slot."); "Cannot fit a register inside a thread local storage slot.");
static void InitializeRegisterSaveSlots() { static void InitializePatchContextSlots() {
for (u32 i = 0; i < MaxSavedRegisters; i++) { ASSERT_MSG(pthread_key_create(&stack_pointer_slot, nullptr) == 0,
ASSERT_MSG(pthread_key_create(&register_save_slots[i], nullptr) == 0, "Unable to allocate thread-local register for stack pointer.");
"Unable to allocate thread-local register save slot {}", i); ASSERT_MSG(pthread_key_create(&patch_stack_slot, nullptr) == 0,
"Unable to allocate thread-local register for patch stack.");
}
void InitializeThreadPatchStack() {
std::call_once(patch_context_slots_init_flag, InitializePatchContextSlots);
const auto* patch_stack = std::malloc(0x1000);
pthread_setspecific(patch_stack_slot, patch_stack);
}
void CleanupThreadPatchStack() {
std::call_once(patch_context_slots_init_flag, InitializePatchContextSlots);
auto* patch_stack = pthread_getspecific(patch_stack_slot);
if (patch_stack != nullptr) {
std::free(patch_stack);
pthread_setspecific(patch_stack_slot, nullptr);
} }
} }
/// Saves the stack pointer to thread local storage and loads the patch stack.
static void SaveStack(Xbyak::CodeGenerator& c) {
std::call_once(patch_context_slots_init_flag, InitializePatchContextSlots);
// Save stack pointer and load patch stack.
c.putSeg(gs);
c.mov(qword[reinterpret_cast<void*>(stack_pointer_slot * sizeof(void*))], rsp);
c.putSeg(gs);
c.mov(rsp, qword[reinterpret_cast<void*>(patch_stack_slot * sizeof(void*))]);
}
/// Restores the stack pointer from thread local storage.
static void RestoreStack(Xbyak::CodeGenerator& c) {
std::call_once(patch_context_slots_init_flag, InitializePatchContextSlots);
// Save patch stack pointer and load original stack.
c.putSeg(gs);
c.mov(qword[reinterpret_cast<void*>(patch_stack_slot * sizeof(void*))], rsp);
c.putSeg(gs);
c.mov(rsp, qword[reinterpret_cast<void*>(stack_pointer_slot * sizeof(void*))]);
}
#else
// These utilities are not implemented as we can't save anything to thread local storage without
// temporary registers.
void InitializeThreadPatchStack() {
// No-op
}
void CleanupThreadPatchStack() {
// No-op
}
/// Saves the stack pointer to thread local storage and loads the patch stack.
static void SaveStack(Xbyak::CodeGenerator& c) {
UNIMPLEMENTED();
}
/// Restores the stack pointer from thread local storage.
static void RestoreStack(Xbyak::CodeGenerator& c) {
UNIMPLEMENTED();
}
#endif
/// Switches to the patch stack, saves registers, and restores the original stack.
static void SaveRegisters(Xbyak::CodeGenerator& c, const std::initializer_list<Xbyak::Reg> regs) { static void SaveRegisters(Xbyak::CodeGenerator& c, const std::initializer_list<Xbyak::Reg> regs) {
ASSERT_MSG(regs.size() <= MaxSavedRegisters, "Not enough space to save {} registers.", SaveStack(c);
regs.size());
std::call_once(register_save_init_flag, &InitializeRegisterSaveSlots);
u32 index = 0;
for (const auto& reg : regs) { for (const auto& reg : regs) {
const auto offset = reinterpret_cast<void*>(register_save_slots[index++] * sizeof(void*)); c.push(reg.cvt64());
c.putSeg(gs);
c.mov(qword[offset], reg.cvt64());
} }
RestoreStack(c);
} }
/// Switches to the patch stack, restores registers, and restores the original stack.
static void RestoreRegisters(Xbyak::CodeGenerator& c, static void RestoreRegisters(Xbyak::CodeGenerator& c,
const std::initializer_list<Xbyak::Reg> regs) { const std::initializer_list<Xbyak::Reg> regs) {
ASSERT_MSG(regs.size() <= MaxSavedRegisters, "Not enough space to restore {} registers.", SaveStack(c);
regs.size());
std::call_once(register_save_init_flag, &InitializeRegisterSaveSlots);
u32 index = 0;
for (const auto& reg : regs) { for (const auto& reg : regs) {
const auto offset = reinterpret_cast<void*>(register_save_slots[index++] * sizeof(void*)); c.pop(reg.cvt64());
}
RestoreStack(c);
}
c.putSeg(gs); /// Switches to the patch stack and stores all registers.
c.mov(reg.cvt64(), qword[offset]); static void SaveContext(Xbyak::CodeGenerator& c) {
SaveStack(c);
for (int reg = Xbyak::Operand::RAX; reg <= Xbyak::Operand::R15; reg++) {
c.push(Xbyak::Reg64(reg));
}
for (int reg = 0; reg <= 7; reg++) {
c.sub(rsp, 32);
c.vmovdqu(ptr[rsp], Xbyak::Ymm(reg));
} }
} }
/// Restores all registers and restores the original stack.
/// If the destination is a register, it is not restored to preserve the output.
static void RestoreContext(Xbyak::CodeGenerator& c, const Xbyak::Operand& dst) {
for (int reg = 7; reg >= 0; reg--) {
if ((!dst.isXMM() && !dst.isYMM()) || dst.getIdx() != reg) {
c.vmovdqu(Xbyak::Ymm(reg), ptr[rsp]);
}
c.add(rsp, 32);
}
for (int reg = Xbyak::Operand::R15; reg >= Xbyak::Operand::RAX; reg--) {
if (!dst.isREG() || dst.getIdx() != reg) {
c.pop(Xbyak::Reg64(reg));
} else {
c.add(rsp, 4);
}
}
RestoreStack(c);
}
#ifdef __APPLE__
static void GenerateANDN(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) { static void GenerateANDN(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) {
const auto dst = ZydisToXbyakRegisterOperand(operands[0]); const auto dst = ZydisToXbyakRegisterOperand(operands[0]);
const auto src1 = ZydisToXbyakRegisterOperand(operands[1]); const auto src1 = ZydisToXbyakRegisterOperand(operands[1]);
@ -204,9 +301,9 @@ static void GenerateBEXTR(const ZydisDecodedOperand* operands, Xbyak::CodeGenera
c.and_(dst, scratch2); c.and_(dst, scratch2);
if (dst.getIdx() == shift.getIdx()) { if (dst.getIdx() == shift.getIdx()) {
RestoreRegisters(c, {scratch1, scratch2}); RestoreRegisters(c, {scratch2, scratch1});
} else { } else {
RestoreRegisters(c, {scratch1, scratch2, shift}); RestoreRegisters(c, {shift, scratch2, scratch1});
} }
} }
@ -258,10 +355,138 @@ static void GenerateBLSR(const ZydisDecodedOperand* operands, Xbyak::CodeGenerat
RestoreRegisters(c, {scratch}); RestoreRegisters(c, {scratch});
} }
bool FilterRosetta2Only(const ZydisDecodedOperand*) { static __attribute__((sysv_abi)) void PerformVCVTPH2PS(float* out, const half_float::half* in,
const u32 count) {
for (u32 i = 0; i < count; i++) {
out[i] = half_float::half_cast<float>(in[i]);
}
}
static void GenerateVCVTPH2PS(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) {
const auto dst = ZydisToXbyakRegisterOperand(operands[0]);
const auto src = ZydisToXbyakOperand(operands[1]);
const auto float_count = dst.getBit() / 32;
const auto byte_count = float_count * 4;
SaveContext(c);
// Allocate stack space for outputs and load into first parameter.
c.sub(rsp, byte_count);
c.mov(rdi, rsp);
if (src->isXMM()) {
// Allocate stack space for inputs and load into second parameter.
c.sub(rsp, byte_count);
c.mov(rsi, rsp);
// Move input to the allocated space.
c.movdqu(ptr[rsp], *reinterpret_cast<Xbyak::Xmm*>(src.get()));
} else {
c.lea(rsi, src->getAddress());
}
// Load float count into third parameter.
c.mov(rdx, float_count);
c.mov(rax, reinterpret_cast<u64>(PerformVCVTPH2PS));
c.call(rax);
if (src->isXMM()) {
// Clean up after inputs space.
c.add(rsp, byte_count);
}
// Load outputs into destination register and clean up space.
if (dst.isYMM()) {
c.vmovdqu(*reinterpret_cast<const Xbyak::Ymm*>(&dst), ptr[rsp]);
} else {
c.movdqu(*reinterpret_cast<const Xbyak::Xmm*>(&dst), ptr[rsp]);
}
c.add(rsp, byte_count);
RestoreContext(c, dst);
}
using SingleToHalfFloatConverter = half_float::half (*)(float);
static const SingleToHalfFloatConverter SingleToHalfFloatConverters[4] = {
half_float::half_cast<half_float::half, std::round_to_nearest, float>,
half_float::half_cast<half_float::half, std::round_toward_neg_infinity, float>,
half_float::half_cast<half_float::half, std::round_toward_infinity, float>,
half_float::half_cast<half_float::half, std::round_toward_zero, float>,
};
static __attribute__((sysv_abi)) void PerformVCVTPS2PH(half_float::half* out, const float* in,
const u32 count, const u8 rounding_mode) {
const auto conversion_func = SingleToHalfFloatConverters[rounding_mode];
for (u32 i = 0; i < count; i++) {
out[i] = conversion_func(in[i]);
}
}
static void GenerateVCVTPS2PH(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) {
const auto dst = ZydisToXbyakOperand(operands[0]);
const auto src = ZydisToXbyakRegisterOperand(operands[1]);
const auto ctrl = ZydisToXbyakImmediateOperand(operands[2]);
const auto float_count = src.getBit() / 32;
const auto byte_count = float_count * 4;
SaveContext(c);
if (dst->isXMM()) {
// Allocate stack space for outputs and load into first parameter.
c.sub(rsp, byte_count);
c.mov(rdi, rsp);
} else {
c.lea(rdi, dst->getAddress());
}
// Allocate stack space for inputs and load into second parameter.
c.sub(rsp, byte_count);
c.mov(rsi, rsp);
// Move input to the allocated space.
if (src.isYMM()) {
c.vmovdqu(ptr[rsp], *reinterpret_cast<const Xbyak::Ymm*>(&src));
} else {
c.movdqu(ptr[rsp], *reinterpret_cast<const Xbyak::Xmm*>(&src));
}
// Load float count into third parameter.
c.mov(rdx, float_count);
// Load rounding mode into fourth parameter.
if (ctrl & 4) {
// Load from MXCSR.RC.
c.stmxcsr(ptr[rsp - 4]);
c.mov(rcx, ptr[rsp - 4]);
c.shr(rcx, 13);
c.and_(rcx, 3);
} else {
c.mov(rcx, ctrl & 3);
}
c.mov(rax, reinterpret_cast<u64>(PerformVCVTPS2PH));
c.call(rax);
// Clean up after inputs space.
c.add(rsp, byte_count);
if (dst->isXMM()) {
// Load outputs into destination register and clean up space.
c.movdqu(*reinterpret_cast<Xbyak::Xmm*>(dst.get()), ptr[rsp]);
c.add(rsp, byte_count);
}
RestoreContext(c, *dst);
}
static bool FilterRosetta2Only(const ZydisDecodedOperand*) {
int ret = 0; int ret = 0;
size_t size = sizeof(ret); size_t size = sizeof(ret);
if (sysctlbyname("sysctl.proc_translated", &ret, &size, NULL, 0) != 0) { if (sysctlbyname("sysctl.proc_translated", &ret, &size, nullptr, 0) != 0) {
return false; return false;
} }
return ret; return ret;
@ -339,12 +564,16 @@ static const std::unordered_map<ZydisMnemonic, PatchInfo> Patches = {
#endif #endif
#ifdef __APPLE__ #ifdef __APPLE__
// BMI1 instructions that are not supported by Rosetta 2 on Apple Silicon. // Patches for instruction sets not supported by Rosetta 2.
// BMI1
{ZYDIS_MNEMONIC_ANDN, {FilterRosetta2Only, GenerateANDN, true}}, {ZYDIS_MNEMONIC_ANDN, {FilterRosetta2Only, GenerateANDN, true}},
{ZYDIS_MNEMONIC_BEXTR, {FilterRosetta2Only, GenerateBEXTR, true}}, {ZYDIS_MNEMONIC_BEXTR, {FilterRosetta2Only, GenerateBEXTR, true}},
{ZYDIS_MNEMONIC_BLSI, {FilterRosetta2Only, GenerateBLSI, true}}, {ZYDIS_MNEMONIC_BLSI, {FilterRosetta2Only, GenerateBLSI, true}},
{ZYDIS_MNEMONIC_BLSMSK, {FilterRosetta2Only, GenerateBLSMSK, true}}, {ZYDIS_MNEMONIC_BLSMSK, {FilterRosetta2Only, GenerateBLSMSK, true}},
{ZYDIS_MNEMONIC_BLSR, {FilterRosetta2Only, GenerateBLSR, true}}, {ZYDIS_MNEMONIC_BLSR, {FilterRosetta2Only, GenerateBLSR, true}},
// F16C
{ZYDIS_MNEMONIC_VCVTPH2PS, {FilterRosetta2Only, GenerateVCVTPH2PS, true}},
{ZYDIS_MNEMONIC_VCVTPS2PH, {FilterRosetta2Only, GenerateVCVTPS2PH, true}},
#endif #endif
}; };

View File

@ -9,6 +9,12 @@ class CodeGenerator;
namespace Core { namespace Core {
/// Initializes a stack for the current thread for use by patch implementations.
void InitializeThreadPatchStack();
/// Cleans up the patch stack for the current thread.
void CleanupThreadPatchStack();
/// Patches CPU instructions that cannot run as-is on the host. /// Patches CPU instructions that cannot run as-is on the host.
void PatchInstructions(u64 segment_addr, u64 segment_size, Xbyak::CodeGenerator& c); void PatchInstructions(u64 segment_addr, u64 segment_size, Xbyak::CodeGenerator& c);

View File

@ -67,15 +67,19 @@ bool PKG::Open(const std::filesystem::path& filepath) {
file.Seek(0x47); // skip first 7 characters of content_id file.Seek(0x47); // skip first 7 characters of content_id
file.Read(pkgTitleID); file.Read(pkgTitleID);
file.Seek(0);
pkg.resize(pkgheader.pkg_promote_size);
file.Read(pkg);
u32 offset = pkgheader.pkg_table_entry_offset; u32 offset = pkgheader.pkg_table_entry_offset;
u32 n_files = pkgheader.pkg_table_entry_count; u32 n_files = pkgheader.pkg_table_entry_count;
file.Seek(offset);
for (int i = 0; i < n_files; i++) { for (int i = 0; i < n_files; i++) {
PKGEntry entry; PKGEntry entry{};
std::memcpy(&entry, &pkg[offset + i * 0x20], sizeof(entry)); file.Read(entry.id);
file.Read(entry.filename_offset);
file.Read(entry.flags1);
file.Read(entry.flags2);
file.Read(entry.offset);
file.Read(entry.size);
file.Seek(8, Common::FS::SeekOrigin::CurrentPosition);
// Try to figure out the name // Try to figure out the name
const auto name = GetEntryNameByType(entry.id); const auto name = GetEntryNameByType(entry.id);
@ -113,9 +117,6 @@ bool PKG::Extract(const std::filesystem::path& filepath, const std::filesystem::
failreason = "Content size is bigger than pkg size"; failreason = "Content size is bigger than pkg size";
return false; return false;
} }
file.Seek(0);
pkg.resize(pkgheader.pkg_promote_size);
file.Read(pkg);
u32 offset = pkgheader.pkg_table_entry_offset; u32 offset = pkgheader.pkg_table_entry_offset;
u32 n_files = pkgheader.pkg_table_entry_count; u32 n_files = pkgheader.pkg_table_entry_count;
@ -126,9 +127,18 @@ bool PKG::Extract(const std::filesystem::path& filepath, const std::filesystem::
std::array<std::array<u8, 256>, 7> key1; std::array<std::array<u8, 256>, 7> key1;
std::array<u8, 256> imgkeydata; std::array<u8, 256> imgkeydata;
file.Seek(offset);
for (int i = 0; i < n_files; i++) { for (int i = 0; i < n_files; i++) {
PKGEntry entry; PKGEntry entry{};
std::memcpy(&entry, &pkg[offset + i * 0x20], sizeof(entry)); file.Read(entry.id);
file.Read(entry.filename_offset);
file.Read(entry.flags1);
file.Read(entry.flags2);
file.Read(entry.offset);
file.Read(entry.size);
file.Seek(8, Common::FS::SeekOrigin::CurrentPosition);
auto currentPos = file.Tell();
// Try to figure out the name // Try to figure out the name
const auto name = GetEntryNameByType(entry.id); const auto name = GetEntryNameByType(entry.id);
@ -139,8 +149,15 @@ bool PKG::Extract(const std::filesystem::path& filepath, const std::filesystem::
// Just print with id // Just print with id
Common::FS::IOFile out(extract_path / "sce_sys" / std::to_string(entry.id), Common::FS::IOFile out(extract_path / "sce_sys" / std::to_string(entry.id),
Common::FS::FileAccessMode::Write); Common::FS::FileAccessMode::Write);
out.WriteRaw<u8>(pkg.data() + entry.offset, entry.size); file.Seek(entry.offset);
std::vector<u8> data;
data.resize(entry.size);
file.ReadRaw<u8>(data.data(), entry.size);
out.WriteRaw<u8>(data.data(), entry.size);
out.Close(); out.Close();
file.Seek(currentPos);
continue; continue;
} }
@ -178,14 +195,25 @@ bool PKG::Extract(const std::filesystem::path& filepath, const std::filesystem::
} }
Common::FS::IOFile out(extract_path / "sce_sys" / name, Common::FS::FileAccessMode::Write); Common::FS::IOFile out(extract_path / "sce_sys" / name, Common::FS::FileAccessMode::Write);
out.WriteRaw<u8>(pkg.data() + entry.offset, entry.size); file.Seek(entry.offset);
std::vector<u8> data;
data.resize(entry.size);
file.ReadRaw<u8>(data.data(), entry.size);
out.WriteRaw<u8>(data.data(), entry.size);
out.Close(); out.Close();
// Decrypt Np stuff and overwrite. // Decrypt Np stuff and overwrite.
if (entry.id == 0x400 || entry.id == 0x401 || entry.id == 0x402 || if (entry.id == 0x400 || entry.id == 0x401 || entry.id == 0x402 ||
entry.id == 0x403) { // somehow 0x401 is not decrypting entry.id == 0x403) { // somehow 0x401 is not decrypting
decNp.resize(entry.size); decNp.resize(entry.size);
std::span<u8> cipherNp(pkg.data() + entry.offset, entry.size); file.Seek(entry.offset);
std::vector<u8> data;
data.resize(entry.size);
file.ReadRaw<u8>(data.data(), entry.size);
std::span<u8> cipherNp(data.data(), entry.size);
std::array<u8, 64> concatenated_ivkey_dk3_; std::array<u8, 64> concatenated_ivkey_dk3_;
std::memcpy(concatenated_ivkey_dk3_.data(), &entry, sizeof(entry)); std::memcpy(concatenated_ivkey_dk3_.data(), &entry, sizeof(entry));
std::memcpy(concatenated_ivkey_dk3_.data() + sizeof(entry), dk3_.data(), sizeof(dk3_)); std::memcpy(concatenated_ivkey_dk3_.data() + sizeof(entry), dk3_.data(), sizeof(dk3_));
@ -197,6 +225,8 @@ bool PKG::Extract(const std::filesystem::path& filepath, const std::filesystem::
out.Write(decNp); out.Write(decNp);
out.Close(); out.Close();
} }
file.Seek(currentPos);
} }
// Extract trophy files // Extract trophy files
@ -214,28 +244,31 @@ bool PKG::Extract(const std::filesystem::path& filepath, const std::filesystem::
PKG::crypto.PfsGenCryptoKey(ekpfsKey, seed, dataKey, tweakKey); PKG::crypto.PfsGenCryptoKey(ekpfsKey, seed, dataKey, tweakKey);
const u32 length = pkgheader.pfs_cache_size * 0x2; // Seems to be ok. const u32 length = pkgheader.pfs_cache_size * 0x2; // Seems to be ok.
// Read encrypted pfs_image int num_blocks = 0;
std::vector<u8> pfs_encrypted(length);
file.Seek(pkgheader.pfs_image_offset);
file.Read(pfs_encrypted);
file.Close();
// Decrypt the pfs_image.
std::vector<u8> pfs_decrypted(length);
PKG::crypto.decryptPFS(dataKey, tweakKey, pfs_encrypted, pfs_decrypted, 0);
// Retrieve PFSC from decrypted pfs_image.
pfsc_offset = GetPFSCOffset(pfs_decrypted);
std::vector<u8> pfsc(length); std::vector<u8> pfsc(length);
std::memcpy(pfsc.data(), pfs_decrypted.data() + pfsc_offset, length - pfsc_offset); if (length != 0) {
// Read encrypted pfs_image
std::vector<u8> pfs_encrypted(length);
file.Seek(pkgheader.pfs_image_offset);
file.Read(pfs_encrypted);
file.Close();
// Decrypt the pfs_image.
std::vector<u8> pfs_decrypted(length);
PKG::crypto.decryptPFS(dataKey, tweakKey, pfs_encrypted, pfs_decrypted, 0);
PFSCHdr pfsChdr; // Retrieve PFSC from decrypted pfs_image.
std::memcpy(&pfsChdr, pfsc.data(), sizeof(pfsChdr)); pfsc_offset = GetPFSCOffset(pfs_decrypted);
std::memcpy(pfsc.data(), pfs_decrypted.data() + pfsc_offset, length - pfsc_offset);
const int num_blocks = (int)(pfsChdr.data_length / pfsChdr.block_sz2); PFSCHdr pfsChdr;
sectorMap.resize(num_blocks + 1); // 8 bytes, need extra 1 to get the last offset. std::memcpy(&pfsChdr, pfsc.data(), sizeof(pfsChdr));
for (int i = 0; i < num_blocks + 1; i++) { num_blocks = (int)(pfsChdr.data_length / pfsChdr.block_sz2);
std::memcpy(&sectorMap[i], pfsc.data() + pfsChdr.block_offsets + i * 8, 8); sectorMap.resize(num_blocks + 1); // 8 bytes, need extra 1 to get the last offset.
for (int i = 0; i < num_blocks + 1; i++) {
std::memcpy(&sectorMap[i], pfsc.data() + pfsChdr.block_offsets + i * 8, 8);
}
} }
u32 ent_size = 0; u32 ent_size = 0;
@ -296,7 +329,15 @@ bool PKG::Extract(const std::filesystem::path& filepath, const std::filesystem::
} else { } else {
// Set the the folder according to the current inode. // Set the the folder according to the current inode.
// Can be 2 or more (rarely) // Can be 2 or more (rarely)
extractPaths[ndinode_counter] = extract_path.parent_path() / GetTitleID(); auto parent_path = extract_path.parent_path();
auto title_id = GetTitleID();
if (parent_path.filename() != title_id) {
extractPaths[ndinode_counter] = parent_path / title_id;
} else {
// DLCs path has different structure
extractPaths[ndinode_counter] = extract_path;
}
uroot_reached = false; uroot_reached = false;
break; break;
} }

View File

@ -149,7 +149,6 @@ public:
private: private:
Crypto crypto; Crypto crypto;
TRP trp; TRP trp;
std::vector<u8> pkg;
u64 pkgSize = 0; u64 pkgSize = 0;
char pkgTitleID[9]; char pkgTitleID[9];
PKGHeader pkgheader; PKGHeader pkgheader;

View File

@ -1,20 +1,38 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// Generated By moduleGenerator
#include <cmath> #include <cmath>
#include <common/path_util.h>
#include <common/singleton.h>
#include <core/file_format/psf.h>
#include <core/file_sys/fs.h>
#include "app_content.h" #include "app_content.h"
#include "common/io_file.h" #include "common/io_file.h"
#include "common/logging/log.h" #include "common/logging/log.h"
#include "common/path_util.h"
#include "common/singleton.h"
#include "common/string_util.h"
#include "core/file_format/psf.h"
#include "core/file_sys/fs.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"
namespace Libraries::AppContent { namespace Libraries::AppContent {
int32_t addcont_count = 0;
struct AddContInfo {
char entitlementLabel[ORBIS_NP_UNIFIED_ENTITLEMENT_LABEL_SIZE];
OrbisAppContentAddcontDownloadStatus status;
OrbisAppContentGetEntitlementKey key;
};
std::array<AddContInfo, ORBIS_APP_CONTENT_INFO_LIST_MAX_SIZE> addcont_info = {{
{"0000000000000000",
ORBIS_APP_CONTENT_ADDCONT_DOWNLOAD_STATUS_INSTALLED,
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00}},
}};
std::string title_id;
int PS4_SYSV_ABI _Z5dummyv() { int PS4_SYSV_ABI _Z5dummyv() {
LOG_ERROR(Lib_AppContent, "(STUBBED) called"); LOG_ERROR(Lib_AppContent, "(STUBBED) called");
return ORBIS_OK; return ORBIS_OK;
@ -35,9 +53,31 @@ int PS4_SYSV_ABI sceAppContentAddcontEnqueueDownloadSp() {
return ORBIS_OK; return ORBIS_OK;
} }
int PS4_SYSV_ABI sceAppContentAddcontMount() { int PS4_SYSV_ABI sceAppContentAddcontMount(u32 service_label,
LOG_ERROR(Lib_AppContent, "(STUBBED) called"); const OrbisNpUnifiedEntitlementLabel* entitlement_label,
return ORBIS_OK; OrbisAppContentMountPoint* mount_point) {
LOG_INFO(Lib_AppContent, "called");
const auto& mount_dir = Common::FS::GetUserPath(Common::FS::PathType::AddonsDir) / title_id /
entitlement_label->data;
auto* mnt = Common::Singleton<Core::FileSys::MntPoints>::Instance();
for (int i = 0; i < addcont_count; i++) {
if (strncmp(entitlement_label->data, addcont_info[i].entitlementLabel,
ORBIS_NP_UNIFIED_ENTITLEMENT_LABEL_SIZE - 1) != 0) {
continue;
}
if (addcont_info[i].status != ORBIS_APP_CONTENT_ADDCONT_DOWNLOAD_STATUS_INSTALLED) {
return ORBIS_APP_CONTENT_ERROR_NOT_FOUND;
}
snprintf(mount_point->data, ORBIS_APP_CONTENT_MOUNTPOINT_DATA_MAXSIZE, "/addcont%d", i);
mnt->Mount(mount_dir, mount_point->data);
return ORBIS_OK;
}
return ORBIS_APP_CONTENT_ERROR_NOT_FOUND;
} }
int PS4_SYSV_ABI sceAppContentAddcontShrink() { int PS4_SYSV_ABI sceAppContentAddcontShrink() {
@ -124,22 +164,80 @@ int PS4_SYSV_ABI sceAppContentGetAddcontDownloadProgress() {
return ORBIS_OK; return ORBIS_OK;
} }
int PS4_SYSV_ABI sceAppContentGetAddcontInfo() { int PS4_SYSV_ABI sceAppContentGetAddcontInfo(u32 service_label,
LOG_ERROR(Lib_AppContent, "(STUBBED) called"); const OrbisNpUnifiedEntitlementLabel* entitlementLabel,
return ORBIS_OK; OrbisAppContentAddcontInfo* info) {
LOG_INFO(Lib_AppContent, "called");
if (entitlementLabel == nullptr || info == nullptr) {
return ORBIS_APP_CONTENT_ERROR_PARAMETER;
}
for (auto i = 0; i < addcont_count; i++) {
if (strncmp(entitlementLabel->data, addcont_info[i].entitlementLabel,
ORBIS_NP_UNIFIED_ENTITLEMENT_LABEL_SIZE - 1) != 0) {
continue;
}
LOG_INFO(Lib_AppContent, "found DLC {}", entitlementLabel->data);
strncpy(info->entitlement_label.data, addcont_info[i].entitlementLabel,
ORBIS_NP_UNIFIED_ENTITLEMENT_LABEL_SIZE);
info->status = addcont_info[i].status;
return ORBIS_OK;
}
return ORBIS_APP_CONTENT_ERROR_DRM_NO_ENTITLEMENT;
} }
int PS4_SYSV_ABI sceAppContentGetAddcontInfoList(u32 service_label, int PS4_SYSV_ABI sceAppContentGetAddcontInfoList(u32 service_label,
OrbisAppContentAddcontInfo* list, u32 list_num, OrbisAppContentAddcontInfo* list, u32 list_num,
u32* hit_num) { u32* hit_num) {
*hit_num = 0; LOG_INFO(Lib_AppContent, "called");
LOG_ERROR(Lib_AppContent, "(DUMMY) called");
if (list_num == 0 || list == nullptr) {
if (hit_num == nullptr) {
return ORBIS_APP_CONTENT_ERROR_PARAMETER;
}
*hit_num = addcont_count;
return ORBIS_OK;
}
int dlcs_to_list = addcont_count < list_num ? addcont_count : list_num;
for (int i = 0; i < dlcs_to_list; i++) {
strncpy(list[i].entitlement_label.data, addcont_info[i].entitlementLabel,
ORBIS_NP_UNIFIED_ENTITLEMENT_LABEL_SIZE);
list[i].status = addcont_info[i].status;
}
if (hit_num != nullptr) {
*hit_num = dlcs_to_list;
}
return ORBIS_OK; return ORBIS_OK;
} }
int PS4_SYSV_ABI sceAppContentGetEntitlementKey() { int PS4_SYSV_ABI sceAppContentGetEntitlementKey(
LOG_ERROR(Lib_AppContent, "(STUBBED) called"); u32 service_label, const OrbisNpUnifiedEntitlementLabel* entitlement_label,
return ORBIS_OK; OrbisAppContentGetEntitlementKey* key) {
LOG_ERROR(Lib_AppContent, "called");
if (entitlement_label == nullptr || key == nullptr) {
return ORBIS_APP_CONTENT_ERROR_PARAMETER;
}
for (int i = 0; i < addcont_count; i++) {
if (strncmp(entitlement_label->data, addcont_info[i].entitlementLabel,
ORBIS_NP_UNIFIED_ENTITLEMENT_LABEL_SIZE - 1) != 0) {
continue;
}
memcpy(key->data, addcont_info[i].key.data, ORBIS_APP_CONTENT_ENTITLEMENT_KEY_SIZE);
return ORBIS_OK;
}
return ORBIS_APP_CONTENT_ERROR_DRM_NO_ENTITLEMENT;
} }
int PS4_SYSV_ABI sceAppContentGetRegion() { int PS4_SYSV_ABI sceAppContentGetRegion() {
@ -150,7 +248,25 @@ int PS4_SYSV_ABI sceAppContentGetRegion() {
int PS4_SYSV_ABI sceAppContentInitialize(const OrbisAppContentInitParam* initParam, int PS4_SYSV_ABI sceAppContentInitialize(const OrbisAppContentInitParam* initParam,
OrbisAppContentBootParam* bootParam) { OrbisAppContentBootParam* bootParam) {
LOG_ERROR(Lib_AppContent, "(DUMMY) called"); LOG_ERROR(Lib_AppContent, "(DUMMY) called");
bootParam->attr = 0; // always 0 auto* param_sfo = Common::Singleton<PSF>::Instance();
const auto addons_dir = Common::FS::GetUserPath(Common::FS::PathType::AddonsDir);
title_id = param_sfo->GetString("TITLE_ID");
auto addon_path = addons_dir / title_id;
if (std::filesystem::exists(addon_path)) {
for (const auto& entry : std::filesystem::directory_iterator(addon_path)) {
if (entry.is_directory()) {
auto entitlement_label = entry.path().filename().string();
AddContInfo info{};
info.status = ORBIS_APP_CONTENT_ADDCONT_DOWNLOAD_STATUS_INSTALLED;
strcpy(info.entitlementLabel, entitlement_label.c_str());
addcont_info[addcont_count++] = info;
}
}
}
return ORBIS_OK; return ORBIS_OK;
} }

View File

@ -41,6 +41,16 @@ struct OrbisAppContentMountPoint {
constexpr int ORBIS_APP_CONTENT_TEMPORARY_DATA_OPTION_NONE = 0; constexpr int ORBIS_APP_CONTENT_TEMPORARY_DATA_OPTION_NONE = 0;
constexpr int ORBIS_APP_CONTENT_TEMPORARY_DATA_OPTION_FORMAT = (1 << 0); constexpr int ORBIS_APP_CONTENT_TEMPORARY_DATA_OPTION_FORMAT = (1 << 0);
constexpr int ORBIS_NP_UNIFIED_ENTITLEMENT_LABEL_SIZE = 17; constexpr int ORBIS_NP_UNIFIED_ENTITLEMENT_LABEL_SIZE = 17;
constexpr int ORBIS_APP_CONTENT_ENTITLEMENT_KEY_SIZE = 16;
constexpr int ORBIS_APP_CONTENT_INFO_LIST_MAX_SIZE = 2500;
enum OrbisAppContentAddcontDownloadStatus : u32 {
ORBIS_APP_CONTENT_ADDCONT_DOWNLOAD_STATUS_NO_EXTRA_DATA = 0,
ORBIS_APP_CONTENT_ADDCONT_DOWNLOAD_STATUS_NO_IN_QUEUE = 1,
ORBIS_APP_CONTENT_ADDCONT_DOWNLOAD_STATUS_DOWNLOADING = 2,
ORBIS_APP_CONTENT_ADDCONT_DOWNLOAD_STATUS_DOWNLOAD_SUSPENDED = 3,
ORBIS_APP_CONTENT_ADDCONT_DOWNLOAD_STATUS_INSTALLED = 4
};
struct OrbisNpUnifiedEntitlementLabel { struct OrbisNpUnifiedEntitlementLabel {
char data[ORBIS_NP_UNIFIED_ENTITLEMENT_LABEL_SIZE]; char data[ORBIS_NP_UNIFIED_ENTITLEMENT_LABEL_SIZE];
@ -54,11 +64,17 @@ struct OrbisAppContentAddcontInfo {
u32 status; u32 status;
}; };
struct OrbisAppContentGetEntitlementKey {
char data[ORBIS_APP_CONTENT_ENTITLEMENT_KEY_SIZE];
};
int PS4_SYSV_ABI _Z5dummyv(); int PS4_SYSV_ABI _Z5dummyv();
int PS4_SYSV_ABI sceAppContentAddcontDelete(); int PS4_SYSV_ABI sceAppContentAddcontDelete();
int PS4_SYSV_ABI sceAppContentAddcontEnqueueDownload(); int PS4_SYSV_ABI sceAppContentAddcontEnqueueDownload();
int PS4_SYSV_ABI sceAppContentAddcontEnqueueDownloadSp(); int PS4_SYSV_ABI sceAppContentAddcontEnqueueDownloadSp();
int PS4_SYSV_ABI sceAppContentAddcontMount(); int PS4_SYSV_ABI sceAppContentAddcontMount(u32 service_label,
const OrbisNpUnifiedEntitlementLabel* entitlement_label,
OrbisAppContentMountPoint* mount_point);
int PS4_SYSV_ABI sceAppContentAddcontShrink(); int PS4_SYSV_ABI sceAppContentAddcontShrink();
int PS4_SYSV_ABI sceAppContentAddcontUnmount(); int PS4_SYSV_ABI sceAppContentAddcontUnmount();
int PS4_SYSV_ABI sceAppContentAppParamGetInt(OrbisAppContentAppParamId paramId, s32* value); int PS4_SYSV_ABI sceAppContentAppParamGetInt(OrbisAppContentAppParamId paramId, s32* value);
@ -70,11 +86,15 @@ int PS4_SYSV_ABI sceAppContentDownload1Shrink();
int PS4_SYSV_ABI sceAppContentDownloadDataFormat(); int PS4_SYSV_ABI sceAppContentDownloadDataFormat();
int PS4_SYSV_ABI sceAppContentDownloadDataGetAvailableSpaceKb(); int PS4_SYSV_ABI sceAppContentDownloadDataGetAvailableSpaceKb();
int PS4_SYSV_ABI sceAppContentGetAddcontDownloadProgress(); int PS4_SYSV_ABI sceAppContentGetAddcontDownloadProgress();
int PS4_SYSV_ABI sceAppContentGetAddcontInfo(); int PS4_SYSV_ABI sceAppContentGetAddcontInfo(u32 service_label,
const OrbisNpUnifiedEntitlementLabel* entitlementLabel,
OrbisAppContentAddcontInfo* info);
int PS4_SYSV_ABI sceAppContentGetAddcontInfoList(u32 service_label, int PS4_SYSV_ABI sceAppContentGetAddcontInfoList(u32 service_label,
OrbisAppContentAddcontInfo* list, u32 list_num, OrbisAppContentAddcontInfo* list, u32 list_num,
u32* hit_num); u32* hit_num);
int PS4_SYSV_ABI sceAppContentGetEntitlementKey(); int PS4_SYSV_ABI sceAppContentGetEntitlementKey(
u32 service_label, const OrbisNpUnifiedEntitlementLabel* entitlement_label,
OrbisAppContentGetEntitlementKey* key);
int PS4_SYSV_ABI sceAppContentGetRegion(); int PS4_SYSV_ABI sceAppContentGetRegion();
int PS4_SYSV_ABI sceAppContentInitialize(const OrbisAppContentInitParam* initParam, int PS4_SYSV_ABI sceAppContentInitialize(const OrbisAppContentInitParam* initParam,
OrbisAppContentBootParam* bootParam); OrbisAppContentBootParam* bootParam);

View File

@ -2,9 +2,10 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <memory> #include <memory>
#include <common/assert.h>
#include <magic_enum.hpp> #include <magic_enum.hpp>
#include "audio_core/sdl_audio.h" #include "audio_core/sdl_audio.h"
#include "common/assert.h"
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/libraries/audio/audioout.h" #include "core/libraries/audio/audioout.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"

View File

@ -1,7 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// Generated By moduleGenerator
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"

View File

@ -1,7 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// Generated By moduleGenerator
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"

View File

@ -1,7 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// Generated By moduleGenerator
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"

View File

@ -461,3 +461,5 @@ constexpr int ORBIS_AVPLAYER_ERROR_INFO_OTHER_ENCRY = 0x806A00BF;
// AppContent library // AppContent library
constexpr int ORBIS_APP_CONTENT_ERROR_PARAMETER = 0x80D90002; constexpr int ORBIS_APP_CONTENT_ERROR_PARAMETER = 0x80D90002;
constexpr int ORBIS_APP_CONTENT_ERROR_DRM_NO_ENTITLEMENT = 0x80D90007;
constexpr int ORBIS_APP_CONTENT_ERROR_NOT_FOUND = 0x80D90005;

View File

@ -650,12 +650,12 @@ s32 PS4_SYSV_ABI sceGnmDrawIndexAuto(u32* cmdbuf, u32 size, u32 index_count, u32
} }
s32 PS4_SYSV_ABI sceGnmDrawIndexIndirect(u32* cmdbuf, u32 size, u32 data_offset, u32 shader_stage, s32 PS4_SYSV_ABI sceGnmDrawIndexIndirect(u32* cmdbuf, u32 size, u32 data_offset, u32 shader_stage,
u32 vertex_sgpr_offset, u32 instance_vgpr_offset, u32 vertex_sgpr_offset, u32 instance_sgpr_offset,
u32 flags) { u32 flags) {
LOG_TRACE(Lib_GnmDriver, "called"); LOG_TRACE(Lib_GnmDriver, "called");
if (cmdbuf && (size == 9) && (shader_stage < ShaderStages::Max) && if (cmdbuf && (size == 9) && (shader_stage < ShaderStages::Max) &&
(vertex_sgpr_offset < 0x10u) && (instance_vgpr_offset < 0x10u)) { (vertex_sgpr_offset < 0x10u) && (instance_sgpr_offset < 0x10u)) {
const auto predicate = flags & 1 ? PM4Predicate::PredEnable : PM4Predicate::PredDisable; const auto predicate = flags & 1 ? PM4Predicate::PredEnable : PM4Predicate::PredDisable;
cmdbuf = WriteHeader<PM4ItOpcode::DrawIndexIndirect>( cmdbuf = WriteHeader<PM4ItOpcode::DrawIndexIndirect>(
@ -665,7 +665,7 @@ s32 PS4_SYSV_ABI sceGnmDrawIndexIndirect(u32* cmdbuf, u32 size, u32 data_offset,
cmdbuf[0] = data_offset; cmdbuf[0] = data_offset;
cmdbuf[1] = vertex_sgpr_offset == 0 ? 0 : (vertex_sgpr_offset & 0xffffu) + sgpr_offset; cmdbuf[1] = vertex_sgpr_offset == 0 ? 0 : (vertex_sgpr_offset & 0xffffu) + sgpr_offset;
cmdbuf[2] = instance_vgpr_offset == 0 ? 0 : (instance_vgpr_offset & 0xffffu) + sgpr_offset; cmdbuf[2] = instance_sgpr_offset == 0 ? 0 : (instance_sgpr_offset & 0xffffu) + sgpr_offset;
cmdbuf[3] = 0; cmdbuf[3] = 0;
cmdbuf += 4; cmdbuf += 4;
@ -707,11 +707,11 @@ s32 PS4_SYSV_ABI sceGnmDrawIndexOffset(u32* cmdbuf, u32 size, u32 index_offset,
} }
s32 PS4_SYSV_ABI sceGnmDrawIndirect(u32* cmdbuf, u32 size, u32 data_offset, u32 shader_stage, s32 PS4_SYSV_ABI sceGnmDrawIndirect(u32* cmdbuf, u32 size, u32 data_offset, u32 shader_stage,
u32 vertex_sgpr_offset, u32 instance_vgpr_offset, u32 flags) { u32 vertex_sgpr_offset, u32 instance_sgpr_offset, u32 flags) {
LOG_TRACE(Lib_GnmDriver, "called"); LOG_TRACE(Lib_GnmDriver, "called");
if (cmdbuf && (size == 9) && (shader_stage < ShaderStages::Max) && if (cmdbuf && (size == 9) && (shader_stage < ShaderStages::Max) &&
(vertex_sgpr_offset < 0x10u) && (instance_vgpr_offset < 0x10u)) { (vertex_sgpr_offset < 0x10u) && (instance_sgpr_offset < 0x10u)) {
const auto predicate = flags & 1 ? PM4Predicate::PredEnable : PM4Predicate::PredDisable; const auto predicate = flags & 1 ? PM4Predicate::PredEnable : PM4Predicate::PredDisable;
cmdbuf = WriteHeader<PM4ItOpcode::DrawIndirect>(cmdbuf, 4, PM4ShaderType::ShaderGraphics, cmdbuf = WriteHeader<PM4ItOpcode::DrawIndirect>(cmdbuf, 4, PM4ShaderType::ShaderGraphics,
@ -721,7 +721,7 @@ s32 PS4_SYSV_ABI sceGnmDrawIndirect(u32* cmdbuf, u32 size, u32 data_offset, u32
cmdbuf[0] = data_offset; cmdbuf[0] = data_offset;
cmdbuf[1] = vertex_sgpr_offset == 0 ? 0 : (vertex_sgpr_offset & 0xffffu) + sgpr_offset; cmdbuf[1] = vertex_sgpr_offset == 0 ? 0 : (vertex_sgpr_offset & 0xffffu) + sgpr_offset;
cmdbuf[2] = instance_vgpr_offset == 0 ? 0 : (instance_vgpr_offset & 0xffffu) + sgpr_offset; cmdbuf[2] = instance_sgpr_offset == 0 ? 0 : (instance_sgpr_offset & 0xffffu) + sgpr_offset;
cmdbuf[3] = 2; // auto index cmdbuf[3] = 2; // auto index
cmdbuf += 4; cmdbuf += 4;

View File

@ -45,7 +45,7 @@ s32 PS4_SYSV_ABI sceGnmDrawIndex(u32* cmdbuf, u32 size, u32 index_count, uintptr
u32 flags, u32 type); u32 flags, u32 type);
s32 PS4_SYSV_ABI sceGnmDrawIndexAuto(u32* cmdbuf, u32 size, u32 index_count, u32 flags); s32 PS4_SYSV_ABI sceGnmDrawIndexAuto(u32* cmdbuf, u32 size, u32 index_count, u32 flags);
s32 PS4_SYSV_ABI sceGnmDrawIndexIndirect(u32* cmdbuf, u32 size, u32 data_offset, u32 shader_stage, s32 PS4_SYSV_ABI sceGnmDrawIndexIndirect(u32* cmdbuf, u32 size, u32 data_offset, u32 shader_stage,
u32 vertex_sgpr_offset, u32 instance_vgpr_offset, u32 vertex_sgpr_offset, u32 instance_sgpr_offset,
u32 flags); u32 flags);
int PS4_SYSV_ABI sceGnmDrawIndexIndirectCountMulti(); int PS4_SYSV_ABI sceGnmDrawIndexIndirectCountMulti();
int PS4_SYSV_ABI sceGnmDrawIndexIndirectMulti(); int PS4_SYSV_ABI sceGnmDrawIndexIndirectMulti();
@ -53,7 +53,7 @@ int PS4_SYSV_ABI sceGnmDrawIndexMultiInstanced();
s32 PS4_SYSV_ABI sceGnmDrawIndexOffset(u32* cmdbuf, u32 size, u32 index_offset, u32 index_count, s32 PS4_SYSV_ABI sceGnmDrawIndexOffset(u32* cmdbuf, u32 size, u32 index_offset, u32 index_count,
u32 flags); u32 flags);
s32 PS4_SYSV_ABI sceGnmDrawIndirect(u32* cmdbuf, u32 size, u32 data_offset, u32 shader_stage, s32 PS4_SYSV_ABI sceGnmDrawIndirect(u32* cmdbuf, u32 size, u32 data_offset, u32 shader_stage,
u32 vertex_sgpr_offset, u32 instance_vgpr_offset, u32 flags); u32 vertex_sgpr_offset, u32 instance_sgpr_offset, u32 flags);
int PS4_SYSV_ABI sceGnmDrawIndirectCountMulti(); int PS4_SYSV_ABI sceGnmDrawIndirectCountMulti();
int PS4_SYSV_ABI sceGnmDrawIndirectMulti(); int PS4_SYSV_ABI sceGnmDrawIndirectMulti();
u32 PS4_SYSV_ABI sceGnmDrawInitDefaultHardwareState(u32* cmdbuf, u32 size); u32 PS4_SYSV_ABI sceGnmDrawInitDefaultHardwareState(u32* cmdbuf, u32 size);

View File

@ -1,7 +1,7 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <common/assert.h> #include "common/assert.h"
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"

View File

@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <thread> #include <thread>
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "event_flag_obj.h" #include "event_flag_obj.h"

View File

@ -2,8 +2,10 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#pragma once #pragma once
#include <condition_variable> #include <condition_variable>
#include <mutex> #include <mutex>
#include "common/types.h" #include "common/types.h"
namespace Libraries::Kernel { namespace Libraries::Kernel {

View File

@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <thread> #include <thread>
#include "common/assert.h" #include "common/assert.h"
#include "core/libraries/kernel/event_queue.h" #include "core/libraries/kernel/event_queue.h"

View File

@ -4,6 +4,7 @@
#pragma once #pragma once
#include <sys/types.h> #include <sys/types.h>
#include "common/types.h" #include "common/types.h"
namespace Core::Loader { namespace Core::Loader {

View File

@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <bit> #include <bit>
#include "common/alignment.h" #include "common/alignment.h"
#include "common/assert.h" #include "common/assert.h"
#include "common/logging/log.h" #include "common/logging/log.h"

View File

@ -4,12 +4,14 @@
#include <mutex> #include <mutex>
#include <semaphore> #include <semaphore>
#include <thread> #include <thread>
#include "common/alignment.h" #include "common/alignment.h"
#include "common/assert.h" #include "common/assert.h"
#include "common/error.h" #include "common/error.h"
#include "common/logging/log.h" #include "common/logging/log.h"
#include "common/singleton.h" #include "common/singleton.h"
#include "common/thread.h" #include "common/thread.h"
#include "core/cpu_patches.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/kernel/libkernel.h" #include "core/libraries/kernel/libkernel.h"
#include "core/libraries/kernel/thread_management.h" #include "core/libraries/kernel/thread_management.h"
@ -985,6 +987,7 @@ static void cleanup_thread(void* arg) {
destructor(value); destructor(value);
} }
} }
Core::CleanupThreadPatchStack();
thread->is_almost_done = true; thread->is_almost_done = true;
} }
@ -992,6 +995,7 @@ static void* run_thread(void* arg) {
auto* thread = static_cast<ScePthread>(arg); auto* thread = static_cast<ScePthread>(arg);
Common::SetCurrentThreadName(thread->name.c_str()); Common::SetCurrentThreadName(thread->name.c_str());
auto* linker = Common::Singleton<Core::Linker>::Instance(); auto* linker = Common::Singleton<Core::Linker>::Instance();
Core::InitializeThreadPatchStack();
linker->InitTlsForThread(false); linker->InitTlsForThread(false);
void* ret = nullptr; void* ret = nullptr;
g_pthread_self = thread; g_pthread_self = thread;

View File

@ -10,6 +10,7 @@
#include <vector> #include <vector>
#include <pthread.h> #include <pthread.h>
#include <sched.h> #include <sched.h>
#include "common/types.h" #include "common/types.h"
namespace Core::Loader { namespace Core::Loader {

View File

@ -2,10 +2,10 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <condition_variable> #include <condition_variable>
#include <list>
#include <mutex> #include <mutex>
#include <utility>
#include <boost/intrusive/list.hpp>
#include <pthread.h> #include <pthread.h>
#include "common/assert.h" #include "common/assert.h"
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
@ -13,9 +13,6 @@
namespace Libraries::Kernel { namespace Libraries::Kernel {
using ListBaseHook =
boost::intrusive::list_base_hook<boost::intrusive::link_mode<boost::intrusive::normal_link>>;
class Semaphore { class Semaphore {
public: public:
Semaphore(s32 init_count, s32 max_count, std::string_view name, bool is_fifo) Semaphore(s32 init_count, s32 max_count, std::string_view name, bool is_fifo)
@ -37,7 +34,7 @@ public:
// Create waiting thread object and add it into the list of waiters. // Create waiting thread object and add it into the list of waiters.
WaitingThread waiter{need_count, is_fifo}; WaitingThread waiter{need_count, is_fifo};
AddWaiter(waiter); AddWaiter(&waiter);
// Perform the wait. // Perform the wait.
return waiter.Wait(lk, timeout); return waiter.Wait(lk, timeout);
@ -52,14 +49,14 @@ public:
// Wake up threads in order of priority. // Wake up threads in order of priority.
for (auto it = wait_list.begin(); it != wait_list.end();) { for (auto it = wait_list.begin(); it != wait_list.end();) {
auto& waiter = *it; auto* waiter = *it;
if (waiter.need_count > token_count) { if (waiter->need_count > token_count) {
it++; it++;
continue; continue;
} }
it = wait_list.erase(it); it = wait_list.erase(it);
token_count -= waiter.need_count; token_count -= waiter->need_count;
waiter.cv.notify_one(); waiter->cv.notify_one();
} }
return true; return true;
@ -70,9 +67,9 @@ public:
if (num_waiters) { if (num_waiters) {
*num_waiters = wait_list.size(); *num_waiters = wait_list.size();
} }
for (auto& waiter : wait_list) { for (auto* waiter : wait_list) {
waiter.was_cancled = true; waiter->was_cancled = true;
waiter.cv.notify_one(); waiter->cv.notify_one();
} }
wait_list.clear(); wait_list.clear();
token_count = set_count < 0 ? init_count : set_count; token_count = set_count < 0 ? init_count : set_count;
@ -80,7 +77,7 @@ public:
} }
public: public:
struct WaitingThread : public ListBaseHook { struct WaitingThread {
std::condition_variable cv; std::condition_variable cv;
u32 priority; u32 priority;
s32 need_count; s32 need_count;
@ -132,7 +129,7 @@ public:
} }
}; };
void AddWaiter(WaitingThread& waiter) { void AddWaiter(WaitingThread* waiter) {
// Insert at the end of the list for FIFO order. // Insert at the end of the list for FIFO order.
if (is_fifo) { if (is_fifo) {
wait_list.push_back(waiter); wait_list.push_back(waiter);
@ -140,16 +137,13 @@ public:
} }
// Find the first with priority less then us and insert right before it. // Find the first with priority less then us and insert right before it.
auto it = wait_list.begin(); auto it = wait_list.begin();
while (it != wait_list.end() && it->priority > waiter.priority) { while (it != wait_list.end() && (*it)->priority > waiter->priority) {
it++; it++;
} }
wait_list.insert(it, waiter); wait_list.insert(it, waiter);
} }
using WaitingThreads = std::list<WaitingThread*> wait_list;
boost::intrusive::list<WaitingThread, boost::intrusive::base_hook<ListBaseHook>,
boost::intrusive::constant_time_size<false>>;
WaitingThreads wait_list;
std::string name; std::string name;
std::atomic<s32> token_count; std::atomic<s32> token_count;
std::mutex mutex; std::mutex mutex;

View File

@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <thread> #include <thread>
#include "common/assert.h" #include "common/assert.h"
#include "common/debug.h" #include "common/debug.h"
#include "common/native_clock.h" #include "common/native_clock.h"

View File

@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <cmath> #include <cmath>
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"

View File

@ -2,13 +2,18 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include "common/config.h" #include "common/config.h"
#include "core/libraries/ajm/ajm.h"
#include "core/libraries/app_content/app_content.h" #include "core/libraries/app_content/app_content.h"
#include "core/libraries/audio/audioin.h" #include "core/libraries/audio/audioin.h"
#include "core/libraries/audio/audioout.h" #include "core/libraries/audio/audioout.h"
#include "core/libraries/avplayer/avplayer.h"
#include "core/libraries/dialogs/error_dialog.h"
#include "core/libraries/dialogs/ime_dialog.h"
#include "core/libraries/disc_map/disc_map.h" #include "core/libraries/disc_map/disc_map.h"
#include "core/libraries/gnmdriver/gnmdriver.h" #include "core/libraries/gnmdriver/gnmdriver.h"
#include "core/libraries/kernel/libkernel.h" #include "core/libraries/kernel/libkernel.h"
#include "core/libraries/libc_internal/libc_internal.h" #include "core/libraries/libc_internal/libc_internal.h"
#include "core/libraries/libpng/pngdec.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"
#include "core/libraries/network/http.h" #include "core/libraries/network/http.h"
#include "core/libraries/network/net.h" #include "core/libraries/network/net.h"
@ -32,12 +37,6 @@
#include "core/libraries/system/userservice.h" #include "core/libraries/system/userservice.h"
#include "core/libraries/usbd/usbd.h" #include "core/libraries/usbd/usbd.h"
#include "core/libraries/videoout/video_out.h" #include "core/libraries/videoout/video_out.h"
#include "src/core/libraries/ajm/ajm.h"
#include "src/core/libraries/avplayer/avplayer.h"
#include "src/core/libraries/dialogs/error_dialog.h"
#include "src/core/libraries/dialogs/ime_dialog.h"
#include "src/core/libraries/libpng/pngdec.h"
#include "src/core/libraries/mouse/mouse.h"
namespace Libraries { namespace Libraries {
@ -76,7 +75,6 @@ void InitHLELibs(Core::Loader::SymbolsResolver* sym) {
Libraries::ErrorDialog::RegisterlibSceErrorDialog(sym); Libraries::ErrorDialog::RegisterlibSceErrorDialog(sym);
Libraries::ImeDialog::RegisterlibSceImeDialog(sym); Libraries::ImeDialog::RegisterlibSceImeDialog(sym);
Libraries::AvPlayer::RegisterlibSceAvPlayer(sym); Libraries::AvPlayer::RegisterlibSceAvPlayer(sym);
Libraries::Mouse::RegisterlibSceMouse(sym);
} }
} // namespace Libraries } // namespace Libraries

View File

@ -4,6 +4,7 @@
#pragma once #pragma once
#include <functional> #include <functional>
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/loader/elf.h" #include "core/loader/elf.h"
#include "core/loader/symbols_resolver.h" #include "core/loader/symbols_resolver.h"

View File

@ -1,118 +0,0 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
// Generated By moduleGenerator
#include <common/singleton.h>
#include <input/mouse.h>
#include "common/logging/log.h"
#include "core/libraries/error_codes.h"
#include "core/libraries/libs.h"
#include "mouse.h"
namespace Libraries::Mouse {
int PS4_SYSV_ABI sceMouseClose() {
LOG_ERROR(Lib_Mouse, "(STUBBED) called");
return ORBIS_OK;
}
int PS4_SYSV_ABI sceMouseConnectPort() {
LOG_ERROR(Lib_Mouse, "(STUBBED) called");
return ORBIS_OK;
}
int PS4_SYSV_ABI sceMouseDebugGetDeviceId() {
LOG_ERROR(Lib_Mouse, "(STUBBED) called");
return ORBIS_OK;
}
int PS4_SYSV_ABI sceMouseDeviceOpen() {
LOG_ERROR(Lib_Mouse, "(STUBBED) called");
return ORBIS_OK;
}
int PS4_SYSV_ABI sceMouseDisconnectDevice() {
LOG_ERROR(Lib_Mouse, "(STUBBED) called");
return ORBIS_OK;
}
int PS4_SYSV_ABI sceMouseDisconnectPort() {
LOG_ERROR(Lib_Mouse, "(STUBBED) called");
return ORBIS_OK;
}
int PS4_SYSV_ABI sceMouseGetDeviceInfo() {
LOG_ERROR(Lib_Mouse, "(STUBBED) called");
return ORBIS_OK;
}
int PS4_SYSV_ABI sceMouseInit() {
LOG_INFO(Lib_Mouse, "called");
return ORBIS_OK;
}
int PS4_SYSV_ABI sceMouseMbusInit() {
LOG_ERROR(Lib_Mouse, "(STUBBED) called");
return ORBIS_OK;
}
int PS4_SYSV_ABI sceMouseOpen(s32 userId, s32 type, s32 index, OrbisMouseOpenParam* pParam) {
LOG_INFO(Lib_Mouse, "(DUMMY) called");
return 2; // dummy
}
int PS4_SYSV_ABI sceMouseRead(s32 handle, OrbisMouseData* pData, s32 num) {
bool connected = false;
Input::MouseState states[64];
auto* mouse = Common::Singleton<Input::GameMouse>::Instance();
int ret_num = mouse->ReadStates(states, num, &connected);
if (!connected) {
ret_num = 1;
}
for (int i = 0; i < ret_num; i++) {
pData[i].buttons = states[i].buttonsState;
pData[i].connected = connected;
pData[i].timestamp = states[i].time;
pData[i].xAxis = 0;
pData[i].yAxis = 0;
pData[i].wheel = 0;
pData[i].tilt = 0;
}
return ret_num;
}
int PS4_SYSV_ABI sceMouseSetHandType() {
LOG_ERROR(Lib_Mouse, "(STUBBED) called");
return ORBIS_OK;
}
int PS4_SYSV_ABI sceMouseSetPointerSpeed() {
LOG_ERROR(Lib_Mouse, "(STUBBED) called");
return ORBIS_OK;
}
int PS4_SYSV_ABI sceMouseSetProcessPrivilege() {
LOG_ERROR(Lib_Mouse, "(STUBBED) called");
return ORBIS_OK;
}
void RegisterlibSceMouse(Core::Loader::SymbolsResolver* sym) {
LIB_FUNCTION("cAnT0Rw-IwU", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseClose);
LIB_FUNCTION("Ymyy1HSSJLQ", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseConnectPort);
LIB_FUNCTION("BRXOoXQtb+k", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseDebugGetDeviceId);
LIB_FUNCTION("WiGKINCZWkc", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseDeviceOpen);
LIB_FUNCTION("eDQTFHbgeTU", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseDisconnectDevice);
LIB_FUNCTION("jJP1vYMEPd4", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseDisconnectPort);
LIB_FUNCTION("QA9Qupz3Zjw", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseGetDeviceInfo);
LIB_FUNCTION("Qs0wWulgl7U", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseInit);
LIB_FUNCTION("1FeceR5YhAo", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseMbusInit);
LIB_FUNCTION("RaqxZIf6DvE", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseOpen);
LIB_FUNCTION("x8qnXqh-tiM", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseRead);
LIB_FUNCTION("crkFfp-cmFo", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseSetHandType);
LIB_FUNCTION("ghLUU2Z5Lcg", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseSetPointerSpeed);
LIB_FUNCTION("6aANndpS0Wo", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseSetProcessPrivilege);
};
} // namespace Libraries::Mouse

View File

@ -1,50 +0,0 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include "common/types.h"
namespace Core::Loader {
class SymbolsResolver;
}
namespace Libraries::Mouse {
struct OrbisMouseOpenParam {
u8 behaviorFlag;
u8 reserve[7];
};
struct OrbisMouseData {
u64 timestamp;
bool connected;
u32 buttons;
s32 xAxis;
s32 yAxis;
s32 wheel;
s32 tilt;
u8 reserve[8];
};
enum OrbisMouseButtonDataOffset {
ORBIS_MOUSE_BUTTON_PRIMARY = 0x00000001,
ORBIS_MOUSE_BUTTON_SECONDARY = 0x00000002
};
int PS4_SYSV_ABI sceMouseClose();
int PS4_SYSV_ABI sceMouseConnectPort();
int PS4_SYSV_ABI sceMouseDebugGetDeviceId();
int PS4_SYSV_ABI sceMouseDeviceOpen();
int PS4_SYSV_ABI sceMouseDisconnectDevice();
int PS4_SYSV_ABI sceMouseDisconnectPort();
int PS4_SYSV_ABI sceMouseGetDeviceInfo();
int PS4_SYSV_ABI sceMouseInit();
int PS4_SYSV_ABI sceMouseMbusInit();
int PS4_SYSV_ABI sceMouseOpen(s32 userId, s32 type, s32 index, OrbisMouseOpenParam* pParam);
int PS4_SYSV_ABI sceMouseRead(s32 handle, OrbisMouseData* pData, s32 num);
int PS4_SYSV_ABI sceMouseSetHandType();
int PS4_SYSV_ABI sceMouseSetPointerSpeed();
int PS4_SYSV_ABI sceMouseSetProcessPrivilege();
void RegisterlibSceMouse(Core::Loader::SymbolsResolver* sym);
} // namespace Libraries::Mouse

View File

@ -1,7 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// Generated By moduleGenerator
#include "common/config.h" #include "common/config.h"
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"

View File

@ -1,7 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// Generated By moduleGenerator
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"

View File

@ -1,7 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// Generated By moduleGenerator
#include <unordered_map> #include <unordered_map>
#include "common/logging/log.h" #include "common/logging/log.h"

View File

@ -1,11 +1,10 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// Generated By moduleGenerator #include "common/assert.h"
#include <common/assert.h>
#include <common/singleton.h>
#include "common/config.h" #include "common/config.h"
#include "common/logging/log.h" #include "common/logging/log.h"
#include "common/singleton.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"
#include "input/controller.h" #include "input/controller.h"

View File

@ -1,9 +1,9 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <core/file_format/playgo_chunk.h>
#include "common/logging/log.h" #include "common/logging/log.h"
#include "common/singleton.h" #include "common/singleton.h"
#include "core/file_format/playgo_chunk.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"
#include "core/libraries/system/systemservice.h" #include "core/libraries/system/systemservice.h"

View File

@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#pragma once #pragma once
#include "common/types.h" #include "common/types.h"
#include "playgo_types.h" #include "playgo_types.h"

View File

@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#pragma once #pragma once
#include "common/types.h" #include "common/types.h"
namespace Core::Loader { namespace Core::Loader {

View File

@ -1,8 +1,8 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// Generated By moduleGenerator
#include <chrono> #include <chrono>
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"

View File

@ -3,12 +3,13 @@
#include <span> #include <span>
#include <vector> #include <vector>
#include <common/path_util.h>
#include <common/singleton.h>
#include <core/file_format/psf.h>
#include <core/file_sys/fs.h>
#include "common/assert.h" #include "common/assert.h"
#include "common/logging/log.h" #include "common/logging/log.h"
#include "common/path_util.h"
#include "common/singleton.h"
#include "core/file_format/psf.h"
#include "core/file_sys/fs.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"
#include "core/libraries/save_data/savedata.h" #include "core/libraries/save_data/savedata.h"

View File

@ -1,7 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// Generated By moduleGenerator
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"

View File

@ -1,7 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// Generated By moduleGenerator
#include "common/logging/log.h" #include "common/logging/log.h"
#include "common/singleton.h" #include "common/singleton.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"

View File

@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#pragma once #pragma once
#include "common/types.h" #include "common/types.h"
namespace Core::Loader { namespace Core::Loader {

View File

@ -4,6 +4,7 @@
#pragma once #pragma once
#include <string_view> #include <string_view>
#include "common/assert.h" #include "common/assert.h"
#include "common/types.h" #include "common/types.h"

View File

@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <pthread.h> #include <pthread.h>
#include "common/assert.h" #include "common/assert.h"
#include "common/config.h" #include "common/config.h"
#include "common/debug.h" #include "common/debug.h"

View File

@ -10,6 +10,7 @@
#include "common/thread.h" #include "common/thread.h"
#include "core/aerolib/aerolib.h" #include "core/aerolib/aerolib.h"
#include "core/aerolib/stubs.h" #include "core/aerolib/stubs.h"
#include "core/cpu_patches.h"
#include "core/libraries/kernel/memory_management.h" #include "core/libraries/kernel/memory_management.h"
#include "core/libraries/kernel/thread_management.h" #include "core/libraries/kernel/thread_management.h"
#include "core/linker.h" #include "core/linker.h"
@ -85,6 +86,7 @@ void Linker::Execute() {
// Init primary thread. // Init primary thread.
Common::SetCurrentThreadName("GAME_MainThread"); Common::SetCurrentThreadName("GAME_MainThread");
Libraries::Kernel::pthreadInitSelfMainThread(); Libraries::Kernel::pthreadInitSelfMainThread();
InitializeThreadPatchStack();
InitTlsForThread(true); InitTlsForThread(true);
// Start shared library modules // Start shared library modules
@ -104,6 +106,8 @@ void Linker::Execute() {
RunMainEntry(m->GetEntryAddress(), &p, ProgramExitFunc); RunMainEntry(m->GetEntryAddress(), &p, ProgramExitFunc);
} }
} }
CleanupThreadPatchStack();
} }
s32 Linker::LoadModule(const std::filesystem::path& elf_name, bool is_dynamic) { s32 Linker::LoadModule(const std::filesystem::path& elf_name, bool is_dynamic) {

View File

@ -5,6 +5,9 @@
#include "common/alignment.h" #include "common/alignment.h"
#include "common/assert.h" #include "common/assert.h"
#include "common/logging/log.h" #include "common/logging/log.h"
#ifdef ENABLE_QT_GUI
#include "qt_gui/memory_patcher.h"
#endif
#include "common/string_util.h" #include "common/string_util.h"
#include "core/aerolib/aerolib.h" #include "core/aerolib/aerolib.h"
#include "core/cpu_patches.h" #include "core/cpu_patches.h"
@ -192,6 +195,16 @@ void Module::LoadModuleToMemory(u32& max_tls_index) {
const VAddr entry_addr = base_virtual_addr + elf.GetElfEntry(); const VAddr entry_addr = base_virtual_addr + elf.GetElfEntry();
LOG_INFO(Core_Linker, "program entry addr ..........: {:#018x}", entry_addr); LOG_INFO(Core_Linker, "program entry addr ..........: {:#018x}", entry_addr);
#ifdef ENABLE_QT_GUI
if (MemoryPatcher::g_eboot_address == 0) {
if (name == "eboot") {
MemoryPatcher::g_eboot_address = base_virtual_addr;
MemoryPatcher::g_eboot_image_size = base_size;
MemoryPatcher::OnGameLoaded();
}
}
#endif
} }
void Module::LoadDynamicInfo() { void Module::LoadDynamicInfo() {

View File

@ -7,6 +7,9 @@
#include "common/debug.h" #include "common/debug.h"
#include "common/logging/backend.h" #include "common/logging/backend.h"
#include "common/logging/log.h" #include "common/logging/log.h"
#ifdef ENABLE_QT_GUI
#include "qt_gui/memory_patcher.h"
#endif
#include "common/ntapi.h" #include "common/ntapi.h"
#include "common/path_util.h" #include "common/path_util.h"
#include "common/polyfill_thread.h" #include "common/polyfill_thread.h"
@ -81,6 +84,8 @@ void Emulator::Run(const std::filesystem::path& file) {
// Applications expect to be run from /app0 so mount the file's parent path as app0. // Applications expect to be run from /app0 so mount the file's parent path as app0.
auto* mnt = Common::Singleton<Core::FileSys::MntPoints>::Instance(); auto* mnt = Common::Singleton<Core::FileSys::MntPoints>::Instance();
mnt->Mount(file.parent_path(), "/app0"); mnt->Mount(file.parent_path(), "/app0");
// Certain games may use /hostapp as well such as CUSA001100
mnt->Mount(file.parent_path(), "/hostapp");
// Loading param.sfo file if exists // Loading param.sfo file if exists
std::string id; std::string id;
@ -93,6 +98,9 @@ void Emulator::Run(const std::filesystem::path& file) {
auto* param_sfo = Common::Singleton<PSF>::Instance(); auto* param_sfo = Common::Singleton<PSF>::Instance();
param_sfo->open(sce_sys_folder.string() + "/param.sfo", {}); param_sfo->open(sce_sys_folder.string() + "/param.sfo", {});
id = std::string(param_sfo->GetString("CONTENT_ID"), 7, 9); id = std::string(param_sfo->GetString("CONTENT_ID"), 7, 9);
#ifdef ENABLE_QT_GUI
MemoryPatcher::g_game_serial = id;
#endif
title = param_sfo->GetString("TITLE"); title = param_sfo->GetString("TITLE");
LOG_INFO(Loader, "Game id: {} Title: {}", id, title); LOG_INFO(Loader, "Game id: {} Title: {}", id, title);
u32 fw_version = param_sfo->GetInteger("SYSTEM_VER"); u32 fw_version = param_sfo->GetInteger("SYSTEM_VER");

View File

@ -1,80 +0,0 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include "core/libraries/kernel/time_management.h"
#include "input/mouse.h"
namespace Input {
GameMouse::GameMouse() {
m_states_num = 0;
m_last_state = MouseState();
}
int GameMouse::ReadStates(MouseState* states, int states_num, bool* isConnected) {
std::scoped_lock lock{m_mutex};
*isConnected = m_connected;
int ret_num = 0;
if (m_connected) {
if (m_states_num == 0) {
ret_num = 1;
states[0] = m_last_state;
} else {
for (uint32_t i = 0; i < m_states_num; i++) {
if (ret_num >= states_num) {
break;
}
auto index = (m_first_state + i) % MAX_MOUSE_STATES;
if (!m_private[index].obtained) {
m_private[index].obtained = true;
states[ret_num++] = m_states[index];
}
}
}
}
return ret_num;
}
MouseState GameMouse::GetLastState() const {
if (m_states_num == 0) {
return m_last_state;
}
auto last = (m_first_state + m_states_num - 1) % MAX_MOUSE_STATES;
return m_states[last];
}
void GameMouse::AddState(const MouseState& state) {
if (m_states_num >= MAX_MOUSE_STATES) {
m_states_num = MAX_MOUSE_STATES - 1;
m_first_state = (m_first_state + 1) % MAX_MOUSE_STATES;
}
auto index = (m_first_state + m_states_num) % MAX_MOUSE_STATES;
m_states[index] = state;
m_last_state = state;
m_private[index].obtained = false;
m_states_num++;
}
void GameMouse::CheckButton(int id, u32 button, bool isPressed) {
std::scoped_lock lock{m_mutex};
auto state = GetLastState();
state.time = Libraries::Kernel::sceKernelGetProcessTime();
if (isPressed) {
state.buttonsState |= button;
} else {
state.buttonsState &= ~button;
}
AddState(state);
}
}; // namespace Input

View File

@ -1,43 +0,0 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <mutex>
#include "common/types.h"
namespace Input {
struct MouseState {
u32 buttonsState = 0;
u64 time = 0;
};
constexpr u32 MAX_MOUSE_STATES = 64;
class GameMouse {
public:
GameMouse();
virtual ~GameMouse() = default;
int ReadStates(MouseState* states, int states_num, bool* isConnected);
MouseState GetLastState() const;
void CheckButton(int id, u32 button, bool isPressed);
void AddState(const MouseState& state);
private:
struct StateInternal {
bool obtained = false;
};
std::mutex m_mutex;
bool m_connected = true;
MouseState m_last_state;
int m_connected_count = 0;
u32 m_states_num = 0;
u32 m_first_state = 0;
std::array<MouseState, MAX_MOUSE_STATES> m_states;
std::array<StateInternal, MAX_MOUSE_STATES> m_private;
};
} // namespace Input

File diff suppressed because it is too large Load Diff

115
src/qt_gui/cheats_patches.h Normal file
View File

@ -0,0 +1,115 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#ifndef CHEATS_PATCHES_H
#define CHEATS_PATCHES_H
#include <QCheckBox>
#include <QComboBox>
#include <QGroupBox>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QLabel>
#include <QListView>
#include <QMap>
#include <QNetworkAccessManager>
#include <QPixmap>
#include <QPushButton>
#include <QScrollArea>
#include <QString>
#include <QTabWidget>
#include <QTextEdit>
#include <QVBoxLayout>
#include <QVector>
#include <QWidget>
class CheatsPatches : public QWidget {
Q_OBJECT
public:
CheatsPatches(const QString& gameName, const QString& gameSerial, const QString& gameVersion,
const QString& gameSize, const QPixmap& gameImage, QWidget* parent = nullptr);
~CheatsPatches();
// Public Methods
void downloadCheats(const QString& source, const QString& m_gameSerial,
const QString& m_gameVersion, bool showMessageBox);
void downloadPatches(const QString repository, const bool showMessageBox);
void createFilesJson(const QString& repository);
signals:
void downloadFinished();
private:
// UI Setup and Event Handlers
void setupUI();
void onSaveButtonClicked();
QCheckBox* findCheckBoxByName(const QString& name);
bool eventFilter(QObject* obj, QEvent* event);
void onPatchCheckBoxHovered(QCheckBox* checkBox, bool hovered);
// Cheat and Patch Management
void populateFileListCheats();
void populateFileListPatches();
void addCheatsToLayout(const QJsonArray& modsArray, const QJsonArray& creditsArray);
void addPatchesToLayout(const QString& serial);
void applyCheat(const QString& modName, bool enabled);
void applyPatch(const QString& patchName, bool enabled);
void uncheckAllCheatCheckBoxes();
void updateNoteTextEdit(const QString& patchName);
// Network Manager
QNetworkAccessManager* manager;
// Patch Info Structures
struct MemoryMod {
QString offset;
QString on;
QString off;
};
struct Cheat {
QString name;
QString type;
bool hasHint;
QVector<MemoryMod> memoryMods;
};
struct PatchInfo {
QString name;
QString author;
QString note;
QJsonArray linesArray;
QString serial;
};
// Members
QString m_gameName;
QString m_gameSerial;
QString m_gameVersion;
QString m_gameSize;
QPixmap m_gameImage;
QString m_cheatFilePath;
QMap<QString, Cheat> m_cheats;
QMap<QString, PatchInfo> m_patchInfos;
QVector<QCheckBox*> m_cheatCheckBoxes;
// UI Elements
QVBoxLayout* rightLayout;
QVBoxLayout* patchesGroupBoxLayout;
QGroupBox* patchesGroupBox;
QVBoxLayout* patchesLayout;
QTextEdit* instructionsTextEdit;
QListView* listView_selectFile;
QItemSelectionModel* selectionModel;
QComboBox* patchesComboBox;
QListView* patchesListView;
QString defaultTextEdit;
};
#endif // CHEATS_PATCHES_H

View File

@ -10,6 +10,7 @@
#include <QTreeWidget> #include <QTreeWidget>
#include <QTreeWidgetItem> #include <QTreeWidgetItem>
#include "cheats_patches.h"
#include "game_info.h" #include "game_info.h"
#include "trophy_viewer.h" #include "trophy_viewer.h"
@ -20,6 +21,7 @@
#include <shlguid.h> #include <shlguid.h>
#include <shobjidl.h> #include <shobjidl.h>
#endif #endif
#include "common/path_util.h"
class GuiContextMenus : public QObject { class GuiContextMenus : public QObject {
Q_OBJECT Q_OBJECT
@ -34,15 +36,22 @@ public:
itemID = widget->currentRow() * widget->columnCount() + widget->currentColumn(); itemID = widget->currentRow() * widget->columnCount() + widget->currentColumn();
} }
// Do not show the menu if an item is selected
if (itemID == -1) {
return;
}
// Setup menu. // Setup menu.
QMenu menu(widget); QMenu menu(widget);
QAction createShortcut(tr("Create Shortcut"), widget); QAction createShortcut(tr("Create Shortcut"), widget);
QAction openFolder(tr("Open Game Folder"), widget); QAction openFolder(tr("Open Game Folder"), widget);
QAction openCheats(tr("Cheats / Patches"), widget);
QAction openSfoViewer(tr("SFO Viewer"), widget); QAction openSfoViewer(tr("SFO Viewer"), widget);
QAction openTrophyViewer(tr("Trophy Viewer"), widget); QAction openTrophyViewer(tr("Trophy Viewer"), widget);
menu.addAction(&openFolder); menu.addAction(&openFolder);
menu.addAction(&createShortcut); menu.addAction(&createShortcut);
menu.addAction(&openCheats);
menu.addAction(&openSfoViewer); menu.addAction(&openSfoViewer);
menu.addAction(&openTrophyViewer); menu.addAction(&openTrophyViewer);
@ -121,6 +130,19 @@ public:
} }
} }
if (selected == &openCheats) {
QString gameName = QString::fromStdString(m_games[itemID].name);
QString gameSerial = QString::fromStdString(m_games[itemID].serial);
QString gameVersion = QString::fromStdString(m_games[itemID].version);
QString gameSize = QString::fromStdString(m_games[itemID].size);
QPixmap gameImage(QString::fromStdString(m_games[itemID].icon_path));
CheatsPatches* cheatsPatches =
new CheatsPatches(gameName, gameSerial, gameVersion, gameSize, gameImage);
cheatsPatches->show();
connect(widget->parent(), &QWidget::destroyed, cheatsPatches,
[cheatsPatches]() { cheatsPatches->deleteLater(); });
}
if (selected == &openTrophyViewer) { if (selected == &openTrophyViewer) {
QString trophyPath = QString::fromStdString(m_games[itemID].serial); QString trophyPath = QString::fromStdString(m_games[itemID].serial);
QString gameTrpPath = QString::fromStdString(m_games[itemID].path); QString gameTrpPath = QString::fromStdString(m_games[itemID].path);

View File

@ -5,7 +5,9 @@
#include <QProgressDialog> #include <QProgressDialog>
#include "about_dialog.h" #include "about_dialog.h"
#include "cheats_patches.h"
#include "common/io_file.h" #include "common/io_file.h"
#include "common/string_util.h"
#include "common/version.h" #include "common/version.h"
#include "core/file_format/pkg.h" #include "core/file_format/pkg.h"
#include "core/loader.h" #include "core/loader.h"
@ -164,7 +166,7 @@ void MainWindow::GetPhysicalDevices() {
auto prop = physical_device.getProperties(); auto prop = physical_device.getProperties();
QString name = QString::fromUtf8(prop.deviceName, -1); QString name = QString::fromUtf8(prop.deviceName, -1);
if (prop.apiVersion < Vulkan::TargetVulkanApiVersion) { if (prop.apiVersion < Vulkan::TargetVulkanApiVersion) {
name += " * Unsupported Vulkan Version"; name += tr(" * Unsupported Vulkan Version");
} }
m_physical_devices.push_back(name); m_physical_devices.push_back(name);
} }
@ -317,6 +319,85 @@ void MainWindow::CreateConnects() {
Config::setTableMode(2); Config::setTableMode(2);
}); });
// Cheats/Patches Download.
connect(ui->downloadCheatsPatchesAct, &QAction::triggered, this, [this]() {
QDialog* panelDialog = new QDialog(this);
QVBoxLayout* layout = new QVBoxLayout(panelDialog);
QPushButton* downloadAllCheatsButton =
new QPushButton(tr("Download Cheats For All Installed Games"), panelDialog);
QPushButton* downloadAllPatchesButton =
new QPushButton(tr("Download Patches For All Games"), panelDialog);
layout->addWidget(downloadAllCheatsButton);
layout->addWidget(downloadAllPatchesButton);
panelDialog->setLayout(layout);
connect(downloadAllCheatsButton, &QPushButton::clicked, this, [this, panelDialog]() {
QEventLoop eventLoop;
int pendingDownloads = 0;
auto onDownloadFinished = [&]() {
if (--pendingDownloads <= 0) {
eventLoop.quit();
}
};
for (const GameInfo& game : m_game_info->m_games) {
QString empty = "";
QString gameSerial = QString::fromStdString(game.serial);
QString gameVersion = QString::fromStdString(game.version);
CheatsPatches* cheatsPatches =
new CheatsPatches(empty, empty, empty, empty, empty, nullptr);
connect(cheatsPatches, &CheatsPatches::downloadFinished, onDownloadFinished);
pendingDownloads += 3;
cheatsPatches->downloadCheats("wolf2022", gameSerial, gameVersion, false);
cheatsPatches->downloadCheats("GoldHEN", gameSerial, gameVersion, false);
cheatsPatches->downloadCheats("shadPS4", gameSerial, gameVersion, false);
}
eventLoop.exec();
QMessageBox::information(
nullptr, tr("Download Complete"),
tr("You have downloaded cheats for all the games you have installed."));
panelDialog->accept();
});
connect(downloadAllPatchesButton, &QPushButton::clicked, [panelDialog]() {
QEventLoop eventLoop;
int pendingDownloads = 0;
auto onDownloadFinished = [&]() {
if (--pendingDownloads <= 0) {
eventLoop.quit();
}
};
QString empty = "";
CheatsPatches* cheatsPatches =
new CheatsPatches(empty, empty, empty, empty, empty, nullptr);
connect(cheatsPatches, &CheatsPatches::downloadFinished, onDownloadFinished);
pendingDownloads += 2;
cheatsPatches->downloadPatches("GoldHEN", false);
cheatsPatches->downloadPatches("shadPS4", false);
eventLoop.exec();
QMessageBox::information(
nullptr, tr("Download Complete"),
QString(tr("Patches Downloaded Successfully!") + "\n" +
tr("All Patches available for all games have been downloaded.")));
cheatsPatches->createFilesJson("GoldHEN");
cheatsPatches->createFilesJson("shadPS4");
panelDialog->accept();
});
panelDialog->exec();
});
// Dump game list. // Dump game list.
connect(ui->dumpGameListAct, &QAction::triggered, this, [&] { connect(ui->dumpGameListAct, &QAction::triggered, this, [&] {
QString filePath = qApp->applicationDirPath().append("/GameList.txt"); QString filePath = qApp->applicationDirPath().append("/GameList.txt");
@ -468,7 +549,7 @@ void MainWindow::RefreshGameTable() {
m_game_grid_frame->PopulateGameGrid(m_game_info->m_games, false); m_game_grid_frame->PopulateGameGrid(m_game_info->m_games, false);
statusBar->clearMessage(); statusBar->clearMessage();
int numGames = m_game_info->m_games.size(); int numGames = m_game_info->m_games.size();
QString statusMessage = "Games: " + QString::number(numGames); QString statusMessage = tr("Games: ") + QString::number(numGames);
statusBar->showMessage(statusMessage); statusBar->showMessage(statusMessage);
} }
@ -519,7 +600,8 @@ void MainWindow::BootGame() {
int nFiles = fileNames.size(); int nFiles = fileNames.size();
if (nFiles > 1) { if (nFiles > 1) {
QMessageBox::critical(nullptr, "Game Boot", QString("Only one file can be selected!")); QMessageBox::critical(nullptr, tr("Game Boot"),
QString(tr("Only one file can be selected!")));
} else { } else {
std::filesystem::path path(fileNames[0].toStdString()); std::filesystem::path path(fileNames[0].toStdString());
#ifdef _WIN64 #ifdef _WIN64
@ -536,38 +618,48 @@ void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int
pkg = PKG(); pkg = PKG();
pkg.Open(file); pkg.Open(file);
std::string failreason; std::string failreason;
const auto extract_path = auto extract_path = std::filesystem::path(Config::getGameInstallDir()) / pkg.GetTitleID();
std::filesystem::path(Config::getGameInstallDir()) / pkg.GetTitleID();
QString pkgType = QString::fromStdString(pkg.GetPkgFlags()); QString pkgType = QString::fromStdString(pkg.GetPkgFlags());
QDir game_dir(QString::fromStdString(extract_path.string())); QDir game_dir(QString::fromStdString(extract_path.string()));
if (game_dir.exists()) { if (game_dir.exists()) {
QMessageBox msgBox; QMessageBox msgBox;
msgBox.setWindowTitle("PKG Extraction"); msgBox.setWindowTitle(tr("PKG Extraction"));
psf.open("", pkg.sfo);
std::string content_id = psf.GetString("CONTENT_ID");
std::string entitlement_label = Common::SplitString(content_id, '-')[2];
auto addon_extract_path = Common::FS::GetUserPath(Common::FS::PathType::AddonsDir) /
pkg.GetTitleID() / entitlement_label;
QDir addon_dir(QString::fromStdString(addon_extract_path.string()));
auto category = psf.GetString("CATEGORY");
if (pkgType.contains("PATCH")) { if (pkgType.contains("PATCH")) {
psf.open("", pkg.sfo);
QString pkg_app_version = QString::fromStdString(psf.GetString("APP_VER")); QString pkg_app_version = QString::fromStdString(psf.GetString("APP_VER"));
psf.open(extract_path.string() + "/sce_sys/param.sfo", {}); psf.open(extract_path.string() + "/sce_sys/param.sfo", {});
QString game_app_version = QString::fromStdString(psf.GetString("APP_VER")); QString game_app_version = QString::fromStdString(psf.GetString("APP_VER"));
double appD = game_app_version.toDouble(); double appD = game_app_version.toDouble();
double pkgD = pkg_app_version.toDouble(); double pkgD = pkg_app_version.toDouble();
if (pkgD == appD) { if (pkgD == appD) {
msgBox.setText( msgBox.setText(QString(tr("Patch detected!") + "\n" +
QString("Patch detected!\nPKG and Game versions match!: %1\nWould you like " tr("PKG and Game versions match: ") + pkg_app_version +
"to overwrite?") "\n" + tr("Would you like to overwrite?")));
.arg(pkg_app_version));
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
msgBox.setDefaultButton(QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No);
} else if (pkgD < appD) { } else if (pkgD < appD) {
msgBox.setText(QString("Patch detected!\nPKG Version %1 is older " msgBox.setText(QString(tr("Patch detected!") + "\n" +
"than installed version!: %2\nWould you like " tr("PKG Version %1 is older than installed version: ")
"to overwrite?") .arg(pkg_app_version) +
.arg(pkg_app_version, game_app_version)); game_app_version + "\n" +
tr("Would you like to overwrite?")));
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
msgBox.setDefaultButton(QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No);
} else { } else {
msgBox.setText(QString("Patch detected!\nGame is installed: %1\nWould you like " msgBox.setText(QString(tr("Patch detected!") + "\n" +
"to install Patch: %2?") tr("Game is installed: ") + game_app_version + "\n" +
.arg(game_app_version, pkg_app_version)); tr("Would you like to install Patch: ") +
pkg_app_version + " ?"));
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
msgBox.setDefaultButton(QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No);
} }
@ -577,9 +669,38 @@ void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int
} else { } else {
return; return;
} }
} else if (category == "ac") {
if (!addon_dir.exists()) {
QMessageBox addonMsgBox;
addonMsgBox.setWindowTitle(tr("DLC Installation"));
addonMsgBox.setText(QString(tr("Would you like to install DLC: %1?"))
.arg(QString::fromStdString(entitlement_label)));
addonMsgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
addonMsgBox.setDefaultButton(QMessageBox::No);
int result = addonMsgBox.exec();
if (result == QMessageBox::Yes) {
extract_path = addon_extract_path;
} else {
return;
}
} else {
msgBox.setText(QString(tr("DLC already installed:") + "\n" +
QString::fromStdString(addon_extract_path.string()) +
"\n\n" + tr("Would you like to overwrite?")));
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
msgBox.setDefaultButton(QMessageBox::No);
int result = msgBox.exec();
if (result == QMessageBox::Yes) {
extract_path = addon_extract_path;
} else {
return;
}
}
} else { } else {
msgBox.setText(QString("Game already installed\n%1\nWould you like to overwrite?") msgBox.setText(QString(tr("Game already installed") + "\n" +
.arg(QString::fromStdString(extract_path.string()))); QString::fromStdString(extract_path.string()) + "\n" +
tr("Would you like to overwrite?")));
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
msgBox.setDefaultButton(QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No);
int result = msgBox.exec(); int result = msgBox.exec();
@ -592,59 +713,63 @@ void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int
} else { } else {
// Do nothing; // Do nothing;
if (pkgType.contains("PATCH")) { if (pkgType.contains("PATCH")) {
QMessageBox::information(this, "PKG Extraction", QMessageBox::information(this, tr("PKG Extraction"),
"PKG is a patch, please install the game first!"); tr("PKG is a patch, please install the game first!"));
return; return;
} }
// what else? // what else?
} }
if (!pkg.Extract(file, extract_path, failreason)) { if (!pkg.Extract(file, extract_path, failreason)) {
QMessageBox::critical(this, "PKG ERROR", QString::fromStdString(failreason)); QMessageBox::critical(this, tr("PKG ERROR"), QString::fromStdString(failreason));
} else { } else {
int nfiles = pkg.GetNumberOfFiles(); int nfiles = pkg.GetNumberOfFiles();
QVector<int> indices; if (nfiles > 0) {
for (int i = 0; i < nfiles; i++) { QVector<int> indices;
indices.append(i); for (int i = 0; i < nfiles; i++) {
} indices.append(i);
QProgressDialog dialog;
dialog.setWindowTitle("PKG Extraction");
dialog.setWindowModality(Qt::WindowModal);
QString extractmsg = QString("Extracting PKG %1/%2").arg(pkgNum).arg(nPkg);
dialog.setLabelText(extractmsg);
dialog.setAutoClose(true);
dialog.setRange(0, nfiles);
QFutureWatcher<void> futureWatcher;
connect(&futureWatcher, &QFutureWatcher<void>::finished, this, [=, this]() {
if (pkgNum == nPkg) {
QString path = QString::fromStdString(Config::getGameInstallDir());
QMessageBox extractMsgBox(this);
extractMsgBox.setWindowTitle("Extraction Finished");
extractMsgBox.setText(QString("Game successfully installed at %1").arg(path));
extractMsgBox.addButton(QMessageBox::Ok);
extractMsgBox.setDefaultButton(QMessageBox::Ok);
connect(&extractMsgBox, &QMessageBox::buttonClicked, this,
[&](QAbstractButton* button) {
if (extractMsgBox.button(QMessageBox::Ok) == button) {
extractMsgBox.close();
emit ExtractionFinished();
}
});
extractMsgBox.exec();
} }
});
connect(&dialog, &QProgressDialog::canceled, [&]() { futureWatcher.cancel(); }); QProgressDialog dialog;
connect(&futureWatcher, &QFutureWatcher<void>::progressValueChanged, &dialog, dialog.setWindowTitle(tr("PKG Extraction"));
&QProgressDialog::setValue); dialog.setWindowModality(Qt::WindowModal);
futureWatcher.setFuture( QString extractmsg = QString(tr("Extracting PKG %1/%2")).arg(pkgNum).arg(nPkg);
QtConcurrent::map(indices, [&](int index) { pkg.ExtractFiles(index); })); dialog.setLabelText(extractmsg);
dialog.exec(); dialog.setAutoClose(true);
dialog.setRange(0, nfiles);
QFutureWatcher<void> futureWatcher;
connect(&futureWatcher, &QFutureWatcher<void>::finished, this, [=, this]() {
if (pkgNum == nPkg) {
QString path = QString::fromStdString(Config::getGameInstallDir());
QMessageBox extractMsgBox(this);
extractMsgBox.setWindowTitle(tr("Extraction Finished"));
extractMsgBox.setText(
QString(tr("Game successfully installed at %1")).arg(path));
extractMsgBox.addButton(QMessageBox::Ok);
extractMsgBox.setDefaultButton(QMessageBox::Ok);
connect(&extractMsgBox, &QMessageBox::buttonClicked, this,
[&](QAbstractButton* button) {
if (extractMsgBox.button(QMessageBox::Ok) == button) {
extractMsgBox.close();
emit ExtractionFinished();
}
});
extractMsgBox.exec();
}
});
connect(&dialog, &QProgressDialog::canceled, [&]() { futureWatcher.cancel(); });
connect(&futureWatcher, &QFutureWatcher<void>::progressValueChanged, &dialog,
&QProgressDialog::setValue);
futureWatcher.setFuture(
QtConcurrent::map(indices, [&](int index) { pkg.ExtractFiles(index); }));
dialog.exec();
}
} }
} else { } else {
QMessageBox::critical(this, "PKG ERROR", "File doesn't appear to be a valid PKG file"); QMessageBox::critical(this, tr("PKG ERROR"),
tr("File doesn't appear to be a valid PKG file"));
} }
} }

View File

@ -25,6 +25,7 @@ public:
QAction* setlistModeGridAct; QAction* setlistModeGridAct;
QAction* setlistElfAct; QAction* setlistElfAct;
QAction* gameInstallPathAct; QAction* gameInstallPathAct;
QAction* downloadCheatsPatchesAct;
QAction* dumpGameListAct; QAction* dumpGameListAct;
QAction* pkgViewerAct; QAction* pkgViewerAct;
QAction* aboutAct; QAction* aboutAct;
@ -120,11 +121,12 @@ public:
gameInstallPathAct = new QAction(MainWindow); gameInstallPathAct = new QAction(MainWindow);
gameInstallPathAct->setObjectName("gameInstallPathAct"); gameInstallPathAct->setObjectName("gameInstallPathAct");
gameInstallPathAct->setIcon(QIcon(":images/folder_icon.png")); gameInstallPathAct->setIcon(QIcon(":images/folder_icon.png"));
downloadCheatsPatchesAct = new QAction(MainWindow);
downloadCheatsPatchesAct->setObjectName("downloadCheatsPatchesAct");
dumpGameListAct = new QAction(MainWindow); dumpGameListAct = new QAction(MainWindow);
dumpGameListAct->setObjectName("dumpGameList"); dumpGameListAct->setObjectName("dumpGameList");
pkgViewerAct = new QAction(MainWindow); pkgViewerAct = new QAction(MainWindow);
pkgViewerAct->setObjectName("pkgViewer"); pkgViewerAct->setObjectName("pkgViewer");
pkgViewerAct->setObjectName("pkgViewer");
pkgViewerAct->setIcon(QIcon(":images/file_icon.png")); pkgViewerAct->setIcon(QIcon(":images/file_icon.png"));
aboutAct = new QAction(MainWindow); aboutAct = new QAction(MainWindow);
aboutAct->setObjectName("aboutAct"); aboutAct->setObjectName("aboutAct");
@ -277,6 +279,7 @@ public:
menuSettings->addAction(configureAct); menuSettings->addAction(configureAct);
menuSettings->addAction(gameInstallPathAct); menuSettings->addAction(gameInstallPathAct);
menuSettings->addAction(menuUtils->menuAction()); menuSettings->addAction(menuUtils->menuAction());
menuUtils->addAction(downloadCheatsPatchesAct);
menuUtils->addAction(dumpGameListAct); menuUtils->addAction(dumpGameListAct);
menuUtils->addAction(pkgViewerAct); menuUtils->addAction(pkgViewerAct);
menuAbout->addAction(aboutAct); menuAbout->addAction(aboutAct);
@ -323,6 +326,8 @@ public:
setlistElfAct->setText(QCoreApplication::translate("MainWindow", "Elf Viewer", nullptr)); setlistElfAct->setText(QCoreApplication::translate("MainWindow", "Elf Viewer", nullptr));
gameInstallPathAct->setText( gameInstallPathAct->setText(
QCoreApplication::translate("MainWindow", "Game Install Directory", nullptr)); QCoreApplication::translate("MainWindow", "Game Install Directory", nullptr));
downloadCheatsPatchesAct->setText(
QCoreApplication::translate("MainWindow", "Download Cheats/Patches", nullptr));
dumpGameListAct->setText( dumpGameListAct->setText(
QCoreApplication::translate("MainWindow", "Dump Game List", nullptr)); QCoreApplication::translate("MainWindow", "Dump Game List", nullptr));
pkgViewerAct->setText(QCoreApplication::translate("MainWindow", "PKG Viewer", nullptr)); pkgViewerAct->setText(QCoreApplication::translate("MainWindow", "PKG Viewer", nullptr));

View File

@ -0,0 +1,347 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include <algorithm>
#include <string>
#include <QFile>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QListView>
#include <QMessageBox>
#include <QXmlStreamReader>
#include "common/logging/log.h"
#include "common/path_util.h"
#include "memory_patcher.h"
namespace MemoryPatcher {
uintptr_t g_eboot_address;
u64 g_eboot_image_size;
std::string g_game_serial;
std::vector<patchInfo> pending_patches;
QString toHex(unsigned long long value, size_t byteSize) {
std::stringstream ss;
ss << std::hex << std::setfill('0') << std::setw(byteSize * 2) << value;
return QString::fromStdString(ss.str());
}
QString convertValueToHex(const QString& type, const QString& valueStr) {
QString result;
std::string typeStr = type.toStdString();
std::string valueStrStd = valueStr.toStdString();
if (typeStr == "byte") {
unsigned int value = std::stoul(valueStrStd, nullptr, 16);
result = toHex(value, 1);
} else if (typeStr == "bytes16") {
unsigned int value = std::stoul(valueStrStd, nullptr, 16);
result = toHex(value, 2);
} else if (typeStr == "bytes32") {
unsigned long value = std::stoul(valueStrStd, nullptr, 16);
result = toHex(value, 4);
} else if (typeStr == "bytes64") {
unsigned long long value = std::stoull(valueStrStd, nullptr, 16);
result = toHex(value, 8);
} else if (typeStr == "float32") {
union {
float f;
uint32_t i;
} floatUnion;
floatUnion.f = std::stof(valueStrStd);
result = toHex(floatUnion.i, sizeof(floatUnion.i));
} else if (typeStr == "float64") {
union {
double d;
uint64_t i;
} doubleUnion;
doubleUnion.d = std::stod(valueStrStd);
result = toHex(doubleUnion.i, sizeof(doubleUnion.i));
} else if (typeStr == "utf8") {
QByteArray byteArray = QString::fromStdString(valueStrStd).toUtf8();
byteArray.append('\0');
std::stringstream ss;
for (unsigned char c : byteArray) {
ss << std::hex << std::setfill('0') << std::setw(2) << static_cast<int>(c);
}
result = QString::fromStdString(ss.str());
} else if (typeStr == "utf16") {
QByteArray byteArray(
reinterpret_cast<const char*>(QString::fromStdString(valueStrStd).utf16()),
QString::fromStdString(valueStrStd).size() * 2);
byteArray.append('\0');
byteArray.append('\0');
std::stringstream ss;
for (unsigned char c : byteArray) {
ss << std::hex << std::setfill('0') << std::setw(2) << static_cast<int>(c);
}
result = QString::fromStdString(ss.str());
} else if (typeStr == "bytes") {
result = valueStr;
} else if (typeStr == "mask" || typeStr == "mask_jump32") {
result = valueStr;
} else {
LOG_INFO(Loader, "Error applying Patch, unknown type: {}", typeStr);
}
return result;
}
void OnGameLoaded() {
// We use the QT headers for the xml and json parsing, this define is only true on QT builds
QString patchDir =
QString::fromStdString(Common::FS::GetUserPath(Common::FS::PathType::PatchesDir).string());
QString repositories[] = {"GoldHEN", "shadPS4"};
for (const QString& repository : repositories) {
QString filesJsonPath = patchDir + "/" + repository + "/files.json";
QFile jsonFile(filesJsonPath);
if (!jsonFile.open(QIODevice::ReadOnly)) {
LOG_ERROR(Loader, "Unable to open files.json for reading.");
continue;
}
QByteArray jsonData = jsonFile.readAll();
jsonFile.close();
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData);
QJsonObject jsonObject = jsonDoc.object();
QString selectedFileName;
QString serial = QString::fromStdString(g_game_serial);
for (auto it = jsonObject.constBegin(); it != jsonObject.constEnd(); ++it) {
QString filePath = it.key();
QJsonArray idsArray = it.value().toArray();
if (idsArray.contains(QJsonValue(serial))) {
selectedFileName = filePath;
break;
}
}
if (selectedFileName.isEmpty()) {
LOG_ERROR(Loader, "No patch file found for the current serial.");
continue;
}
QString filePath = patchDir + "/" + repository + "/" + selectedFileName;
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
LOG_ERROR(Loader, "Unable to open the file for reading.");
continue;
}
QByteArray xmlData = file.readAll();
file.close();
QString newXmlData;
QXmlStreamReader xmlReader(xmlData);
bool insideMetadata = false;
bool isEnabled = false;
std::string currentPatchName;
while (!xmlReader.atEnd()) {
xmlReader.readNext();
if (xmlReader.isStartElement()) {
QJsonArray patchLines;
if (xmlReader.name() == QStringLiteral("Metadata")) {
insideMetadata = true;
QString name = xmlReader.attributes().value("Name").toString();
currentPatchName = name.toStdString();
// Check and update the isEnabled attribute
for (const QXmlStreamAttribute& attr : xmlReader.attributes()) {
if (attr.name() == QStringLiteral("isEnabled")) {
if (attr.value().toString() == "true") {
isEnabled = true;
} else
isEnabled = false;
}
}
} else if (xmlReader.name() == QStringLiteral("PatchList")) {
QJsonArray linesArray;
while (!xmlReader.atEnd() &&
!(xmlReader.tokenType() == QXmlStreamReader::EndElement &&
xmlReader.name() == QStringLiteral("PatchList"))) {
xmlReader.readNext();
if (xmlReader.tokenType() == QXmlStreamReader::StartElement &&
xmlReader.name() == QStringLiteral("Line")) {
QXmlStreamAttributes attributes = xmlReader.attributes();
QJsonObject lineObject;
lineObject["Type"] = attributes.value("Type").toString();
lineObject["Address"] = attributes.value("Address").toString();
lineObject["Value"] = attributes.value("Value").toString();
linesArray.append(lineObject);
}
}
patchLines = linesArray;
if (isEnabled) {
foreach (const QJsonValue& value, patchLines) {
QJsonObject lineObject = value.toObject();
QString type = lineObject["Type"].toString();
QString address = lineObject["Address"].toString();
QString patchValue = lineObject["Value"].toString();
QString maskOffsetStr = lineObject["Offset"].toString();
patchValue = convertValueToHex(type, patchValue);
bool littleEndian = false;
if (type == "bytes16") {
littleEndian = true;
} else if (type == "bytes32") {
littleEndian = true;
} else if (type == "bytes64") {
littleEndian = true;
}
MemoryPatcher::PatchMask patchMask = MemoryPatcher::PatchMask::None;
int maskOffsetValue = 0;
if (type == "mask") {
patchMask = MemoryPatcher::PatchMask::Mask;
// im not sure if this works, there is no games to test the mask
// offset on yet
if (!maskOffsetStr.toStdString().empty())
maskOffsetValue = std::stoi(maskOffsetStr.toStdString(), 0, 10);
}
if (type == "mask_jump32")
patchMask = MemoryPatcher::PatchMask::Mask_Jump32;
MemoryPatcher::PatchMemory(currentPatchName, address.toStdString(),
patchValue.toStdString(), false,
littleEndian, patchMask);
}
}
}
}
}
if (xmlReader.hasError()) {
LOG_ERROR(Loader, "Failed to parse XML for {}", g_game_serial);
} else {
LOG_INFO(Loader, "Patches loaded successfully");
}
ApplyPendingPatches();
}
}
void AddPatchToQueue(patchInfo patchToAdd) {
pending_patches.push_back(patchToAdd);
}
void ApplyPendingPatches() {
for (size_t i = 0; i < pending_patches.size(); ++i) {
patchInfo currentPatch = pending_patches[i];
if (currentPatch.gameSerial != g_game_serial)
continue;
PatchMemory(currentPatch.modNameStr, currentPatch.offsetStr, currentPatch.valueStr,
currentPatch.isOffset, currentPatch.littleEndian, currentPatch.patchMask,
currentPatch.maskOffset);
}
pending_patches.clear();
}
void PatchMemory(std::string modNameStr, std::string offsetStr, std::string valueStr, bool isOffset,
bool littleEndian, PatchMask patchMask, int maskOffset) {
// Send a request to modify the process memory.
void* cheatAddress = nullptr;
if (patchMask == PatchMask::None) {
if (isOffset) {
cheatAddress = reinterpret_cast<void*>(g_eboot_address + std::stoi(offsetStr, 0, 16));
} else {
cheatAddress =
reinterpret_cast<void*>(g_eboot_address + (std::stoi(offsetStr, 0, 16) - 0x400000));
}
}
if (patchMask == PatchMask::Mask) {
cheatAddress = reinterpret_cast<void*>(PatternScan(offsetStr) + maskOffset);
}
// TODO: implement mask_jump32
if (cheatAddress == nullptr) {
LOG_ERROR(Loader, "Failed to get address for patch {}", modNameStr);
return;
}
std::vector<unsigned char> bytePatch;
for (size_t i = 0; i < valueStr.length(); i += 2) {
unsigned char byte =
static_cast<unsigned char>(std::strtol(valueStr.substr(i, 2).c_str(), nullptr, 16));
bytePatch.push_back(byte);
}
if (littleEndian) {
std::reverse(bytePatch.begin(), bytePatch.end());
}
std::memcpy(cheatAddress, bytePatch.data(), bytePatch.size());
LOG_INFO(Loader, "Applied patch: {}, Offset: {}, Value: {}", modNameStr,
(uintptr_t)cheatAddress, valueStr);
}
static std::vector<int32_t> PatternToByte(const std::string& pattern) {
std::vector<int32_t> bytes;
const char* start = pattern.data();
const char* end = start + pattern.size();
for (const char* current = start; current < end; ++current) {
if (*current == '?') {
++current;
if (*current == '?')
++current;
bytes.push_back(-1);
} else {
bytes.push_back(strtoul(current, const_cast<char**>(&current), 16));
}
}
return bytes;
}
uintptr_t PatternScan(const std::string& signature) {
std::vector<int32_t> patternBytes = PatternToByte(signature);
const auto scanBytes = static_cast<uint8_t*>((void*)g_eboot_address);
const int32_t* sigPtr = patternBytes.data();
const size_t sigSize = patternBytes.size();
uint32_t foundResults = 0;
for (uint32_t i = 0; i < g_eboot_image_size - sigSize; ++i) {
bool found = true;
for (uint32_t j = 0; j < sigSize; ++j) {
if (scanBytes[i + j] != sigPtr[j] && sigPtr[j] != -1) {
found = false;
break;
}
}
if (found) {
foundResults++;
return reinterpret_cast<uintptr_t>(&scanBytes[i]);
}
}
return 0;
}
} // namespace MemoryPatcher

View File

@ -0,0 +1,47 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <cstring>
#include <string>
#include <vector>
#include <QString>
namespace MemoryPatcher {
extern uintptr_t g_eboot_address;
extern u64 g_eboot_image_size;
extern std::string g_game_serial;
enum PatchMask : uint8_t {
None,
Mask,
Mask_Jump32,
};
struct patchInfo {
std::string gameSerial;
std::string modNameStr;
std::string offsetStr;
std::string valueStr;
bool isOffset;
bool littleEndian;
PatchMask patchMask;
int maskOffset;
};
extern std::vector<patchInfo> pending_patches;
QString convertValueToHex(const QString& type, const QString& valueStr);
void OnGameLoaded();
void AddPatchToQueue(patchInfo patchToAdd);
void ApplyPendingPatches();
void PatchMemory(std::string modNameStr, std::string offsetStr, std::string valueStr, bool isOffset,
bool littleEndian, PatchMask patchMask = PatchMask::None, int maskOffset = 0);
static std::vector<int32_t> PatternToByte(const std::string& pattern);
uintptr_t PatternScan(const std::string& signature);
} // namespace MemoryPatcher

View File

@ -81,67 +81,72 @@
<context> <context>
<name>GuiContextMenus</name> <name>GuiContextMenus</name>
<message> <message>
<location filename="../gui_context_menus.h" line="39"/> <location filename="../gui_context_menus.h" line="46"/>
<source>Create Shortcut</source> <source>Create Shortcut</source>
<translation>Create Shortcut</translation> <translation>Create Shortcut</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="40"/> <location filename="../gui_context_menus.h" line="47"/>
<source>Open Game Folder</source> <source>Open Game Folder</source>
<translation>Open Game Folder</translation> <translation>Open Game Folder</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="41"/> <location filename="../gui_context_menus.h" line="48"/>
<source>Cheats / Patches</source>
<translation>Trick / Patches</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>SFO Viewer</source> <source>SFO Viewer</source>
<translation>SFO Viewer</translation> <translation>SFO Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="42"/> <location filename="../gui_context_menus.h" line="50"/>
<source>Trophy Viewer</source> <source>Trophy Viewer</source>
<translation>Trophy Viewer</translation> <translation>Trophy Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="50"/> <location filename="../gui_context_menus.h" line="59"/>
<source>Copy info</source> <source>Copy info</source>
<translation>Copy info</translation> <translation>Copy info</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="51"/> <location filename="../gui_context_menus.h" line="60"/>
<source>Copy Name</source> <source>Copy Name</source>
<translation>Copy Name</translation> <translation>Copy Name</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="52"/> <location filename="../gui_context_menus.h" line="61"/>
<source>Copy Serial</source> <source>Copy Serial</source>
<translation>Copy Serial</translation> <translation>Copy Serial</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="53"/> <location filename="../gui_context_menus.h" line="62"/>
<source>Copy All</source> <source>Copy All</source>
<translation>Copy All</translation> <translation>Copy All</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="173"/> <location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source> <source>Shortcut creation</source>
<translation>Shortcut creation</translation> <translation>Shortcut creation</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="174"/> <location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source> <source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation> <translation>Shortcut created successfully!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="177"/> <location filename="../gui_context_menus.h" line="199"/>
<source>Error</source> <source>Error</source>
<translation>Error</translation> <translation>Error</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="178"/> <location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source> <source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation> <translation>Error creating shortcut!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="253"/> <location filename="../gui_context_menus.h" line="275"/>
<source>Install PKG</source> <source>Install PKG</source>
<translation>Install PKG</translation> <translation>Install PKG</translation>
</message> </message>
@ -248,6 +253,11 @@
<source>Game Install Directory</source> <source>Game Install Directory</source>
<translation>Game Install Directory</translation> <translation>Game Install Directory</translation>
</message> </message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation>Download Tricks / Patches</translation>
</message>
<message> <message>
<location filename="../main_window_ui.h" line="345"/> <location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source> <source>Dump Game List</source>
@ -487,5 +497,406 @@
<source>Enable RenderDoc Debugging</source> <source>Enable RenderDoc Debugging</source>
<translation>Enable RenderDoc Debugging</translation> <translation>Enable RenderDoc Debugging</translation>
</message> </message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation> * Ikke understøttet Vulkan-version</translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source>
<translation>Hent snyd til alle installerede spil</translation>
</message>
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation>Hent patches til alle spil</translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
<source>Download Complete</source>
<translation>Download fuldført</translation>
</message>
<message>
<location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source>
<translation>Du har hentet snyd til alle de spil, du har installeret.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="391"/>
<source>Patches Downloaded Successfully!</source>
<translation>Patcher hentet med succes!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="392"/>
<source>All Patches available for all games have been downloaded.</source>
<translation>Alle patches til alle spil er blevet hentet.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="549"/>
<source>Games: </source>
<translation>Spil: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="575"/>
<source>PKG File (*.PKG)</source>
<translation>PKG-fil (*.PKG)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>ELF-filer (*.bin *.elf *.oelf)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Game Boot</source>
<translation>Spil-boot</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Only one file can be selected!</source>
<translation>Kun én fil kan vælges!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>PKG-udtrækning</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>Patch detected!</source>
<translation>Opdatering detekteret!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source>
<translation>PKG og spilversioner matcher: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
<source>Would you like to overwrite?</source>
<translation>Vil du overskrive?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>PKG Version %1 is older than installed version: </source>
<translation>PKG Version %1 er ældre end den installerede version: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Spillet er installeret: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Vil du installere opdateringen: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source>
<translation>DLC Installation</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source>
<translation>Vil du installere DLC: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC allerede installeret:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Spillet er allerede installeret</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>PKG er en patch, venligst installer spillet først!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source>
<translation>PKG FEJL</translation>
</message>
<message>
<location filename="../main_window.cpp" line="693"/>
<source>Extracting PKG %1/%2</source>
<translation>Udvinding af PKG %1/%2</translation>
</message>
<message>
<location filename="../main_window.cpp" line="703"/>
<source>Extraction Finished</source>
<translation>Udvinding afsluttet</translation>
</message>
<message>
<location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source>
<translation>Spillet blev installeret succesfuldt %1</translation>
</message>
<message>
<location filename="../main_window.cpp" line="725"/>
<source>File doesn't appear to be a valid PKG file</source>
<translation>Filen ser ikke ud til at være en gyldig PKG-fil</translation>
</message>
</context>
<context>
<name>CheatsPatches</name>
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source>
<translation>Snyd / Patches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>Cheats/Patches er eksperimentelle.\nBrug med forsigtighed.\n\nDownload cheats individuelt ved at vælge lageret og klikke download-knappen.\nUnder fanen Patches kan du downloade alle patches én gang, vælge hvilke du vil bruge og gemme valget.\n\nDa vi ikke udvikler cheats/patches,\nvenligst rapporter problemer til cheat-udvikleren.\n\nHar du lavet en ny cheat? Besøg:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
<source>No Image Available</source>
<translation>Ingen billede tilgængelig</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source>
<translation>Serienummer: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>Version: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source>
<translation>Størrelse: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source>
<translation>Vælg snyd-fil:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source>
<translation>Repository:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source>
<translation>Hent snyd</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Delete File</source>
<translation>Slet fil</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="169"/>
<source>No files selected.</source>
<translation>Ingen filer valgt.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source>
<translation>Du kan slette de snyd, du ikke ønsker, efter at have hentet dem.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>Ønsker du at slette den valgte fil?\n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source>
<translation>Vælg patch-fil:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation>Hent patches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
<source>Save</source>
<translation>Gem</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation>Snyd</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
<source>Patches</source>
<translation>Patches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>Error</source>
<translation>Fejl</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>No patch selected.</source>
<translation>Ingen patch valgt.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="292"/>
<source>Unable to open files.json for reading.</source>
<translation>Kan ikke åbne files.json til læsning.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source>
<translation>Ingen patch-fil fundet for det nuværende serienummer.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="323"/>
<source>Unable to open the file for reading.</source>
<translation>Kan ikke åbne filen til læsning.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="422"/>
<source>Unable to open the file for writing.</source>
<translation>Kan ikke åbne filen til skrivning.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source>
<translation>Kunne ikke analysere XML: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Success</source>
<translation>Succes</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Options saved successfully.</source>
<translation>Indstillinger gemt med succes.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation>Ugyldig kilde</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
<source>The selected source is invalid.</source>
<translation>Den valgte kilde er ugyldig.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation>Fil findes</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
<source>File already exists. Do you want to replace it?</source>
<translation>Filen findes allerede. Vil du erstatte den?</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source>
<translation>Kunne ikke gemme fil:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source>
<translation>Kunne ikke hente fil:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation>Snyd ikke fundet</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source>
<translation>Ingen snyd fundet til dette spil i denne version af det valgte repository, prøv et andet repository eller en anden version af spillet.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation>Snyd hentet med succes</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation>Du har succesfuldt hentet snyd for denne version af spillet fra det valgte repository. Du kan prøve at hente fra et andet repository, hvis det er tilgængeligt, vil det også være muligt at bruge det ved at vælge filen fra listen.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source>
<translation>Kunne ikke gemme:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source>
<translation>Kunne ikke hente:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="762"/>
<source>Download Complete</source>
<translation>Download fuldført</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation>Patcher hentet med succes! Alle patches til alle spil er blevet hentet, der er ikke behov for at hente dem individuelt for hvert spil, som det sker med snyd.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
<source>Failed to parse JSON data from HTML.</source>
<translation>Kunne ikke analysere JSON-data fra HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="778"/>
<source>Failed to retrieve HTML page.</source>
<translation>Kunne ikke hente HTML-side.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source>
<translation>Kunne ikke åbne fil:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source>
<translation>XML FEJL:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="826"/>
<source>Failed to open files.json for writing</source>
<translation>Kunne ikke åbne files.json til skrivning</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source>
<translation>Forfatter: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source>
<translation>Mappe findes ikke:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Failed to open files.json for reading.</source>
<translation>Kunne ikke åbne files.json til læsning.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>Navn:</translation>
</message>
</context> </context>
</TS> </TS>

View File

@ -81,67 +81,72 @@
<context> <context>
<name>GuiContextMenus</name> <name>GuiContextMenus</name>
<message> <message>
<location filename="../gui_context_menus.h" line="39"/> <location filename="../gui_context_menus.h" line="46"/>
<source>Create Shortcut</source> <source>Create Shortcut</source>
<translation>Create Shortcut</translation> <translation>Create Shortcut</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="40"/> <location filename="../gui_context_menus.h" line="47"/>
<source>Open Game Folder</source> <source>Open Game Folder</source>
<translation>Open Game Folder</translation> <translation>Open Game Folder</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="41"/> <location filename="../gui_context_menus.h" line="48"/>
<source>Cheats / Patches</source>
<translation>Cheats / Patches</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>SFO Viewer</source> <source>SFO Viewer</source>
<translation>SFO Viewer</translation> <translation>SFO Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="42"/> <location filename="../gui_context_menus.h" line="50"/>
<source>Trophy Viewer</source> <source>Trophy Viewer</source>
<translation>Trophy Viewer</translation> <translation>Trophy Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="50"/> <location filename="../gui_context_menus.h" line="59"/>
<source>Copy info</source> <source>Copy info</source>
<translation>Copy info</translation> <translation>Copy info</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="51"/> <location filename="../gui_context_menus.h" line="60"/>
<source>Copy Name</source> <source>Copy Name</source>
<translation>Copy Name</translation> <translation>Copy Name</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="52"/> <location filename="../gui_context_menus.h" line="61"/>
<source>Copy Serial</source> <source>Copy Serial</source>
<translation>Copy Serial</translation> <translation>Copy Serial</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="53"/> <location filename="../gui_context_menus.h" line="62"/>
<source>Copy All</source> <source>Copy All</source>
<translation>Copy All</translation> <translation>Copy All</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="173"/> <location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source> <source>Shortcut creation</source>
<translation>Shortcut creation</translation> <translation>Shortcut creation</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="174"/> <location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source> <source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation> <translation>Shortcut created successfully!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="177"/> <location filename="../gui_context_menus.h" line="199"/>
<source>Error</source> <source>Error</source>
<translation>Error</translation> <translation>Error</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="178"/> <location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source> <source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation> <translation>Error creating shortcut!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="253"/> <location filename="../gui_context_menus.h" line="275"/>
<source>Install PKG</source> <source>Install PKG</source>
<translation>Install PKG</translation> <translation>Install PKG</translation>
</message> </message>
@ -248,6 +253,11 @@
<source>Game Install Directory</source> <source>Game Install Directory</source>
<translation>Game Install Directory</translation> <translation>Game Install Directory</translation>
</message> </message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation>Cheats / Patches herunterladen</translation>
</message>
<message> <message>
<location filename="../main_window_ui.h" line="345"/> <location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source> <source>Dump Game List</source>
@ -487,5 +497,406 @@
<source>Enable RenderDoc Debugging</source> <source>Enable RenderDoc Debugging</source>
<translation>Enable RenderDoc Debugging</translation> <translation>Enable RenderDoc Debugging</translation>
</message> </message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation> * Nicht unterstützte Vulkan-Version</translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source>
<translation>Cheats für alle installierten Spiele herunterladen</translation>
</message>
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation>Patches für alle Spiele herunterladen</translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
<source>Download Complete</source>
<translation>Download abgeschlossen</translation>
</message>
<message>
<location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source>
<translation>Sie haben Cheats für alle installierten Spiele heruntergeladen.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="391"/>
<source>Patches Downloaded Successfully!</source>
<translation>Patches erfolgreich heruntergeladen!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="392"/>
<source>All Patches available for all games have been downloaded.</source>
<translation>Alle Patches für alle Spiele wurden heruntergeladen.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="549"/>
<source>Games: </source>
<translation>Spiele: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="575"/>
<source>PKG File (*.PKG)</source>
<translation>PKG-Datei (*.PKG)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>ELF-Dateien (*.bin *.elf *.oelf)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Game Boot</source>
<translation>Spiel-Start</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Only one file can be selected!</source>
<translation>Es kann nur eine Datei ausgewählt werden!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>PKG-Extraktion</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>Patch detected!</source>
<translation>Patch erkannt!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source>
<translation>PKG- und Spielversionen stimmen überein: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
<source>Would you like to overwrite?</source>
<translation>Würden Sie gerne überschreiben?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>PKG Version %1 is older than installed version: </source>
<translation>PKG-Version %1 ist älter als die installierte Version: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Spiel ist installiert: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Möchten Sie den Patch installieren: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source>
<translation>DLC-Installation</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source>
<translation>Würden Sie gerne DLC installieren: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC bereits installiert:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Spiel bereits installiert</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>PKG ist ein Patch, bitte installieren Sie zuerst das Spiel!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source>
<translation>PKG-ERROR</translation>
</message>
<message>
<location filename="../main_window.cpp" line="693"/>
<source>Extracting PKG %1/%2</source>
<translation>Extrahiere PKG %1/%2</translation>
</message>
<message>
<location filename="../main_window.cpp" line="703"/>
<source>Extraction Finished</source>
<translation>Extraktion abgeschlossen</translation>
</message>
<message>
<location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source>
<translation>Spiel erfolgreich installiert auf %1</translation>
</message>
<message>
<location filename="../main_window.cpp" line="725"/>
<source>File doesn't appear to be a valid PKG file</source>
<translation>Die Datei scheint keine gültige PKG-Datei zu sein</translation>
</message>
</context>
<context>
<name>CheatsPatches</name>
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source>
<translation>Cheats / Patches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>Cheats/Patches sind experimentell.\nVerwenden Sie sie mit Vorsicht.\n\nLaden Sie Cheats einzeln herunter, indem Sie das Repository auswählen und auf die Download-Schaltfläche klicken.\nAuf der Registerkarte Patches können Sie alle Patches auf einmal herunterladen, auswählen, welche Sie verwenden möchten, und die Auswahl speichern.\n\nDa wir die Cheats/Patches nicht entwickeln,\nbitte melden Sie Probleme an den Cheat-Autor.\n\nHaben Sie einen neuen Cheat erstellt? Besuchen Sie:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
<source>No Image Available</source>
<translation>Kein Bild verfügbar</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source>
<translation>Seriennummer: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>Version: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source>
<translation>Größe: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source>
<translation>Cheat-Datei auswählen:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source>
<translation>Repository:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source>
<translation>Cheats herunterladen</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Delete File</source>
<translation>Datei löschen</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="169"/>
<source>No files selected.</source>
<translation>Keine Dateien ausgewählt.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source>
<translation>Sie können die Cheats, die Sie nicht möchten, nach dem Herunterladen löschen.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>Wollen Sie die ausgewählte Datei löschen?\n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source>
<translation>Patch-Datei auswählen:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation>Patches herunterladen</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
<source>Save</source>
<translation>Speichern</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation>Cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
<source>Patches</source>
<translation>Patches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>Error</source>
<translation>Fehler</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>No patch selected.</source>
<translation>Kein Patch ausgewählt.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="292"/>
<source>Unable to open files.json for reading.</source>
<translation>Kann files.json nicht zum Lesen öffnen.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source>
<translation>Keine Patch-Datei für die aktuelle Seriennummer gefunden.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="323"/>
<source>Unable to open the file for reading.</source>
<translation>Kann die Datei nicht zum Lesen öffnen.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="422"/>
<source>Unable to open the file for writing.</source>
<translation>Kann die Datei nicht zum Schreiben öffnen.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source>
<translation>Fehler beim Parsen von XML: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Success</source>
<translation>Erfolg</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Options saved successfully.</source>
<translation>Optionen erfolgreich gespeichert.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation>Ungültige Quelle</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
<source>The selected source is invalid.</source>
<translation>Die ausgewählte Quelle ist ungültig.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation>Datei existiert</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
<source>File already exists. Do you want to replace it?</source>
<translation>Datei existiert bereits. Möchten Sie sie ersetzen?</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source>
<translation>Fehler beim Speichern der Datei:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source>
<translation>Fehler beim Herunterladen der Datei:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation>Cheats nicht gefunden</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source>
<translation>Keine Cheats für dieses Spiel in dieser Version des gewählten Repositories gefunden. Versuchen Sie es mit einem anderen Repository oder einer anderen Version des Spiels.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation>Cheats erfolgreich heruntergeladen</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation>Sie haben erfolgreich Cheats für diese Version des Spiels aus dem gewählten Repository heruntergeladen. Sie können versuchen, von einem anderen Repository herunterzuladen. Wenn verfügbar, können Sie es auswählen, indem Sie die Datei aus der Liste auswählen.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source>
<translation>Speichern fehlgeschlagen:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source>
<translation>Herunterladen fehlgeschlagen:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="762"/>
<source>Download Complete</source>
<translation>Download abgeschlossen</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation>Patches erfolgreich heruntergeladen! Alle Patches für alle Spiele wurden heruntergeladen, es ist nicht notwendig, sie einzeln für jedes Spiel herunterzuladen, wie es bei Cheats der Fall ist.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
<source>Failed to parse JSON data from HTML.</source>
<translation>Fehler beim Parsen der JSON-Daten aus HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="778"/>
<source>Failed to retrieve HTML page.</source>
<translation>Fehler beim Abrufen der HTML-Seite.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source>
<translation>Fehler beim Öffnen der Datei:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source>
<translation>XML-Fehler:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="826"/>
<source>Failed to open files.json for writing</source>
<translation>Kann files.json nicht zum Schreiben öffnen</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source>
<translation>Autor: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source>
<translation>Verzeichnis existiert nicht:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Failed to open files.json for reading.</source>
<translation>Kann files.json nicht zum Lesen öffnen.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>Name:</translation>
</message>
</context> </context>
</TS> </TS>

View File

@ -81,67 +81,72 @@
<context> <context>
<name>GuiContextMenus</name> <name>GuiContextMenus</name>
<message> <message>
<location filename="../gui_context_menus.h" line="39"/> <location filename="../gui_context_menus.h" line="46"/>
<source>Create Shortcut</source> <source>Create Shortcut</source>
<translation>Create Shortcut</translation> <translation>Create Shortcut</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="40"/> <location filename="../gui_context_menus.h" line="47"/>
<source>Open Game Folder</source> <source>Open Game Folder</source>
<translation>Open Game Folder</translation> <translation>Open Game Folder</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="41"/> <location filename="../gui_context_menus.h" line="48"/>
<source>Cheats / Patches</source>
<translation>Kodikí / Enimeróseis</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>SFO Viewer</source> <source>SFO Viewer</source>
<translation>SFO Viewer</translation> <translation>SFO Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="42"/> <location filename="../gui_context_menus.h" line="50"/>
<source>Trophy Viewer</source> <source>Trophy Viewer</source>
<translation>Trophy Viewer</translation> <translation>Trophy Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="50"/> <location filename="../gui_context_menus.h" line="59"/>
<source>Copy info</source> <source>Copy info</source>
<translation>Copy info</translation> <translation>Copy info</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="51"/> <location filename="../gui_context_menus.h" line="60"/>
<source>Copy Name</source> <source>Copy Name</source>
<translation>Copy Name</translation> <translation>Copy Name</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="52"/> <location filename="../gui_context_menus.h" line="61"/>
<source>Copy Serial</source> <source>Copy Serial</source>
<translation>Copy Serial</translation> <translation>Copy Serial</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="53"/> <location filename="../gui_context_menus.h" line="62"/>
<source>Copy All</source> <source>Copy All</source>
<translation>Copy All</translation> <translation>Copy All</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="173"/> <location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source> <source>Shortcut creation</source>
<translation>Shortcut creation</translation> <translation>Shortcut creation</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="174"/> <location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source> <source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation> <translation>Shortcut created successfully!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="177"/> <location filename="../gui_context_menus.h" line="199"/>
<source>Error</source> <source>Error</source>
<translation>Error</translation> <translation>Error</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="178"/> <location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source> <source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation> <translation>Error creating shortcut!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="253"/> <location filename="../gui_context_menus.h" line="275"/>
<source>Install PKG</source> <source>Install PKG</source>
<translation>Install PKG</translation> <translation>Install PKG</translation>
</message> </message>
@ -248,6 +253,11 @@
<source>Game Install Directory</source> <source>Game Install Directory</source>
<translation>Game Install Directory</translation> <translation>Game Install Directory</translation>
</message> </message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation>Κατεβάστε Κωδικούς / Ενημερώσεις</translation>
</message>
<message> <message>
<location filename="../main_window_ui.h" line="345"/> <location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source> <source>Dump Game List</source>
@ -487,5 +497,406 @@
<source>Enable RenderDoc Debugging</source> <source>Enable RenderDoc Debugging</source>
<translation>Enable RenderDoc Debugging</translation> <translation>Enable RenderDoc Debugging</translation>
</message> </message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation> * Μη υποστηριζόμενη έκδοση Vulkan</translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source>
<translation>Λήψη Cheats για όλα τα εγκατεστημένα παιχνίδια</translation>
</message>
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation>Λήψη Patches για όλα τα παιχνίδια</translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
<source>Download Complete</source>
<translation>Η λήψη ολοκληρώθηκε</translation>
</message>
<message>
<location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source>
<translation>Έχετε κατεβάσει cheats για όλα τα εγκατεστημένα παιχνίδια.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="391"/>
<source>Patches Downloaded Successfully!</source>
<translation>Τα Patches κατέβηκαν επιτυχώς!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="392"/>
<source>All Patches available for all games have been downloaded.</source>
<translation>Όλα τα διαθέσιμα Patches για όλα τα παιχνίδια έχουν κατέβει.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="549"/>
<source>Games: </source>
<translation>Παιχνίδια: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="575"/>
<source>PKG File (*.PKG)</source>
<translation>Αρχείο PKG (*.PKG)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>Αρχεία ELF (*.bin *.elf *.oelf)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Game Boot</source>
<translation>Εκκίνηση παιχνιδιού</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Only one file can be selected!</source>
<translation>Μπορεί να επιλεγεί μόνο ένα αρχείο!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>Εξαγωγή PKG</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>Patch detected!</source>
<translation>Αναγνώριση ενημέρωσης!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source>
<translation>Οι εκδόσεις PKG και παιχνιδιού ταιριάζουν: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
<source>Would you like to overwrite?</source>
<translation>Θέλετε να αντικαταστήσετε;</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>PKG Version %1 is older than installed version: </source>
<translation>Η έκδοση PKG %1 είναι παλαιότερη από την εγκατεστημένη έκδοση: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Το παιχνίδι είναι εγκατεστημένο: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Θέλετε να εγκαταστήσετε την ενημέρωση: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source>
<translation>Εγκατάσταση DLC</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source>
<translation>Θέλετε να εγκαταστήσετε το DLC: %1;</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC ήδη εγκατεστημένο:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Παιχνίδι ήδη εγκατεστημένο</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>Το PKG είναι patch, παρακαλώ εγκαταστήστε πρώτα το παιχνίδι!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source>
<translation>ΣΦΑΛΜΑ PKG</translation>
</message>
<message>
<location filename="../main_window.cpp" line="693"/>
<source>Extracting PKG %1/%2</source>
<translation>Εξαγωγή PKG %1/%2</translation>
</message>
<message>
<location filename="../main_window.cpp" line="703"/>
<source>Extraction Finished</source>
<translation>Η εξαγωγή ολοκληρώθηκε</translation>
</message>
<message>
<location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source>
<translation>Το παιχνίδι εγκαταστάθηκε επιτυχώς στο %1</translation>
</message>
<message>
<location filename="../main_window.cpp" line="725"/>
<source>File doesn't appear to be a valid PKG file</source>
<translation>Η αρχείο δεν φαίνεται να είναι έγκυρο αρχείο PKG</translation>
</message>
</context>
<context>
<name>CheatsPatches</name>
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source>
<translation>Cheats / Patches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>Οι cheats/patches είναι πειραματικά.\nΧρησιμοποιήστε τα με προσοχή.\n\nΚατεβάστε τους cheats μεμονωμένα επιλέγοντας το αποθετήριο και κάνοντας κλικ στο κουμπί λήψης.\nΣτην καρτέλα Patches, μπορείτε να κατεβάσετε όλα τα patches ταυτόχρονα, να επιλέξετε ποια θέλετε να χρησιμοποιήσετε και να αποθηκεύσετε την επιλογή.\n\nΔεδομένου ότι δεν αναπτύσσουμε τους cheats/patches,\αρακαλώ αναφέρετε προβλήματα στον δημιουργό του cheat.\n\nΔημιουργήσατε ένα νέο cheat; Επισκεφθείτε:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
<source>No Image Available</source>
<translation>Δεν διατίθεται εικόνα</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source>
<translation>Σειριακός αριθμός: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>Έκδοση: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source>
<translation>Μέγεθος: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source>
<translation>Επιλέξτε αρχείο Cheat:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source>
<translation>Αποθετήριο:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source>
<translation>Λήψη Cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Delete File</source>
<translation>Διαγραφή αρχείου</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="169"/>
<source>No files selected.</source>
<translation>Δεν έχουν επιλεγεί αρχεία.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source>
<translation>Μπορείτε να διαγράψετε τα cheats που δεν θέλετε μετά τη λήψη τους.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>Θέλετε να διαγράψετε το επιλεγμένο αρχείο;\n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source>
<translation>Επιλέξτε αρχείο Patch:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation>Λήψη Patches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
<source>Save</source>
<translation>Αποθήκευση</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation>Cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
<source>Patches</source>
<translation>Patches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>Error</source>
<translation>Σφάλμα</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>No patch selected.</source>
<translation>Δεν έχει επιλεγεί κανένα patch.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="292"/>
<source>Unable to open files.json for reading.</source>
<translation>Αδυναμία ανοίγματος του files.json για ανάγνωση.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source>
<translation>Δεν βρέθηκε αρχείο patch για τον τρέχοντα σειριακό αριθμό.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="323"/>
<source>Unable to open the file for reading.</source>
<translation>Αδυναμία ανοίγματος του αρχείου για ανάγνωση.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="422"/>
<source>Unable to open the file for writing.</source>
<translation>Αδυναμία ανοίγματος του αρχείου για εγγραφή.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source>
<translation>Αποτυχία ανάλυσης XML: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Success</source>
<translation>Επιτυχία</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Options saved successfully.</source>
<translation>Οι ρυθμίσεις αποθηκεύτηκαν επιτυχώς.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation>Μη έγκυρη Πηγή</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
<source>The selected source is invalid.</source>
<translation>Η επιλεγμένη πηγή είναι μη έγκυρη.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation>Η αρχείο υπάρχει</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
<source>File already exists. Do you want to replace it?</source>
<translation>Η αρχείο υπάρχει ήδη. Θέλετε να την αντικαταστήσετε;</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source>
<translation>Αποτυχία αποθήκευσης αρχείου:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source>
<translation>Αποτυχία λήψης αρχείου:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation>Δεν βρέθηκαν Cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source>
<translation>Δεν βρέθηκαν cheats για αυτό το παιχνίδι στην τρέχουσα έκδοση του επιλεγμένου αποθετηρίου. Δοκιμάστε να κατεβάσετε από άλλο αποθετήριο ή άλλη έκδοση του παιχνιδιού.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation>Cheats κατεβάστηκαν επιτυχώς</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation>Κατεβάσατε επιτυχώς cheats για αυτή την έκδοση του παιχνιδιού από το επιλεγμένο αποθετήριο. Μπορείτε να δοκιμάσετε να κατεβάσετε από άλλο αποθετήριο. Αν είναι διαθέσιμο, μπορείτε να το επιλέξετε επιλέγοντας το αρχείο από τη λίστα.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source>
<translation>Αποτυχία αποθήκευσης:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source>
<translation>Αποτυχία λήψης:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="762"/>
<source>Download Complete</source>
<translation>Η λήψη ολοκληρώθηκε</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation>Τα Patches κατεβάστηκαν επιτυχώς! Όλα τα Patches για όλα τα παιχνίδια έχουν κατέβει, δεν είναι απαραίτητο να τα κατεβάσετε ένα-ένα για κάθε παιχνίδι, όπως με τα Cheats.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
<source>Failed to parse JSON data from HTML.</source>
<translation>Αποτυχία ανάλυσης δεδομένων JSON από HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="778"/>
<source>Failed to retrieve HTML page.</source>
<translation>Αποτυχία ανάκτησης σελίδας HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source>
<translation>Αποτυχία ανοίγματος αρχείου:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source>
<translation>ΣΦΑΛΜΑ XML:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="826"/>
<source>Failed to open files.json for writing</source>
<translation>Αποτυχία ανοίγματος του files.json για εγγραφή</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source>
<translation>Συγγραφέας: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source>
<translation>Ο φάκελος δεν υπάρχει:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Failed to open files.json for reading.</source>
<translation>Αποτυχία ανοίγματος του files.json για ανάγνωση.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>Όνομα:</translation>
</message>
</context> </context>
</TS> </TS>

View File

@ -81,67 +81,72 @@
<context> <context>
<name>GuiContextMenus</name> <name>GuiContextMenus</name>
<message> <message>
<location filename="../gui_context_menus.h" line="39"/> <location filename="../gui_context_menus.h" line="46"/>
<source>Create Shortcut</source> <source>Create Shortcut</source>
<translation>Create Shortcut</translation> <translation>Create Shortcut</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="40"/> <location filename="../gui_context_menus.h" line="47"/>
<source>Open Game Folder</source> <source>Open Game Folder</source>
<translation>Open Game Folder</translation> <translation>Open Game Folder</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="41"/> <location filename="../gui_context_menus.h" line="48"/>
<source>Cheats / Patches</source>
<translation>Cheats / Patches</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>SFO Viewer</source> <source>SFO Viewer</source>
<translation>SFO Viewer</translation> <translation>SFO Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="42"/> <location filename="../gui_context_menus.h" line="50"/>
<source>Trophy Viewer</source> <source>Trophy Viewer</source>
<translation>Trophy Viewer</translation> <translation>Trophy Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="50"/> <location filename="../gui_context_menus.h" line="59"/>
<source>Copy info</source> <source>Copy info</source>
<translation>Copy info</translation> <translation>Copy info</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="51"/> <location filename="../gui_context_menus.h" line="60"/>
<source>Copy Name</source> <source>Copy Name</source>
<translation>Copy Name</translation> <translation>Copy Name</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="52"/> <location filename="../gui_context_menus.h" line="61"/>
<source>Copy Serial</source> <source>Copy Serial</source>
<translation>Copy Serial</translation> <translation>Copy Serial</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="53"/> <location filename="../gui_context_menus.h" line="62"/>
<source>Copy All</source> <source>Copy All</source>
<translation>Copy All</translation> <translation>Copy All</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="173"/> <location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source> <source>Shortcut creation</source>
<translation>Shortcut creation</translation> <translation>Shortcut creation</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="174"/> <location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source> <source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation> <translation>Shortcut created successfully!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="177"/> <location filename="../gui_context_menus.h" line="199"/>
<source>Error</source> <source>Error</source>
<translation>Error</translation> <translation>Error</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="178"/> <location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source> <source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation> <translation>Error creating shortcut!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="253"/> <location filename="../gui_context_menus.h" line="275"/>
<source>Install PKG</source> <source>Install PKG</source>
<translation>Install PKG</translation> <translation>Install PKG</translation>
</message> </message>
@ -248,6 +253,11 @@
<source>Game Install Directory</source> <source>Game Install Directory</source>
<translation>Game Install Directory</translation> <translation>Game Install Directory</translation>
</message> </message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation>Download Cheats / Patches</translation>
</message>
<message> <message>
<location filename="../main_window_ui.h" line="345"/> <location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source> <source>Dump Game List</source>
@ -488,4 +498,405 @@
<translation>Enable RenderDoc Debugging</translation> <translation>Enable RenderDoc Debugging</translation>
</message> </message>
</context> </context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation> * Unsupported Vulkan Version</translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source>
<translation>Download Cheats For All Installed Games</translation>
</message>
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation>Download Patches For All Games</translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
<source>Download Complete</source>
<translation>Download Complete</translation>
</message>
<message>
<location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source>
<translation>You have downloaded cheats for all the games you have installed.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="391"/>
<source>Patches Downloaded Successfully!</source>
<translation>Patches Downloaded Successfully!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="392"/>
<source>All Patches available for all games have been downloaded.</source>
<translation>All Patches available for all games have been downloaded.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="549"/>
<source>Games: </source>
<translation>Games: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="575"/>
<source>PKG File (*.PKG)</source>
<translation>PKG File (*.PKG)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>ELF files (*.bin *.elf *.oelf)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Game Boot</source>
<translation>Game Boot</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Only one file can be selected!</source>
<translation>Only one file can be selected!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>PKG Extraction</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>Patch detected!</source>
<translation>Patch detected!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source>
<translation>PKG and Game versions match: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
<source>Would you like to overwrite?</source>
<translation>Would you like to overwrite?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>PKG Version %1 is older than installed version: </source>
<translation>PKG Version %1 is older than installed version: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Game is installed: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Would you like to install Patch: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source>
<translation>DLC Installation</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source>
<translation>Would you like to install DLC: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC already installed:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Game already installed</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>PKG is a patch, please install the game first!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source>
<translation>PKG ERROR</translation>
</message>
<message>
<location filename="../main_window.cpp" line="693"/>
<source>Extracting PKG %1/%2</source>
<translation>Extracting PKG %1/%2</translation>
</message>
<message>
<location filename="../main_window.cpp" line="703"/>
<source>Extraction Finished</source>
<translation>Extraction Finished</translation>
</message>
<message>
<location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source>
<translation>Game successfully installed at %1</translation>
</message>
<message>
<location filename="../main_window.cpp" line="725"/>
<source>File doesn't appear to be a valid PKG file</source>
<translation>File doesn't appear to be a valid PKG file</translation>
</message>
</context>
<context>
<name>CheatsPatches</name>
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source>
<translation>Cheats / Patches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
<source>No Image Available</source>
<translation>No Image Available</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source>
<translation>Serial: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>Version: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source>
<translation>Size: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source>
<translation>Select Cheat File:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source>
<translation>Repository:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source>
<translation>Download Cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Delete File</source>
<translation>Delete File</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="169"/>
<source>No files selected.</source>
<translation>No files selected.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source>
<translation>You can delete the cheats you don't want after downloading them.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>Do you want to delete the selected file?\n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source>
<translation>Select Patch File:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation>Download Patches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
<source>Save</source>
<translation>Save</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation>Cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
<source>Patches</source>
<translation>Patches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>No patch selected.</source>
<translation>No patch selected.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="292"/>
<source>Unable to open files.json for reading.</source>
<translation>Unable to open files.json for reading.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source>
<translation>No patch file found for the current serial.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="323"/>
<source>Unable to open the file for reading.</source>
<translation>Unable to open the file for reading.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="422"/>
<source>Unable to open the file for writing.</source>
<translation>Unable to open the file for writing.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source>
<translation>Failed to parse XML: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Success</source>
<translation>Success</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Options saved successfully.</source>
<translation>Options saved successfully.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation>Invalid Source</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
<source>The selected source is invalid.</source>
<translation>The selected source is invalid.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation>File Exists</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
<source>File already exists. Do you want to replace it?</source>
<translation>File already exists. Do you want to replace it?</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source>
<translation>Failed to save file:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source>
<translation>Failed to download file:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation>Cheats Not Found</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source>
<translation>No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation>Cheats Downloaded Successfully</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation>You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source>
<translation>Failed to save:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source>
<translation>Failed to download:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="762"/>
<source>Download Complete</source>
<translation>Download Complete</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation>Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
<source>Failed to parse JSON data from HTML.</source>
<translation>Failed to parse JSON data from HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="778"/>
<source>Failed to retrieve HTML page.</source>
<translation>Failed to retrieve HTML page.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source>
<translation>Failed to open file:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source>
<translation>XML ERROR:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="826"/>
<source>Failed to open files.json for writing</source>
<translation>Failed to open files.json for writing</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source>
<translation>Author: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source>
<translation>Directory does not exist:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Failed to open files.json for reading.</source>
<translation>Failed to open files.json for reading.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>Name:</translation>
</message>
</context>
</TS> </TS>

View File

@ -81,67 +81,72 @@
<context> <context>
<name>GuiContextMenus</name> <name>GuiContextMenus</name>
<message> <message>
<location filename="../gui_context_menus.h" line="39"/> <location filename="../gui_context_menus.h" line="46"/>
<source>Create Shortcut</source> <source>Create Shortcut</source>
<translation>Crear acceso directo</translation> <translation>Crear acceso directo</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="40"/> <location filename="../gui_context_menus.h" line="47"/>
<source>Open Game Folder</source> <source>Open Game Folder</source>
<translation>Abrir carpeta del juego</translation> <translation>Abrir carpeta del juego</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="41"/> <location filename="../gui_context_menus.h" line="48"/>
<source>Cheats / Patches</source>
<translation>Trucos / Parches</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>SFO Viewer</source> <source>SFO Viewer</source>
<translation>Vista SFO</translation> <translation>Vista SFO</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="42"/> <location filename="../gui_context_menus.h" line="50"/>
<source>Trophy Viewer</source> <source>Trophy Viewer</source>
<translation>Ver trofeos</translation> <translation>Ver trofeos</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="50"/> <location filename="../gui_context_menus.h" line="59"/>
<source>Copy info</source> <source>Copy info</source>
<translation>Copiar información</translation> <translation>Copiar información</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="51"/> <location filename="../gui_context_menus.h" line="60"/>
<source>Copy Name</source> <source>Copy Name</source>
<translation>Copiar nombre</translation> <translation>Copiar nombre</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="52"/> <location filename="../gui_context_menus.h" line="61"/>
<source>Copy Serial</source> <source>Copy Serial</source>
<translation>Copiar serial</translation> <translation>Copiar serial</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="53"/> <location filename="../gui_context_menus.h" line="62"/>
<source>Copy All</source> <source>Copy All</source>
<translation>Copiar todo</translation> <translation>Copiar todo</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="173"/> <location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source> <source>Shortcut creation</source>
<translation>Acceso directo creado</translation> <translation>Acceso directo creado</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="174"/> <location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source> <source>Shortcut created successfully!\n %1</source>
<translation>¡Acceso directo creado con éxito!\n %1</translation> <translation>¡Acceso directo creado con éxito!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="177"/> <location filename="../gui_context_menus.h" line="199"/>
<source>Error</source> <source>Error</source>
<translation>Error</translation> <translation>Error</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="178"/> <location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source> <source>Error creating shortcut!\n %1</source>
<translation>¡Error al crear el acceso directo!\n %1</translation> <translation>¡Error al crear el acceso directo!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="253"/> <location filename="../gui_context_menus.h" line="275"/>
<source>Install PKG</source> <source>Install PKG</source>
<translation>Instalar PKG</translation> <translation>Instalar PKG</translation>
</message> </message>
@ -248,6 +253,11 @@
<source>Game Install Directory</source> <source>Game Install Directory</source>
<translation>Carpeta de instalación de los juegos</translation> <translation>Carpeta de instalación de los juegos</translation>
</message> </message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation>Descargar Trucos / Parches</translation>
</message>
<message> <message>
<location filename="../main_window_ui.h" line="345"/> <location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source> <source>Dump Game List</source>
@ -488,4 +498,405 @@
<translation>Habilitar depuración de RenderDoc</translation> <translation>Habilitar depuración de RenderDoc</translation>
</message> </message>
</context> </context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation> * Versión de Vulkan no soportada</translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source>
<translation>Descargar trucos para todos los juegos instalados</translation>
</message>
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation>Descargar parches para todos los juegos</translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
<source>Download Complete</source>
<translation>Descarga completa</translation>
</message>
<message>
<location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source>
<translation>Has descargado trucos para todos los juegos que tienes instalados.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="391"/>
<source>Patches Downloaded Successfully!</source>
<translation>¡Parches descargados exitosamente!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="392"/>
<source>All Patches available for all games have been downloaded.</source>
<translation>Todos los parches disponibles para todos los juegos han sido descargados.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="549"/>
<source>Games: </source>
<translation>Juegos: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="575"/>
<source>PKG File (*.PKG)</source>
<translation>Archivo PKG (*.PKG)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>Archivos ELF (*.bin *.elf *.oelf)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Game Boot</source>
<translation>Inicio del juego</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Only one file can be selected!</source>
<translation>¡Solo se puede seleccionar un archivo!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>Extracción de PKG</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>Patch detected!</source>
<translation>¡Actualización detectada!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source>
<translation>Las versiones de PKG y del juego coinciden: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
<source>Would you like to overwrite?</source>
<translation>¿Desea sobrescribir?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>PKG Version %1 is older than installed version: </source>
<translation>La versión de PKG %1 es más antigua que la versión instalada: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>El juego está instalado: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>¿Desea instalar la actualización: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source>
<translation>Instalación de DLC</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source>
<translation>¿Desea instalar el DLC: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC ya instalado:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Juego ya instalado</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>PKG es un parche, ¡por favor instala el juego primero!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source>
<translation>ERROR PKG</translation>
</message>
<message>
<location filename="../main_window.cpp" line="693"/>
<source>Extracting PKG %1/%2</source>
<translation>Extrayendo PKG %1/%2</translation>
</message>
<message>
<location filename="../main_window.cpp" line="703"/>
<source>Extraction Finished</source>
<translation>Extracción terminada</translation>
</message>
<message>
<location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source>
<translation>Juego instalado exitosamente en %1</translation>
</message>
<message>
<location filename="../main_window.cpp" line="725"/>
<source>File doesn't appear to be a valid PKG file</source>
<translation>El archivo no parece ser un archivo PKG válido</translation>
</message>
</context>
<context>
<name>CheatsPatches</name>
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source>
<translation>Trucos / Parches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>Los cheats/patches son experimentales.\nÚselos con precaución.\n\nDescargue los cheats individualmente seleccionando el repositorio y haciendo clic en el botón de descarga.\nEn la pestaña Patches, puede descargar todos los patches a la vez, elegir cuáles desea usar y guardar la selección.\n\nComo no desarrollamos los Cheats/Patches,\npor favor informe los problemas al autor del cheat.\n\n¿Creaste un nuevo cheat? Visita:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
<source>No Image Available</source>
<translation>No hay imagen disponible</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source>
<translation>Serie: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>Versión: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source>
<translation>Tamaño: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source>
<translation>Seleccionar archivo de trucos:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source>
<translation>Repositorio:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source>
<translation>Descargar trucos</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Delete File</source>
<translation>Eliminar archivo</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="169"/>
<source>No files selected.</source>
<translation>No se han seleccionado archivos.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source>
<translation>Puedes eliminar los trucos que no quieras después de descargarlos.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>¿Deseas eliminar el archivo seleccionado?\n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source>
<translation>Seleccionar archivo de parche:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation>Descargar parches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
<source>Save</source>
<translation>Guardar</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation>Trucos</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
<source>Patches</source>
<translation>Parche</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>No patch selected.</source>
<translation>No se ha seleccionado ningún parche.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="292"/>
<source>Unable to open files.json for reading.</source>
<translation>No se puede abrir files.json para lectura.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source>
<translation>No se encontró ningún archivo de parche para la serie actual.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="323"/>
<source>Unable to open the file for reading.</source>
<translation>No se puede abrir el archivo para lectura.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="422"/>
<source>Unable to open the file for writing.</source>
<translation>No se puede abrir el archivo para escritura.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source>
<translation>Error al analizar XML: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Success</source>
<translation>Éxito</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Options saved successfully.</source>
<translation>Opciones guardadas exitosamente.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation>Fuente inválida</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
<source>The selected source is invalid.</source>
<translation>La fuente seleccionada es inválida.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation>El archivo ya existe</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
<source>File already exists. Do you want to replace it?</source>
<translation>El archivo ya existe. ¿Deseas reemplazarlo?</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source>
<translation>Error al guardar el archivo:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source>
<translation>Error al descargar el archivo:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation>Trucos no encontrados</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source>
<translation>No se encontraron trucos para este juego en esta versión del repositorio seleccionado,intenta con otro repositorio o con una versión diferente del juego.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation>Trucos descargados exitosamente</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation>Has descargado exitosamente los trucos para esta versión del juego desde el repositorio seleccionado. Puedes intentar descargar desde otro repositorio; si está disponible, también será posible usarlo seleccionando el archivo de la lista.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source>
<translation>Error al guardar:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source>
<translation>Error al descargar:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="762"/>
<source>Download Complete</source>
<translation>Descarga completa</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation>¡Parches descargados exitosamente! Todos los parches disponibles para todos los juegos han sido descargados, no es necesario descargarlos individualmente para cada juego como ocurre con los trucos.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
<source>Failed to parse JSON data from HTML.</source>
<translation>Error al analizar los datos JSON del HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="778"/>
<source>Failed to retrieve HTML page.</source>
<translation>Error al recuperar la página HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source>
<translation>Error al abrir el archivo:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source>
<translation>ERROR XML:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="826"/>
<source>Failed to open files.json for writing</source>
<translation>Error al abrir files.json para escritura</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source>
<translation>Autor: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source>
<translation>El directorio no existe:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Failed to open files.json for reading.</source>
<translation>Error al abrir files.json para lectura.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>Nombre:</translation>
</message>
</context>
</TS> </TS>

View File

@ -81,67 +81,72 @@
<context> <context>
<name>GuiContextMenus</name> <name>GuiContextMenus</name>
<message> <message>
<location filename="../gui_context_menus.h" line="39"/> <location filename="../gui_context_menus.h" line="46"/>
<source>Create Shortcut</source> <source>Create Shortcut</source>
<translation>Create Shortcut</translation> <translation>Create Shortcut</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="40"/> <location filename="../gui_context_menus.h" line="47"/>
<source>Open Game Folder</source> <source>Open Game Folder</source>
<translation>Open Game Folder</translation> <translation>Open Game Folder</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="41"/> <location filename="../gui_context_menus.h" line="48"/>
<source>Cheats / Patches</source>
<translation>Huijaukset / Korjaukset</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>SFO Viewer</source> <source>SFO Viewer</source>
<translation>SFO Viewer</translation> <translation>SFO Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="42"/> <location filename="../gui_context_menus.h" line="50"/>
<source>Trophy Viewer</source> <source>Trophy Viewer</source>
<translation>Trophy Viewer</translation> <translation>Trophy Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="50"/> <location filename="../gui_context_menus.h" line="59"/>
<source>Copy info</source> <source>Copy info</source>
<translation>Copy info</translation> <translation>Copy info</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="51"/> <location filename="../gui_context_menus.h" line="60"/>
<source>Copy Name</source> <source>Copy Name</source>
<translation>Copy Name</translation> <translation>Copy Name</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="52"/> <location filename="../gui_context_menus.h" line="61"/>
<source>Copy Serial</source> <source>Copy Serial</source>
<translation>Copy Serial</translation> <translation>Copy Serial</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="53"/> <location filename="../gui_context_menus.h" line="62"/>
<source>Copy All</source> <source>Copy All</source>
<translation>Copy All</translation> <translation>Copy All</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="173"/> <location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source> <source>Shortcut creation</source>
<translation>Shortcut creation</translation> <translation>Shortcut creation</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="174"/> <location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source> <source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation> <translation>Shortcut created successfully!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="177"/> <location filename="../gui_context_menus.h" line="199"/>
<source>Error</source> <source>Error</source>
<translation>Error</translation> <translation>Error</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="178"/> <location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source> <source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation> <translation>Error creating shortcut!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="253"/> <location filename="../gui_context_menus.h" line="275"/>
<source>Install PKG</source> <source>Install PKG</source>
<translation>Install PKG</translation> <translation>Install PKG</translation>
</message> </message>
@ -248,6 +253,11 @@
<source>Game Install Directory</source> <source>Game Install Directory</source>
<translation>Game Install Directory</translation> <translation>Game Install Directory</translation>
</message> </message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation>Lataa Huijaukset / Korjaukset</translation>
</message>
<message> <message>
<location filename="../main_window_ui.h" line="345"/> <location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source> <source>Dump Game List</source>
@ -488,4 +498,405 @@
<translation>Enable RenderDoc Debugging</translation> <translation>Enable RenderDoc Debugging</translation>
</message> </message>
</context> </context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation> * Tuettu Vulkan-versio</translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source>
<translation>Lataa huijaukset kaikille asennetuille peleille</translation>
</message>
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation>Lataa korjaukset kaikille peleille</translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
<source>Download Complete</source>
<translation>Lataus valmis</translation>
</message>
<message>
<location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source>
<translation>Olet ladannut huijaukset kaikkiin asennettuihin peleihin.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="391"/>
<source>Patches Downloaded Successfully!</source>
<translation>Korjaukset ladattu onnistuneesti!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="392"/>
<source>All Patches available for all games have been downloaded.</source>
<translation>Kaikki saatavilla olevat korjaukset kaikille peleille on ladattu.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="549"/>
<source>Games: </source>
<translation>Pelit: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="575"/>
<source>PKG File (*.PKG)</source>
<translation>PKG-tiedosto (*.PKG)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>ELF-tiedostot (*.bin *.elf *.oelf)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Game Boot</source>
<translation>Pelin käynnistys</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Only one file can be selected!</source>
<translation>Vain yksi tiedosto voidaan valita!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>PKG:n purku</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>Patch detected!</source>
<translation>Päivitys havaittu!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source>
<translation>PKG- ja peliversiot vastaavat: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
<source>Would you like to overwrite?</source>
<translation>Haluatko korvata?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>PKG Version %1 is older than installed version: </source>
<translation>PKG-versio %1 on vanhempi kuin asennettu versio: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Peli on asennettu: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Haluatko asentaa päivityksen: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source>
<translation>DLC-asennus</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source>
<translation>Haluatko asentaa DLC:n: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC on jo asennettu:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Peli on jo asennettu</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>PKG on korjaus, asenna peli ensin!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source>
<translation>PKG VIRHE</translation>
</message>
<message>
<location filename="../main_window.cpp" line="693"/>
<source>Extracting PKG %1/%2</source>
<translation>Purkaminen PKG %1/%2</translation>
</message>
<message>
<location filename="../main_window.cpp" line="703"/>
<source>Extraction Finished</source>
<translation>Purku valmis</translation>
</message>
<message>
<location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source>
<translation>Peli asennettu onnistuneesti kohtaan %1</translation>
</message>
<message>
<location filename="../main_window.cpp" line="725"/>
<source>File doesn't appear to be a valid PKG file</source>
<translation>Tiedosto ei vaikuta olevan kelvollinen PKG-tiedosto</translation>
</message>
</context>
<context>
<name>CheatsPatches</name>
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source>
<translation>Huijaukset / Korjaukset</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>Cheats/Patches ovat kokeellisia.\nKäytä varoen.\n\nLataa cheats yksitellen valitsemalla repositorio ja napsauttamalla latauspainiketta.\nPatches-välilehdellä voit ladata kaikki patchit kerralla, valita, mitä haluat käyttää, ja tallentaa valinnan.\n\nKoska emme kehitä Cheats/Patches,\nilmoita ongelmista cheatin tekijälle.\n\nLuo uusi cheat? Käy osoitteessa:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
<source>No Image Available</source>
<translation>Kuvaa ei saatavilla</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source>
<translation>Sarjanumero: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>Versio: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source>
<translation>Koko: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source>
<translation>Valitse huijaustiedosto:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source>
<translation>Repo:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source>
<translation>Lataa huijaukset</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Delete File</source>
<translation>Poista tiedosto</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="169"/>
<source>No files selected.</source>
<translation>Ei tiedostoja valittu.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source>
<translation>Voit poistaa ei-toivomasi huijaukset lataamisen jälkeen.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>Haluatko poistaa valitun tiedoston?\n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source>
<translation>Valitse korjaustiedosto:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation>Lataa korjaukset</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
<source>Save</source>
<translation>Tallenna</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation>Huijaukset</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
<source>Patches</source>
<translation>Korjaukset</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>Error</source>
<translation>Virhe</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>No patch selected.</source>
<translation>Ei korjausta valittu.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="292"/>
<source>Unable to open files.json for reading.</source>
<translation>Tiedostoa files.json ei voitu avata lukemista varten.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source>
<translation>Nykyiselle sarjanumerolle ei löytynyt korjaustiedostoa.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="323"/>
<source>Unable to open the file for reading.</source>
<translation>Tiedostoa ei voitu avata lukemista varten.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="422"/>
<source>Unable to open the file for writing.</source>
<translation>Tiedostoa ei voitu avata kirjoittamista varten.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source>
<translation>XML:n jäsentäminen epäonnistui: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Success</source>
<translation>Onnistui</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Options saved successfully.</source>
<translation>Vaihtoehdot tallennettu onnistuneesti.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation>Virheellinen lähde</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
<source>The selected source is invalid.</source>
<translation>Valittu lähde on virheellinen.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation>Tiedosto on olemassa</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
<source>File already exists. Do you want to replace it?</source>
<translation>Tiedosto on jo olemassa. Haluatko korvata sen?</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source>
<translation>Tiedoston tallentaminen epäonnistui:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source>
<translation>Tiedoston lataaminen epäonnistui:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation>Huijauksia ei löytynyt</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source>
<translation>Huijauksia ei löytynyt tälle pelille tämän version valitusta repositoriosta, yritä toista repositoriota tai pelin eri versiota.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation>Huijaukset ladattu onnistuneesti</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation>Olet ladannut huijaukset onnistuneesti valitusta repositoriosta tälle pelin versiolle. Voit yrittää ladata toisesta repositoriosta, jos se on saatavilla, voit myös käyttää sitä valitsemalla tiedoston luettelosta.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source>
<translation>Tallentaminen epäonnistui:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source>
<translation>Lataaminen epäonnistui:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="762"/>
<source>Download Complete</source>
<translation>Lataus valmis</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation>Korjaukset ladattu onnistuneesti! Kaikki saatavilla olevat korjaukset kaikille peleille on ladattu, eikä niitä tarvitse ladata yksittäin jokaiselle pelille kuten huijauksissa.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
<source>Failed to parse JSON data from HTML.</source>
<translation>JSON-tietojen jäsentäminen HTML:stä epäonnistui.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="778"/>
<source>Failed to retrieve HTML page.</source>
<translation>HTML-sivun hakeminen epäonnistui.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source>
<translation>Tiedoston avaaminen epäonnistui:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source>
<translation>XML VIRHE:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="826"/>
<source>Failed to open files.json for writing</source>
<translation>Tiedostoa files.json ei voitu avata kirjoittamista varten</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source>
<translation>Tekijä: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source>
<translation>Kansiota ei ole olemassa:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Failed to open files.json for reading.</source>
<translation>Tiedostoa files.json ei voitu avata lukemista varten.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>Nimi:</translation>
</message>
</context>
</TS> </TS>

View File

@ -81,67 +81,72 @@
<context> <context>
<name>GuiContextMenus</name> <name>GuiContextMenus</name>
<message> <message>
<location filename="../gui_context_menus.h" line="39"/> <location filename="../gui_context_menus.h" line="46"/>
<source>Create Shortcut</source> <source>Create Shortcut</source>
<translation>Créer un raccourci</translation> <translation>Créer un raccourci</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="40"/> <location filename="../gui_context_menus.h" line="47"/>
<source>Open Game Folder</source> <source>Open Game Folder</source>
<translation>Ouvrir le dossier du jeu</translation> <translation>Ouvrir le dossier du jeu</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="41"/> <location filename="../gui_context_menus.h" line="48"/>
<source>Cheats / Patches</source>
<translation>Cheats/Patchs</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>SFO Viewer</source> <source>SFO Viewer</source>
<translation>Visionneuse SFO</translation> <translation>Visionneuse SFO</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="42"/> <location filename="../gui_context_menus.h" line="50"/>
<source>Trophy Viewer</source> <source>Trophy Viewer</source>
<translation>Visionneuse de trophées</translation> <translation>Visionneuse de trophées</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="50"/> <location filename="../gui_context_menus.h" line="59"/>
<source>Copy info</source> <source>Copy info</source>
<translation>Copier les informations</translation> <translation>Copier infos</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="51"/> <location filename="../gui_context_menus.h" line="60"/>
<source>Copy Name</source> <source>Copy Name</source>
<translation>Copier le nom</translation> <translation>Copier le nom</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="52"/> <location filename="../gui_context_menus.h" line="61"/>
<source>Copy Serial</source> <source>Copy Serial</source>
<translation>Copier le numéro de série</translation> <translation>Copier le numéro de série</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="53"/> <location filename="../gui_context_menus.h" line="62"/>
<source>Copy All</source> <source>Copy All</source>
<translation>Copier tout</translation> <translation>Copier tout</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="173"/> <location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source> <source>Shortcut creation</source>
<translation>Création du raccourci</translation> <translation>Création du raccourci</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="174"/> <location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source> <source>Shortcut created successfully!\n %1</source>
<translation>Raccourci créé avec succès!\n %1</translation> <translation>Raccourci créé avec succès !\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="177"/> <location filename="../gui_context_menus.h" line="199"/>
<source>Error</source> <source>Error</source>
<translation>Erreur</translation> <translation>Erreur</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="178"/> <location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source> <source>Error creating shortcut!\n %1</source>
<translation>Erreur lors de la création du raccourci!\n %1</translation> <translation>Erreur lors de la création du raccourci !\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="253"/> <location filename="../gui_context_menus.h" line="275"/>
<source>Install PKG</source> <source>Install PKG</source>
<translation>Installer un PKG</translation> <translation>Installer un PKG</translation>
</message> </message>
@ -248,6 +253,11 @@
<source>Game Install Directory</source> <source>Game Install Directory</source>
<translation>Répertoire des jeux</translation> <translation>Répertoire des jeux</translation>
</message> </message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation>Télécharger Cheats/Patchs</translation>
</message>
<message> <message>
<location filename="../main_window_ui.h" line="345"/> <location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source> <source>Dump Game List</source>
@ -475,17 +485,418 @@
<message> <message>
<location filename="../settings_dialog.ui" line="560"/> <location filename="../settings_dialog.ui" line="560"/>
<source>Enable Vulkan Validation Layers</source> <source>Enable Vulkan Validation Layers</source>
<translation>Couche de validation Vulkan</translation> <translation>Activer la couche de validation Vulkan</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="567"/> <location filename="../settings_dialog.ui" line="567"/>
<source>Enable Vulkan Synchronization Validation</source> <source>Enable Vulkan Synchronization Validation</source>
<translation>Synchroniser la validation Vulkan</translation> <translation>Activer la synchronisation de la validation Vulkan</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="574"/> <location filename="../settings_dialog.ui" line="574"/>
<source>Enable RenderDoc Debugging</source> <source>Enable RenderDoc Debugging</source>
<translation>Activer le débogage RenderDoc</translation> <translation>Activer le débogage RenderDoc</translation>
</message> </message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation> * Version de Vulkan non prise en charge</translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source>
<translation>Télécharger les Cheats pour tous les jeux installés</translation>
</message>
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation>Télécharger les patchs pour tous les jeux</translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
<source>Download Complete</source>
<translation>Téléchargement terminé</translation>
</message>
<message>
<location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source>
<translation>Vous avez téléchargé des Cheats pour tous les jeux installés.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="391"/>
<source>Patches Downloaded Successfully!</source>
<translation>Patchs téléchargés avec succès !</translation>
</message>
<message>
<location filename="../main_window.cpp" line="392"/>
<source>All Patches available for all games have been downloaded.</source>
<translation>Tous les patchs disponibles pour les jeux ont é téléchargés.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="549"/>
<source>Games: </source>
<translation>Jeux : </translation>
</message>
<message>
<location filename="../main_window.cpp" line="575"/>
<source>PKG File (*.PKG)</source>
<translation>Fichiers PKG (*.PKG)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>Fichiers ELF (*.bin *.elf *.oelf)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Game Boot</source>
<translation>Démarrer un jeu</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Only one file can be selected!</source>
<translation>Un seul fichier peut être sélectionné !</translation>
</message>
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>Extraction du PKG</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>Patch detected!</source>
<translation>Patch détecté !</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source>
<translation>Les versions PKG et jeu correspondent : </translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
<source>Would you like to overwrite?</source>
<translation>Souhaitez-vous remplacer ?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>PKG Version %1 is older than installed version: </source>
<translation>La version PKG %1 est plus ancienne que la version installée : </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Jeu installé : </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Souhaitez-vous installer le patch : </translation>
</message>
<message>
<location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source>
<translation>Installation du DLC</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source>
<translation>Souhaitez-vous installer le DLC : %1 ?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC déjà installé :</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Jeu déjà installé</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>Le PKG est un patch, veuillez d'abord installer le jeu !</translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source>
<translation>Erreur PKG</translation>
</message>
<message>
<location filename="../main_window.cpp" line="693"/>
<source>Extracting PKG %1/%2</source>
<translation>Extraction PKG %1/%2</translation>
</message>
<message>
<location filename="../main_window.cpp" line="703"/>
<source>Extraction Finished</source>
<translation>Extraction terminée</translation>
</message>
<message>
<location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source>
<translation>Jeu installé avec succès à %1</translation>
</message>
<message>
<location filename="../main_window.cpp" line="725"/>
<source>File doesn't appear to be a valid PKG file</source>
<translation>Le fichier ne semble pas être un PKG valide</translation>
</message>
</context>
<context>
<name>CheatsPatches</name>
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source>
<translation>Cheats/Patches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>Les Cheats/Patchs sont expérimentaux.\nUtilisez-les avec précaution.\n\nTéléchargez les Cheats individuellement en sélectionnant le dépôt et en cliquant sur le bouton de téléchargement.\nDans l'onglet Patchs, vous pouvez télécharger tous les patchs en une seule fois, choisir lesquels vous souhaitez utiliser et enregistrer votre sélection.\n\nComme nous ne développons pas les Cheats/Patches,\nmerci de signaler les problèmes à l'auteur du Cheat.\n\nVous avez créé un nouveau cheat ? Visitez :\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
<source>No Image Available</source>
<translation>Aucune image disponible</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source>
<translation>Série : </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>Version : </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source>
<translation>Taille : </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source>
<translation>Sélectionner le fichier de Cheat :</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source>
<translation>Dépôt :</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source>
<translation>Télécharger les Cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Delete File</source>
<translation>Supprimer le fichier</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="169"/>
<source>No files selected.</source>
<translation>Aucun fichier sélectionné.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source>
<translation>Vous pouvez supprimer les Cheats que vous ne souhaitez pas après les avoir téléchargés.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>Voulez-vous supprimer le fichier sélectionné ?\n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source>
<translation>Sélectionner le fichier de patch :</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation>Télécharger les patchs</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
<source>Save</source>
<translation>Enregistrer</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation>Cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
<source>Patches</source>
<translation>Patchs</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>Error</source>
<translation>Erreur</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>No patch selected.</source>
<translation>Aucun patch sélectionné.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="292"/>
<source>Unable to open files.json for reading.</source>
<translation>Impossible d'ouvrir files.json pour la lecture.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source>
<translation>Aucun fichier de patch trouvé pour la série actuelle.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="323"/>
<source>Unable to open the file for reading.</source>
<translation>Impossible d'ouvrir le fichier pour la lecture.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="422"/>
<source>Unable to open the file for writing.</source>
<translation>Impossible d'ouvrir le fichier pour l'écriture.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source>
<translation>Échec de l'analyse XML : </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Success</source>
<translation>Succès</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Options saved successfully.</source>
<translation>Options enregistrées avec succès.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation>Source invalide</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
<source>The selected source is invalid.</source>
<translation>La source sélectionnée est invalide.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation>Le fichier existe</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
<source>File already exists. Do you want to replace it?</source>
<translation>Le fichier existe déjà. Voulez-vous le remplacer ?</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source>
<translation>Échec de l'enregistrement du fichier :</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source>
<translation>Échec du téléchargement du fichier :</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation>Cheats non trouvés</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source>
<translation>Aucun Cheat trouvé pour ce jeu dans cette version du dépôt sélectionné, essayez un autre dépôt ou une version différente du jeu.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation>Cheats téléchargés avec succès</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation>Vous avez téléchargé les cheats avec succès pour cette version du jeu depuis le dépôt sélectionné. Vous pouvez essayer de télécharger depuis un autre dépôt, si disponible, il sera également possible de l'utiliser en sélectionnant le fichier dans la liste.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source>
<translation>Échec de l'enregistrement :</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source>
<translation>Échec du téléchargement :</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="762"/>
<source>Download Complete</source>
<translation>Téléchargement terminé</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation>Patchs téléchargés avec succès ! Tous les patches disponibles pour tous les jeux ont é téléchargés, il n'est pas nécessaire de les télécharger individuellement pour chaque jeu comme c'est le cas pour les Cheats.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
<source>Failed to parse JSON data from HTML.</source>
<translation>Échec de l'analyse des données JSON à partir du HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="778"/>
<source>Failed to retrieve HTML page.</source>
<translation>Échec de la récupération de la page HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source>
<translation>Échec de l'ouverture du fichier :</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source>
<translation>Erreur XML :</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="826"/>
<source>Failed to open files.json for writing</source>
<translation>Échec de l'ouverture de files.json pour l'écriture</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source>
<translation>Auteur : </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source>
<translation>Répertoire n'existe pas :</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Failed to open files.json for reading.</source>
<translation>Échec de l'ouverture de files.json pour la lecture.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>Nom :</translation>
</message>
</context> </context>
</TS> </TS>

View File

@ -6,7 +6,7 @@
<message> <message>
<location filename="../about_dialog.ui" line="16"/> <location filename="../about_dialog.ui" line="16"/>
<source>About shadPS4</source> <source>About shadPS4</source>
<translation>About shadPS4</translation> <translation>A shadPS4-ről</translation>
</message> </message>
<message> <message>
<location filename="../about_dialog.ui" line="60"/> <location filename="../about_dialog.ui" line="60"/>
@ -16,12 +16,12 @@
<message> <message>
<location filename="../about_dialog.ui" line="78"/> <location filename="../about_dialog.ui" line="78"/>
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source> <source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
<translation>shadPS4 is an experimental open-source emulator for the PlayStation 4.</translation> <translation>A shadPS4 egy kezdetleges, open-source PlayStation 4 emulátor.</translation>
</message> </message>
<message> <message>
<location filename="../about_dialog.ui" line="99"/> <location filename="../about_dialog.ui" line="99"/>
<source>This software should not be used to play games you have not legally obtained.</source> <source>This software should not be used to play games you have not legally obtained.</source>
<translation>This software should not be used to play games you have not legally obtained.</translation> <translation>Ne használja ezt a szoftvert olyan játékokkal, amelyeket nem legális módon szerzett be.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -29,7 +29,7 @@
<message> <message>
<location filename="../elf_viewer.cpp" line="45"/> <location filename="../elf_viewer.cpp" line="45"/>
<source>Open Folder</source> <source>Open Folder</source>
<translation>Open Folder</translation> <translation>Mappa megnyitása</translation>
</message> </message>
</context> </context>
<context> <context>
@ -37,17 +37,17 @@
<message> <message>
<location filename="../game_info.cpp" line="26"/> <location filename="../game_info.cpp" line="26"/>
<source>Loading game list, please wait :3</source> <source>Loading game list, please wait :3</source>
<translation>Loading game list, please wait :3</translation> <translation>Játék könyvtár betöltése, kérjük várjon :3</translation>
</message> </message>
<message> <message>
<location filename="../game_info.cpp" line="26"/> <location filename="../game_info.cpp" line="26"/>
<source>Cancel</source> <source>Cancel</source>
<translation>Cancel</translation> <translation>Megszakítás</translation>
</message> </message>
<message> <message>
<location filename="../game_info.cpp" line="27"/> <location filename="../game_info.cpp" line="27"/>
<source>Loading...</source> <source>Loading...</source>
<translation>Loading...</translation> <translation>Betöltés..</translation>
</message> </message>
</context> </context>
<context> <context>
@ -55,27 +55,27 @@
<message> <message>
<location filename="../game_install_dialog.cpp" line="24"/> <location filename="../game_install_dialog.cpp" line="24"/>
<source>shadPS4 - Choose directory</source> <source>shadPS4 - Choose directory</source>
<translation>shadPS4 - Choose directory</translation> <translation>shadPS4 - Mappa kiválasztása</translation>
</message> </message>
<message> <message>
<location filename="../game_install_dialog.cpp" line="31"/> <location filename="../game_install_dialog.cpp" line="31"/>
<source>Directory to install games</source> <source>Directory to install games</source>
<translation>Directory to install games</translation> <translation>Mappa a játékok telepítésére</translation>
</message> </message>
<message> <message>
<location filename="../game_install_dialog.cpp" line="50"/> <location filename="../game_install_dialog.cpp" line="50"/>
<source>Browse</source> <source>Browse</source>
<translation>Browse</translation> <translation>Böngészés</translation>
</message> </message>
<message> <message>
<location filename="../game_install_dialog.cpp" line="74"/> <location filename="../game_install_dialog.cpp" line="74"/>
<source>Error</source> <source>Error</source>
<translation>Error</translation> <translation>Hiba</translation>
</message> </message>
<message> <message>
<location filename="../game_install_dialog.cpp" line="75"/> <location filename="../game_install_dialog.cpp" line="75"/>
<source>The value for location to install games is not valid.</source> <source>The value for location to install games is not valid.</source>
<translation>The value for location to install games is not valid.</translation> <translation>A játékok telepítéséhez megadott érték nem érvényes.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -83,67 +83,72 @@
<message> <message>
<location filename="../gui_context_menus.h" line="39"/> <location filename="../gui_context_menus.h" line="39"/>
<source>Create Shortcut</source> <source>Create Shortcut</source>
<translation>Create Shortcut</translation> <translation>Parancsikon Létrehozása</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="40"/> <location filename="../gui_context_menus.h" line="40"/>
<source>Open Game Folder</source> <source>Open Game Folder</source>
<translation>Open Game Folder</translation> <translation>Játék Mappa Megnyitása</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="48"/>
<source>Cheats / Patches</source>
<translation>Csalások / Javítások</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="41"/> <location filename="../gui_context_menus.h" line="41"/>
<source>SFO Viewer</source> <source>SFO Viewer</source>
<translation>SFO Viewer</translation> <translation>SFO Néző</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="42"/> <location filename="../gui_context_menus.h" line="42"/>
<source>Trophy Viewer</source> <source>Trophy Viewer</source>
<translation>Trophy Viewer</translation> <translation>Trófeák Megtekintése</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="50"/> <location filename="../gui_context_menus.h" line="50"/>
<source>Copy info</source> <source>Copy info</source>
<translation>Copy info</translation> <translation>Információ Másolása</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="51"/> <location filename="../gui_context_menus.h" line="51"/>
<source>Copy Name</source> <source>Copy Name</source>
<translation>Copy Name</translation> <translation>Név Másolása</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="52"/> <location filename="../gui_context_menus.h" line="52"/>
<source>Copy Serial</source> <source>Copy Serial</source>
<translation>Copy Serial</translation> <translation>Széria Másolása</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="53"/> <location filename="../gui_context_menus.h" line="53"/>
<source>Copy All</source> <source>Copy All</source>
<translation>Copy All</translation> <translation>Összes Másolása</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="173"/> <location filename="../gui_context_menus.h" line="173"/>
<source>Shortcut creation</source> <source>Shortcut creation</source>
<translation>Shortcut creation</translation> <translation>Parancsikon létrehozása</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="174"/> <location filename="../gui_context_menus.h" line="174"/>
<source>Shortcut created successfully!\n %1</source> <source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation> <translation>Parancsikon sikeresen létrehozva!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="177"/> <location filename="../gui_context_menus.h" line="177"/>
<source>Error</source> <source>Error</source>
<translation>Error</translation> <translation>Hiba</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="178"/> <location filename="../gui_context_menus.h" line="178"/>
<source>Error creating shortcut!\n %1</source> <source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation> <translation>Hiba a parancsikon létrehozásával!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="253"/> <location filename="../gui_context_menus.h" line="253"/>
<source>Install PKG</source> <source>Install PKG</source>
<translation>Install PKG</translation> <translation>PKG telepítése</translation>
</message> </message>
</context> </context>
<context> <context>
@ -151,187 +156,192 @@
<message> <message>
<location filename="../main_window_ui.h" line="310"/> <location filename="../main_window_ui.h" line="310"/>
<source>Open/Add Elf Folder</source> <source>Open/Add Elf Folder</source>
<translation>Open/Add Elf Folder</translation> <translation>Efl Mappa Megnyitása/Hozzáadása</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="312"/> <location filename="../main_window_ui.h" line="312"/>
<source>Install Packages (PKG)</source> <source>Install Packages (PKG)</source>
<translation>Install Packages (PKG)</translation> <translation>PKG-k Telepítése (PKG)</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="313"/> <location filename="../main_window_ui.h" line="313"/>
<source>Boot Game</source> <source>Boot Game</source>
<translation>Boot Game</translation> <translation>Játék Bootolása</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="314"/> <location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source> <source>About shadPS4</source>
<translation>About shadPS4</translation> <translation>A shadPS4-ről</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="315"/> <location filename="../main_window_ui.h" line="315"/>
<source>Configure...</source> <source>Configure...</source>
<translation>Configure...</translation> <translation>Konfigurálás...</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="318"/> <location filename="../main_window_ui.h" line="318"/>
<source>Install application from a .pkg file</source> <source>Install application from a .pkg file</source>
<translation>Install application from a .pkg file</translation> <translation>Program telepítése egy .pkg fájlból</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="320"/> <location filename="../main_window_ui.h" line="320"/>
<source>Recent Games</source> <source>Recent Games</source>
<translation>Recent Games</translation> <translation>Legutóbbi Játékok</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="321"/> <location filename="../main_window_ui.h" line="321"/>
<source>Exit</source> <source>Exit</source>
<translation>Exit</translation> <translation>Kilépés</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="323"/> <location filename="../main_window_ui.h" line="323"/>
<source>Exit shadPS4</source> <source>Exit shadPS4</source>
<translation>Exit shadPS4</translation> <translation>Kilépés a shadPS4</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="327"/> <location filename="../main_window_ui.h" line="327"/>
<source>Exit the application.</source> <source>Exit the application.</source>
<translation>Exit the application.</translation> <translation>Lépjen ki az programból.</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="330"/> <location filename="../main_window_ui.h" line="330"/>
<source>Show Game List</source> <source>Show Game List</source>
<translation>Show Game List</translation> <translation>Játék Könyvtár Megjelenítése</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="332"/> <location filename="../main_window_ui.h" line="332"/>
<source>Game List Refresh</source> <source>Game List Refresh</source>
<translation>Game List Refresh</translation> <translation>Játék Könyvtár Újratöltése</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="333"/> <location filename="../main_window_ui.h" line="333"/>
<source>Tiny</source> <source>Tiny</source>
<translation>Tiny</translation> <translation>Apró</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="334"/> <location filename="../main_window_ui.h" line="334"/>
<source>Small</source> <source>Small</source>
<translation>Small</translation> <translation>Kicsi</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="335"/> <location filename="../main_window_ui.h" line="335"/>
<source>Medium</source> <source>Medium</source>
<translation>Medium</translation> <translation>Közepes</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="336"/> <location filename="../main_window_ui.h" line="336"/>
<source>Large</source> <source>Large</source>
<translation>Large</translation> <translation>Nagy</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="338"/> <location filename="../main_window_ui.h" line="338"/>
<source>List View</source> <source>List View</source>
<translation>List View</translation> <translation>Lista Nézet</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="340"/> <location filename="../main_window_ui.h" line="340"/>
<source>Grid View</source> <source>Grid View</source>
<translation>Grid View</translation> <translation>Rács Nézet</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="341"/> <location filename="../main_window_ui.h" line="341"/>
<source>Elf Viewer</source> <source>Elf Viewer</source>
<translation>Elf Viewer</translation> <translation>Elf Néző</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="343"/> <location filename="../main_window_ui.h" line="343"/>
<source>Game Install Directory</source> <source>Game Install Directory</source>
<translation>Game Install Directory</translation> <translation>Játék Telepítési Mappa</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation>Csalások / Javítások letöltése</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="345"/> <location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source> <source>Dump Game List</source>
<translation>Dump Game List</translation> <translation>Játék Lista Dumpolása</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="346"/> <location filename="../main_window_ui.h" line="346"/>
<source>PKG Viewer</source> <source>PKG Viewer</source>
<translation>PKG Viewer</translation> <translation>PKG Néző</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="348"/> <location filename="../main_window_ui.h" line="348"/>
<source>Search...</source> <source>Search...</source>
<translation>Search...</translation> <translation>Keresés...</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="349"/> <location filename="../main_window_ui.h" line="349"/>
<source>File</source> <source>File</source>
<translation>File</translation> <translation>Fájl</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="350"/> <location filename="../main_window_ui.h" line="350"/>
<source>View</source> <source>View</source>
<translation>View</translation> <translation>Megnézés</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="352"/> <location filename="../main_window_ui.h" line="352"/>
<source>Game List Icons</source> <source>Game List Icons</source>
<translation>Game List Icons</translation> <translation>Játék Könyvtár Ikonok</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="354"/> <location filename="../main_window_ui.h" line="354"/>
<source>Game List Mode</source> <source>Game List Mode</source>
<translation>Game List Mode</translation> <translation>Játék Könyvtár Mód</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="355"/> <location filename="../main_window_ui.h" line="355"/>
<source>Settings</source> <source>Settings</source>
<translation>Settings</translation> <translation>Beállítások</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="356"/> <location filename="../main_window_ui.h" line="356"/>
<source>Utils</source> <source>Utils</source>
<translation>Utils</translation> <translation>Segédeszközök</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="357"/> <location filename="../main_window_ui.h" line="357"/>
<source>Themes</source> <source>Themes</source>
<translation>Themes</translation> <translation>Témák</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="358"/> <location filename="../main_window_ui.h" line="358"/>
<source>About</source> <source>About</source>
<translation>About</translation> <translation>Segítség</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="359"/> <location filename="../main_window_ui.h" line="359"/>
<source>Dark</source> <source>Dark</source>
<translation>Dark</translation> <translation>Sötét</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="360"/> <location filename="../main_window_ui.h" line="360"/>
<source>Light</source> <source>Light</source>
<translation>Light</translation> <translation>Világos</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="361"/> <location filename="../main_window_ui.h" line="361"/>
<source>Green</source> <source>Green</source>
<translation>Green</translation> <translation>Zöld</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="362"/> <location filename="../main_window_ui.h" line="362"/>
<source>Blue</source> <source>Blue</source>
<translation>Blue</translation> <translation>Kék</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="363"/> <location filename="../main_window_ui.h" line="363"/>
<source>Violet</source> <source>Violet</source>
<translation>Violet</translation> <translation>Ibolya</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="364"/> <location filename="../main_window_ui.h" line="364"/>
<source>toolBar</source> <source>toolBar</source>
<translation>toolBar</translation> <translation>Eszköztár</translation>
</message> </message>
</context> </context>
<context> <context>
@ -339,7 +349,7 @@
<message> <message>
<location filename="../pkg_viewer.cpp" line="32"/> <location filename="../pkg_viewer.cpp" line="32"/>
<source>Open Folder</source> <source>Open Folder</source>
<translation>Open Folder</translation> <translation>Mappa Megnyitása</translation>
</message> </message>
</context> </context>
<context> <context>
@ -347,7 +357,7 @@
<message> <message>
<location filename="../trophy_viewer.cpp" line="8"/> <location filename="../trophy_viewer.cpp" line="8"/>
<source>Trophy Viewer</source> <source>Trophy Viewer</source>
<translation>Trophy Viewer</translation> <translation>Trófeák Megtekintése</translation>
</message> </message>
</context> </context>
<context> <context>
@ -355,137 +365,538 @@
<message> <message>
<location filename="../settings_dialog.ui" line="29"/> <location filename="../settings_dialog.ui" line="29"/>
<source>Settings</source> <source>Settings</source>
<translation>Settings</translation> <translation>Beállítások</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="67"/> <location filename="../settings_dialog.ui" line="67"/>
<source>General</source> <source>General</source>
<translation>General</translation> <translation>Általános</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="77"/> <location filename="../settings_dialog.ui" line="77"/>
<source>System</source> <source>System</source>
<translation>System</translation> <translation>Rendszer</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="83"/> <location filename="../settings_dialog.ui" line="83"/>
<source>Console Language</source> <source>Console Language</source>
<translation>Console Language</translation> <translation>A Konzol Nyelvezete</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="95"/> <location filename="../settings_dialog.ui" line="95"/>
<source>Emulator Language</source> <source>Emulator Language</source>
<translation>Emulator Language</translation> <translation>Az Emulátor Nyelvezete</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="114"/> <location filename="../settings_dialog.ui" line="114"/>
<source>Emulator</source> <source>Emulator</source>
<translation>Emulator</translation> <translation>Emulátor</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="122"/> <location filename="../settings_dialog.ui" line="122"/>
<source>Enable Fullscreen</source> <source>Enable Fullscreen</source>
<translation>Enable Fullscreen</translation> <translation>Teljesképernyő Engedélyezése</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="129"/> <location filename="../settings_dialog.ui" line="129"/>
<source>Show Splash</source> <source>Show Splash</source>
<translation>Show Splash</translation> <translation>Indítóképernyő Mutatása</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="136"/> <location filename="../settings_dialog.ui" line="136"/>
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>Is PS4 Pro</translation> <translation>PS4 Pro</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
<translation>Username</translation> <translation>Felhasználónév</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="178"/> <location filename="../settings_dialog.ui" line="178"/>
<source>Logger</source> <source>Logger</source>
<translation>Logger</translation> <translation>Naplózó</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="199"/> <location filename="../settings_dialog.ui" line="199"/>
<source>Log Type</source> <source>Log Type</source>
<translation>Log Type</translation> <translation>Naplózási Típus</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="235"/> <location filename="../settings_dialog.ui" line="235"/>
<source>Log Filter</source> <source>Log Filter</source>
<translation>Log Filter</translation> <translation>Naplózási Filter</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
<translation>Graphics</translation> <translation>Grafika</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="282"/> <location filename="../settings_dialog.ui" line="282"/>
<source>Graphics Device</source> <source>Graphics Device</source>
<translation>Graphics Device</translation> <translation>Grafikai Eszköz</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="326"/> <location filename="../settings_dialog.ui" line="326"/>
<source>Width</source> <source>Width</source>
<translation>Width</translation> <translation>Szélesség</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="357"/> <location filename="../settings_dialog.ui" line="357"/>
<source>Height</source> <source>Height</source>
<translation>Height</translation> <translation>Magasság</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="405"/> <location filename="../settings_dialog.ui" line="405"/>
<source>Vblank Divider</source> <source>Vblank Divider</source>
<translation>Vblank Divider</translation> <translation>Vblank Elosztó</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="453"/> <location filename="../settings_dialog.ui" line="453"/>
<source>Advanced</source> <source>Advanced</source>
<translation>Advanced</translation> <translation>Haladó</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="462"/> <location filename="../settings_dialog.ui" line="462"/>
<source>Enable Shaders Dumping</source> <source>Enable Shaders Dumping</source>
<translation>Enable Shaders Dumping</translation> <translation>Shader Dumpolás Engedélyezése</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="469"/> <location filename="../settings_dialog.ui" line="469"/>
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>Enable NULL GPU</translation> <translation>NULL GPU Engedélyezése</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="476"/> <location filename="../settings_dialog.ui" line="476"/>
<source>Enable PM4 Dumping</source> <source>Enable PM4 Dumping</source>
<translation>Enable PM4 Dumping</translation> <translation>PM4 Dumpolás Engedélyezése</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
<translation>Debug</translation> <translation>Debugolás</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="537"/> <location filename="../settings_dialog.ui" line="537"/>
<source>Enable Debug Dumping</source> <source>Enable Debug Dumping</source>
<translation>Enable Debug Dumping</translation> <translation>Debug Dumpolás Engedélyezése</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="560"/> <location filename="../settings_dialog.ui" line="560"/>
<source>Enable Vulkan Validation Layers</source> <source>Enable Vulkan Validation Layers</source>
<translation>Enable Vulkan Validation Layers</translation> <translation>Vulkan Validációs Rétegek Engedélyezése</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="567"/> <location filename="../settings_dialog.ui" line="567"/>
<source>Enable Vulkan Synchronization Validation</source> <source>Enable Vulkan Synchronization Validation</source>
<translation>Enable Vulkan Synchronization Validation</translation> <translation>Vulkan Szinkronizálás Validáció</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="574"/> <location filename="../settings_dialog.ui" line="574"/>
<source>Enable RenderDoc Debugging</source> <source>Enable RenderDoc Debugging</source>
<translation>Enable RenderDoc Debugging</translation> <translation>RenderDoc Debugolás Engedélyezése</translation>
</message> </message>
</context> </context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation> * Támogatott Vulkan verzió hiányzik</translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source>
<translation>Letöltés csalások minden telepített játékhoz</translation>
</message>
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation>Frissítések letöltése minden játékhoz</translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
<source>Download Complete</source>
<translation>Letöltés befejezve</translation>
</message>
<message>
<location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source>
<translation>Csalásokat töltöttél le az összes telepített játékhoz.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="391"/>
<source>Patches Downloaded Successfully!</source>
<translation>Frissítések sikeresen letöltve!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="392"/>
<source>All Patches available for all games have been downloaded.</source>
<translation>Az összes játékhoz elérhető frissítés letöltésre került.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="549"/>
<source>Games: </source>
<translation>Játékok: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="575"/>
<source>PKG File (*.PKG)</source>
<translation>PKG fájl (*.PKG)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>ELF fájlok (*.bin *.elf *.oelf)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Game Boot</source>
<translation>Játék indító</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Only one file can be selected!</source>
<translation>Csak egy fájl választható ki!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>PKG kicsomagolás</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>Patch detected!</source>
<translation>Frissítés észlelve!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source>
<translation>A PKG és a játék verziói egyeznek: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
<source>Would you like to overwrite?</source>
<translation>Szeretné felülírni?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>PKG Version %1 is older than installed version: </source>
<translation>A %1-es PKG verzió régebbi, mint a telepített verzió: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>A játék telepítve van: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Szeretné telepíteni a frissítést: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source>
<translation>DLC Telepítés</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source>
<translation>Szeretné telepíteni a DLC-t: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC már telepítve:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>A játék már telepítve van</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>A PKG egy javítás, először telepítsd a játékot!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source>
<translation>PKG HIBA</translation>
</message>
<message>
<location filename="../main_window.cpp" line="693"/>
<source>Extracting PKG %1/%2</source>
<translation>PKG kicsomagolása %1/%2</translation>
</message>
<message>
<location filename="../main_window.cpp" line="703"/>
<source>Extraction Finished</source>
<translation>Kicsomagolás befejezve</translation>
</message>
<message>
<location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source>
<translation>A játék sikeresen telepítve itt: %1</translation>
</message>
<message>
<location filename="../main_window.cpp" line="725"/>
<source>File doesn't appear to be a valid PKG file</source>
<translation>A fájl nem tűnik érvényes PKG fájlnak</translation>
</message>
</context>
<context>
<name>CheatsPatches</name>
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source>
<translation>Csalások / Javítások</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>A csalások/patchek kísérleti jellegűek.\nHasználja őket óvatosan.\n\nTöltse le a csalásokat egyesével a repository kiválasztásával és a letöltés gombra kattintással.\nA Patches fül alatt egyszerre letöltheti az összes patchet, választhat, melyeket szeretné használni, és elmentheti a választását.\n\nMivel nem fejlesztjük a csalásokat/patch-eket,\nkérjük, jelentse a problémákat a csalás szerzőjének.\n\nKészített egy új csalást? Látogasson el ide:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
<source>No Image Available</source>
<translation>Nincs elérhető kép</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source>
<translation>Sorozatszám: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>Verzió: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source>
<translation>Méret: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source>
<translation>Válaszd ki a csalás fájlt:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source>
<translation>Tároló:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source>
<translation>Csalások letöltése</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Delete File</source>
<translation>Fájl törlése</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="169"/>
<source>No files selected.</source>
<translation>Nincsenek kiválasztott fájlok.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source>
<translation>Törölheted a nem kívánt csalásokat a letöltés után.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>Szeretnéd törölni a kiválasztott fájlt?\n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source>
<translation>Válaszd ki a javítás fájlt:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation>Javítások letöltése</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
<source>Save</source>
<translation>Mentés</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation>Csalások</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
<source>Patches</source>
<translation>Javítások</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>Error</source>
<translation>Hiba</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>No patch selected.</source>
<translation>Nincs kiválasztva javítás.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="292"/>
<source>Unable to open files.json for reading.</source>
<translation>Nem sikerült megnyitni a files.json fájlt olvasásra.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source>
<translation>Nincs található javítási fájl a jelenlegi sorozatszámhoz.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="323"/>
<source>Unable to open the file for reading.</source>
<translation>Nem sikerült megnyitni a fájlt olvasásra.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="422"/>
<source>Unable to open the file for writing.</source>
<translation>Nem sikerült megnyitni a fájlt írásra.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source>
<translation>XML elemzési hiba: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Success</source>
<translation>Siker</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Options saved successfully.</source>
<translation>A beállítások sikeresen elmentve.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation>Érvénytelen forrás</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
<source>The selected source is invalid.</source>
<translation>A kiválasztott forrás érvénytelen.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation>A fájl létezik</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
<source>File already exists. Do you want to replace it?</source>
<translation>A fájl már létezik. Szeretnéd helyettesíteni?</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source>
<translation>Nem sikerült elmenteni a fájlt:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source>
<translation>Nem sikerült letölteni a fájlt:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation>Csalások nem találhatóak</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source>
<translation>Nincs található csalás ezen a játékverzión ebben a kiválasztott tárolóban,próbálj meg egy másik tárolót vagy a játék egy másik verzióját.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation>Csalások sikeresen letöltve</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation>Sikeresen letöltötted a csalásokat ennek a játéknak a verziójához a kiválasztott tárolóból. Próbálhatsz letölteni egy másik tárolóból is, ha az elérhető, akkor a fájl kiválasztásával az is használható lesz.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source>
<translation>Nem sikerült menteni:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source>
<translation>Nem sikerült letölteni:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="762"/>
<source>Download Complete</source>
<translation>Letöltés befejezve</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation>Frissítések sikeresen letöltve! Minden elérhető frissítés letöltésre került, nem szükséges egyesével letölteni őket minden játékhoz, mint a csalások esetében.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
<source>Failed to parse JSON data from HTML.</source>
<translation>Nem sikerült az JSON adatok elemzése HTML-ből.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="778"/>
<source>Failed to retrieve HTML page.</source>
<translation>Nem sikerült HTML oldal lekérése.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source>
<translation>Nem sikerült megnyitni a fájlt:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source>
<translation>XML HIBA:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="826"/>
<source>Failed to open files.json for writing</source>
<translation>Nem sikerült megnyitni a files.json fájlt írásra</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source>
<translation>Szerző: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source>
<translation>A könyvtár nem létezik:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Failed to open files.json for reading.</source>
<translation>Nem sikerült megnyitni a files.json fájlt olvasásra.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>Név:</translation>
</message>
</context>
</TS> </TS>

View File

@ -81,67 +81,72 @@
<context> <context>
<name>GuiContextMenus</name> <name>GuiContextMenus</name>
<message> <message>
<location filename="../gui_context_menus.h" line="39"/> <location filename="../gui_context_menus.h" line="46"/>
<source>Create Shortcut</source> <source>Create Shortcut</source>
<translation>Create Shortcut</translation> <translation>Create Shortcut</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="40"/> <location filename="../gui_context_menus.h" line="47"/>
<source>Open Game Folder</source> <source>Open Game Folder</source>
<translation>Open Game Folder</translation> <translation>Open Game Folder</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="41"/> <location filename="../gui_context_menus.h" line="48"/>
<source>Cheats / Patches</source>
<translation>Cheat / Patch</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>SFO Viewer</source> <source>SFO Viewer</source>
<translation>SFO Viewer</translation> <translation>SFO Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="42"/> <location filename="../gui_context_menus.h" line="50"/>
<source>Trophy Viewer</source> <source>Trophy Viewer</source>
<translation>Trophy Viewer</translation> <translation>Trophy Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="50"/> <location filename="../gui_context_menus.h" line="59"/>
<source>Copy info</source> <source>Copy info</source>
<translation>Copy info</translation> <translation>Copy info</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="51"/> <location filename="../gui_context_menus.h" line="60"/>
<source>Copy Name</source> <source>Copy Name</source>
<translation>Copy Name</translation> <translation>Copy Name</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="52"/> <location filename="../gui_context_menus.h" line="61"/>
<source>Copy Serial</source> <source>Copy Serial</source>
<translation>Copy Serial</translation> <translation>Copy Serial</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="53"/> <location filename="../gui_context_menus.h" line="62"/>
<source>Copy All</source> <source>Copy All</source>
<translation>Copy All</translation> <translation>Copy All</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="173"/> <location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source> <source>Shortcut creation</source>
<translation>Shortcut creation</translation> <translation>Shortcut creation</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="174"/> <location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source> <source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation> <translation>Shortcut created successfully!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="177"/> <location filename="../gui_context_menus.h" line="199"/>
<source>Error</source> <source>Error</source>
<translation>Error</translation> <translation>Error</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="178"/> <location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source> <source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation> <translation>Error creating shortcut!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="253"/> <location filename="../gui_context_menus.h" line="275"/>
<source>Install PKG</source> <source>Install PKG</source>
<translation>Install PKG</translation> <translation>Install PKG</translation>
</message> </message>
@ -248,6 +253,11 @@
<source>Game Install Directory</source> <source>Game Install Directory</source>
<translation>Game Install Directory</translation> <translation>Game Install Directory</translation>
</message> </message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation>Unduh Cheat / Patch</translation>
</message>
<message> <message>
<location filename="../main_window_ui.h" line="345"/> <location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source> <source>Dump Game List</source>
@ -488,4 +498,405 @@
<translation>Enable RenderDoc Debugging</translation> <translation>Enable RenderDoc Debugging</translation>
</message> </message>
</context> </context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation> * Versi Vulkan Tidak Didukung</translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source>
<translation>Unduh Cheat Untuk Semua Game Yang Terpasang</translation>
</message>
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation>Unduh Patch Untuk Semua Game</translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
<source>Download Complete</source>
<translation>Unduhan Selesai</translation>
</message>
<message>
<location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source>
<translation>Anda telah mengunduh cheat untuk semua game yang terpasang.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="391"/>
<source>Patches Downloaded Successfully!</source>
<translation>Patch Berhasil Diunduh!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="392"/>
<source>All Patches available for all games have been downloaded.</source>
<translation>Semua Patch yang tersedia untuk semua game telah diunduh.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="549"/>
<source>Games: </source>
<translation>Game: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="575"/>
<source>PKG File (*.PKG)</source>
<translation>File PKG (*.PKG)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>File ELF (*.bin *.elf *.oelf)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Game Boot</source>
<translation>Boot Game</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Only one file can be selected!</source>
<translation>Hanya satu file yang bisa dipilih!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>Ekstraksi PKG</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>Patch detected!</source>
<translation>Patch terdeteksi!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source>
<translation>Versi PKG dan Game cocok: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
<source>Would you like to overwrite?</source>
<translation>Apakah Anda ingin menimpa?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>PKG Version %1 is older than installed version: </source>
<translation>Versi PKG %1 lebih lama dari versi yang terpasang: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Game telah terpasang: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Apakah Anda ingin menginstal patch: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source>
<translation>Instalasi DLC</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source>
<translation>Apakah Anda ingin menginstal DLC: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC sudah terpasang:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Game sudah terpasang</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>PKG adalah patch, harap pasang game terlebih dahulu!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source>
<translation>KESALAHAN PKG</translation>
</message>
<message>
<location filename="../main_window.cpp" line="693"/>
<source>Extracting PKG %1/%2</source>
<translation>Mengekstrak PKG %1/%2</translation>
</message>
<message>
<location filename="../main_window.cpp" line="703"/>
<source>Extraction Finished</source>
<translation>Ekstraksi Selesai</translation>
</message>
<message>
<location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source>
<translation>Game berhasil dipasang di %1</translation>
</message>
<message>
<location filename="../main_window.cpp" line="725"/>
<source>File doesn't appear to be a valid PKG file</source>
<translation>File tampaknya bukan file PKG yang valid</translation>
</message>
</context>
<context>
<name>CheatsPatches</name>
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source>
<translation>Cheat / Patch</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>Cheats/Patches bersifat eksperimental.\nGunakan dengan hati-hati.\n\nUnduh cheats satu per satu dengan memilih repositori dan mengklik tombol unduh.\nDi tab Patches, Anda dapat mengunduh semua patch sekaligus, memilih yang ingin digunakan, dan menyimpan pilihan Anda.\n\nKarena kami tidak mengembangkan Cheats/Patches,\nharap laporkan masalah kepada pembuat cheat.\n\nMembuat cheat baru? Kunjungi:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
<source>No Image Available</source>
<translation>Tidak Ada Gambar Tersedia</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source>
<translation>Serial: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>Versi: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source>
<translation>Ukuran: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source>
<translation>Pilih File Cheat:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source>
<translation>Repositori:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source>
<translation>Unduh Cheat</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Delete File</source>
<translation>Hapus File</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="169"/>
<source>No files selected.</source>
<translation>Tidak ada file yang dipilih.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source>
<translation>Anda dapat menghapus cheat yang tidak Anda inginkan setelah mengunduhnya.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>Apakah Anda ingin menghapus berkas yang dipilih?\n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source>
<translation>Pilih File Patch:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation>Unduh Patch</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
<source>Save</source>
<translation>Simpan</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation>Cheat</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
<source>Patches</source>
<translation>Patch</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>Error</source>
<translation>Kesalahan</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>No patch selected.</source>
<translation>Tidak ada patch yang dipilih.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="292"/>
<source>Unable to open files.json for reading.</source>
<translation>Tidak dapat membuka files.json untuk dibaca.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source>
<translation>Tidak ada file patch ditemukan untuk serial saat ini.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="323"/>
<source>Unable to open the file for reading.</source>
<translation>Tidak dapat membuka file untuk dibaca.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="422"/>
<source>Unable to open the file for writing.</source>
<translation>Tidak dapat membuka file untuk menulis.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source>
<translation>Gagal menganalisis XML: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Success</source>
<translation>Sukses</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Options saved successfully.</source>
<translation>Opsi berhasil disimpan.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation>Sumber Tidak Valid</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
<source>The selected source is invalid.</source>
<translation>Sumber yang dipilih tidak valid.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation>File Ada</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
<source>File already exists. Do you want to replace it?</source>
<translation>File sudah ada. Apakah Anda ingin menggantinya?</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source>
<translation>Gagal menyimpan file:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source>
<translation>Gagal mengunduh file:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation>Cheat Tidak Ditemukan</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source>
<translation>Cheat tidak ditemukan untuk game ini dalam versi repositori yang dipilih,cobalah repositori lain atau versi game yang berbeda.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation>Cheat Berhasil Diunduh</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation>Anda telah berhasil mengunduh cheat untuk versi game ini dari repositori yang dipilih. Anda bisa mencoba mengunduh dari repositori lain, jika tersedia akan juga memungkinkan untuk menggunakannya dengan memilih file dari daftar.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source>
<translation>Gagal menyimpan:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source>
<translation>Gagal mengunduh:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="762"/>
<source>Download Complete</source>
<translation>Unduhan Selesai</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation>Patch Berhasil Diunduh! Semua Patch yang tersedia untuk semua game telah diunduh, tidak perlu mengunduhnya satu per satu seperti yang terjadi pada Cheat.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
<source>Failed to parse JSON data from HTML.</source>
<translation>Gagal menganalisis data JSON dari HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="778"/>
<source>Failed to retrieve HTML page.</source>
<translation>Gagal mengambil halaman HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source>
<translation>Gagal membuka file:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source>
<translation>KESALAHAN XML:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="826"/>
<source>Failed to open files.json for writing</source>
<translation>Gagal membuka files.json untuk menulis</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source>
<translation>Penulis: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source>
<translation>Direktori tidak ada:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Failed to open files.json for reading.</source>
<translation>Gagal membuka files.json untuk dibaca.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>Nama:</translation>
</message>
</context>
</TS> </TS>

View File

@ -16,7 +16,7 @@
<message> <message>
<location filename="../about_dialog.ui" line="78"/> <location filename="../about_dialog.ui" line="78"/>
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source> <source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
<translation>shadPS4 è un emulatore sperimentale open source per Playstation 4.</translation> <translation>shadPS4 è un emulatore sperimentale open source per PlayStation 4.</translation>
</message> </message>
<message> <message>
<location filename="../about_dialog.ui" line="99"/> <location filename="../about_dialog.ui" line="99"/>
@ -81,67 +81,72 @@
<context> <context>
<name>GuiContextMenus</name> <name>GuiContextMenus</name>
<message> <message>
<location filename="../gui_context_menus.h" line="39"/> <location filename="../gui_context_menus.h" line="46"/>
<source>Create Shortcut</source> <source>Create Shortcut</source>
<translation>Crea scorciatoia</translation> <translation>Crea scorciatoia</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="40"/> <location filename="../gui_context_menus.h" line="47"/>
<source>Open Game Folder</source> <source>Open Game Folder</source>
<translation>Apri cartella del gioco</translation> <translation>Apri cartella del gioco</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="41"/> <location filename="../gui_context_menus.h" line="48"/>
<source>Cheats / Patches</source>
<translation>Trucchi / Patch</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>SFO Viewer</source> <source>SFO Viewer</source>
<translation>Visualizzatore SFO</translation> <translation>Visualizzatore SFO</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="42"/> <location filename="../gui_context_menus.h" line="50"/>
<source>Trophy Viewer</source> <source>Trophy Viewer</source>
<translation>Visualizzatore Trofei</translation> <translation>Visualizzatore Trofei</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="50"/> <location filename="../gui_context_menus.h" line="59"/>
<source>Copy info</source> <source>Copy info</source>
<translation>Copia informazioni</translation> <translation>Copia informazioni</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="51"/> <location filename="../gui_context_menus.h" line="60"/>
<source>Copy Name</source> <source>Copy Name</source>
<translation>Copia Nome</translation> <translation>Copia Nome</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="52"/> <location filename="../gui_context_menus.h" line="61"/>
<source>Copy Serial</source> <source>Copy Serial</source>
<translation>Copia Seriale</translation> <translation>Copia Seriale</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="53"/> <location filename="../gui_context_menus.h" line="62"/>
<source>Copy All</source> <source>Copy All</source>
<translation>Copia Tutto</translation> <translation>Copia Tutto</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="173"/> <location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source> <source>Shortcut creation</source>
<translation>Creazione scorciatoia</translation> <translation>Creazione scorciatoia</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="174"/> <location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source> <source>Shortcut created successfully!\n %1</source>
<translation>Scorciatoia creata con successo!\n %1</translation> <translation>Scorciatoia creata con successo!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="177"/> <location filename="../gui_context_menus.h" line="199"/>
<source>Error</source> <source>Error</source>
<translation>Errore</translation> <translation>Errore</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="178"/> <location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source> <source>Error creating shortcut!\n %1</source>
<translation>Errore nella creazione della scorciatoia!\n %1</translation> <translation>Errore nella creazione della scorciatoia!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="253"/> <location filename="../gui_context_menus.h" line="275"/>
<source>Install PKG</source> <source>Install PKG</source>
<translation>Installa PKG</translation> <translation>Installa PKG</translation>
</message> </message>
@ -176,7 +181,7 @@
<message> <message>
<location filename="../main_window_ui.h" line="318"/> <location filename="../main_window_ui.h" line="318"/>
<source>Install application from a .pkg file</source> <source>Install application from a .pkg file</source>
<translation>Installa applicaazione da un .pkg file</translation> <translation>Installa applicazione da un file .pkg</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="320"/> <location filename="../main_window_ui.h" line="320"/>
@ -231,7 +236,7 @@
<message> <message>
<location filename="../main_window_ui.h" line="338"/> <location filename="../main_window_ui.h" line="338"/>
<source>List View</source> <source>List View</source>
<translation>Visualizzazione lista</translation> <translation>Visualizzazione Lista</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="340"/> <location filename="../main_window_ui.h" line="340"/>
@ -248,6 +253,11 @@
<source>Game Install Directory</source> <source>Game Install Directory</source>
<translation>Cartella Installazione Giochi</translation> <translation>Cartella Installazione Giochi</translation>
</message> </message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation>Scarica Trucchi / Patch</translation>
</message>
<message> <message>
<location filename="../main_window_ui.h" line="345"/> <location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source> <source>Dump Game List</source>
@ -331,7 +341,7 @@
<message> <message>
<location filename="../main_window_ui.h" line="364"/> <location filename="../main_window_ui.h" line="364"/>
<source>toolBar</source> <source>toolBar</source>
<translation>barra strumenti</translation> <translation>Barra strumenti</translation>
</message> </message>
</context> </context>
<context> <context>
@ -346,8 +356,8 @@
<name>TrophyViewer</name> <name>TrophyViewer</name>
<message> <message>
<location filename="../trophy_viewer.cpp" line="8"/> <location filename="../trophy_viewer.cpp" line="8"/>
<source>Visualizzatore Trofei</source> <source>Trophy Viewer</source>
<translation>Trophy Viewer</translation> <translation>Visualizzatore Trofei</translation>
</message> </message>
</context> </context>
<context> <context>
@ -365,7 +375,7 @@
<message> <message>
<location filename="../settings_dialog.ui" line="77"/> <location filename="../settings_dialog.ui" line="77"/>
<source>System</source> <source>System</source>
<translation>Systema</translation> <translation>Sistema</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="83"/> <location filename="../settings_dialog.ui" line="83"/>
@ -450,7 +460,7 @@
<message> <message>
<location filename="../settings_dialog.ui" line="462"/> <location filename="../settings_dialog.ui" line="462"/>
<source>Enable Shaders Dumping</source> <source>Enable Shaders Dumping</source>
<translation>Abilita Scaricamento Shader</translation> <translation>Abilita Dump Shader</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="469"/> <location filename="../settings_dialog.ui" line="469"/>
@ -460,7 +470,7 @@
<message> <message>
<location filename="../settings_dialog.ui" line="476"/> <location filename="../settings_dialog.ui" line="476"/>
<source>Enable PM4 Dumping</source> <source>Enable PM4 Dumping</source>
<translation>Abilita Scaricamento PM4</translation> <translation>Abilita Dump PM4</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
@ -470,7 +480,7 @@
<message> <message>
<location filename="../settings_dialog.ui" line="537"/> <location filename="../settings_dialog.ui" line="537"/>
<source>Enable Debug Dumping</source> <source>Enable Debug Dumping</source>
<translation>Abilita Scaricamento Debug</translation> <translation>Abilita Dump Debug</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="560"/> <location filename="../settings_dialog.ui" line="560"/>
@ -488,4 +498,405 @@
<translation>Abilita Debugging RenderDoc</translation> <translation>Abilita Debugging RenderDoc</translation>
</message> </message>
</context> </context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation> * Versione Vulkan non supportata</translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source>
<translation>Scarica Trucchi per tutti i giochi installati</translation>
</message>
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation>Scarica Patch per tutti i giochi</translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
<source>Download Complete</source>
<translation>Scaricamento completato</translation>
</message>
<message>
<location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source>
<translation>Hai scaricato trucchi per tutti i giochi installati.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="391"/>
<source>Patches Downloaded Successfully!</source>
<translation>Patch scaricate con successo!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="392"/>
<source>All Patches available for all games have been downloaded.</source>
<translation>Tutte le patch disponibili per tutti i giochi sono state scaricate.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="549"/>
<source>Games: </source>
<translation>Giochi: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="575"/>
<source>PKG File (*.PKG)</source>
<translation>File PKG (*.PKG)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>File ELF (*.bin *.elf *.oelf)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Game Boot</source>
<translation>Avvia Gioco</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Only one file can be selected!</source>
<translation>Si può selezionare solo un file!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>Estrazione file PKG</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>Patch detected!</source>
<translation>Patch rilevata!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source>
<translation>Le versioni di PKG e del gioco corrispondono: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
<source>Would you like to overwrite?</source>
<translation>Vuoi sovrascrivere?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>PKG Version %1 is older than installed version: </source>
<translation>La versione PKG %1 è più vecchia rispetto alla versione installata: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Gioco installato: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Vuoi installare la patch: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source>
<translation>Installazione DLC</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source>
<translation>Vuoi installare il DLC: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC già installato:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Gioco già installato</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>Questo file PKG contiene una patch. Per favore, installa prima il gioco!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source>
<translation>ERRORE PKG</translation>
</message>
<message>
<location filename="../main_window.cpp" line="693"/>
<source>Extracting PKG %1/%2</source>
<translation>Estrazione file PKG %1/%2</translation>
</message>
<message>
<location filename="../main_window.cpp" line="703"/>
<source>Extraction Finished</source>
<translation>Estrazione Completata</translation>
</message>
<message>
<location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source>
<translation>Gioco installato correttamente in %1</translation>
</message>
<message>
<location filename="../main_window.cpp" line="725"/>
<source>File doesn't appear to be a valid PKG file</source>
<translation>Il file sembra non essere un file PKG valido</translation>
</message>
</context>
<context>
<name>CheatsPatches</name>
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source>
<translation>Trucchi / Patch</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>I trucchi e le patch sono sperimentali.\nUtilizzali con cautela.\n\nScarica i trucchi singolarmente selezionando l'archivio e cliccando sul pulsante di download.\nNella scheda Patch, puoi scaricare tutte le patch in una volta sola, scegliere quali vuoi utilizzare e salvare la tua selezione.\n\nPoiché non sviluppiamo i trucchi e le patch,\nper favore segnala i problemi all'autore dei trucchi.\n\nHai creato un nuovo trucco? Visita:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
<source>No Image Available</source>
<translation>Nessuna immagine disponibile</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source>
<translation>Seriale: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>Versione: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source>
<translation>Dimensione: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source>
<translation>Seleziona File Trucchi:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source>
<translation>Archivio:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source>
<translation>Scarica trucchi</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Delete File</source>
<translation>Cancella File</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="169"/>
<source>No files selected.</source>
<translation>Nessun file selezionato.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source>
<translation>Puoi cancellare i trucchi che non vuoi utilizzare dopo averli scaricati.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>Vuoi cancellare il file selezionato?\n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source>
<translation>Seleziona File Patch:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation>Scarica Patch</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
<source>Save</source>
<translation>Salva</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation>Trucchi</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
<source>Patches</source>
<translation>Patch</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>Error</source>
<translation>Errore</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>No patch selected.</source>
<translation>Nessuna patch selezionata.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="292"/>
<source>Unable to open files.json for reading.</source>
<translation>Impossibile aprire il file .json per la lettura.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source>
<translation>Nessun file patch trovato per il seriale selezionato.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="323"/>
<source>Unable to open the file for reading.</source>
<translation>Impossibile aprire il file per la lettura.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="422"/>
<source>Unable to open the file for writing.</source>
<translation>Impossibile aprire il file per la scrittura.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source>
<translation>Analisi XML fallita: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Success</source>
<translation>Successo</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Options saved successfully.</source>
<translation>Opzioni salvate con successo.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation>Fonte non valida</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
<source>The selected source is invalid.</source>
<translation>La fonte selezionata non è valida.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation>Il file è presente</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
<source>File already exists. Do you want to replace it?</source>
<translation>Il file è già presente. Vuoi sostituirlo?</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source>
<translation>Salvataggio file fallito:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source>
<translation>Scaricamento file fallito:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation>Trucchi non trovati</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source>
<translation>Non sono stati trovati trucchi per questa versione del gioco nell'archivio selezionato, prova un altro archivio o una versione diversa del gioco.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation>Trucchi scaricati con successo!</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation>Hai scaricato con successo i trucchi per questa versione del gioco dall'archivio selezionato. Puoi provare a scaricare da un altro archivio, se disponibile, puoi anche utilizzarlo selezionando il file dall'elenco.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source>
<translation>Salvataggio fallito:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source>
<translation>Impossibile scaricare:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="762"/>
<source>Download Complete</source>
<translation>Scaricamento completo</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation>Patch scaricata con successo! Vengono scaricate tutte le patch disponibili per tutti i giochi, non è necessario scaricarle singolarmente per ogni gioco come nel caso dei trucchi.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
<source>Failed to parse JSON data from HTML.</source>
<translation>Impossibile analizzare i dati JSON dall'HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="778"/>
<source>Failed to retrieve HTML page.</source>
<translation>Impossibile recuperare la pagina HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source>
<translation>Impossibile aprire file:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source>
<translation>ERRORE XML:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="826"/>
<source>Failed to open files.json for writing</source>
<translation>Impossibile aprire i file .json per la scrittura</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source>
<translation>Autore: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source>
<translation>La cartella non esiste:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Failed to open files.json for reading.</source>
<translation>Impossibile aprire i file .json per la lettura.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>Nome:</translation>
</message>
</context>
</TS> </TS>

View File

@ -81,67 +81,72 @@
<context> <context>
<name>GuiContextMenus</name> <name>GuiContextMenus</name>
<message> <message>
<location filename="../gui_context_menus.h" line="39"/> <location filename="../gui_context_menus.h" line="46"/>
<source>Create Shortcut</source> <source>Create Shortcut</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="40"/> <location filename="../gui_context_menus.h" line="47"/>
<source>Open Game Folder</source> <source>Open Game Folder</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="41"/> <location filename="../gui_context_menus.h" line="48"/>
<source>Cheats / Patches</source>
<translation> / </translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>SFO Viewer</source> <source>SFO Viewer</source>
<translation>SFOビューワー</translation> <translation>SFOビューワー</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="42"/> <location filename="../gui_context_menus.h" line="50"/>
<source>Trophy Viewer</source> <source>Trophy Viewer</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="50"/> <location filename="../gui_context_menus.h" line="59"/>
<source>Copy info</source> <source>Copy info</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="51"/> <location filename="../gui_context_menus.h" line="60"/>
<source>Copy Name</source> <source>Copy Name</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="52"/> <location filename="../gui_context_menus.h" line="61"/>
<source>Copy Serial</source> <source>Copy Serial</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="53"/> <location filename="../gui_context_menus.h" line="62"/>
<source>Copy All</source> <source>Copy All</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="173"/> <location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source> <source>Shortcut creation</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="174"/> <location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source> <source>Shortcut created successfully!\n %1</source>
<translation>!\n %1</translation> <translation>!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="177"/> <location filename="../gui_context_menus.h" line="199"/>
<source>Error</source> <source>Error</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="178"/> <location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source> <source>Error creating shortcut!\n %1</source>
<translation>!\n %1</translation> <translation>!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="253"/> <location filename="../gui_context_menus.h" line="275"/>
<source>Install PKG</source> <source>Install PKG</source>
<translation>PKGをインストール</translation> <translation>PKGをインストール</translation>
</message> </message>
@ -248,6 +253,11 @@
<source>Game Install Directory</source> <source>Game Install Directory</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation> / </translation>
</message>
<message> <message>
<location filename="../main_window_ui.h" line="345"/> <location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source> <source>Dump Game List</source>
@ -488,4 +498,405 @@
<translation>RenderDocデバッグを有効にする</translation> <translation>RenderDocデバッグを有効にする</translation>
</message> </message>
</context> </context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation> * Vulkanバージョン</translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
<source>Download Complete</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="391"/>
<source>Patches Downloaded Successfully!</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="392"/>
<source>All Patches available for all games have been downloaded.</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="549"/>
<source>Games: </source>
<translation>: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="575"/>
<source>PKG File (*.PKG)</source>
<translation>PKGファイル (*.PKG)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>ELFファイル (*.bin *.elf *.oelf)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Game Boot</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Only one file can be selected!</source>
<translation>1</translation>
</message>
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>PKG抽出</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>Patch detected!</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source>
<translation>PKGとゲームのバージョンが一致しています: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
<source>Would you like to overwrite?</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>PKG Version %1 is older than installed version: </source>
<translation>PKGバージョン %1 : </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source>
<translation>DLCのインストール</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source>
<translation>DLCをインストールしてもよろしいですか: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLCはすでにインストールされています:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>PKGはパッチです</translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source>
<translation>PKGエラー</translation>
</message>
<message>
<location filename="../main_window.cpp" line="693"/>
<source>Extracting PKG %1/%2</source>
<translation>PKGを抽出中 %1/%2</translation>
</message>
<message>
<location filename="../main_window.cpp" line="703"/>
<source>Extraction Finished</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source>
<translation> %1 </translation>
</message>
<message>
<location filename="../main_window.cpp" line="725"/>
<source>File doesn't appear to be a valid PKG file</source>
<translation>PKGファイルでないようです</translation>
</message>
</context>
<context>
<name>CheatsPatches</name>
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source>
<translation> / </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>/\n使用には注意してください\n\nリポジトリを選択し\nPatches使\n\nチート/\n問題があればチートの作者に報告してください\n\n新しいチートを作成しましたか\nhttps://github.com/shadps4-emu/ps4_cheats を訪問してください。</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
<source>No Image Available</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source>
<translation>: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source>
<translation>: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Delete File</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="169"/>
<source>No files selected.</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>\n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
<source>Save</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
<source>Patches</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>Error</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>No patch selected.</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="292"/>
<source>Unable to open files.json for reading.</source>
<translation>files.jsonを読み込み用に開けません</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="323"/>
<source>Unable to open the file for reading.</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="422"/>
<source>Unable to open the file for writing.</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source>
<translation>XMLの解析に失敗しました: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Success</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Options saved successfully.</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
<source>The selected source is invalid.</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
<source>File already exists. Do you want to replace it?</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation> 使</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="762"/>
<source>Download Complete</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation> </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
<source>Failed to parse JSON data from HTML.</source>
<translation>HTMLからJSONデータの解析に失敗しました</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="778"/>
<source>Failed to retrieve HTML page.</source>
<translation>HTMLページの取得に失敗しました</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source>
<translation>XMLエラー:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="826"/>
<source>Failed to open files.json for writing</source>
<translation>files.jsonを記録用に開けません</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source>
<translation>: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Failed to open files.json for reading.</source>
<translation>files.jsonを読み込み用に開けません</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>:</translation>
</message>
</context>
</TS> </TS>

View File

@ -81,67 +81,72 @@
<context> <context>
<name>GuiContextMenus</name> <name>GuiContextMenus</name>
<message> <message>
<location filename="../gui_context_menus.h" line="39"/> <location filename="../gui_context_menus.h" line="46"/>
<source>Create Shortcut</source> <source>Create Shortcut</source>
<translation>Create Shortcut</translation> <translation>Create Shortcut</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="40"/> <location filename="../gui_context_menus.h" line="47"/>
<source>Open Game Folder</source> <source>Open Game Folder</source>
<translation>Open Game Folder</translation> <translation>Open Game Folder</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="41"/> <location filename="../gui_context_menus.h" line="48"/>
<source>Cheats / Patches</source>
<translation> / </translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>SFO Viewer</source> <source>SFO Viewer</source>
<translation>SFO Viewer</translation> <translation>SFO Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="42"/> <location filename="../gui_context_menus.h" line="50"/>
<source>Trophy Viewer</source> <source>Trophy Viewer</source>
<translation>Trophy Viewer</translation> <translation>Trophy Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="50"/> <location filename="../gui_context_menus.h" line="59"/>
<source>Copy info</source> <source>Copy info</source>
<translation>Copy info</translation> <translation>Copy info</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="51"/> <location filename="../gui_context_menus.h" line="60"/>
<source>Copy Name</source> <source>Copy Name</source>
<translation>Copy Name</translation> <translation>Copy Name</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="52"/> <location filename="../gui_context_menus.h" line="61"/>
<source>Copy Serial</source> <source>Copy Serial</source>
<translation>Copy Serial</translation> <translation>Copy Serial</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="53"/> <location filename="../gui_context_menus.h" line="62"/>
<source>Copy All</source> <source>Copy All</source>
<translation>Copy All</translation> <translation>Copy All</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="173"/> <location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source> <source>Shortcut creation</source>
<translation>Shortcut creation</translation> <translation>Shortcut creation</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="174"/> <location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source> <source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation> <translation>Shortcut created successfully!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="177"/> <location filename="../gui_context_menus.h" line="199"/>
<source>Error</source> <source>Error</source>
<translation>Error</translation> <translation>Error</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="178"/> <location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source> <source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation> <translation>Error creating shortcut!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="253"/> <location filename="../gui_context_menus.h" line="275"/>
<source>Install PKG</source> <source>Install PKG</source>
<translation>Install PKG</translation> <translation>Install PKG</translation>
</message> </message>
@ -248,6 +253,11 @@
<source>Game Install Directory</source> <source>Game Install Directory</source>
<translation>Game Install Directory</translation> <translation>Game Install Directory</translation>
</message> </message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation> / </translation>
</message>
<message> <message>
<location filename="../main_window_ui.h" line="345"/> <location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source> <source>Dump Game List</source>
@ -488,4 +498,405 @@
<translation>Enable RenderDoc Debugging</translation> <translation>Enable RenderDoc Debugging</translation>
</message> </message>
</context> </context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation> * Unsupported Vulkan Version</translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source>
<translation>Download Cheats For All Installed Games</translation>
</message>
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation>Download Patches For All Games</translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
<source>Download Complete</source>
<translation>Download Complete</translation>
</message>
<message>
<location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source>
<translation>You have downloaded cheats for all the games you have installed.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="391"/>
<source>Patches Downloaded Successfully!</source>
<translation>Patches Downloaded Successfully!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="392"/>
<source>All Patches available for all games have been downloaded.</source>
<translation>All Patches available for all games have been downloaded.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="549"/>
<source>Games: </source>
<translation>Games: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="575"/>
<source>PKG File (*.PKG)</source>
<translation>PKG File (*.PKG)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>ELF files (*.bin *.elf *.oelf)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Game Boot</source>
<translation>Game Boot</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Only one file can be selected!</source>
<translation>Only one file can be selected!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>PKG Extraction</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>Patch detected!</source>
<translation>Patch detected!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source>
<translation>PKG and Game versions match: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
<source>Would you like to overwrite?</source>
<translation>Would you like to overwrite?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>PKG Version %1 is older than installed version: </source>
<translation>PKG Version %1 is older than installed version: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Game is installed: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Would you like to install Patch: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source>
<translation>DLC Installation</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source>
<translation>Would you like to install DLC: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC already installed:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Game already installed</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>PKG is a patch, please install the game first!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source>
<translation>PKG ERROR</translation>
</message>
<message>
<location filename="../main_window.cpp" line="693"/>
<source>Extracting PKG %1/%2</source>
<translation>Extracting PKG %1/%2</translation>
</message>
<message>
<location filename="../main_window.cpp" line="703"/>
<source>Extraction Finished</source>
<translation>Extraction Finished</translation>
</message>
<message>
<location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source>
<translation>Game successfully installed at %1</translation>
</message>
<message>
<location filename="../main_window.cpp" line="725"/>
<source>File doesn't appear to be a valid PKG file</source>
<translation>File doesn't appear to be a valid PKG file</translation>
</message>
</context>
<context>
<name>CheatsPatches</name>
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source>
<translation>Cheats / Patches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
<source>No Image Available</source>
<translation>No Image Available</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source>
<translation>Serial: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>Version: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source>
<translation>Size: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source>
<translation>Select Cheat File:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source>
<translation>Repository:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source>
<translation>Download Cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Delete File</source>
<translation>Delete File</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="169"/>
<source>No files selected.</source>
<translation>No files selected.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source>
<translation>You can delete the cheats you don't want after downloading them.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>Do you want to delete the selected file?\n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source>
<translation>Select Patch File:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation>Download Patches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
<source>Save</source>
<translation>Save</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation>Cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
<source>Patches</source>
<translation>Patches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>No patch selected.</source>
<translation>No patch selected.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="292"/>
<source>Unable to open files.json for reading.</source>
<translation>Unable to open files.json for reading.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source>
<translation>No patch file found for the current serial.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="323"/>
<source>Unable to open the file for reading.</source>
<translation>Unable to open the file for reading.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="422"/>
<source>Unable to open the file for writing.</source>
<translation>Unable to open the file for writing.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source>
<translation>Failed to parse XML: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Success</source>
<translation>Success</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Options saved successfully.</source>
<translation>Options saved successfully.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation>Invalid Source</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
<source>The selected source is invalid.</source>
<translation>The selected source is invalid.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation>File Exists</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
<source>File already exists. Do you want to replace it?</source>
<translation>File already exists. Do you want to replace it?</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source>
<translation>Failed to save file:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source>
<translation>Failed to download file:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation>Cheats Not Found</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source>
<translation>No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation>Cheats Downloaded Successfully</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation>You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source>
<translation>Failed to save:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source>
<translation>Failed to download:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="762"/>
<source>Download Complete</source>
<translation>Download Complete</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation>Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
<source>Failed to parse JSON data from HTML.</source>
<translation>Failed to parse JSON data from HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="778"/>
<source>Failed to retrieve HTML page.</source>
<translation>Failed to retrieve HTML page.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source>
<translation>Failed to open file:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source>
<translation>XML ERROR:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="826"/>
<source>Failed to open files.json for writing</source>
<translation>Failed to open files.json for writing</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source>
<translation>Author: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source>
<translation>Directory does not exist:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Failed to open files.json for reading.</source>
<translation>Failed to open files.json for reading.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>Name:</translation>
</message>
</context>
</TS> </TS>

View File

@ -81,67 +81,72 @@
<context> <context>
<name>GuiContextMenus</name> <name>GuiContextMenus</name>
<message> <message>
<location filename="../gui_context_menus.h" line="39"/> <location filename="../gui_context_menus.h" line="46"/>
<source>Create Shortcut</source> <source>Create Shortcut</source>
<translation>Create Shortcut</translation> <translation>Create Shortcut</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="40"/> <location filename="../gui_context_menus.h" line="47"/>
<source>Open Game Folder</source> <source>Open Game Folder</source>
<translation>Open Game Folder</translation> <translation>Open Game Folder</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="41"/> <location filename="../gui_context_menus.h" line="48"/>
<source>Apgaulės / Pleistrai</source>
<translation>Cheats / Patches</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>SFO Viewer</source> <source>SFO Viewer</source>
<translation>SFO Viewer</translation> <translation>SFO Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="42"/> <location filename="../gui_context_menus.h" line="50"/>
<source>Trophy Viewer</source> <source>Trophy Viewer</source>
<translation>Trophy Viewer</translation> <translation>Trophy Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="50"/> <location filename="../gui_context_menus.h" line="59"/>
<source>Copy info</source> <source>Copy info</source>
<translation>Copy info</translation> <translation>Copy info</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="51"/> <location filename="../gui_context_menus.h" line="60"/>
<source>Copy Name</source> <source>Copy Name</source>
<translation>Copy Name</translation> <translation>Copy Name</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="52"/> <location filename="../gui_context_menus.h" line="61"/>
<source>Copy Serial</source> <source>Copy Serial</source>
<translation>Copy Serial</translation> <translation>Copy Serial</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="53"/> <location filename="../gui_context_menus.h" line="62"/>
<source>Copy All</source> <source>Copy All</source>
<translation>Copy All</translation> <translation>Copy All</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="173"/> <location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source> <source>Shortcut creation</source>
<translation>Shortcut creation</translation> <translation>Shortcut creation</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="174"/> <location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source> <source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation> <translation>Shortcut created successfully!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="177"/> <location filename="../gui_context_menus.h" line="199"/>
<source>Error</source> <source>Error</source>
<translation>Error</translation> <translation>Error</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="178"/> <location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source> <source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation> <translation>Error creating shortcut!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="253"/> <location filename="../gui_context_menus.h" line="275"/>
<source>Install PKG</source> <source>Install PKG</source>
<translation>Install PKG</translation> <translation>Install PKG</translation>
</message> </message>
@ -248,6 +253,11 @@
<source>Game Install Directory</source> <source>Game Install Directory</source>
<translation>Game Install Directory</translation> <translation>Game Install Directory</translation>
</message> </message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation>Atsisiųsti Apgaules / Pleistrus</translation>
</message>
<message> <message>
<location filename="../main_window_ui.h" line="345"/> <location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source> <source>Dump Game List</source>
@ -487,5 +497,406 @@
<source>Enable RenderDoc Debugging</source> <source>Enable RenderDoc Debugging</source>
<translation>Enable RenderDoc Debugging</translation> <translation>Enable RenderDoc Debugging</translation>
</message> </message>
</context> </context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation> * Nepalaikoma Vulkan versija</translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source>
<translation>Atsisiųsti sukčiavimus visiems įdiegtiems žaidimams</translation>
</message>
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation>Atsisiųsti pataisas visiems žaidimams</translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
<source>Download Complete</source>
<translation>Atsisiuntimas baigtas</translation>
</message>
<message>
<location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source>
<translation>Jūs atsisiuntėte sukčiavimus visiems jūsų įdiegtiesiems žaidimams.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="391"/>
<source>Patches Downloaded Successfully!</source>
<translation>Pataisos sėkmingai atsisiųstos!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="392"/>
<source>All Patches available for all games have been downloaded.</source>
<translation>Visos pataisos visiems žaidimams buvo atsisiųstos.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="549"/>
<source>Games: </source>
<translation>Žaidimai: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="575"/>
<source>PKG File (*.PKG)</source>
<translation>PKG failas (*.PKG)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>ELF failai (*.bin *.elf *.oelf)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Game Boot</source>
<translation>Žaidimo paleidimas</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Only one file can be selected!</source>
<translation>Galite pasirinkti tik vieną failą!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>PKG ištraukimas</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>Patch detected!</source>
<translation>Rasta atnaujinimą!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source>
<translation>PKG ir žaidimo versijos sutampa: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
<source>Would you like to overwrite?</source>
<translation>Ar norite perrašyti?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>PKG Version %1 is older than installed version: </source>
<translation>PKG versija %1 yra senesnė nei įdiegta versija: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Žaidimas įdiegtas: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Ar norite įdiegti atnaujinimą: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source>
<translation>DLC diegimas</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source>
<translation>Ar norite įdiegti DLC: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC jau įdiegtas:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Žaidimas jau įdiegtas</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>PKG yra pataisa, prašome pirmiausia įdiegti žaidimą!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source>
<translation>PKG KLAIDA</translation>
</message>
<message>
<location filename="../main_window.cpp" line="693"/>
<source>Extracting PKG %1/%2</source>
<translation>Ekstrakcinis PKG %1/%2</translation>
</message>
<message>
<location filename="../main_window.cpp" line="703"/>
<source>Extraction Finished</source>
<translation>Ekstrakcija baigta</translation>
</message>
<message>
<location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source>
<translation>Žaidimas sėkmingai įdiegtas %1</translation>
</message>
<message>
<location filename="../main_window.cpp" line="725"/>
<source>File doesn't appear to be a valid PKG file</source>
<translation>Failas atrodo, kad nėra galiojantis PKG failas</translation>
</message>
</context>
<context>
<name>CheatsPatches</name>
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source>
<translation>Sukčiavimai / Pataisos</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>Cheats/Patches yra eksperimentiniai.\nNaudokite atsargiai.\n\nAtsisiųskite cheats atskirai pasirinkdami saugyklą ir paspausdami atsisiuntimo mygtuką.\nPatches skirtuke galite atsisiųsti visus patchus vienu metu, pasirinkti, kuriuos norite naudoti, ir išsaugoti pasirinkimą.\n\nKadangi mes nekurime Cheats/Patches,\npraneškite problemas cheat autoriui.\n\nSukūrėte naują cheat? Apsilankykite:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
<source>No Image Available</source>
<translation>Nuotrauka neprieinama</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source>
<translation>Seriinis numeris: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>Versija: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source>
<translation>Dydis: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source>
<translation>Pasirinkite sukčiavimo failą:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source>
<translation>Saugykla:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source>
<translation>Atsisiųsti sukčiavimus</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Delete File</source>
<translation>Pašalinti failą</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="169"/>
<source>No files selected.</source>
<translation>Failai nepasirinkti.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source>
<translation>Galite pašalinti sukčiavimus, kurių nenorite, juos atsisiuntę.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>Ar norite ištrinti pasirinktą failą?\n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source>
<translation>Pasirinkite pataisos failą:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation>Atsisiųsti pataisas</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
<source>Save</source>
<translation>Įrašyti</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation>Sukčiavimai</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
<source>Patches</source>
<translation>Pataisos</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>Error</source>
<translation>Klaida</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>No patch selected.</source>
<translation>Nieko nepataisyta.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="292"/>
<source>Unable to open files.json for reading.</source>
<translation>Neįmanoma atidaryti files.json skaitymui.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source>
<translation>Nepavyko rasti pataisos failo dabartiniam serijiniam numeriui.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="323"/>
<source>Unable to open the file for reading.</source>
<translation>Neįmanoma atidaryti failo skaitymui.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="422"/>
<source>Unable to open the file for writing.</source>
<translation>Neįmanoma atidaryti failo rašymui.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source>
<translation>Nepavyko išanalizuoti XML: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Success</source>
<translation>Sėkmė</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Options saved successfully.</source>
<translation>Nustatymai sėkmingai išsaugoti.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation>Netinkamas šaltinis</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
<source>The selected source is invalid.</source>
<translation>Pasirinktas šaltinis yra netinkamas.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation>Failas egzistuoja</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
<source>File already exists. Do you want to replace it?</source>
<translation>Failas jau egzistuoja. Ar norite pakeisti?</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source>
<translation>Nepavyko išsaugoti failo:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source>
<translation>Nepavyko atsisiųsti failo:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation>Sukčiavimai nerasti</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source>
<translation>Nerasta sukčiavimų šiam žaidimui šioje pasirinktos saugyklos versijoje,bandykite kitą saugyklą arba skirtingą žaidimo versiją.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation>Sukčiavimai sėkmingai atsisiųsti</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation>Sėkmingai atsisiuntėte sukčiavimus šios žaidimo versijos pasirinktos saugyklos. Galite pabandyti atsisiųsti kitos saugyklos, jei ji yra prieinama, taip pat bus galima naudoti pasirinkus failą sąrašo.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source>
<translation>Nepavyko išsaugoti:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source>
<translation>Nepavyko atsisiųsti:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="762"/>
<source>Download Complete</source>
<translation>Atsisiuntimas baigtas</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation>Pataisos sėkmingai atsisiųstos! Visos pataisos visiems žaidimams buvo atsisiųstos, nebėra reikalo jas atsisiųsti atskirai kiekvienam žaidimui, kaip tai vyksta su sukčiavimais.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
<source>Failed to parse JSON data from HTML.</source>
<translation>Nepavyko išanalizuoti JSON duomenų HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="778"/>
<source>Failed to retrieve HTML page.</source>
<translation>Nepavyko gauti HTML puslapio.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source>
<translation>Nepavyko atidaryti failo:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source>
<translation>XML KLAIDA:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="826"/>
<source>Failed to open files.json for writing</source>
<translation>Nepavyko atidaryti files.json rašymui</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source>
<translation>Autorius: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source>
<translation>Katalogas neegzistuoja:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Failed to open files.json for reading.</source>
<translation>Nepavyko atidaryti files.json skaitymui.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>Pavadinimas:</translation>
</message>
</context>
</TS> </TS>

View File

@ -81,67 +81,72 @@
<context> <context>
<name>GuiContextMenus</name> <name>GuiContextMenus</name>
<message> <message>
<location filename="../gui_context_menus.h" line="39"/> <location filename="../gui_context_menus.h" line="46"/>
<source>Create Shortcut</source> <source>Create Shortcut</source>
<translation>Create Shortcut</translation> <translation>Create Shortcut</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="40"/> <location filename="../gui_context_menus.h" line="47"/>
<source>Open Game Folder</source> <source>Open Game Folder</source>
<translation>Open Game Folder</translation> <translation>Open Game Folder</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="41"/> <location filename="../gui_context_menus.h" line="48"/>
<source>Cheats / Patches</source>
<translation>Juks / Oppdateringer</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>SFO Viewer</source> <source>SFO Viewer</source>
<translation>SFO Viewer</translation> <translation>SFO Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="42"/> <location filename="../gui_context_menus.h" line="50"/>
<source>Trophy Viewer</source> <source>Trophy Viewer</source>
<translation>Trophy Viewer</translation> <translation>Trophy Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="50"/> <location filename="../gui_context_menus.h" line="59"/>
<source>Copy info</source> <source>Copy info</source>
<translation>Copy info</translation> <translation>Copy info</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="51"/> <location filename="../gui_context_menus.h" line="60"/>
<source>Copy Name</source> <source>Copy Name</source>
<translation>Copy Name</translation> <translation>Copy Name</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="52"/> <location filename="../gui_context_menus.h" line="61"/>
<source>Copy Serial</source> <source>Copy Serial</source>
<translation>Copy Serial</translation> <translation>Copy Serial</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="53"/> <location filename="../gui_context_menus.h" line="62"/>
<source>Copy All</source> <source>Copy All</source>
<translation>Copy All</translation> <translation>Copy All</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="173"/> <location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source> <source>Shortcut creation</source>
<translation>Shortcut creation</translation> <translation>Shortcut creation</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="174"/> <location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source> <source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation> <translation>Shortcut created successfully!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="177"/> <location filename="../gui_context_menus.h" line="199"/>
<source>Error</source> <source>Error</source>
<translation>Error</translation> <translation>Error</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="178"/> <location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source> <source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation> <translation>Error creating shortcut!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="253"/> <location filename="../gui_context_menus.h" line="275"/>
<source>Install PKG</source> <source>Install PKG</source>
<translation>Install PKG</translation> <translation>Install PKG</translation>
</message> </message>
@ -248,6 +253,11 @@
<source>Game Install Directory</source> <source>Game Install Directory</source>
<translation>Game Install Directory</translation> <translation>Game Install Directory</translation>
</message> </message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation>Last ned Juks / Oppdateringer</translation>
</message>
<message> <message>
<location filename="../main_window_ui.h" line="345"/> <location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source> <source>Dump Game List</source>
@ -487,5 +497,406 @@
<source>Enable RenderDoc Debugging</source> <source>Enable RenderDoc Debugging</source>
<translation>Enable RenderDoc Debugging</translation> <translation>Enable RenderDoc Debugging</translation>
</message> </message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation> * Ikke støttet Vulkan-versjon</translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source>
<translation>Last ned jukser for alle installerte spill</translation>
</message>
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation>Last ned oppdateringer for alle spill</translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
<source>Download Complete</source>
<translation>Nedlasting fullført</translation>
</message>
<message>
<location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source>
<translation>Du har lastet ned jukser for alle spillene du har installert.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="391"/>
<source>Patches Downloaded Successfully!</source>
<translation>Oppdateringer lastet ned vellykket!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="392"/>
<source>All Patches available for all games have been downloaded.</source>
<translation>Alle oppdateringer tilgjengelige for alle spillene har blitt lastet ned.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="549"/>
<source>Games: </source>
<translation>Spill: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="575"/>
<source>PKG File (*.PKG)</source>
<translation>PKG-fil (*.PKG)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>ELF-filer (*.bin *.elf *.oelf)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Game Boot</source>
<translation>Spilloppstart</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Only one file can be selected!</source>
<translation>Kun én fil kan velges!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>PKG-ekstraksjon</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>Patch detected!</source>
<translation>Oppdatering oppdaget!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source>
<translation>PKG- og spillversjoner stemmer overens: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
<source>Would you like to overwrite?</source>
<translation>Ønsker du å overskrive?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>PKG Version %1 is older than installed version: </source>
<translation>PKG-versjon %1 er eldre enn installert versjon: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Spillet er installert: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Ønsker du å installere oppdateringen: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source>
<translation>DLC-installasjon</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source>
<translation>Ønsker du å installere DLC: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC allerede installert:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Spillet er allerede installert</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>PKG er en oppdatering, vennligst installer spillet først!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source>
<translation>PKG FEIL</translation>
</message>
<message>
<location filename="../main_window.cpp" line="693"/>
<source>Extracting PKG %1/%2</source>
<translation>Ekstraherer PKG %1/%2</translation>
</message>
<message>
<location filename="../main_window.cpp" line="703"/>
<source>Extraction Finished</source>
<translation>Ekstrahering fullført</translation>
</message>
<message>
<location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source>
<translation>Spillet ble installert vellykket %1</translation>
</message>
<message>
<location filename="../main_window.cpp" line="725"/>
<source>File doesn't appear to be a valid PKG file</source>
<translation>Fil ser ikke ut til å være en gyldig PKG-fil</translation>
</message>
</context>
<context>
<name>CheatsPatches</name>
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source>
<translation>Jukser / Oppdateringer</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>Cheats/Patches er eksperimentelle.\nBruk med forsiktighet.\n\nLast ned cheats individuelt ved å velge depotet og klikke nedlastingsknappen.\nPå fanen Patches kan du laste ned alle patches samtidig, velge hvilke du ønsker å bruke, og lagre valget ditt.\n\nSiden vi ikke utvikler Cheats/Patches,\nvær vennlig å rapportere problemer til cheat-utvikleren.\n\nHar du laget en ny cheat? Besøk:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
<source>No Image Available</source>
<translation>Ingen bilde tilgjengelig</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source>
<translation>Serienummer: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>Versjon: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source>
<translation>Størrelse: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source>
<translation>Velg juksfil:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source>
<translation>Depot:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source>
<translation>Last ned jukser</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Delete File</source>
<translation>Slett fil</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="169"/>
<source>No files selected.</source>
<translation>Ingen filer valgt.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source>
<translation>Du kan slette jukser du ikke ønsker etter å ha lastet dem ned.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>Ønsker du å slette den valgte filen?\n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source>
<translation>Velg oppdateringsfil:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation>Last ned oppdateringer</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
<source>Save</source>
<translation>Lagre</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation>Jukser</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
<source>Patches</source>
<translation>Oppdateringer</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>Error</source>
<translation>Feil</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>No patch selected.</source>
<translation>Ingen oppdatering valgt.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="292"/>
<source>Unable to open files.json for reading.</source>
<translation>Kan ikke åpne files.json for lesing.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source>
<translation>Ingen oppdateringsfil funnet for det aktuelle serienummeret.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="323"/>
<source>Unable to open the file for reading.</source>
<translation>Kan ikke åpne filen for lesing.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="422"/>
<source>Unable to open the file for writing.</source>
<translation>Kan ikke åpne filen for skriving.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source>
<translation>Feil ved parsing av XML: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Success</source>
<translation>Vellykket</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Options saved successfully.</source>
<translation>Alternativer lagret vellykket.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation>Ugyldig kilde</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
<source>The selected source is invalid.</source>
<translation>Den valgte kilden er ugyldig.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation>Fil eksisterer</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
<source>File already exists. Do you want to replace it?</source>
<translation>Fil eksisterer allerede. Ønsker du å erstatte den?</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source>
<translation>Kunne ikke lagre fil:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source>
<translation>Kunne ikke laste ned fil:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation>Jukser ikke funnet</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source>
<translation>Ingen jukser funnet for dette spillet i denne versjonen av det valgte depotet,prøv et annet depot eller en annen versjon av spillet.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation>Jukser lastet ned vellykket</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation>Du har lastet ned jukser vellykket for denne versjonen av spillet fra det valgte depotet. Du kan prøve å laste ned fra et annet depot, hvis det er tilgjengelig, vil det også være mulig å bruke det ved å velge filen fra listen.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source>
<translation>Kunne ikke lagre:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source>
<translation>Kunne ikke laste ned:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="762"/>
<source>Download Complete</source>
<translation>Nedlasting fullført</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation>Oppdateringer lastet ned vellykket! Alle oppdateringer tilgjengelige for alle spill har blitt lastet ned, det er ikke nødvendig å laste dem ned individuelt for hvert spill som skjer med jukser.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
<source>Failed to parse JSON data from HTML.</source>
<translation>Kunne ikke analysere JSON-data fra HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="778"/>
<source>Failed to retrieve HTML page.</source>
<translation>Kunne ikke hente HTML-side.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source>
<translation>Kunne ikke åpne fil:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source>
<translation>XML FEIL:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="826"/>
<source>Failed to open files.json for writing</source>
<translation>Kunne ikke åpne files.json for skriving</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source>
<translation>Forfatter: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source>
<translation>Direktory eksisterer ikke:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Failed to open files.json for reading.</source>
<translation>Kunne ikke åpne files.json for lesing.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>Navn:</translation>
</message>
</context> </context>
</TS> </TS>

View File

@ -81,67 +81,72 @@
<context> <context>
<name>GuiContextMenus</name> <name>GuiContextMenus</name>
<message> <message>
<location filename="../gui_context_menus.h" line="39"/> <location filename="../gui_context_menus.h" line="46"/>
<source>Create Shortcut</source> <source>Create Shortcut</source>
<translation>Create Shortcut</translation> <translation>Create Shortcut</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="40"/> <location filename="../gui_context_menus.h" line="47"/>
<source>Open Game Folder</source> <source>Open Game Folder</source>
<translation>Open Game Folder</translation> <translation>Open Game Folder</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="41"/> <location filename="../gui_context_menus.h" line="48"/>
<source>Cheats / Patches</source>
<translation>Cheats / Patches</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>SFO Viewer</source> <source>SFO Viewer</source>
<translation>SFO Viewer</translation> <translation>SFO Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="42"/> <location filename="../gui_context_menus.h" line="50"/>
<source>Trophy Viewer</source> <source>Trophy Viewer</source>
<translation>Trophy Viewer</translation> <translation>Trophy Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="50"/> <location filename="../gui_context_menus.h" line="59"/>
<source>Copy info</source> <source>Copy info</source>
<translation>Copy info</translation> <translation>Copy info</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="51"/> <location filename="../gui_context_menus.h" line="60"/>
<source>Copy Name</source> <source>Copy Name</source>
<translation>Copy Name</translation> <translation>Copy Name</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="52"/> <location filename="../gui_context_menus.h" line="61"/>
<source>Copy Serial</source> <source>Copy Serial</source>
<translation>Copy Serial</translation> <translation>Copy Serial</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="53"/> <location filename="../gui_context_menus.h" line="62"/>
<source>Copy All</source> <source>Copy All</source>
<translation>Copy All</translation> <translation>Copy All</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="173"/> <location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source> <source>Shortcut creation</source>
<translation>Shortcut creation</translation> <translation>Shortcut creation</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="174"/> <location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source> <source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation> <translation>Shortcut created successfully!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="177"/> <location filename="../gui_context_menus.h" line="199"/>
<source>Error</source> <source>Error</source>
<translation>Error</translation> <translation>Error</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="178"/> <location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source> <source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation> <translation>Error creating shortcut!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="253"/> <location filename="../gui_context_menus.h" line="275"/>
<source>Install PKG</source> <source>Install PKG</source>
<translation>Install PKG</translation> <translation>Install PKG</translation>
</message> </message>
@ -248,6 +253,11 @@
<source>Game Install Directory</source> <source>Game Install Directory</source>
<translation>Game Install Directory</translation> <translation>Game Install Directory</translation>
</message> </message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation>Download Cheats/Patches</translation>
</message>
<message> <message>
<location filename="../main_window_ui.h" line="345"/> <location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source> <source>Dump Game List</source>
@ -487,5 +497,406 @@
<source>Enable RenderDoc Debugging</source> <source>Enable RenderDoc Debugging</source>
<translation>Enable RenderDoc Debugging</translation> <translation>Enable RenderDoc Debugging</translation>
</message> </message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation> * Niet ondersteunde Vulkan-versie</translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source>
<translation>Download cheats voor alle geïnstalleerde spellen</translation>
</message>
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation>Download patches voor alle spellen</translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
<source>Download Complete</source>
<translation>Download voltooid</translation>
</message>
<message>
<location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source>
<translation>Je hebt cheats gedownload voor alle spellen die je hebt geïnstalleerd.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="391"/>
<source>Patches Downloaded Successfully!</source>
<translation>Patches succesvol gedownload!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="392"/>
<source>All Patches available for all games have been downloaded.</source>
<translation>Alle patches voor alle spellen zijn gedownload.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="549"/>
<source>Games: </source>
<translation>Spellen: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="575"/>
<source>PKG File (*.PKG)</source>
<translation>PKG-bestand (*.PKG)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>ELF-bestanden (*.bin *.elf *.oelf)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Game Boot</source>
<translation>Spelopstart</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Only one file can be selected!</source>
<translation>Je kunt slechts één bestand selecteren!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>PKG-extractie</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>Patch detected!</source>
<translation>Patch gedetecteerd!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source>
<translation>PKG- en gameversies komen overeen: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
<source>Would you like to overwrite?</source>
<translation>Wilt u overschrijven?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>PKG Version %1 is older than installed version: </source>
<translation>PKG-versie %1 is ouder dan de geïnstalleerde versie: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Game is geïnstalleerd: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Wilt u de patch installeren: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source>
<translation>DLC-installatie</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source>
<translation>Wilt u DLC installeren: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC al geïnstalleerd:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Game al geïnstalleerd</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>PKG is een patch, installeer eerst het spel!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source>
<translation>PKG FOUT</translation>
</message>
<message>
<location filename="../main_window.cpp" line="693"/>
<source>Extracting PKG %1/%2</source>
<translation>PKG %1/%2 aan het extraheren</translation>
</message>
<message>
<location filename="../main_window.cpp" line="703"/>
<source>Extraction Finished</source>
<translation>Extractie voltooid</translation>
</message>
<message>
<location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source>
<translation>Spel succesvol geïnstalleerd op %1</translation>
</message>
<message>
<location filename="../main_window.cpp" line="725"/>
<source>File doesn't appear to be a valid PKG file</source>
<translation>Het bestand lijkt geen geldig PKG-bestand te zijn</translation>
</message>
</context>
<context>
<name>CheatsPatches</name>
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source>
<translation>Cheats / Patches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>Cheats/Patches zijn experimenteel.\nGebruik met voorzichtigheid.\n\nDownload cheats afzonderlijk door het repository te selecteren en op de downloadknop te klikken.\nOp het tabblad Patches kun je alle patches tegelijk downloaden, kiezen welke je wilt gebruiken en je selectie opslaan.\n\nAangezien wij de Cheats/Patches niet ontwikkelen,\nmeld problemen bij de auteur van de cheat.\n\nHeb je een nieuwe cheat gemaakt? Bezoek:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
<source>No Image Available</source>
<translation>Geen afbeelding beschikbaar</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source>
<translation>Serie: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>Versie: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source>
<translation>Grootte: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source>
<translation>Selecteer cheatbestand:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source>
<translation>Repository:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source>
<translation>Download cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Delete File</source>
<translation>Bestand verwijderen</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="169"/>
<source>No files selected.</source>
<translation>Geen bestanden geselecteerd.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source>
<translation>Je kunt de cheats die je niet wilt verwijderen nadat je ze hebt gedownload.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>Wil je het geselecteerde bestand verwijderen?\n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source>
<translation>Selecteer patchbestand:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation>Download patches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
<source>Save</source>
<translation>Opslaan</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation>Cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
<source>Patches</source>
<translation>Patches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>Error</source>
<translation>Fout</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>No patch selected.</source>
<translation>Geen patch geselecteerd.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="292"/>
<source>Unable to open files.json for reading.</source>
<translation>Kan files.json niet openen voor lezen.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source>
<translation>Geen patchbestand gevonden voor het huidige serienummer.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="323"/>
<source>Unable to open the file for reading.</source>
<translation>Kan het bestand niet openen voor lezen.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="422"/>
<source>Unable to open the file for writing.</source>
<translation>Kan het bestand niet openen voor schrijven.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source>
<translation>XML parsing mislukt: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Success</source>
<translation>Succes</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Options saved successfully.</source>
<translation>Opties succesvol opgeslagen.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation>Ongeldige bron</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
<source>The selected source is invalid.</source>
<translation>De geselecteerde bron is ongeldig.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation>Bestand bestaat</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
<source>File already exists. Do you want to replace it?</source>
<translation>Bestand bestaat al. Wil je het vervangen?</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source>
<translation>Kan bestand niet opslaan:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source>
<translation>Kan bestand niet downloaden:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation>Cheats niet gevonden</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source>
<translation>Geen cheats gevonden voor deze game in deze versie van de geselecteerde repository.Probeer een andere repository of een andere versie van het spel.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation>Cheats succesvol gedownload</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation>Je hebt cheats succesvol gedownload voor deze versie van het spel uit de geselecteerde repository. Je kunt proberen te downloaden van een andere repository. Als deze beschikbaar is, kan het ook worden gebruikt door het bestand uit de lijst te selecteren.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source>
<translation>Opslaan mislukt:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source>
<translation>Downloaden mislukt:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="762"/>
<source>Download Complete</source>
<translation>Download voltooid</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation>Patches succesvol gedownload! Alle beschikbare patches voor alle spellen zijn gedownload. Het is niet nodig om ze afzonderlijk te downloaden voor elk spel dat cheats heeft.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
<source>Failed to parse JSON data from HTML.</source>
<translation>Kan JSON-gegevens uit HTML niet parseren.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="778"/>
<source>Failed to retrieve HTML page.</source>
<translation>Kan HTML-pagina niet ophalen.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source>
<translation>Kan bestand niet openen:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source>
<translation>XML FOUT:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="826"/>
<source>Failed to open files.json for writing</source>
<translation>Kan files.json niet openen voor schrijven</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source>
<translation>Auteur: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source>
<translation>Map bestaat niet:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Failed to open files.json for reading.</source>
<translation>Kan files.json niet openen voor lezen.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>Naam:</translation>
</message>
</context> </context>
</TS> </TS>

File diff suppressed because it is too large Load Diff

View File

@ -37,7 +37,7 @@
<message> <message>
<location filename="../game_info.cpp" line="26"/> <location filename="../game_info.cpp" line="26"/>
<source>Loading game list, please wait :3</source> <source>Loading game list, please wait :3</source>
<translation>Carregando lista de jogos, por favor aguarde :3</translation> <translation>Carregando a lista de jogos, por favor aguarde :3</translation>
</message> </message>
<message> <message>
<location filename="../game_info.cpp" line="26"/> <location filename="../game_info.cpp" line="26"/>
@ -81,67 +81,72 @@
<context> <context>
<name>GuiContextMenus</name> <name>GuiContextMenus</name>
<message> <message>
<location filename="../gui_context_menus.h" line="39"/> <location filename="../gui_context_menus.h" line="46"/>
<source>Create Shortcut</source> <source>Create Shortcut</source>
<translation>Criar Atalho</translation> <translation>Criar Atalho</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="40"/> <location filename="../gui_context_menus.h" line="47"/>
<source>Open Game Folder</source> <source>Open Game Folder</source>
<translation>Abrir Pasta do Jogo</translation> <translation>Abrir Pasta do Jogo</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="41"/> <location filename="../gui_context_menus.h" line="48"/>
<source>Cheats / Patches</source>
<translation>Cheats / Patches</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>SFO Viewer</source> <source>SFO Viewer</source>
<translation>Visualizador de SFO</translation> <translation>Visualizador de SFO</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="42"/> <location filename="../gui_context_menus.h" line="50"/>
<source>Trophy Viewer</source> <source>Trophy Viewer</source>
<translation>Visualizador de Troféu</translation> <translation>Visualizador de Troféu</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="50"/> <location filename="../gui_context_menus.h" line="59"/>
<source>Copy info</source> <source>Copy info</source>
<translation>Copiar informação</translation> <translation>Copiar informação</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="51"/> <location filename="../gui_context_menus.h" line="60"/>
<source>Copy Name</source> <source>Copy Name</source>
<translation>Copiar Nome</translation> <translation>Copiar Nome</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="52"/> <location filename="../gui_context_menus.h" line="61"/>
<source>Copy Serial</source> <source>Copy Serial</source>
<translation>Copiar Serial</translation> <translation>Copiar Serial</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="53"/> <location filename="../gui_context_menus.h" line="62"/>
<source>Copy All</source> <source>Copy All</source>
<translation>Copiar Tudo</translation> <translation>Copiar Tudo</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="173"/> <location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source> <source>Shortcut creation</source>
<translation>Criação de atalho</translation> <translation>Criação de atalho</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="174"/> <location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source> <source>Shortcut created successfully!\n %1</source>
<translation>Atalho criado com sucesso!\n %1</translation> <translation>Atalho criado com sucesso!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="177"/> <location filename="../gui_context_menus.h" line="199"/>
<source>Error</source> <source>Error</source>
<translation>Erro</translation> <translation>Erro</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="178"/> <location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source> <source>Error creating shortcut!\n %1</source>
<translation>Erro ao criar atalho!\n %1</translation> <translation>Erro ao criar atalho!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="253"/> <location filename="../gui_context_menus.h" line="275"/>
<source>Install PKG</source> <source>Install PKG</source>
<translation>Instalar PKG</translation> <translation>Instalar PKG</translation>
</message> </message>
@ -248,6 +253,11 @@
<source>Game Install Directory</source> <source>Game Install Directory</source>
<translation>Diretório de Instalação de Jogos</translation> <translation>Diretório de Instalação de Jogos</translation>
</message> </message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation>Baixar Cheats/Patches</translation>
</message>
<message> <message>
<location filename="../main_window_ui.h" line="345"/> <location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source> <source>Dump Game List</source>
@ -281,7 +291,7 @@
<message> <message>
<location filename="../main_window_ui.h" line="354"/> <location filename="../main_window_ui.h" line="354"/>
<source>Game List Mode</source> <source>Game List Mode</source>
<translation>Modo de Lista de Jogos</translation> <translation>Modo da Lista de Jogos</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="355"/> <location filename="../main_window_ui.h" line="355"/>
@ -415,7 +425,7 @@
<message> <message>
<location filename="../settings_dialog.ui" line="235"/> <location filename="../settings_dialog.ui" line="235"/>
<source>Log Filter</source> <source>Log Filter</source>
<translation>Filtro</translation> <translation>Filtro do Registro</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
@ -488,4 +498,405 @@
<translation>Ativar Depuração por RenderDoc</translation> <translation>Ativar Depuração por RenderDoc</translation>
</message> </message>
</context> </context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation> * Versão Vulkan não suportada</translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source>
<translation>Baixar Cheats para Todos os Jogos Instalados</translation>
</message>
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation>Baixar Patches para Todos os Jogos</translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
<source>Download Complete</source>
<translation>Download Completo</translation>
</message>
<message>
<location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source>
<translation>Você baixou cheats para todos os jogos que instalou.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="391"/>
<source>Patches Downloaded Successfully!</source>
<translation>Patches Baixados com Sucesso!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="392"/>
<source>All Patches available for all games have been downloaded.</source>
<translation>Todos os patches disponíveis para todos os jogos foram baixados.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="549"/>
<source>Games: </source>
<translation>Jogos: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="575"/>
<source>PKG File (*.PKG)</source>
<translation>Arquivo PKG (*.PKG)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>Arquivos ELF (*.bin *.elf *.oelf)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Game Boot</source>
<translation>Inicialização do Jogo</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Only one file can be selected!</source>
<translation>Apenas um arquivo pode ser selecionado!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>Extração de PKG</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>Patch detected!</source>
<translation>Atualização detectada!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source>
<translation>As versões do PKG e do Jogo são igual: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
<source>Would you like to overwrite?</source>
<translation>Gostaria de substituir?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>PKG Version %1 is older than installed version: </source>
<translation>Versão do PKG %1 é mais antiga do que a versão instalada: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Jogo instalado: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Você gostaria de instalar a atualização: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source>
<translation>Instalação de DLC</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source>
<translation>Você gostaria de instalar o DLC: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC instalada:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>O jogo está instalado:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>O PKG é um patch, por favor, instale o jogo primeiro!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source>
<translation>ERRO de PKG</translation>
</message>
<message>
<location filename="../main_window.cpp" line="693"/>
<source>Extracting PKG %1/%2</source>
<translation>Extraindo PKG %1/%2</translation>
</message>
<message>
<location filename="../main_window.cpp" line="703"/>
<source>Extraction Finished</source>
<translation>Extração Concluída</translation>
</message>
<message>
<location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source>
<translation>Jogo instalado com sucesso em %1</translation>
</message>
<message>
<location filename="../main_window.cpp" line="725"/>
<source>File doesn't appear to be a valid PKG file</source>
<translation>O arquivo não parece ser um arquivo PKG válido</translation>
</message>
</context>
<context>
<name>CheatsPatches</name>
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source>
<translation>Cheats / Patches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>Cheats/Patches são experimentais.\nUse com cautela.\n\nBaixe os cheats individualmente selecionando o repositório e clicando no botão de download.\nNa aba Patches, você pode baixar todos os Patches de uma vez, escolha qual deseja usar e salve a opção.\n\nComo não desenvolvemos os Cheats/Patches,\npor favor, reporte problemas relacionados ao autor do cheat.\n\nCriou um novo cheat? Visite:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
<source>No Image Available</source>
<translation>Imagem Não Disponível</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source>
<translation>Serial: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>Versão: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source>
<translation>Tamanho: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source>
<translation>Selecione o Arquivo de Cheat:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source>
<translation>Repositório:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source>
<translation>Baixar Cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Delete File</source>
<translation>Excluir Arquivo</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="169"/>
<source>No files selected.</source>
<translation>Nenhum arquivo selecionado.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source>
<translation>Você pode excluir os cheats que não deseja após baixá-las.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>Deseja excluir o arquivo selecionado?\n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source>
<translation>Selecione o Arquivo de Patch:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation>Baixar Patches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
<source>Save</source>
<translation>Salvar</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation>Cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
<source>Patches</source>
<translation>Patches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>Error</source>
<translation>Erro</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>No patch selected.</source>
<translation>Nenhum patch selecionado.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="292"/>
<source>Unable to open files.json for reading.</source>
<translation>Não foi possível abrir files.json para leitura.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source>
<translation>Nenhum arquivo de patch encontrado para o serial atual.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="323"/>
<source>Unable to open the file for reading.</source>
<translation>Não foi possível abrir o arquivo para leitura.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="422"/>
<source>Unable to open the file for writing.</source>
<translation>Não foi possível abrir o arquivo para gravação.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source>
<translation>Falha ao analisar XML: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Success</source>
<translation>Sucesso</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Options saved successfully.</source>
<translation>Opções salvas com sucesso.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation>Fonte Inválida</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
<source>The selected source is invalid.</source>
<translation>A fonte selecionada é inválida.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation>Arquivo Existe</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
<source>File already exists. Do you want to replace it?</source>
<translation>O arquivo existe. Deseja substituí-lo?</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source>
<translation>Falha ao salvar o arquivo:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source>
<translation>Falha ao baixar o arquivo:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation>Cheats Não Encontrados</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source>
<translation>Nenhum cheat encontrado para este jogo nesta versão do repositório selecionado, tente outro repositório ou uma versão diferente do jogo.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation>Cheats Baixados com Sucesso</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation>Você baixou os cheats com sucesso. Para esta versão do jogo a partir do repositório selecionado. Você pode tentar baixar de outro repositório, se estiver disponível, também será possível usá-lo selecionando o arquivo da lista.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source>
<translation>Falha ao salvar:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source>
<translation>Falha ao baixar:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="762"/>
<source>Download Complete</source>
<translation>Download Completo</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation>Patches Baixados com Sucesso! Todos os patches disponíveis para todos os jogos foram baixados, não é necessário baixá-los individualmente para cada jogo como acontece com os Cheats.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
<source>Failed to parse JSON data from HTML.</source>
<translation>Falha ao analisar dados JSON do HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="778"/>
<source>Failed to retrieve HTML page.</source>
<translation>Falha ao recuperar a página HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source>
<translation>Falha ao abrir o arquivo:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source>
<translation>ERRO de XML:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="826"/>
<source>Failed to open files.json for writing</source>
<translation>Falha ao abrir files.json para gravação</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source>
<translation>Autor: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source>
<translation>O Diretório não existe:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Failed to open files.json for reading.</source>
<translation>Falha ao abrir files.json para leitura.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>Nome:</translation>
</message>
</context>
</TS> </TS>

View File

@ -81,67 +81,72 @@
<context> <context>
<name>GuiContextMenus</name> <name>GuiContextMenus</name>
<message> <message>
<location filename="../gui_context_menus.h" line="39"/> <location filename="../gui_context_menus.h" line="46"/>
<source>Create Shortcut</source> <source>Create Shortcut</source>
<translation>Create Shortcut</translation> <translation>Create Shortcut</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="40"/> <location filename="../gui_context_menus.h" line="47"/>
<source>Open Game Folder</source> <source>Open Game Folder</source>
<translation>Open Game Folder</translation> <translation>Open Game Folder</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="41"/> <location filename="../gui_context_menus.h" line="48"/>
<source>Trapaças / Patches</source>
<translation>Coduri / Patch-uri</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>SFO Viewer</source> <source>SFO Viewer</source>
<translation>SFO Viewer</translation> <translation>SFO Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="42"/> <location filename="../gui_context_menus.h" line="50"/>
<source>Trophy Viewer</source> <source>Trophy Viewer</source>
<translation>Trophy Viewer</translation> <translation>Trophy Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="50"/> <location filename="../gui_context_menus.h" line="59"/>
<source>Copy info</source> <source>Copy info</source>
<translation>Copy info</translation> <translation>Copy info</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="51"/> <location filename="../gui_context_menus.h" line="60"/>
<source>Copy Name</source> <source>Copy Name</source>
<translation>Copy Name</translation> <translation>Copy Name</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="52"/> <location filename="../gui_context_menus.h" line="61"/>
<source>Copy Serial</source> <source>Copy Serial</source>
<translation>Copy Serial</translation> <translation>Copy Serial</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="53"/> <location filename="../gui_context_menus.h" line="62"/>
<source>Copy All</source> <source>Copy All</source>
<translation>Copy All</translation> <translation>Copy All</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="173"/> <location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source> <source>Shortcut creation</source>
<translation>Shortcut creation</translation> <translation>Shortcut creation</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="174"/> <location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source> <source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation> <translation>Shortcut created successfully!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="177"/> <location filename="../gui_context_menus.h" line="199"/>
<source>Error</source> <source>Error</source>
<translation>Error</translation> <translation>Error</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="178"/> <location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source> <source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation> <translation>Error creating shortcut!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="253"/> <location filename="../gui_context_menus.h" line="275"/>
<source>Install PKG</source> <source>Install PKG</source>
<translation>Install PKG</translation> <translation>Install PKG</translation>
</message> </message>
@ -248,6 +253,11 @@
<source>Game Install Directory</source> <source>Game Install Directory</source>
<translation>Game Install Directory</translation> <translation>Game Install Directory</translation>
</message> </message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation>Descarcă Coduri / Patch-uri</translation>
</message>
<message> <message>
<location filename="../main_window_ui.h" line="345"/> <location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source> <source>Dump Game List</source>
@ -487,5 +497,406 @@
<source>Enable RenderDoc Debugging</source> <source>Enable RenderDoc Debugging</source>
<translation>Enable RenderDoc Debugging</translation> <translation>Enable RenderDoc Debugging</translation>
</message> </message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation> * Versiune Vulkan nesuportată</translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source>
<translation>Descarcă Cheats pentru toate jocurile instalate</translation>
</message>
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation>Descarcă Patches pentru toate jocurile</translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
<source>Download Complete</source>
<translation>Descărcare completă</translation>
</message>
<message>
<location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source>
<translation>Ai descărcat cheats pentru toate jocurile instalate.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="391"/>
<source>Patches Downloaded Successfully!</source>
<translation>Patches descărcate cu succes!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="392"/>
<source>All Patches available for all games have been downloaded.</source>
<translation>Toate Patches disponibile pentru toate jocurile au fost descărcate.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="549"/>
<source>Games: </source>
<translation>Jocuri: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="575"/>
<source>PKG File (*.PKG)</source>
<translation>Fișier PKG (*.PKG)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>Fișiere ELF (*.bin *.elf *.oelf)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Game Boot</source>
<translation>Boot Joc</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Only one file can be selected!</source>
<translation>Numai un fișier poate fi selectat!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>Extracție PKG</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>Patch detected!</source>
<translation>Patch detectat!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source>
<translation>Versiunile PKG și ale jocului sunt compatibile: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
<source>Would you like to overwrite?</source>
<translation>Doriți suprascrieți?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>PKG Version %1 is older than installed version: </source>
<translation>Versiunea PKG %1 este mai veche decât versiunea instalată: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Jocul este instalat: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Doriți instalați patch-ul: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source>
<translation>Instalare DLC</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source>
<translation>Doriți instalați DLC-ul: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC deja instalat:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Jocul deja instalat</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>PKG este un patch, te rugăm instalezi mai întâi jocul!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source>
<translation>EROARE PKG</translation>
</message>
<message>
<location filename="../main_window.cpp" line="693"/>
<source>Extracting PKG %1/%2</source>
<translation>Extracție PKG %1/%2</translation>
</message>
<message>
<location filename="../main_window.cpp" line="703"/>
<source>Extraction Finished</source>
<translation>Extracție terminată</translation>
</message>
<message>
<location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source>
<translation>Jocul a fost instalat cu succes la %1</translation>
</message>
<message>
<location filename="../main_window.cpp" line="725"/>
<source>File doesn't appear to be a valid PKG file</source>
<translation>Fișierul nu pare fie un fișier PKG valid</translation>
</message>
</context>
<context>
<name>CheatsPatches</name>
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source>
<translation>Cheats / Patches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>Cheats/Patches sunt experimentale.\nUtilizați cu prudență.\n\nDescărcați cheats individual prin selectarea depozitului și făcând clic pe butonul de descărcare.\nÎn fila Patches, puteți descărca toate patch-urile deodată, alege pe cele pe care doriți le utilizați și salvați selecția.\n\nDeoarece nu dezvoltăm Cheats/Patches,\nte rugăm raportezi problemele autorului cheat-ului.\n\nAi creat un nou cheat? Vizitează:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
<source>No Image Available</source>
<translation>Nu este disponibilă imaginea</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source>
<translation>Serial: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>Versiune: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source>
<translation>Dimensiune: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source>
<translation>Selectează fișierul Cheat:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source>
<translation>Repository:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source>
<translation>Descarcă Cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Delete File</source>
<translation>Șterge Fișierul</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="169"/>
<source>No files selected.</source>
<translation>Nu sunt fișiere selectate.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source>
<translation>Poti șterge cheats-urile pe care nu le dorești după ce le-ai descărcat.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>Vrei ștergi fișierul selectat?\n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source>
<translation>Selectează fișierul Patch:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation>Descarcă Patches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
<source>Save</source>
<translation>Salvează</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation>Cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
<source>Patches</source>
<translation>Patches</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>Error</source>
<translation>Eroare</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>No patch selected.</source>
<translation>Nu este selectat niciun patch.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="292"/>
<source>Unable to open files.json for reading.</source>
<translation>Imposibil de deschis files.json pentru citire.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source>
<translation>Nu s-a găsit niciun fișier patch pentru serialul curent.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="323"/>
<source>Unable to open the file for reading.</source>
<translation>Imposibil de deschis fișierul pentru citire.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="422"/>
<source>Unable to open the file for writing.</source>
<translation>Imposibil de deschis fișierul pentru scriere.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source>
<translation>Nu s-a reușit pararea XML: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Success</source>
<translation>Succes</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Options saved successfully.</source>
<translation>Opțiunile au fost salvate cu succes.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation>Sursă invalidă</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
<source>The selected source is invalid.</source>
<translation>Sursa selectată este invalidă.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation>Fișier existent</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
<source>File already exists. Do you want to replace it?</source>
<translation>Fișierul există deja. Vrei -l înlocuiești?</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source>
<translation>Nu s-a reușit salvarea fișierului:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source>
<translation>Nu s-a reușit descărcarea fișierului:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation>Cheats Nu au fost găsite</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source>
<translation>Nu au fost găsite cheats pentru acest joc în această versiune a repository-ului selectat, încearcă un alt repository sau o versiune diferită a jocului.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation>Cheats descărcate cu succes</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation>Ai descărcat cu succes cheats-urile pentru această versiune a jocului din repository-ul selectat. Poți încerca descărcarea din alt repository; dacă este disponibil, va fi posibil -l folosești selectând fișierul din listă.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source>
<translation>Nu s-a reușit salvarea:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source>
<translation>Nu s-a reușit descărcarea:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="762"/>
<source>Download Complete</source>
<translation>Descărcare completă</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation>Patches descărcate cu succes! Toate Patches disponibile pentru toate jocurile au fost descărcate; nu este nevoie le descarci individual pentru fiecare joc, așa cum se întâmplă cu Cheats.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
<source>Failed to parse JSON data from HTML.</source>
<translation>Nu s-a reușit pararea datelor JSON din HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="778"/>
<source>Failed to retrieve HTML page.</source>
<translation>Nu s-a reușit obținerea paginii HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source>
<translation>Nu s-a reușit deschiderea fișierului:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source>
<translation>EROARE XML:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="826"/>
<source>Failed to open files.json for writing</source>
<translation>Nu s-a reușit deschiderea files.json pentru scriere</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source>
<translation>Autor: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source>
<translation>Directorul nu există:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Failed to open files.json for reading.</source>
<translation>Nu s-a reușit deschiderea files.json pentru citire.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>Nume:</translation>
</message>
</context> </context>
</TS> </TS>

View File

@ -81,67 +81,72 @@
<context> <context>
<name>GuiContextMenus</name> <name>GuiContextMenus</name>
<message> <message>
<location filename="../gui_context_menus.h" line="39"/> <location filename="../gui_context_menus.h" line="46"/>
<source>Create Shortcut</source> <source>Create Shortcut</source>
<translation>Создать ярлык</translation> <translation>Создать ярлык</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="40"/> <location filename="../gui_context_menus.h" line="47"/>
<source>Open Game Folder</source> <source>Open Game Folder</source>
<translation>Открыть папку с игрой</translation> <translation>Открыть папку с игрой</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="41"/> <location filename="../gui_context_menus.h" line="48"/>
<source>Cheats / Patches</source>
<translation>Читы и патчи</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>SFO Viewer</source> <source>SFO Viewer</source>
<translation>Просмотр SFO</translation> <translation>Просмотр SFO</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="42"/> <location filename="../gui_context_menus.h" line="50"/>
<source>Trophy Viewer</source> <source>Trophy Viewer</source>
<translation>Просмотр трофеев</translation> <translation>Просмотр трофеев</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="50"/> <location filename="../gui_context_menus.h" line="59"/>
<source>Copy info</source> <source>Copy info</source>
<translation>Копировать информацию</translation> <translation>Копировать информацию</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="51"/> <location filename="../gui_context_menus.h" line="60"/>
<source>Copy Name</source> <source>Copy Name</source>
<translation>Копировать имя</translation> <translation>Копировать имя</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="52"/> <location filename="../gui_context_menus.h" line="61"/>
<source>Copy Serial</source> <source>Copy Serial</source>
<translation>Копировать серийный номер</translation> <translation>Копировать серийный номер</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="53"/> <location filename="../gui_context_menus.h" line="62"/>
<source>Copy All</source> <source>Copy All</source>
<translation>Копировать все</translation> <translation>Копировать все</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="173"/> <location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source> <source>Shortcut creation</source>
<translation>Создание ярлыка</translation> <translation>Создание ярлыка</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="174"/> <location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source> <source>Shortcut created successfully!\n %1</source>
<translation>Ярлык создан успешно!\n %1</translation> <translation>Ярлык создан успешно!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="177"/> <location filename="../gui_context_menus.h" line="199"/>
<source>Error</source> <source>Error</source>
<translation>Ошибка</translation> <translation>Ошибка</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="178"/> <location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source> <source>Error creating shortcut!\n %1</source>
<translation>Ошибка создания ярлыка!\n %1</translation> <translation>Ошибка создания ярлыка!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="253"/> <location filename="../gui_context_menus.h" line="275"/>
<source>Install PKG</source> <source>Install PKG</source>
<translation>Установить PKG</translation> <translation>Установить PKG</translation>
</message> </message>
@ -248,6 +253,11 @@
<source>Game Install Directory</source> <source>Game Install Directory</source>
<translation>Каталог установки игры</translation> <translation>Каталог установки игры</translation>
</message> </message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation>Скачать читы или патчи</translation>
</message>
<message> <message>
<location filename="../main_window_ui.h" line="345"/> <location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source> <source>Dump Game List</source>
@ -488,4 +498,405 @@
<translation>Включить отладку RenderDoc</translation> <translation>Включить отладку RenderDoc</translation>
</message> </message>
</context> </context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation> * Неподдерживаемая версия Vulkan</translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source>
<translation>Скачать читы для всех установленных игр</translation>
</message>
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation>Скачать патчи для всех игр</translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
<source>Download Complete</source>
<translation>Скачивание завершено</translation>
</message>
<message>
<location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source>
<translation>Вы скачали читы для всех установленных игр.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="391"/>
<source>Patches Downloaded Successfully!</source>
<translation>Патчи успешно скачаны!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="392"/>
<source>All Patches available for all games have been downloaded.</source>
<translation>Все доступные патчи для всех игр были скачаны.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="549"/>
<source>Games: </source>
<translation>Игры: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="575"/>
<source>PKG File (*.PKG)</source>
<translation>Файл PKG (*.PKG)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>Файл ELF (*.bin *.elf *.oelf)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Game Boot</source>
<translation>Запуск игры</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Only one file can be selected!</source>
<translation>Можно выбрать только один файл!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>Извлечение PKG</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>Patch detected!</source>
<translation>Обнаружен патч!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source>
<translation>Версии PKG и игры совпадают: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
<source>Would you like to overwrite?</source>
<translation>Хотите перезаписать?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>PKG Version %1 is older than installed version: </source>
<translation>Версия PKG %1 старее установленной версии: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Игра установлена: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Хотите установить патч: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source>
<translation>Установка DLC</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source>
<translation>Вы хотите установить DLC: %1??</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC уже установлен:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Игра уже установлена</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>PKG - это патч, сначала установите игру!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source>
<translation>ОШИБКА PKG</translation>
</message>
<message>
<location filename="../main_window.cpp" line="693"/>
<source>Extracting PKG %1/%2</source>
<translation>Извлечение PKG %1/%2</translation>
</message>
<message>
<location filename="../main_window.cpp" line="703"/>
<source>Extraction Finished</source>
<translation>Извлечение завершено</translation>
</message>
<message>
<location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source>
<translation>Игра успешно установлена в %1</translation>
</message>
<message>
<location filename="../main_window.cpp" line="725"/>
<source>File doesn't appear to be a valid PKG file</source>
<translation>Файл не является допустимым файлом PKG</translation>
</message>
</context>
<context>
<name>CheatsPatches</name>
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source>
<translation>Читы и патчи</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>Читы и патчи экспериментальны.\спользуйте с осторожностью.\n\nСкачивайте читы, выбрав репозиторий и нажав на кнопку загрузки.\nВо вкладке "Патчи" вы можете скачать все патчи сразу, выбирать какие вы хотите использовать, и сохранять выбор.\n\оскольку мы не разрабатываем читы/патчи,\nпожалуйста сообщайте о проблемах автору чита/патча.\n\nСоздали новый чит? Посетите:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
<source>No Image Available</source>
<translation>Изображение недоступно</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source>
<translation>Серийный номер: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>Версия: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source>
<translation>Размер: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source>
<translation>Выберите файл чита:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source>
<translation>Репозиторий:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source>
<translation>Скачать читы</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Delete File</source>
<translation>Удалить файл</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="169"/>
<source>No files selected.</source>
<translation>Файлы не выбраны.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source>
<translation>Вы можете удалить ненужные читы после их скачивания.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>Вы хотите удалить выбранный файл?\n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source>
<translation>Выберите файл патча:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation>Скачать патчи</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
<source>Save</source>
<translation>Сохранить</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation>Читы</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
<source>Patches</source>
<translation>Патчи</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>Error</source>
<translation>Ошибка</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>No patch selected.</source>
<translation>Патч не выбран.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="292"/>
<source>Unable to open files.json for reading.</source>
<translation>Не удалось открыть файл files.json для чтения.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source>
<translation>Не найден файл патча для текущего серийного номера.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="323"/>
<source>Unable to open the file for reading.</source>
<translation>Не удалось открыть файл для чтения.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="422"/>
<source>Unable to open the file for writing.</source>
<translation>Не удалось открыть файл для записи.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source>
<translation>Не удалось разобрать XML: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Success</source>
<translation>Успех</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Options saved successfully.</source>
<translation>Опции успешно сохранены.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation>Неверный источник</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
<source>The selected source is invalid.</source>
<translation>Выбранный источник недействителен.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation>Файл существует</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
<source>File already exists. Do you want to replace it?</source>
<translation>Файл уже существует. Хотите заменить его?</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source>
<translation>Не удалось сохранить файл:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source>
<translation>Не удалось скачать файл:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation>Читы не найдены</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source>
<translation>Читы не найдены для этой игры в выбранном репозитории. Попробуйте другой репозиторий или другую версию игры.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation>Читы успешно скачаны</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation>Вы успешно скачали читы для этой версии игры из выбранного репозитория. Вы можете попробовать скачать из другого репозитория. Если он доступен, его также можно будет использовать, выбрав файл из списка.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source>
<translation>Не удалось сохранить:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source>
<translation>Не удалось скачать:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="762"/>
<source>Download Complete</source>
<translation>Скачивание завершено</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation>Патчи успешно скачаны! Все доступные патчи для всех игр были скачаны, нет необходимости скачивать их по отдельности для каждой игры, как это происходит с читами.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
<source>Failed to parse JSON data from HTML.</source>
<translation>Не удалось разобрать данные JSON из HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="778"/>
<source>Failed to retrieve HTML page.</source>
<translation>Не удалось получить HTML-страницу.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source>
<translation>Не удалось открыть файл:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source>
<translation>ОШИБКА XML:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="826"/>
<source>Failed to open files.json for writing</source>
<translation>Не удалось открыть файл files.json для записи</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source>
<translation>Автор: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source>
<translation>Каталог не существует:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Failed to open files.json for reading.</source>
<translation>Не удалось открыть файл files.json для чтения.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>Имя:</translation>
</message>
</context>
</TS> </TS>

View File

@ -81,67 +81,72 @@
<context> <context>
<name>GuiContextMenus</name> <name>GuiContextMenus</name>
<message> <message>
<location filename="../gui_context_menus.h" line="39"/> <location filename="../gui_context_menus.h" line="46"/>
<source>Create Shortcut</source> <source>Create Shortcut</source>
<translation>Kısayol Oluştur</translation> <translation>Kısayol Oluştur</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="40"/> <location filename="../gui_context_menus.h" line="47"/>
<source>Open Game Folder</source> <source>Open Game Folder</source>
<translation>Oyun Klasörünü </translation> <translation>Oyun Klasörünü </translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="41"/> <location filename="../gui_context_menus.h" line="48"/>
<source>Cheats / Patches</source>
<translation>Hileler / Yamanlar</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>SFO Viewer</source> <source>SFO Viewer</source>
<translation>SFO Görüntüleyici</translation> <translation>SFO Görüntüleyici</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="42"/> <location filename="../gui_context_menus.h" line="50"/>
<source>Trophy Viewer</source> <source>Trophy Viewer</source>
<translation>Kupa Görüntüleyici</translation> <translation>Kupa Görüntüleyici</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="50"/> <location filename="../gui_context_menus.h" line="59"/>
<source>Copy info</source> <source>Copy info</source>
<translation>Bilgiyi Kopyala</translation> <translation>Bilgiyi Kopyala</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="51"/> <location filename="../gui_context_menus.h" line="60"/>
<source>Copy Name</source> <source>Copy Name</source>
<translation>Adı Kopyala</translation> <translation>Adı Kopyala</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="52"/> <location filename="../gui_context_menus.h" line="61"/>
<source>Copy Serial</source> <source>Copy Serial</source>
<translation>Seri Numarasını Kopyala</translation> <translation>Seri Numarasını Kopyala</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="53"/> <location filename="../gui_context_menus.h" line="62"/>
<source>Copy All</source> <source>Copy All</source>
<translation>Tümünü Kopyala</translation> <translation>Tümünü Kopyala</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="173"/> <location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source> <source>Shortcut creation</source>
<translation>Kısayol oluşturma</translation> <translation>Kısayol oluşturma</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="174"/> <location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source> <source>Shortcut created successfully!\n %1</source>
<translation>Kısayol başarıyla oluşturuldu!\n %1</translation> <translation>Kısayol başarıyla oluşturuldu!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="177"/> <location filename="../gui_context_menus.h" line="199"/>
<source>Error</source> <source>Error</source>
<translation>Hata</translation> <translation>Hata</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="178"/> <location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source> <source>Error creating shortcut!\n %1</source>
<translation>Kısayol oluşturulurken hata oluştu!\n %1</translation> <translation>Kısayol oluşturulurken hata oluştu!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="253"/> <location filename="../gui_context_menus.h" line="275"/>
<source>Install PKG</source> <source>Install PKG</source>
<translation>PKG Yükle</translation> <translation>PKG Yükle</translation>
</message> </message>
@ -248,6 +253,11 @@
<source>Game Install Directory</source> <source>Game Install Directory</source>
<translation>Oyun Kurulum Klasörü</translation> <translation>Oyun Kurulum Klasörü</translation>
</message> </message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation>Hileler / Yamanlar İndir</translation>
</message>
<message> <message>
<location filename="../main_window_ui.h" line="345"/> <location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source> <source>Dump Game List</source>
@ -488,4 +498,476 @@
<translation>RenderDoc Hata Ayıklamayı Etkinleştir</translation> <translation>RenderDoc Hata Ayıklamayı Etkinleştir</translation>
</message> </message>
</context> </context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation> * Desteklenmeyen Vulkan Sürümü</translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source>
<translation>Tüm Yüklenmiş Oyunlar İçin Hileleri İndir</translation>
</message>
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation>Tüm Oyunlar İçin Yamanları İndir</translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
<source>Download Complete</source>
<translation>İndirme Tamamlandı</translation>
</message>
<message>
<location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source>
<translation>Yüklediğiniz tüm oyunlar için hileleri indirdiniz.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="391"/>
<source>Patches Downloaded Successfully!</source>
<translation>Yamalar Başarıyla İndirildi!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="392"/>
<source>All Patches available for all games have been downloaded.</source>
<translation>Tüm oyunlar için mevcut tüm yamalar indirildi.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="549"/>
<source>Games: </source>
<translation>Oyunlar: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="575"/>
<source>PKG File (*.PKG)</source>
<translation>PKG Dosyası (*.PKG)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>ELF Dosyaları (*.bin *.elf *.oelf)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Game Boot</source>
<translation>Oyun Başlatma</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Only one file can be selected!</source>
<translation>Sadece bir dosya seçilebilir!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>PKG Çıkartma</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>Patch detected!</source>
<translation>Yamanın tespit edildi!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source>
<translation>PKG ve oyun sürümleri uyumlu: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
<source>Would you like to overwrite?</source>
<translation>Üzerine yazmak ister misiniz?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>PKG Version %1 is older than installed version: </source>
<translation>PKG Sürümü %1, kurulu sürümden daha eski: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Oyun yüklendi: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Yamanın yüklenmesini ister misiniz: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source>
<translation>DLC Yükleme</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source>
<translation>DLC'yi yüklemek ister misiniz: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC zaten yüklü:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Oyun zaten yüklü</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>PKG bir yama, lütfen önce oyunu yükleyin!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source>
<translation>PKG HATASI</translation>
</message>
<message>
<location filename="../main_window.cpp" line="693"/>
<source>Extracting PKG %1/%2</source>
<translation>PKG Çıkarılıyor %1/%2</translation>
</message>
<message>
<location filename="../main_window.cpp" line="703"/>
<source>Extraction Finished</source>
<translation>Çıkarma Tamamlandı</translation>
</message>
<message>
<location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source>
<translation>Oyun başarıyla %1 konumuna yüklendi</translation>
</message>
<message>
<location filename="../main_window.cpp" line="725"/>
<source>File doesn't appear to be a valid PKG file</source>
<translation>Dosya geçerli bir PKG dosyası gibi görünmüyor</translation>
</message>
</context>
<context>
<name>CheatsPatches</name>
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source>
<translation>Hileler / Yamalar</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>Cheats/Patches deneysel niteliktedir.\nDikkatli kullanın.\n\nCheat'leri ayrı ayrı indirerek, depo seçerek ve indirme düğmesine tıklayarak indirin.\nPatches sekmesinde tüm patch'leri bir kerede indirebilir, hangi patch'leri kullanmak istediğinizi seçebilir ve seçiminizi kaydedebilirsiniz.\n\nCheats/Patches'i geliştirmediğimiz için,\nproblemleri cheat yazarına bildirin.\n\nYeni bir cheat mi oluşturduğunuz? Şu adresi ziyaret edin:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
<source>No Image Available</source>
<translation>Görüntü Mevcut Değil</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source>
<translation>Seri Numarası: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>Sürüm: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source>
<translation>Boyut: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source>
<translation>Hile Dosyasını Seçin:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source>
<translation>Depo:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source>
<translation>Hileleri İndir</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Confirm Delete</source>
<translation>Silme Onayı</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="156"/>
<source>Are you sure you want to delete the selected cheat?\n%1</source>
<translation>Seçilen hileyi silmek istediğinizden emin misiniz?\n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source>
<translation>İndirdikten sonra istemediğiniz hileleri silebilirsiniz.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>Seçilen dosyayı silmek istiyor musunuz?\n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source>
<translation>Yama Dosyasını Seçin:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation>Yamaları İndir</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
<source>Save</source>
<translation>Kaydet</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation>Hileler</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
<source>Patches</source>
<translation>Yamalar</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>Error</source>
<translation>Hata</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>No patch selected.</source>
<translation>Hiç yama seçilmedi.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="292"/>
<source>Unable to open files.json for reading.</source>
<translation>files.json dosyasını okumak için ılamadı.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source>
<translation>Mevcut seri numarası için hiç yama dosyası bulunamadı.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="323"/>
<source>Unable to open the file for reading.</source>
<translation>Dosya okumak için ılamadı.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="422"/>
<source>Unable to open the file for writing.</source>
<translation>Dosya yazmak için ılamadı.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source>
<translation>XML ayrıştırılamadı: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Success</source>
<translation>Başarı</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Options saved successfully.</source>
<translation>Ayarlar başarıyla kaydedildi.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation>Geçersiz Kaynak</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
<source>The selected source is invalid.</source>
<translation>Seçilen kaynak geçersiz.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation>Dosya Var</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
<source>File already exists. Do you want to replace it?</source>
<translation>Dosya zaten var. Üzerine yazmak ister misiniz?</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source>
<translation>Dosya kaydedilemedi:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source>
<translation>Dosya indirilemedi:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation>Hileler Bulunamadı</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source>
<translation>Bu oyun için seçilen depoda hile bulunamadı.Başka bir depo veya oyun sürümü deneyin.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation>Hileler Başarıyla İndirildi</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation>Bu oyun sürümü için hileleri başarıyla indirdiniz. Başka bir depodan indirmeyi deneyebilirsiniz. Eğer mevcutsa, listeden dosyayı seçerek de kullanılabilir.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source>
<translation>Kaydedilemedi:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source>
<translation>İndirilemedi:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="762"/>
<source>Download Complete</source>
<translation>İndirme Tamamlandı</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation>Yamalar başarıyla indirildi! Tüm oyunlar için mevcut tüm yamalar indirildi, her oyun için ayrı ayrı indirme yapmanız gerekmez, hilelerle olduğu gibi.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
<source>Failed to parse JSON data from HTML.</source>
<translation>HTML'den JSON verileri ayrıştırılamadı.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="778"/>
<source>Failed to retrieve HTML page.</source>
<translation>HTML sayfası alınamadı.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source>
<translation>Dosya ılamadı:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source>
<translation>XML HATASI:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="826"/>
<source>Failed to open files.json for writing</source>
<translation>files.json dosyası yazmak için ılamadı</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source>
<translation>Yazar: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source>
<translation>Klasör mevcut değil:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Failed to open files.json for reading.</source>
<translation>files.json dosyası okumak için ılamadı.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>İsim:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1007"/>
<source>Version:</source>
<translation>Sürüm:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1008"/>
<source>Size:</source>
<translation>Boyut:</translation>
</message>
</context>
<context>
<name>LangDialog</name>
<message>
<location filename="../lang_dialog.cpp" line="23"/>
<source>Language Settings</source>
<translation>Dil Ayarları</translation>
</message>
<message>
<location filename="../lang_dialog.cpp" line="30"/>
<source>Select Language:</source>
<translation>Dil Seçin:</translation>
</message>
<message>
<location filename="../lang_dialog.cpp" line="50"/>
<source>Restart Required</source>
<translation>Yeniden Başlatma Gerekiyor</translation>
</message>
<message>
<location filename="../lang_dialog.cpp" line="51"/>
<source>Changes will take effect after restarting the application.</source>
<translation>Değişiklikler uygulama yeniden başlatıldığında geçerli olacaktır.</translation>
</message>
</context>
<context>
<name>SettingsDialog</name>
<message>
<location filename="../settings_dialog.cpp" line="40"/>
<source>Settings</source>
<translation>Ayarlar</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="45"/>
<source>General</source>
<translation>Genel</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="49"/>
<source>Cheats</source>
<translation>Hileler</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="52"/>
<source>Update</source>
<translation>Güncelleme</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="55"/>
<source>Save</source>
<translation>Kaydet</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="66"/>
<source>Reset to Default</source>
<translation>Varsayılana Sıfırla</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="73"/>
<source>Apply Changes</source>
<translation>Değişiklikleri Uygula</translation>
</message>
</context>
</TS> </TS>

View File

@ -81,67 +81,72 @@
<context> <context>
<name>GuiContextMenus</name> <name>GuiContextMenus</name>
<message> <message>
<location filename="../gui_context_menus.h" line="39"/> <location filename="../gui_context_menus.h" line="46"/>
<source>Create Shortcut</source> <source>Create Shortcut</source>
<translation>Create Shortcut</translation> <translation>Create Shortcut</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="40"/> <location filename="../gui_context_menus.h" line="47"/>
<source>Open Game Folder</source> <source>Open Game Folder</source>
<translation>Open Game Folder</translation> <translation>Open Game Folder</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="41"/> <location filename="../gui_context_menus.h" line="48"/>
<source>Cheats / Patches</source>
<translation>Mẹo / Bản </translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>SFO Viewer</source> <source>SFO Viewer</source>
<translation>SFO Viewer</translation> <translation>SFO Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="42"/> <location filename="../gui_context_menus.h" line="50"/>
<source>Trophy Viewer</source> <source>Trophy Viewer</source>
<translation>Trophy Viewer</translation> <translation>Trophy Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="50"/> <location filename="../gui_context_menus.h" line="59"/>
<source>Copy info</source> <source>Copy info</source>
<translation>Copy info</translation> <translation>Copy info</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="51"/> <location filename="../gui_context_menus.h" line="60"/>
<source>Copy Name</source> <source>Copy Name</source>
<translation>Copy Name</translation> <translation>Copy Name</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="52"/> <location filename="../gui_context_menus.h" line="61"/>
<source>Copy Serial</source> <source>Copy Serial</source>
<translation>Copy Serial</translation> <translation>Copy Serial</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="53"/> <location filename="../gui_context_menus.h" line="62"/>
<source>Copy All</source> <source>Copy All</source>
<translation>Copy All</translation> <translation>Copy All</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="173"/> <location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source> <source>Shortcut creation</source>
<translation>Shortcut creation</translation> <translation>Shortcut creation</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="174"/> <location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source> <source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation> <translation>Shortcut created successfully!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="177"/> <location filename="../gui_context_menus.h" line="199"/>
<source>Error</source> <source>Error</source>
<translation>Error</translation> <translation>Error</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="178"/> <location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source> <source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation> <translation>Error creating shortcut!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="253"/> <location filename="../gui_context_menus.h" line="275"/>
<source>Install PKG</source> <source>Install PKG</source>
<translation>Install PKG</translation> <translation>Install PKG</translation>
</message> </message>
@ -248,6 +253,11 @@
<source>Game Install Directory</source> <source>Game Install Directory</source>
<translation>Game Install Directory</translation> <translation>Game Install Directory</translation>
</message> </message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation>Tải Mẹo / Bản </translation>
</message>
<message> <message>
<location filename="../main_window_ui.h" line="345"/> <location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source> <source>Dump Game List</source>
@ -488,4 +498,405 @@
<translation>Enable RenderDoc Debugging</translation> <translation>Enable RenderDoc Debugging</translation>
</message> </message>
</context> </context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation> * Phiên bản Vulkan không đưc hỗ trợ</translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source>
<translation>Tải xuống cheat cho tất cả các trò chơi đã cài đt</translation>
</message>
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation>Tải xuống bản cho tất cả các trò chơi</translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
<source>Download Complete</source>
<translation>Tải xuống hoàn tất</translation>
</message>
<message>
<location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source>
<translation>Bạn đã tải xuống cheat cho tất cả các trò chơi bạn đã cài đt.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="391"/>
<source>Patches Downloaded Successfully!</source>
<translation>Bản đã tải xuống thành công!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="392"/>
<source>All Patches available for all games have been downloaded.</source>
<translation>Tất cả các bản sẵn cho tất cả các trò chơi đã đưc tải xuống.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="549"/>
<source>Games: </source>
<translation>Trò chơi: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="575"/>
<source>PKG File (*.PKG)</source>
<translation>Tệp PKG (*.PKG)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>Tệp ELF (*.bin *.elf *.oelf)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Game Boot</source>
<translation>Khởi đng trò chơi</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Only one file can be selected!</source>
<translation>Chỉ thể chọn một tệp duy nhất!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>Giải nén PKG</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>Patch detected!</source>
<translation>Đã phát hiện bản !</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source>
<translation>Các phiên bản PKG trò chơi khớp nhau: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
<source>Would you like to overwrite?</source>
<translation>Bạn muốn ghi đè không?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>PKG Version %1 is older than installed version: </source>
<translation>Phiên bản PKG %1 hơn phiên bản đã cài đt: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Trò chơi đã đưc cài đt: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Bạn muốn cài đt bản : </translation>
</message>
<message>
<location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source>
<translation>Cài đt DLC</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source>
<translation>Bạn muốn cài đt DLC: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC đã đưc cài đt:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Trò chơi đã đưc cài đt</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>PKG bản , vui lòng cài đt trò chơi trước!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source>
<translation>LOI PKG</translation>
</message>
<message>
<location filename="../main_window.cpp" line="693"/>
<source>Extracting PKG %1/%2</source>
<translation>Đang giải nén PKG %1/%2</translation>
</message>
<message>
<location filename="../main_window.cpp" line="703"/>
<source>Extraction Finished</source>
<translation>Giải nén hoàn tất</translation>
</message>
<message>
<location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source>
<translation>Trò chơi đã đưc cài đt thành công tại %1</translation>
</message>
<message>
<location filename="../main_window.cpp" line="725"/>
<source>File doesn't appear to be a valid PKG file</source>
<translation>Tệp không vẻ tệp PKG hợp lệ</translation>
</message>
</context>
<context>
<name>CheatsPatches</name>
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source>
<translation>Cheat / Bản </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>Cheats/Patches các tính năng thử nghiệm.\nHãy sử dụng cẩn thận.\n\nTải xuống các cheat riêng lẻ bằng cách chọn kho lưu trữ nhấp vào nút tải xuống.\nTại tab Patches, bạn thể tải xuống tất cả các patch cùng một lúc, chọn cái nào bạn muốn sử dụng lưu lựa chọn của mình.\n\nVì chúng tôi không phát triển Cheats/Patches,\nxin vui lòng báo cáo các vấn đ cho tác giả cheat.\n\nBạn đã tạo ra một cheat mới? Truy cập:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
<source>No Image Available</source>
<translation>Không hình nh</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source>
<translation>Số seri: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>Phiên bản: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source>
<translation>Kích thước: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source>
<translation>Chọn tệp Cheat:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source>
<translation>Kho lưu trữ:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source>
<translation>Tải xuống Cheat</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Delete File</source>
<translation>Xóa tệp</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="169"/>
<source>No files selected.</source>
<translation>Không tệp nào đưc chọn.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source>
<translation>Bạn thể xóa các cheat không muốn sau khi tải xuống.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>Bạn muốn xóa tệp đã chọn?\n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source>
<translation>Chọn tệp Bản :</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation>Tải xuống Bản </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
<source>Save</source>
<translation>Lưu</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation>Cheat</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
<source>Patches</source>
<translation>Bản </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>Error</source>
<translation>Lỗi</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>No patch selected.</source>
<translation>Không bản nào đưc chọn.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="292"/>
<source>Unable to open files.json for reading.</source>
<translation>Không thể mở files.json đ đc.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source>
<translation>Không tìm thấy tệp bản cho số seri hiện tại.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="323"/>
<source>Unable to open the file for reading.</source>
<translation>Không thể mở tệp đ đc.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="422"/>
<source>Unable to open the file for writing.</source>
<translation>Không thể mở tệp đ ghi.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source>
<translation>Không thể phân tích XML: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Success</source>
<translation>Thành công</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Options saved successfully.</source>
<translation>Các tùy chọn đã đưc lưu thành công.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation>Nguồn không hợp lệ</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
<source>The selected source is invalid.</source>
<translation>Nguồn đã chọn không hợp lệ.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation>Tệp đã tồn tại</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
<source>File already exists. Do you want to replace it?</source>
<translation>Tệp đã tồn tại. Bạn muốn thay thế không?</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source>
<translation>Không thể lưu tệp:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source>
<translation>Không thể tải xuống tệp:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation>Không tìm thấy Cheat</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source>
<translation>Không tìm thấy Cheat cho trò chơi này trong phiên bản kho lưu trữ đã chọn,hãy thử kho lưu trữ khác hoặc phiên bản khác của trò chơi.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation>Cheat đã tải xuống thành công</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation>Bạn đã tải xuống các cheat thành công. Cho phiên bản trò chơi này từ kho lưu trữ đã chọn. Bạn thể thử tải xuống từ kho lưu trữ khác, nếu , bạn cũng thể sử dụng bằng cách chọn tệp từ danh sách.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source>
<translation>Không thể lưu:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source>
<translation>Không thể tải xuống:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="762"/>
<source>Download Complete</source>
<translation>Tải xuống hoàn tất</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation>Bản đã tải xuống thành công! Tất cả các bản sẵn cho tất cả các trò chơi đã đưc tải xuống, không cần tải xuống riêng lẻ cho mỗi trò chơi như trong Cheat.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
<source>Failed to parse JSON data from HTML.</source>
<translation>Không thể phân tích dữ liệu JSON từ HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="778"/>
<source>Failed to retrieve HTML page.</source>
<translation>Không thể lấy trang HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source>
<translation>Không thể mở tệp:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source>
<translation>LỖI XML:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="826"/>
<source>Failed to open files.json for writing</source>
<translation>Không thể mở files.json đ ghi</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source>
<translation>Tác giả: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source>
<translation>Thư mục không tồn tại:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Failed to open files.json for reading.</source>
<translation>Không thể mở files.json đ đc.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>Tên:</translation>
</message>
</context>
</TS> </TS>

View File

@ -81,67 +81,72 @@
<context> <context>
<name>GuiContextMenus</name> <name>GuiContextMenus</name>
<message> <message>
<location filename="../gui_context_menus.h" line="39"/> <location filename="../gui_context_menus.h" line="46"/>
<source>Create Shortcut</source> <source>Create Shortcut</source>
<translation>Create Shortcut</translation> <translation>Create Shortcut</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="40"/> <location filename="../gui_context_menus.h" line="47"/>
<source>Open Game Folder</source> <source>Open Game Folder</source>
<translation>Open Game Folder</translation> <translation>Open Game Folder</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="41"/> <location filename="../gui_context_menus.h" line="48"/>
<source>Cheats / Patches</source>
<translation>Zuòbì / Bǔdīng</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>SFO Viewer</source> <source>SFO Viewer</source>
<translation>SFO Viewer</translation> <translation>SFO Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="42"/> <location filename="../gui_context_menus.h" line="50"/>
<source>Trophy Viewer</source> <source>Trophy Viewer</source>
<translation>Trophy Viewer</translation> <translation>Trophy Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="50"/> <location filename="../gui_context_menus.h" line="59"/>
<source>Copy info</source> <source>Copy info</source>
<translation>Copy info</translation> <translation>Copy info</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="51"/> <location filename="../gui_context_menus.h" line="60"/>
<source>Copy Name</source> <source>Copy Name</source>
<translation>Copy Name</translation> <translation>Copy Name</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="52"/> <location filename="../gui_context_menus.h" line="61"/>
<source>Copy Serial</source> <source>Copy Serial</source>
<translation>Copy Serial</translation> <translation>Copy Serial</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="53"/> <location filename="../gui_context_menus.h" line="62"/>
<source>Copy All</source> <source>Copy All</source>
<translation>Copy All</translation> <translation>Copy All</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="173"/> <location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source> <source>Shortcut creation</source>
<translation>Shortcut creation</translation> <translation>Shortcut creation</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="174"/> <location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source> <source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation> <translation>Shortcut created successfully!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="177"/> <location filename="../gui_context_menus.h" line="199"/>
<source>Error</source> <source>Error</source>
<translation>Error</translation> <translation>Error</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="178"/> <location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source> <source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation> <translation>Error creating shortcut!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="253"/> <location filename="../gui_context_menus.h" line="275"/>
<source>Install PKG</source> <source>Install PKG</source>
<translation>Install PKG</translation> <translation>Install PKG</translation>
</message> </message>
@ -248,6 +253,11 @@
<source>Game Install Directory</source> <source>Game Install Directory</source>
<translation>Game Install Directory</translation> <translation>Game Install Directory</translation>
</message> </message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation>Xiàzài Zuòbì / Bǔdīng</translation>
</message>
<message> <message>
<location filename="../main_window_ui.h" line="345"/> <location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source> <source>Dump Game List</source>
@ -488,4 +498,405 @@
<translation>Enable RenderDoc Debugging</translation> <translation>Enable RenderDoc Debugging</translation>
</message> </message>
</context> </context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation> * Vulkan </translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
<source>Download Complete</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="391"/>
<source>Patches Downloaded Successfully!</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="392"/>
<source>All Patches available for all games have been downloaded.</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="549"/>
<source>Games: </source>
<translation>: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="575"/>
<source>PKG File (*.PKG)</source>
<translation>PKG (*.PKG)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>ELF (*.bin *.elf *.oelf)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Game Boot</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Only one file can be selected!</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>PKG </translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>Patch detected!</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source>
<translation>PKG : </translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
<source>Would you like to overwrite?</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>PKG Version %1 is older than installed version: </source>
<translation>PKG %1 : </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source>
<translation>DLC </translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source>
<translation> DLC: %1 </translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC :</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>PKG </translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source>
<translation>PKG </translation>
</message>
<message>
<location filename="../main_window.cpp" line="693"/>
<source>Extracting PKG %1/%2</source>
<translation> PKG %1/%2</translation>
</message>
<message>
<location filename="../main_window.cpp" line="703"/>
<source>Extraction Finished</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source>
<translation> %1</translation>
</message>
<message>
<location filename="../main_window.cpp" line="725"/>
<source>File doesn't appear to be a valid PKG file</source>
<translation> PKG </translation>
</message>
</context>
<context>
<name>CheatsPatches</name>
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source>
<translation> / </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>/\n请小心使用\n\n通过选择存储库并点击下载按钮\n在使\n\n由于我们不开发作弊程序/\n请将问题报告给作弊程序的作者\n\n创建了新的作弊程序访\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
<source>No Image Available</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source>
<translation>: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source>
<translation>: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Delete File</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="169"/>
<source>No files selected.</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>\n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
<source>Save</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
<source>Patches</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>Error</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>No patch selected.</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="292"/>
<source>Unable to open files.json for reading.</source>
<translation> files.json </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="323"/>
<source>Unable to open the file for reading.</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="422"/>
<source>Unable to open the file for writing.</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source>
<translation> XML : </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Success</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Options saved successfully.</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
<source>The selected source is invalid.</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
<source>File already exists. Do you want to replace it?</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation> 使</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="762"/>
<source>Download Complete</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
<source>Failed to parse JSON data from HTML.</source>
<translation> HTML JSON </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="778"/>
<source>Failed to retrieve HTML page.</source>
<translation> HTML </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source>
<translation>XML :</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="826"/>
<source>Failed to open files.json for writing</source>
<translation> files.json </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source>
<translation>: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Failed to open files.json for reading.</source>
<translation> files.json </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>:</translation>
</message>
</context>
</TS> </TS>

View File

@ -81,67 +81,72 @@
<context> <context>
<name>GuiContextMenus</name> <name>GuiContextMenus</name>
<message> <message>
<location filename="../gui_context_menus.h" line="39"/> <location filename="../gui_context_menus.h" line="46"/>
<source>Create Shortcut</source> <source>Create Shortcut</source>
<translation>Create Shortcut</translation> <translation>Create Shortcut</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="40"/> <location filename="../gui_context_menus.h" line="47"/>
<source>Open Game Folder</source> <source>Open Game Folder</source>
<translation>Open Game Folder</translation> <translation>Open Game Folder</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="41"/> <location filename="../gui_context_menus.h" line="48"/>
<source>Cheats / Patches</source>
<translation>Zuòbì / Xiūbǔ chéngshì</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>SFO Viewer</source> <source>SFO Viewer</source>
<translation>SFO Viewer</translation> <translation>SFO Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="42"/> <location filename="../gui_context_menus.h" line="50"/>
<source>Trophy Viewer</source> <source>Trophy Viewer</source>
<translation>Trophy Viewer</translation> <translation>Trophy Viewer</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="50"/> <location filename="../gui_context_menus.h" line="59"/>
<source>Copy info</source> <source>Copy info</source>
<translation>Copy info</translation> <translation>Copy info</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="51"/> <location filename="../gui_context_menus.h" line="60"/>
<source>Copy Name</source> <source>Copy Name</source>
<translation>Copy Name</translation> <translation>Copy Name</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="52"/> <location filename="../gui_context_menus.h" line="61"/>
<source>Copy Serial</source> <source>Copy Serial</source>
<translation>Copy Serial</translation> <translation>Copy Serial</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="53"/> <location filename="../gui_context_menus.h" line="62"/>
<source>Copy All</source> <source>Copy All</source>
<translation>Copy All</translation> <translation>Copy All</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="173"/> <location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source> <source>Shortcut creation</source>
<translation>Shortcut creation</translation> <translation>Shortcut creation</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="174"/> <location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source> <source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation> <translation>Shortcut created successfully!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="177"/> <location filename="../gui_context_menus.h" line="199"/>
<source>Error</source> <source>Error</source>
<translation>Error</translation> <translation>Error</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="178"/> <location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source> <source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation> <translation>Error creating shortcut!\n %1</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="253"/> <location filename="../gui_context_menus.h" line="275"/>
<source>Install PKG</source> <source>Install PKG</source>
<translation>Install PKG</translation> <translation>Install PKG</translation>
</message> </message>
@ -248,6 +253,11 @@
<source>Game Install Directory</source> <source>Game Install Directory</source>
<translation>Game Install Directory</translation> <translation>Game Install Directory</translation>
</message> </message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation>Xiàzài Zuòbì / Xiūbǔ chéngshì</translation>
</message>
<message> <message>
<location filename="../main_window_ui.h" line="345"/> <location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source> <source>Dump Game List</source>
@ -488,4 +498,405 @@
<translation>Enable RenderDoc Debugging</translation> <translation>Enable RenderDoc Debugging</translation>
</message> </message>
</context> </context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation> * Vulkan </translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
<source>Download Complete</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="391"/>
<source>Patches Downloaded Successfully!</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="392"/>
<source>All Patches available for all games have been downloaded.</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="549"/>
<source>Games: </source>
<translation>: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="575"/>
<source>PKG File (*.PKG)</source>
<translation>PKG (*.PKG)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>ELF (*.bin *.elf *.oelf)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Game Boot</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Only one file can be selected!</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>PKG </translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>Patch detected!</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source>
<translation>PKG : </translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
<source>Would you like to overwrite?</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>PKG Version %1 is older than installed version: </source>
<translation>PKG %1 : </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source>
<translation>DLC </translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source>
<translation> DLC: %1 </translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC :</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>PKG </translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source>
<translation>PKG </translation>
</message>
<message>
<location filename="../main_window.cpp" line="693"/>
<source>Extracting PKG %1/%2</source>
<translation> PKG %1/%2</translation>
</message>
<message>
<location filename="../main_window.cpp" line="703"/>
<source>Extraction Finished</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source>
<translation> %1</translation>
</message>
<message>
<location filename="../main_window.cpp" line="725"/>
<source>File doesn't appear to be a valid PKG file</source>
<translation> PKG </translation>
</message>
</context>
<context>
<name>CheatsPatches</name>
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source>
<translation> / </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>/\n請小心使用\n\n透過選擇儲存庫並點擊下載按鈕來單獨下載作弊程式\n在使\n\n由於我們不開發作弊/\n請將問題報告給作弊程式的作者\n\n創建了新的作弊程式\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
<source>No Image Available</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source>
<translation>: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source>
<translation>: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Delete File</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="169"/>
<source>No files selected.</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>\n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
<source>Save</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
<source>Patches</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>Error</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>No patch selected.</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="292"/>
<source>Unable to open files.json for reading.</source>
<translation> files.json </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="323"/>
<source>Unable to open the file for reading.</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="422"/>
<source>Unable to open the file for writing.</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source>
<translation> XML : </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Success</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Options saved successfully.</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
<source>The selected source is invalid.</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
<source>File already exists. Do you want to replace it?</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation> 使</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="762"/>
<source>Download Complete</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation></translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
<source>Failed to parse JSON data from HTML.</source>
<translation> HTML JSON </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="778"/>
<source>Failed to retrieve HTML page.</source>
<translation> HTML </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source>
<translation>XML :</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="826"/>
<source>Failed to open files.json for writing</source>
<translation> files.json </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source>
<translation>: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source>
<translation>:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Failed to open files.json for reading.</source>
<translation> files.json </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>:</translation>
</message>
</context>
</TS> </TS>

View File

@ -16,9 +16,6 @@
#ifdef __APPLE__ #ifdef __APPLE__
#include <SDL3/SDL_metal.h> #include <SDL3/SDL_metal.h>
#endif #endif
#include <common/singleton.h>
#include <core/libraries/mouse/mouse.h>
#include <input/mouse.h>
namespace Frontend { namespace Frontend {
@ -111,31 +108,11 @@ void WindowSDL::waitEvent() {
case SDL_EVENT_QUIT: case SDL_EVENT_QUIT:
is_open = false; is_open = false;
break; break;
case SDL_EVENT_MOUSE_BUTTON_DOWN:
case SDL_EVENT_MOUSE_BUTTON_UP:
onMouseAction(&event);
break;
default: default:
break; break;
} }
} }
void WindowSDL::onMouseAction(const SDL_Event* event) {
auto* mouse = Common::Singleton<Input::GameMouse>::Instance();
using Libraries::Mouse::OrbisMouseButtonDataOffset;
u32 button = 0;
switch (event->button.button) {
case SDL_BUTTON_LEFT:
button = OrbisMouseButtonDataOffset::ORBIS_MOUSE_BUTTON_PRIMARY;
break;
case SDL_BUTTON_RIGHT:
button = OrbisMouseButtonDataOffset::ORBIS_MOUSE_BUTTON_SECONDARY;
break;
}
if (button != 0) {
mouse->CheckButton(0, button, event->type == SDL_EVENT_MOUSE_BUTTON_DOWN);
}
}
void WindowSDL::onResize() { void WindowSDL::onResize() {
SDL_GetWindowSizeInPixels(window, &width, &height); SDL_GetWindowSizeInPixels(window, &width, &height);
} }

View File

@ -68,7 +68,7 @@ private:
void onResize(); void onResize();
void onKeyPress(const SDL_Event* event); void onKeyPress(const SDL_Event* event);
void onGamepadEvent(const SDL_Event* event); void onGamepadEvent(const SDL_Event* event);
void onMouseAction(const SDL_Event* event);
int sdlGamepadToOrbisButton(u8 button); int sdlGamepadToOrbisButton(u8 button);
private: private:

View File

@ -99,7 +99,7 @@ Id TypeId(const EmitContext& ctx, IR::Type type) {
} }
} }
void Traverse(EmitContext& ctx, IR::Program& program) { void Traverse(EmitContext& ctx, const IR::Program& program) {
IR::Block* current_block{}; IR::Block* current_block{};
for (const IR::AbstractSyntaxNode& node : program.syntax_list) { for (const IR::AbstractSyntaxNode& node : program.syntax_list) {
switch (node.type) { switch (node.type) {
@ -162,7 +162,7 @@ void Traverse(EmitContext& ctx, IR::Program& program) {
} }
} }
Id DefineMain(EmitContext& ctx, IR::Program& program) { Id DefineMain(EmitContext& ctx, const IR::Program& program) {
const Id void_function{ctx.TypeFunction(ctx.void_id)}; const Id void_function{ctx.TypeFunction(ctx.void_id)};
const Id main{ctx.OpFunction(ctx.void_id, spv::FunctionControlMask::MaskNone, void_function)}; const Id main{ctx.OpFunction(ctx.void_id, spv::FunctionControlMask::MaskNone, void_function)};
for (IR::Block* const block : program.blocks) { for (IR::Block* const block : program.blocks) {
@ -185,8 +185,28 @@ void DefineEntryPoint(const IR::Program& program, EmitContext& ctx, Id main) {
ctx.AddCapability(spv::Capability::Int16); ctx.AddCapability(spv::Capability::Int16);
} }
ctx.AddCapability(spv::Capability::Int64); ctx.AddCapability(spv::Capability::Int64);
if (info.has_storage_images) { if (info.has_storage_images || info.has_image_buffers) {
ctx.AddCapability(spv::Capability::StorageImageExtendedFormats); ctx.AddCapability(spv::Capability::StorageImageExtendedFormats);
ctx.AddCapability(spv::Capability::StorageImageReadWithoutFormat);
ctx.AddCapability(spv::Capability::StorageImageWriteWithoutFormat);
}
if (info.has_texel_buffers) {
ctx.AddCapability(spv::Capability::SampledBuffer);
}
if (info.has_image_buffers) {
ctx.AddCapability(spv::Capability::ImageBuffer);
}
if (info.has_image_gather) {
ctx.AddCapability(spv::Capability::ImageGatherExtended);
}
if (info.has_image_query) {
ctx.AddCapability(spv::Capability::ImageQuery);
}
if (info.uses_lane_id) {
ctx.AddCapability(spv::Capability::GroupNonUniform);
}
if (info.uses_group_quad) {
ctx.AddCapability(spv::Capability::GroupNonUniformQuad);
} }
switch (program.info.stage) { switch (program.info.stage) {
case Stage::Compute: { case Stage::Compute: {
@ -206,19 +226,9 @@ void DefineEntryPoint(const IR::Program& program, EmitContext& ctx, Id main) {
} else { } else {
ctx.AddExecutionMode(main, spv::ExecutionMode::OriginUpperLeft); ctx.AddExecutionMode(main, spv::ExecutionMode::OriginUpperLeft);
} }
ctx.AddCapability(spv::Capability::GroupNonUniform);
if (info.uses_group_quad) {
ctx.AddCapability(spv::Capability::GroupNonUniformQuad);
}
if (info.has_discard) { if (info.has_discard) {
ctx.AddCapability(spv::Capability::DemoteToHelperInvocationEXT); ctx.AddCapability(spv::Capability::DemoteToHelperInvocationEXT);
} }
if (info.has_image_gather) {
ctx.AddCapability(spv::Capability::ImageGatherExtended);
}
if (info.has_image_query) {
ctx.AddCapability(spv::Capability::ImageQuery);
}
if (info.stores.Get(IR::Attribute::Depth)) { if (info.stores.Get(IR::Attribute::Depth)) {
ctx.AddExecutionMode(main, spv::ExecutionMode::DepthReplacing); ctx.AddExecutionMode(main, spv::ExecutionMode::DepthReplacing);
} }
@ -229,7 +239,7 @@ void DefineEntryPoint(const IR::Program& program, EmitContext& ctx, Id main) {
ctx.AddEntryPoint(execution_model, main, "main", interfaces); ctx.AddEntryPoint(execution_model, main, "main", interfaces);
} }
void PatchPhiNodes(IR::Program& program, EmitContext& ctx) { void PatchPhiNodes(const IR::Program& program, EmitContext& ctx) {
auto inst{program.blocks.front()->begin()}; auto inst{program.blocks.front()->begin()};
size_t block_index{0}; size_t block_index{0};
ctx.PatchDeferredPhi([&](size_t phi_arg) { ctx.PatchDeferredPhi([&](size_t phi_arg) {
@ -248,8 +258,8 @@ void PatchPhiNodes(IR::Program& program, EmitContext& ctx) {
} }
} // Anonymous namespace } // Anonymous namespace
std::vector<u32> EmitSPIRV(const Profile& profile, IR::Program& program, u32& binding) { std::vector<u32> EmitSPIRV(const Profile& profile, const IR::Program& program, u32& binding) {
EmitContext ctx{profile, program, binding}; EmitContext ctx{profile, program.info, binding};
const Id main{DefineMain(ctx, program)}; const Id main{DefineMain(ctx, program)};
DefineEntryPoint(program, ctx, main); DefineEntryPoint(program, ctx, main);
if (program.info.stage == Stage::Vertex) { if (program.info.stage == Stage::Vertex) {

View File

@ -9,7 +9,7 @@
namespace Shader::Backend::SPIRV { namespace Shader::Backend::SPIRV {
[[nodiscard]] std::vector<u32> EmitSPIRV(const Profile& profile, IR::Program& program, [[nodiscard]] std::vector<u32> EmitSPIRV(const Profile& profile, const IR::Program& program,
u32& binding); u32& binding);
} // namespace Shader::Backend::SPIRV } // namespace Shader::Backend::SPIRV

View File

@ -262,171 +262,16 @@ Id EmitLoadBufferF32x4(EmitContext& ctx, IR::Inst*, u32 handle, Id address) {
return EmitLoadBufferF32xN<4>(ctx, handle, address); return EmitLoadBufferF32xN<4>(ctx, handle, address);
} }
static bool IsSignedInteger(AmdGpu::NumberFormat format) {
switch (format) {
case AmdGpu::NumberFormat::Unorm:
case AmdGpu::NumberFormat::Uscaled:
case AmdGpu::NumberFormat::Uint:
return false;
case AmdGpu::NumberFormat::Snorm:
case AmdGpu::NumberFormat::Sscaled:
case AmdGpu::NumberFormat::Sint:
case AmdGpu::NumberFormat::SnormNz:
return true;
case AmdGpu::NumberFormat::Float:
default:
UNREACHABLE();
}
}
static u32 UXBitsMax(u32 bit_width) {
return (1u << bit_width) - 1u;
}
static u32 SXBitsMax(u32 bit_width) {
return (1u << (bit_width - 1u)) - 1u;
}
static Id ConvertValue(EmitContext& ctx, Id value, AmdGpu::NumberFormat format, u32 bit_width) {
switch (format) {
case AmdGpu::NumberFormat::Unorm:
return ctx.OpFDiv(ctx.F32[1], value, ctx.ConstF32(float(UXBitsMax(bit_width))));
case AmdGpu::NumberFormat::Snorm:
return ctx.OpFDiv(ctx.F32[1], value, ctx.ConstF32(float(SXBitsMax(bit_width))));
case AmdGpu::NumberFormat::SnormNz:
// (x * 2 + 1) / (Format::SMAX * 2)
value = ctx.OpFMul(ctx.F32[1], value, ctx.ConstF32(2.f));
value = ctx.OpFAdd(ctx.F32[1], value, ctx.ConstF32(1.f));
return ctx.OpFDiv(ctx.F32[1], value, ctx.ConstF32(float(SXBitsMax(bit_width) * 2)));
case AmdGpu::NumberFormat::Uscaled:
case AmdGpu::NumberFormat::Sscaled:
case AmdGpu::NumberFormat::Uint:
case AmdGpu::NumberFormat::Sint:
case AmdGpu::NumberFormat::Float:
return value;
default:
UNREACHABLE_MSG("Unsupported number format for conversion: {}",
magic_enum::enum_name(format));
}
}
static Id ComponentOffset(EmitContext& ctx, Id address, u32 stride, u32 bit_offset) {
Id comp_offset = ctx.ConstU32(bit_offset);
if (stride < 4) {
// comp_offset += (address % 4) * 8;
const Id byte_offset = ctx.OpUMod(ctx.U32[1], address, ctx.ConstU32(4u));
const Id bit_offset = ctx.OpShiftLeftLogical(ctx.U32[1], byte_offset, ctx.ConstU32(3u));
comp_offset = ctx.OpIAdd(ctx.U32[1], comp_offset, bit_offset);
}
return comp_offset;
}
static Id GetBufferFormatValue(EmitContext& ctx, u32 handle, Id address, u32 comp) {
auto& buffer = ctx.buffers[handle];
const auto format = buffer.dfmt;
switch (format) {
case AmdGpu::DataFormat::FormatInvalid:
return ctx.f32_zero_value;
case AmdGpu::DataFormat::Format8:
case AmdGpu::DataFormat::Format16:
case AmdGpu::DataFormat::Format32:
case AmdGpu::DataFormat::Format8_8:
case AmdGpu::DataFormat::Format16_16:
case AmdGpu::DataFormat::Format10_11_11:
case AmdGpu::DataFormat::Format11_11_10:
case AmdGpu::DataFormat::Format10_10_10_2:
case AmdGpu::DataFormat::Format2_10_10_10:
case AmdGpu::DataFormat::Format8_8_8_8:
case AmdGpu::DataFormat::Format32_32:
case AmdGpu::DataFormat::Format16_16_16_16:
case AmdGpu::DataFormat::Format32_32_32:
case AmdGpu::DataFormat::Format32_32_32_32: {
const u32 num_components = AmdGpu::NumComponents(format);
if (comp >= num_components) {
return ctx.f32_zero_value;
}
// uint index = address / 4;
Id index = ctx.OpShiftRightLogical(ctx.U32[1], address, ctx.ConstU32(2u));
const u32 stride = buffer.stride;
if (stride > 4) {
const u32 index_offset = u32(AmdGpu::ComponentOffset(format, comp) / 32);
if (index_offset > 0) {
// index += index_offset;
index = ctx.OpIAdd(ctx.U32[1], index, ctx.ConstU32(index_offset));
}
}
const Id ptr = ctx.OpAccessChain(buffer.pointer_type, buffer.id, ctx.u32_zero_value, index);
const u32 bit_offset = AmdGpu::ComponentOffset(format, comp) % 32;
const u32 bit_width = AmdGpu::ComponentBits(format, comp);
const auto num_format = buffer.nfmt;
if (num_format == AmdGpu::NumberFormat::Float) {
if (bit_width == 32) {
return ctx.OpLoad(ctx.F32[1], ptr);
} else if (bit_width == 16) {
const Id comp_offset = ComponentOffset(ctx, address, stride, bit_offset);
Id value = ctx.OpLoad(ctx.U32[1], ptr);
value =
ctx.OpBitFieldSExtract(ctx.S32[1], value, comp_offset, ctx.ConstU32(bit_width));
value = ctx.OpSConvert(ctx.U16, value);
value = ctx.OpBitcast(ctx.F16[1], value);
return ctx.OpFConvert(ctx.F32[1], value);
} else {
UNREACHABLE_MSG("Invalid float bit width {}", bit_width);
}
} else {
Id value = ctx.OpLoad(ctx.U32[1], ptr);
const bool is_signed = IsSignedInteger(num_format);
if (bit_width < 32) {
const Id comp_offset = ComponentOffset(ctx, address, stride, bit_offset);
if (is_signed) {
value = ctx.OpBitFieldSExtract(ctx.S32[1], value, comp_offset,
ctx.ConstU32(bit_width));
} else {
value = ctx.OpBitFieldUExtract(ctx.U32[1], value, comp_offset,
ctx.ConstU32(bit_width));
}
}
value = ctx.OpBitcast(ctx.F32[1], value);
return ConvertValue(ctx, value, num_format, bit_width);
}
break;
}
default:
UNREACHABLE_MSG("Invalid format for conversion: {}", magic_enum::enum_name(format));
}
}
template <u32 N>
static Id EmitLoadBufferFormatF32xN(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) {
auto& buffer = ctx.buffers[handle];
address = ctx.OpIAdd(ctx.U32[1], address, buffer.offset);
if constexpr (N == 1) {
return GetBufferFormatValue(ctx, handle, address, 0);
} else {
boost::container::static_vector<Id, N> ids;
for (u32 i = 0; i < N; i++) {
ids.push_back(GetBufferFormatValue(ctx, handle, address, i));
}
return ctx.OpCompositeConstruct(ctx.F32[N], ids);
}
}
Id EmitLoadBufferFormatF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) { Id EmitLoadBufferFormatF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) {
return EmitLoadBufferFormatF32xN<1>(ctx, inst, handle, address); const auto& buffer = ctx.texture_buffers[handle];
} const Id tex_buffer = ctx.OpLoad(buffer.image_type, buffer.id);
const Id coord = ctx.OpIAdd(ctx.U32[1], address, buffer.coord_offset);
Id EmitLoadBufferFormatF32x2(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) { Id texel = buffer.is_storage ? ctx.OpImageRead(buffer.result_type, tex_buffer, coord)
return EmitLoadBufferFormatF32xN<2>(ctx, inst, handle, address); : ctx.OpImageFetch(buffer.result_type, tex_buffer, coord);
} if (buffer.is_integer) {
texel = ctx.OpBitcast(ctx.F32[4], texel);
Id EmitLoadBufferFormatF32x3(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) { }
return EmitLoadBufferFormatF32xN<3>(ctx, inst, handle, address); return texel;
}
Id EmitLoadBufferFormatF32x4(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) {
return EmitLoadBufferFormatF32xN<4>(ctx, inst, handle, address);
} }
template <u32 N> template <u32 N>
@ -467,97 +312,14 @@ void EmitStoreBufferU32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address
EmitStoreBufferF32xN<1>(ctx, handle, address, value); EmitStoreBufferF32xN<1>(ctx, handle, address, value);
} }
static Id ConvertF32ToFormat(EmitContext& ctx, Id value, AmdGpu::NumberFormat format,
u32 bit_width) {
switch (format) {
case AmdGpu::NumberFormat::Unorm:
return ctx.OpConvertFToU(
ctx.U32[1], ctx.OpFMul(ctx.F32[1], value, ctx.ConstF32(float(UXBitsMax(bit_width)))));
case AmdGpu::NumberFormat::Uint:
return ctx.OpBitcast(ctx.U32[1], value);
case AmdGpu::NumberFormat::Float:
return value;
default:
UNREACHABLE_MSG("Unsupported number format for conversion: {}",
magic_enum::enum_name(format));
}
}
template <u32 N>
static void EmitStoreBufferFormatF32xN(EmitContext& ctx, u32 handle, Id address, Id value) {
auto& buffer = ctx.buffers[handle];
const auto format = buffer.dfmt;
const auto num_format = buffer.nfmt;
switch (format) {
case AmdGpu::DataFormat::FormatInvalid:
return;
case AmdGpu::DataFormat::Format8_8_8_8:
case AmdGpu::DataFormat::Format16:
case AmdGpu::DataFormat::Format32:
case AmdGpu::DataFormat::Format32_32:
case AmdGpu::DataFormat::Format32_32_32_32: {
ASSERT(N == AmdGpu::NumComponents(format));
address = ctx.OpIAdd(ctx.U32[1], address, buffer.offset);
const Id index = ctx.OpShiftRightLogical(ctx.U32[1], address, ctx.ConstU32(2u));
const Id ptr = ctx.OpAccessChain(buffer.pointer_type, buffer.id, ctx.u32_zero_value, index);
Id packed_value{};
for (u32 i = 0; i < N; i++) {
const u32 bit_width = AmdGpu::ComponentBits(format, i);
const u32 bit_offset = AmdGpu::ComponentOffset(format, i) % 32;
const Id comp{ConvertF32ToFormat(
ctx, N == 1 ? value : ctx.OpCompositeExtract(ctx.F32[1], value, i), num_format,
bit_width)};
if (bit_width == 32) {
if constexpr (N == 1) {
ctx.OpStore(ptr, comp);
} else {
const Id index_i = ctx.OpIAdd(ctx.U32[1], index, ctx.ConstU32(i));
const Id ptr = ctx.OpAccessChain(buffer.pointer_type, buffer.id,
ctx.u32_zero_value, index_i);
ctx.OpStore(ptr, comp);
}
} else {
if (i == 0) {
packed_value = comp;
} else {
packed_value =
ctx.OpBitFieldInsert(ctx.U32[1], packed_value, comp,
ctx.ConstU32(bit_offset), ctx.ConstU32(bit_width));
}
if (i == N - 1) {
ctx.OpStore(ptr, packed_value);
}
}
}
} break;
default:
UNREACHABLE_MSG("Invalid format for conversion: {}", magic_enum::enum_name(format));
}
}
void EmitStoreBufferFormatF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) { void EmitStoreBufferFormatF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) {
EmitStoreBufferFormatF32xN<1>(ctx, handle, address, value); const auto& buffer = ctx.texture_buffers[handle];
} const Id tex_buffer = ctx.OpLoad(buffer.image_type, buffer.id);
const Id coord = ctx.OpIAdd(ctx.U32[1], address, buffer.coord_offset);
void EmitStoreBufferFormatF32x2(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, if (buffer.is_integer) {
Id value) { value = ctx.OpBitcast(ctx.U32[4], value);
EmitStoreBufferFormatF32xN<2>(ctx, handle, address, value); }
} ctx.OpImageWrite(tex_buffer, coord, value);
void EmitStoreBufferFormatF32x3(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address,
Id value) {
EmitStoreBufferFormatF32xN<3>(ctx, handle, address, value);
}
void EmitStoreBufferFormatF32x4(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address,
Id value) {
EmitStoreBufferFormatF32xN<4>(ctx, handle, address, value);
} }
} // namespace Shader::Backend::SPIRV } // namespace Shader::Backend::SPIRV

View File

@ -41,13 +41,14 @@ void Name(EmitContext& ctx, Id object, std::string_view format_str, Args&&... ar
} // Anonymous namespace } // Anonymous namespace
EmitContext::EmitContext(const Profile& profile_, IR::Program& program, u32& binding_) EmitContext::EmitContext(const Profile& profile_, const Shader::Info& info_, u32& binding_)
: Sirit::Module(profile_.supported_spirv), info{program.info}, profile{profile_}, : Sirit::Module(profile_.supported_spirv), info{info_}, profile{profile_}, stage{info.stage},
stage{program.info.stage}, binding{binding_} { binding{binding_} {
AddCapability(spv::Capability::Shader); AddCapability(spv::Capability::Shader);
DefineArithmeticTypes(); DefineArithmeticTypes();
DefineInterfaces(); DefineInterfaces();
DefineBuffers(); DefineBuffers();
DefineTextureBuffers();
DefineImagesAndSamplers(); DefineImagesAndSamplers();
DefineSharedMemory(); DefineSharedMemory();
} }
@ -123,25 +124,24 @@ void EmitContext::DefineInterfaces() {
DefineOutputs(); DefineOutputs();
} }
Id GetAttributeType(EmitContext& ctx, AmdGpu::NumberFormat fmt) { const VectorIds& GetAttributeType(EmitContext& ctx, AmdGpu::NumberFormat fmt) {
switch (fmt) { switch (fmt) {
case AmdGpu::NumberFormat::Float: case AmdGpu::NumberFormat::Float:
case AmdGpu::NumberFormat::Unorm: case AmdGpu::NumberFormat::Unorm:
case AmdGpu::NumberFormat::Snorm: case AmdGpu::NumberFormat::Snorm:
case AmdGpu::NumberFormat::SnormNz: case AmdGpu::NumberFormat::SnormNz:
return ctx.F32[4];
case AmdGpu::NumberFormat::Sint:
return ctx.S32[4];
case AmdGpu::NumberFormat::Uint:
return ctx.U32[4];
case AmdGpu::NumberFormat::Sscaled: case AmdGpu::NumberFormat::Sscaled:
return ctx.F32[4];
case AmdGpu::NumberFormat::Uscaled: case AmdGpu::NumberFormat::Uscaled:
return ctx.F32[4]; case AmdGpu::NumberFormat::Srgb:
return ctx.F32;
case AmdGpu::NumberFormat::Sint:
return ctx.S32;
case AmdGpu::NumberFormat::Uint:
return ctx.U32;
default: default:
break; break;
} }
throw InvalidArgument("Invalid attribute type {}", fmt); UNREACHABLE_MSG("Invalid attribute type {}", fmt);
} }
EmitContext::SpirvAttribute EmitContext::GetAttributeInfo(AmdGpu::NumberFormat fmt, Id id) { EmitContext::SpirvAttribute EmitContext::GetAttributeInfo(AmdGpu::NumberFormat fmt, Id id) {
@ -162,7 +162,7 @@ EmitContext::SpirvAttribute EmitContext::GetAttributeInfo(AmdGpu::NumberFormat f
default: default:
break; break;
} }
throw InvalidArgument("Invalid attribute type {}", fmt); UNREACHABLE_MSG("Invalid attribute type {}", fmt);
} }
void EmitContext::DefineBufferOffsets() { void EmitContext::DefineBufferOffsets() {
@ -177,6 +177,16 @@ void EmitContext::DefineBufferOffsets() {
buffer.offset = OpBitFieldUExtract(U32[1], value, ConstU32(offset), ConstU32(8U)); buffer.offset = OpBitFieldUExtract(U32[1], value, ConstU32(offset), ConstU32(8U));
buffer.offset_dwords = OpShiftRightLogical(U32[1], buffer.offset, ConstU32(2U)); buffer.offset_dwords = OpShiftRightLogical(U32[1], buffer.offset, ConstU32(2U));
} }
for (auto& tex_buffer : texture_buffers) {
const u32 binding = tex_buffer.binding;
const u32 half = Shader::PushData::BufOffsetIndex + (binding >> 4);
const u32 comp = (binding & 0xf) >> 2;
const u32 offset = (binding & 0x3) << 3;
const Id ptr{OpAccessChain(TypePointer(spv::StorageClass::PushConstant, U32[1]),
push_data_block, ConstU32(half), ConstU32(comp))};
const Id value{OpLoad(U32[1], ptr)};
tex_buffer.coord_offset = OpBitFieldUExtract(U32[1], value, ConstU32(offset), ConstU32(8U));
}
} }
Id MakeDefaultValue(EmitContext& ctx, u32 default_value) { Id MakeDefaultValue(EmitContext& ctx, u32 default_value) {
@ -195,6 +205,11 @@ Id MakeDefaultValue(EmitContext& ctx, u32 default_value) {
} }
void EmitContext::DefineInputs() { void EmitContext::DefineInputs() {
if (info.uses_lane_id) {
subgroup_local_invocation_id = DefineVariable(
U32[1], spv::BuiltIn::SubgroupLocalInvocationId, spv::StorageClass::Input);
Decorate(subgroup_local_invocation_id, spv::Decoration::Flat);
}
switch (stage) { switch (stage) {
case Stage::Vertex: { case Stage::Vertex: {
vertex_index = DefineVariable(U32[1], spv::BuiltIn::VertexIndex, spv::StorageClass::Input); vertex_index = DefineVariable(U32[1], spv::BuiltIn::VertexIndex, spv::StorageClass::Input);
@ -202,7 +217,7 @@ void EmitContext::DefineInputs() {
instance_id = DefineVariable(U32[1], spv::BuiltIn::InstanceIndex, spv::StorageClass::Input); instance_id = DefineVariable(U32[1], spv::BuiltIn::InstanceIndex, spv::StorageClass::Input);
for (const auto& input : info.vs_inputs) { for (const auto& input : info.vs_inputs) {
const Id type{GetAttributeType(*this, input.fmt)}; const Id type{GetAttributeType(*this, input.fmt)[4]};
if (input.instance_step_rate == Info::VsInput::InstanceIdType::OverStepRate0 || if (input.instance_step_rate == Info::VsInput::InstanceIdType::OverStepRate0 ||
input.instance_step_rate == Info::VsInput::InstanceIdType::OverStepRate1) { input.instance_step_rate == Info::VsInput::InstanceIdType::OverStepRate1) {
@ -229,15 +244,12 @@ void EmitContext::DefineInputs() {
break; break;
} }
case Stage::Fragment: case Stage::Fragment:
subgroup_local_invocation_id = DefineVariable(
U32[1], spv::BuiltIn::SubgroupLocalInvocationId, spv::StorageClass::Input);
Decorate(subgroup_local_invocation_id, spv::Decoration::Flat);
frag_coord = DefineVariable(F32[4], spv::BuiltIn::FragCoord, spv::StorageClass::Input); frag_coord = DefineVariable(F32[4], spv::BuiltIn::FragCoord, spv::StorageClass::Input);
frag_depth = DefineVariable(F32[1], spv::BuiltIn::FragDepth, spv::StorageClass::Output); frag_depth = DefineVariable(F32[1], spv::BuiltIn::FragDepth, spv::StorageClass::Output);
front_facing = DefineVariable(U1[1], spv::BuiltIn::FrontFacing, spv::StorageClass::Input); front_facing = DefineVariable(U1[1], spv::BuiltIn::FrontFacing, spv::StorageClass::Input);
for (const auto& input : info.ps_inputs) { for (const auto& input : info.ps_inputs) {
const u32 semantic = input.param_index; const u32 semantic = input.param_index;
if (input.is_default) { if (input.is_default && !input.is_flat) {
input_params[semantic] = {MakeDefaultValue(*this, input.default_value), F32[1], input_params[semantic] = {MakeDefaultValue(*this, input.default_value), F32[1],
F32[1], 4, true}; F32[1], 4, true};
continue; continue;
@ -328,47 +340,75 @@ void EmitContext::DefinePushDataBlock() {
void EmitContext::DefineBuffers() { void EmitContext::DefineBuffers() {
boost::container::small_vector<Id, 8> type_ids; boost::container::small_vector<Id, 8> type_ids;
for (u32 i = 0; const auto& buffer : info.buffers) { const auto define_struct = [&](Id record_array_type, bool is_instance_data) {
const auto* data_types = True(buffer.used_types & IR::Type::F32) ? &F32 : &U32;
const Id data_type = (*data_types)[1];
const Id record_array_type{buffer.is_storage
? TypeRuntimeArray(data_type)
: TypeArray(data_type, ConstU32(buffer.length))};
const Id struct_type{TypeStruct(record_array_type)}; const Id struct_type{TypeStruct(record_array_type)};
if (std::ranges::find(type_ids, record_array_type.value, &Id::value) == type_ids.end()) { if (std::ranges::find(type_ids, record_array_type.value, &Id::value) != type_ids.end()) {
Decorate(record_array_type, spv::Decoration::ArrayStride, 4); return struct_type;
const auto name =
buffer.is_instance_data
? fmt::format("{}_instance_data{}_{}{}", stage, i, 'f',
sizeof(float) * CHAR_BIT)
: fmt::format("{}_cbuf_block_{}{}", stage, 'f', sizeof(float) * CHAR_BIT);
Name(struct_type, name);
Decorate(struct_type, spv::Decoration::Block);
MemberName(struct_type, 0, "data");
MemberDecorate(struct_type, 0, spv::Decoration::Offset, 0U);
type_ids.push_back(record_array_type);
} }
Decorate(record_array_type, spv::Decoration::ArrayStride, 4);
const auto name = is_instance_data ? fmt::format("{}_instance_data_f32", stage)
: fmt::format("{}_cbuf_block_f32", stage);
Name(struct_type, name);
Decorate(struct_type, spv::Decoration::Block);
MemberName(struct_type, 0, "data");
MemberDecorate(struct_type, 0, spv::Decoration::Offset, 0U);
type_ids.push_back(record_array_type);
return struct_type;
};
for (const auto& desc : info.buffers) {
const auto sharp = desc.GetSharp(info);
const bool is_storage = desc.IsStorage(sharp);
const auto* data_types = True(desc.used_types & IR::Type::F32) ? &F32 : &U32;
const Id data_type = (*data_types)[1];
const Id record_array_type{is_storage ? TypeRuntimeArray(data_type)
: TypeArray(data_type, ConstU32(sharp.NumDwords()))};
const Id struct_type{define_struct(record_array_type, desc.is_instance_data)};
const auto storage_class = const auto storage_class =
buffer.is_storage ? spv::StorageClass::StorageBuffer : spv::StorageClass::Uniform; is_storage ? spv::StorageClass::StorageBuffer : spv::StorageClass::Uniform;
const Id struct_pointer_type{TypePointer(storage_class, struct_type)}; const Id struct_pointer_type{TypePointer(storage_class, struct_type)};
const Id pointer_type = TypePointer(storage_class, data_type); const Id pointer_type = TypePointer(storage_class, data_type);
const Id id{AddGlobalVariable(struct_pointer_type, storage_class)}; const Id id{AddGlobalVariable(struct_pointer_type, storage_class)};
Decorate(id, spv::Decoration::Binding, binding); Decorate(id, spv::Decoration::Binding, binding);
Decorate(id, spv::Decoration::DescriptorSet, 0U); Decorate(id, spv::Decoration::DescriptorSet, 0U);
Name(id, fmt::format("{}_{}", buffer.is_storage ? "ssbo" : "cbuf", buffer.sgpr_base)); if (is_storage && !desc.is_written) {
Decorate(id, spv::Decoration::NonWritable);
}
Name(id, fmt::format("{}_{}", is_storage ? "ssbo" : "cbuf", desc.sgpr_base));
buffers.push_back({ buffers.push_back({
.id = id, .id = id,
.binding = binding++, .binding = binding++,
.data_types = data_types, .data_types = data_types,
.pointer_type = pointer_type, .pointer_type = pointer_type,
.dfmt = buffer.dfmt,
.nfmt = buffer.nfmt,
.stride = buffer.GetVsharp(info).GetStride(),
}); });
interfaces.push_back(id); interfaces.push_back(id);
i++; }
}
void EmitContext::DefineTextureBuffers() {
for (const auto& desc : info.texture_buffers) {
const bool is_integer =
desc.nfmt == AmdGpu::NumberFormat::Uint || desc.nfmt == AmdGpu::NumberFormat::Sint;
const VectorIds& sampled_type{GetAttributeType(*this, desc.nfmt)};
const u32 sampled = desc.is_written ? 2 : 1;
const Id image_type{TypeImage(sampled_type[1], spv::Dim::Buffer, false, false, false,
sampled, spv::ImageFormat::Unknown)};
const Id pointer_type{TypePointer(spv::StorageClass::UniformConstant, image_type)};
const Id id{AddGlobalVariable(pointer_type, spv::StorageClass::UniformConstant)};
Decorate(id, spv::Decoration::Binding, binding);
Decorate(id, spv::Decoration::DescriptorSet, 0U);
Name(id, fmt::format("{}_{}", desc.is_written ? "imgbuf" : "texbuf", desc.sgpr_base));
texture_buffers.push_back({
.id = id,
.binding = binding++,
.image_type = image_type,
.result_type = sampled_type[4],
.is_integer = is_integer,
.is_storage = desc.is_written,
});
interfaces.push_back(id);
} }
} }
@ -447,7 +487,7 @@ spv::ImageFormat GetFormat(const AmdGpu::Image& image) {
Id ImageType(EmitContext& ctx, const ImageResource& desc, Id sampled_type) { Id ImageType(EmitContext& ctx, const ImageResource& desc, Id sampled_type) {
const auto image = ctx.info.ReadUd<AmdGpu::Image>(desc.sgpr_base, desc.dword_offset); const auto image = ctx.info.ReadUd<AmdGpu::Image>(desc.sgpr_base, desc.dword_offset);
const auto format = desc.is_storage ? GetFormat(image) : spv::ImageFormat::Unknown; const auto format = desc.is_atomic ? GetFormat(image) : spv::ImageFormat::Unknown;
const u32 sampled = desc.is_storage ? 2 : 1; const u32 sampled = desc.is_storage ? 2 : 1;
switch (desc.type) { switch (desc.type) {
case AmdGpu::ImageType::Color1D: case AmdGpu::ImageType::Color1D:
@ -470,17 +510,8 @@ Id ImageType(EmitContext& ctx, const ImageResource& desc, Id sampled_type) {
void EmitContext::DefineImagesAndSamplers() { void EmitContext::DefineImagesAndSamplers() {
for (const auto& image_desc : info.images) { for (const auto& image_desc : info.images) {
const VectorIds* data_types = [&] { const VectorIds& data_types = GetAttributeType(*this, image_desc.nfmt);
switch (image_desc.nfmt) { const Id sampled_type = data_types[1];
case AmdGpu::NumberFormat::Uint:
return &U32;
case AmdGpu::NumberFormat::Sint:
return &S32;
default:
return &F32;
}
}();
const Id sampled_type = data_types->Get(1);
const Id image_type{ImageType(*this, image_desc, sampled_type)}; const Id image_type{ImageType(*this, image_desc, sampled_type)};
const Id pointer_type{TypePointer(spv::StorageClass::UniformConstant, image_type)}; const Id pointer_type{TypePointer(spv::StorageClass::UniformConstant, image_type)};
const Id id{AddGlobalVariable(pointer_type, spv::StorageClass::UniformConstant)}; const Id id{AddGlobalVariable(pointer_type, spv::StorageClass::UniformConstant)};
@ -489,7 +520,7 @@ void EmitContext::DefineImagesAndSamplers() {
Name(id, fmt::format("{}_{}{}_{:02x}", stage, "img", image_desc.sgpr_base, Name(id, fmt::format("{}_{}{}_{:02x}", stage, "img", image_desc.sgpr_base,
image_desc.dword_offset)); image_desc.dword_offset));
images.push_back({ images.push_back({
.data_types = data_types, .data_types = &data_types,
.id = id, .id = id,
.sampled_type = image_desc.is_storage ? sampled_type : TypeSampledImage(image_type), .sampled_type = image_desc.is_storage ? sampled_type : TypeSampledImage(image_type),
.pointer_type = pointer_type, .pointer_type = pointer_type,
@ -498,13 +529,12 @@ void EmitContext::DefineImagesAndSamplers() {
interfaces.push_back(id); interfaces.push_back(id);
++binding; ++binding;
} }
if (std::ranges::any_of(info.images, &ImageResource::is_atomic)) {
image_u32 = TypePointer(spv::StorageClass::Image, U32[1]); image_u32 = TypePointer(spv::StorageClass::Image, U32[1]);
}
if (info.samplers.empty()) { if (info.samplers.empty()) {
return; return;
} }
sampler_type = TypeSampler(); sampler_type = TypeSampler();
sampler_pointer_type = TypePointer(spv::StorageClass::UniformConstant, sampler_type); sampler_pointer_type = TypePointer(spv::StorageClass::UniformConstant, sampler_type);
for (const auto& samp_desc : info.samplers) { for (const auto& samp_desc : info.samplers) {
@ -520,14 +550,15 @@ void EmitContext::DefineImagesAndSamplers() {
} }
void EmitContext::DefineSharedMemory() { void EmitContext::DefineSharedMemory() {
static constexpr size_t DefaultSharedMemSize = 16_KB; static constexpr size_t DefaultSharedMemSize = 2_KB;
if (!info.uses_shared) { if (!info.uses_shared) {
return; return;
} }
if (info.shared_memory_size == 0) { u32 shared_memory_size = info.shared_memory_size;
info.shared_memory_size = DefaultSharedMemSize; if (shared_memory_size == 0) {
shared_memory_size = DefaultSharedMemSize;
} }
const u32 num_elements{Common::DivCeil(info.shared_memory_size, 4U)}; const u32 num_elements{Common::DivCeil(shared_memory_size, 4U)};
const Id type{TypeArray(U32[1], ConstU32(num_elements))}; const Id type{TypeArray(U32[1], ConstU32(num_elements))};
shared_memory_u32_type = TypePointer(spv::StorageClass::Workgroup, type); shared_memory_u32_type = TypePointer(spv::StorageClass::Workgroup, type);
shared_u32 = TypePointer(spv::StorageClass::Workgroup, U32[1]); shared_u32 = TypePointer(spv::StorageClass::Workgroup, U32[1]);

View File

@ -36,7 +36,7 @@ struct VectorIds {
class EmitContext final : public Sirit::Module { class EmitContext final : public Sirit::Module {
public: public:
explicit EmitContext(const Profile& profile, IR::Program& program, u32& binding); explicit EmitContext(const Profile& profile, const Shader::Info& info, u32& binding);
~EmitContext(); ~EmitContext();
Id Def(const IR::Value& value); Id Def(const IR::Value& value);
@ -124,7 +124,7 @@ public:
return ConstantComposite(type, constituents); return ConstantComposite(type, constituents);
} }
Info& info; const Info& info;
const Profile& profile; const Profile& profile;
Stage stage{}; Stage stage{};
@ -207,13 +207,20 @@ public:
u32 binding; u32 binding;
const VectorIds* data_types; const VectorIds* data_types;
Id pointer_type; Id pointer_type;
AmdGpu::DataFormat dfmt; };
AmdGpu::NumberFormat nfmt; struct TextureBufferDefinition {
u32 stride; Id id;
Id coord_offset;
u32 binding;
Id image_type;
Id result_type;
bool is_integer;
bool is_storage;
}; };
u32& binding; u32& binding;
boost::container::small_vector<BufferDefinition, 16> buffers; boost::container::small_vector<BufferDefinition, 16> buffers;
boost::container::small_vector<TextureBufferDefinition, 8> texture_buffers;
boost::container::small_vector<TextureDefinition, 8> images; boost::container::small_vector<TextureDefinition, 8> images;
boost::container::small_vector<Id, 4> samplers; boost::container::small_vector<Id, 4> samplers;
@ -238,6 +245,7 @@ private:
void DefineOutputs(); void DefineOutputs();
void DefinePushDataBlock(); void DefinePushDataBlock();
void DefineBuffers(); void DefineBuffers();
void DefineTextureBuffers();
void DefineImagesAndSamplers(); void DefineImagesAndSamplers();
void DefineSharedMemory(); void DefineSharedMemory();

View File

@ -18,25 +18,31 @@ void Translator::EmitDataShare(const GcnInst& inst) {
case Opcode::DS_READ2_B64: case Opcode::DS_READ2_B64:
return DS_READ(64, false, true, inst); return DS_READ(64, false, true, inst);
case Opcode::DS_WRITE_B32: case Opcode::DS_WRITE_B32:
return DS_WRITE(32, false, false, inst); return DS_WRITE(32, false, false, false, inst);
case Opcode::DS_WRITE2ST64_B32:
return DS_WRITE(32, false, true, true, inst);
case Opcode::DS_WRITE_B64: case Opcode::DS_WRITE_B64:
return DS_WRITE(64, false, false, inst); return DS_WRITE(64, false, false, false, inst);
case Opcode::DS_WRITE2_B32: case Opcode::DS_WRITE2_B32:
return DS_WRITE(32, false, true, inst); return DS_WRITE(32, false, true, false, inst);
case Opcode::DS_WRITE2_B64: case Opcode::DS_WRITE2_B64:
return DS_WRITE(64, false, true, inst); return DS_WRITE(64, false, true, false, inst);
case Opcode::DS_ADD_U32: case Opcode::DS_ADD_U32:
return DS_ADD_U32(inst, false); return DS_ADD_U32(inst, false);
case Opcode::DS_MIN_U32: case Opcode::DS_MIN_U32:
return DS_MIN_U32(inst, false); return DS_MIN_U32(inst, false, false);
case Opcode::DS_MIN_I32:
return DS_MIN_U32(inst, true, false);
case Opcode::DS_MAX_U32: case Opcode::DS_MAX_U32:
return DS_MAX_U32(inst, false); return DS_MAX_U32(inst, false, false);
case Opcode::DS_MAX_I32:
return DS_MAX_U32(inst, true, false);
case Opcode::DS_ADD_RTN_U32: case Opcode::DS_ADD_RTN_U32:
return DS_ADD_U32(inst, true); return DS_ADD_U32(inst, true);
case Opcode::DS_MIN_RTN_U32: case Opcode::DS_MIN_RTN_U32:
return DS_MIN_U32(inst, true); return DS_MIN_U32(inst, false, true);
case Opcode::DS_MAX_RTN_U32: case Opcode::DS_MAX_RTN_U32:
return DS_MAX_U32(inst, true); return DS_MAX_U32(inst, false, true);
default: default:
LogMissingOpcode(inst); LogMissingOpcode(inst);
} }
@ -89,12 +95,13 @@ void Translator::DS_READ(int bit_size, bool is_signed, bool is_pair, const GcnIn
} }
} }
void Translator::DS_WRITE(int bit_size, bool is_signed, bool is_pair, const GcnInst& inst) { void Translator::DS_WRITE(int bit_size, bool is_signed, bool is_pair, bool stride64,
const GcnInst& inst) {
const IR::U32 addr{ir.GetVectorReg(IR::VectorReg(inst.src[0].code))}; const IR::U32 addr{ir.GetVectorReg(IR::VectorReg(inst.src[0].code))};
const IR::VectorReg data0{inst.src[1].code}; const IR::VectorReg data0{inst.src[1].code};
const IR::VectorReg data1{inst.src[2].code}; const IR::VectorReg data1{inst.src[2].code};
if (is_pair) { if (is_pair) {
const u32 adj = bit_size == 32 ? 4 : 8; const u32 adj = (bit_size == 32 ? 4 : 8) * (stride64 ? 64 : 1);
const IR::U32 addr0 = ir.IAdd(addr, ir.Imm32(u32(inst.control.ds.offset0 * adj))); const IR::U32 addr0 = ir.IAdd(addr, ir.Imm32(u32(inst.control.ds.offset0 * adj)));
if (bit_size == 32) { if (bit_size == 32) {
ir.WriteShared(32, ir.GetVectorReg(data0), addr0); ir.WriteShared(32, ir.GetVectorReg(data0), addr0);
@ -133,23 +140,23 @@ void Translator::DS_ADD_U32(const GcnInst& inst, bool rtn) {
} }
} }
void Translator::DS_MIN_U32(const GcnInst& inst, bool rtn) { void Translator::DS_MIN_U32(const GcnInst& inst, bool is_signed, bool rtn) {
const IR::U32 addr{GetSrc(inst.src[0])}; const IR::U32 addr{GetSrc(inst.src[0])};
const IR::U32 data{GetSrc(inst.src[1])}; const IR::U32 data{GetSrc(inst.src[1])};
const IR::U32 offset = ir.Imm32(u32(inst.control.ds.offset0)); const IR::U32 offset = ir.Imm32(u32(inst.control.ds.offset0));
const IR::U32 addr_offset = ir.IAdd(addr, offset); const IR::U32 addr_offset = ir.IAdd(addr, offset);
const IR::Value original_val = ir.SharedAtomicIMin(addr_offset, data, false); const IR::Value original_val = ir.SharedAtomicIMin(addr_offset, data, is_signed);
if (rtn) { if (rtn) {
SetDst(inst.dst[0], IR::U32{original_val}); SetDst(inst.dst[0], IR::U32{original_val});
} }
} }
void Translator::DS_MAX_U32(const GcnInst& inst, bool rtn) { void Translator::DS_MAX_U32(const GcnInst& inst, bool is_signed, bool rtn) {
const IR::U32 addr{GetSrc(inst.src[0])}; const IR::U32 addr{GetSrc(inst.src[0])};
const IR::U32 data{GetSrc(inst.src[1])}; const IR::U32 data{GetSrc(inst.src[1])};
const IR::U32 offset = ir.Imm32(u32(inst.control.ds.offset0)); const IR::U32 offset = ir.Imm32(u32(inst.control.ds.offset0));
const IR::U32 addr_offset = ir.IAdd(addr, offset); const IR::U32 addr_offset = ir.IAdd(addr, offset);
const IR::Value original_val = ir.SharedAtomicIMax(addr_offset, data, false); const IR::Value original_val = ir.SharedAtomicIMax(addr_offset, data, is_signed);
if (rtn) { if (rtn) {
SetDst(inst.dst[0], IR::U32{original_val}); SetDst(inst.dst[0], IR::U32{original_val});
} }

View File

@ -1,14 +1,12 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include "common/logging/log.h"
#include "shader_recompiler/frontend/translate/translate.h" #include "shader_recompiler/frontend/translate/translate.h"
namespace Shader::Gcn { namespace Shader::Gcn {
void Translator::EmitExport(const GcnInst& inst) { void Translator::EmitExport(const GcnInst& inst) {
if (ir.block->has_multiple_predecessors && info.stage == Stage::Fragment) { if (ir.block->has_multiple_predecessors && info.stage == Stage::Fragment) {
LOG_WARNING(Render_Recompiler, "An ambiguous export appeared in translation");
ir.Discard(ir.LogicalNot(ir.GetExec())); ir.Discard(ir.LogicalNot(ir.GetExec()));
} }

View File

@ -6,98 +6,152 @@
namespace Shader::Gcn { namespace Shader::Gcn {
void Translator::EmitScalarAlu(const GcnInst& inst) { void Translator::EmitScalarAlu(const GcnInst& inst) {
switch (inst.encoding) {
case InstEncoding::SOPC: {
EmitSOPC(inst);
break;
}
case InstEncoding::SOPK: {
EmitSOPK(inst);
break;
}
default:
switch (inst.opcode) {
case Opcode::S_MOV_B32:
return S_MOV(inst);
case Opcode::S_MUL_I32:
return S_MUL_I32(inst);
case Opcode::S_AND_SAVEEXEC_B64:
return S_AND_SAVEEXEC_B64(inst);
case Opcode::S_MOV_B64:
return S_MOV_B64(inst);
case Opcode::S_OR_B64:
return S_OR_B64(NegateMode::None, false, inst);
case Opcode::S_NOR_B64:
return S_OR_B64(NegateMode::Result, false, inst);
case Opcode::S_XOR_B64:
return S_OR_B64(NegateMode::None, true, inst);
case Opcode::S_XNOR_B64:
return S_OR_B64(NegateMode::Result, true, inst);
case Opcode::S_ORN2_B64:
return S_OR_B64(NegateMode::Src1, false, inst);
case Opcode::S_AND_B64:
return S_AND_B64(NegateMode::None, inst);
case Opcode::S_NAND_B64:
return S_AND_B64(NegateMode::Result, inst);
case Opcode::S_ANDN2_B64:
return S_AND_B64(NegateMode::Src1, inst);
case Opcode::S_NOT_B64:
return S_NOT_B64(inst);
case Opcode::S_ADD_I32:
return S_ADD_I32(inst);
case Opcode::S_AND_B32:
return S_AND_B32(inst);
case Opcode::S_ASHR_I32:
return S_ASHR_I32(inst);
case Opcode::S_OR_B32:
return S_OR_B32(inst);
case Opcode::S_LSHL_B32:
return S_LSHL_B32(inst);
case Opcode::S_LSHR_B32:
return S_LSHR_B32(inst);
case Opcode::S_CSELECT_B32:
return S_CSELECT_B32(inst);
case Opcode::S_CSELECT_B64:
return S_CSELECT_B64(inst);
case Opcode::S_BFE_U32:
return S_BFE_U32(inst);
case Opcode::S_BFM_B32:
return S_BFM_B32(inst);
case Opcode::S_BREV_B32:
return S_BREV_B32(inst);
case Opcode::S_ADD_U32:
return S_ADD_U32(inst);
case Opcode::S_ADDC_U32:
return S_ADDC_U32(inst);
case Opcode::S_SUB_U32:
case Opcode::S_SUB_I32:
return S_SUB_U32(inst);
case Opcode::S_MIN_U32:
return S_MIN_U32(inst);
case Opcode::S_MAX_U32:
return S_MAX_U32(inst);
case Opcode::S_WQM_B64:
break;
default:
LogMissingOpcode(inst);
}
break;
}
}
void Translator::EmitSOPC(const GcnInst& inst) {
switch (inst.opcode) { switch (inst.opcode) {
case Opcode::S_MOVK_I32: case Opcode::S_CMP_EQ_I32:
return S_MOVK(inst); return S_CMP(ConditionOp::EQ, true, inst);
case Opcode::S_MOV_B32:
return S_MOV(inst);
case Opcode::S_MUL_I32:
return S_MUL_I32(inst);
case Opcode::S_AND_SAVEEXEC_B64:
return S_AND_SAVEEXEC_B64(inst);
case Opcode::S_MOV_B64:
return S_MOV_B64(inst);
case Opcode::S_CMP_LT_U32:
return S_CMP(ConditionOp::LT, false, inst);
case Opcode::S_CMP_LE_U32:
return S_CMP(ConditionOp::LE, false, inst);
case Opcode::S_CMP_LG_U32:
return S_CMP(ConditionOp::LG, false, inst);
case Opcode::S_CMP_LT_I32:
return S_CMP(ConditionOp::LT, true, inst);
case Opcode::S_CMP_LG_I32: case Opcode::S_CMP_LG_I32:
return S_CMP(ConditionOp::LG, true, inst); return S_CMP(ConditionOp::LG, true, inst);
case Opcode::S_CMP_GT_I32: case Opcode::S_CMP_GT_I32:
return S_CMP(ConditionOp::GT, true, inst); return S_CMP(ConditionOp::GT, true, inst);
case Opcode::S_CMP_LE_I32:
return S_CMP(ConditionOp::LE, true, inst);
case Opcode::S_CMP_GE_I32: case Opcode::S_CMP_GE_I32:
return S_CMP(ConditionOp::GE, true, inst); return S_CMP(ConditionOp::GE, true, inst);
case Opcode::S_CMP_EQ_I32: case Opcode::S_CMP_LT_I32:
return S_CMP(ConditionOp::EQ, true, inst); return S_CMP(ConditionOp::LT, true, inst);
case Opcode::S_CMP_LE_I32:
return S_CMP(ConditionOp::LE, true, inst);
case Opcode::S_CMP_EQ_U32: case Opcode::S_CMP_EQ_U32:
return S_CMP(ConditionOp::EQ, false, inst); return S_CMP(ConditionOp::EQ, false, inst);
case Opcode::S_CMP_GE_U32: case Opcode::S_CMP_LG_U32:
return S_CMP(ConditionOp::GE, false, inst); return S_CMP(ConditionOp::LG, false, inst);
case Opcode::S_CMP_GT_U32: case Opcode::S_CMP_GT_U32:
return S_CMP(ConditionOp::GT, false, inst); return S_CMP(ConditionOp::GT, false, inst);
case Opcode::S_OR_B64: case Opcode::S_CMP_GE_U32:
return S_OR_B64(NegateMode::None, false, inst); return S_CMP(ConditionOp::GE, false, inst);
case Opcode::S_NOR_B64: case Opcode::S_CMP_LT_U32:
return S_OR_B64(NegateMode::Result, false, inst); return S_CMP(ConditionOp::LT, false, inst);
case Opcode::S_XOR_B64: case Opcode::S_CMP_LE_U32:
return S_OR_B64(NegateMode::None, true, inst); return S_CMP(ConditionOp::LE, false, inst);
case Opcode::S_ORN2_B64: default:
return S_OR_B64(NegateMode::Src1, false, inst); LogMissingOpcode(inst);
case Opcode::S_AND_B64: }
return S_AND_B64(NegateMode::None, inst); }
case Opcode::S_NAND_B64:
return S_AND_B64(NegateMode::Result, inst); void Translator::EmitSOPK(const GcnInst& inst) {
case Opcode::S_ANDN2_B64: switch (inst.opcode) {
return S_AND_B64(NegateMode::Src1, inst); case Opcode::S_MOVK_I32:
case Opcode::S_NOT_B64: return S_MOVK(inst);
return S_NOT_B64(inst);
case Opcode::S_ADD_I32: case Opcode::S_CMPK_EQ_I32:
return S_ADD_I32(inst); return S_CMPK(ConditionOp::EQ, true, inst);
case Opcode::S_AND_B32: case Opcode::S_CMPK_LG_I32:
return S_AND_B32(inst); return S_CMPK(ConditionOp::LG, true, inst);
case Opcode::S_ASHR_I32: case Opcode::S_CMPK_GT_I32:
return S_ASHR_I32(inst); return S_CMPK(ConditionOp::GT, true, inst);
case Opcode::S_OR_B32: case Opcode::S_CMPK_GE_I32:
return S_OR_B32(inst); return S_CMPK(ConditionOp::GE, true, inst);
case Opcode::S_LSHL_B32: case Opcode::S_CMPK_LT_I32:
return S_LSHL_B32(inst); return S_CMPK(ConditionOp::LT, true, inst);
case Opcode::S_LSHR_B32: case Opcode::S_CMPK_LE_I32:
return S_LSHR_B32(inst); return S_CMPK(ConditionOp::LE, true, inst);
case Opcode::S_CSELECT_B32:
return S_CSELECT_B32(inst); case Opcode::S_CMPK_EQ_U32:
case Opcode::S_CSELECT_B64: return S_CMPK(ConditionOp::EQ, false, inst);
return S_CSELECT_B64(inst); case Opcode::S_CMPK_LG_U32:
case Opcode::S_BFE_U32: return S_CMPK(ConditionOp::LG, false, inst);
return S_BFE_U32(inst); case Opcode::S_CMPK_GT_U32:
case Opcode::S_BFM_B32: return S_CMPK(ConditionOp::GT, false, inst);
return S_BFM_B32(inst); case Opcode::S_CMPK_GE_U32:
case Opcode::S_BREV_B32: return S_CMPK(ConditionOp::GE, false, inst);
return S_BREV_B32(inst); case Opcode::S_CMPK_LT_U32:
case Opcode::S_ADD_U32: return S_CMPK(ConditionOp::LT, false, inst);
return S_ADD_U32(inst); case Opcode::S_CMPK_LE_U32:
case Opcode::S_ADDC_U32: return S_CMPK(ConditionOp::LE, false, inst);
return S_ADDC_U32(inst);
case Opcode::S_ADDK_I32: case Opcode::S_ADDK_I32:
return S_ADDK_I32(inst); return S_ADDK_I32(inst);
case Opcode::S_MULK_I32: case Opcode::S_MULK_I32:
return S_MULK_I32(inst); return S_MULK_I32(inst);
case Opcode::S_SUB_U32:
case Opcode::S_SUB_I32:
return S_SUB_U32(inst);
case Opcode::S_MIN_U32:
return S_MIN_U32(inst);
case Opcode::S_MAX_U32:
return S_MAX_U32(inst);
case Opcode::S_WQM_B64:
break;
case Opcode::S_CMPK_EQ_U32:
return S_CMPK_EQ_U32(inst);
default: default:
LogMissingOpcode(inst); LogMissingOpcode(inst);
} }
@ -154,6 +208,31 @@ void Translator::S_CMP(ConditionOp cond, bool is_signed, const GcnInst& inst) {
ir.SetScc(result); ir.SetScc(result);
} }
void Translator::S_CMPK(ConditionOp cond, bool is_signed, const GcnInst& inst) {
const s32 simm16 = inst.control.sopk.simm;
const IR::U32 lhs = GetSrc(inst.dst[0]);
const IR::U32 rhs = ir.Imm32(simm16);
const IR::U1 result = [&] {
switch (cond) {
case ConditionOp::EQ:
return ir.IEqual(lhs, rhs);
case ConditionOp::LG:
return ir.INotEqual(lhs, rhs);
case ConditionOp::GT:
return ir.IGreaterThan(lhs, rhs, is_signed);
case ConditionOp::GE:
return ir.IGreaterThanEqual(lhs, rhs, is_signed);
case ConditionOp::LT:
return ir.ILessThan(lhs, rhs, is_signed);
case ConditionOp::LE:
return ir.ILessThanEqual(lhs, rhs, is_signed);
default:
UNREACHABLE();
}
}();
ir.SetScc(result);
}
void Translator::S_AND_SAVEEXEC_B64(const GcnInst& inst) { void Translator::S_AND_SAVEEXEC_B64(const GcnInst& inst) {
// This instruction normally operates on 64-bit data (EXEC, VCC, SGPRs) // This instruction normally operates on 64-bit data (EXEC, VCC, SGPRs)
// However here we flatten it to 1-bit EXEC and 1-bit VCC. For the destination // However here we flatten it to 1-bit EXEC and 1-bit VCC. For the destination
@ -470,11 +549,4 @@ void Translator::S_MIN_U32(const GcnInst& inst) {
ir.SetScc(ir.IEqual(result, src0)); ir.SetScc(ir.IEqual(result, src0));
} }
void Translator::S_CMPK_EQ_U32(const GcnInst& inst) {
const s32 simm16 = inst.control.sopk.simm;
const IR::U32 src0{GetSrc(inst.dst[0])};
const IR::U32 src1{ir.Imm32(simm16)};
ir.SetScc(ir.IEqual(src0, src1));
}
} // namespace Shader::Gcn } // namespace Shader::Gcn

Some files were not shown because too many files have changed in this diff Show More