mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-08-04 16:32:39 +00:00
Merge remote-tracking branch 'origin/main' into libc-internal
This commit is contained in:
commit
8960315a8a
@ -450,6 +450,11 @@ set(NP_LIBS src/core/libraries/np_common/np_common.cpp
|
||||
src/core/libraries/np_party/np_party.h
|
||||
)
|
||||
|
||||
set(ZLIB_LIB src/core/libraries/zlib/zlib.cpp
|
||||
src/core/libraries/zlib/zlib_sce.h
|
||||
src/core/libraries/zlib/zlib_error.h
|
||||
)
|
||||
|
||||
set(MISC_LIBS src/core/libraries/screenshot/screenshot.cpp
|
||||
src/core/libraries/screenshot/screenshot.h
|
||||
src/core/libraries/move/move.cpp
|
||||
@ -622,6 +627,7 @@ set(CORE src/core/aerolib/stubs.cpp
|
||||
${PLAYGO_LIB}
|
||||
${RANDOM_LIB}
|
||||
${USBD_LIB}
|
||||
${ZLIB_LIB}
|
||||
${MISC_LIBS}
|
||||
${IME_LIB}
|
||||
${FIBER_LIB}
|
||||
|
2
externals/MoltenVK/MoltenVK
vendored
2
externals/MoltenVK/MoltenVK
vendored
@ -1 +1 @@
|
||||
Subproject commit 6fa077fb8ed8dac4e4cd66b6b1ebd7b4d955a754
|
||||
Subproject commit aba997657b94d6de1794ebad36ce5634341252c7
|
@ -134,6 +134,7 @@ bool ParseFilterRule(Filter& instance, Iterator begin, Iterator end) {
|
||||
SUB(Lib, Mouse) \
|
||||
SUB(Lib, WebBrowserDialog) \
|
||||
SUB(Lib, NpParty) \
|
||||
SUB(Lib, Zlib) \
|
||||
CLS(Frontend) \
|
||||
CLS(Render) \
|
||||
SUB(Render, Vulkan) \
|
||||
|
@ -101,6 +101,7 @@ enum class Class : u8 {
|
||||
Lib_Mouse, ///< The LibSceMouse implementation
|
||||
Lib_WebBrowserDialog, ///< The LibSceWebBrowserDialog implementation
|
||||
Lib_NpParty, ///< The LibSceNpParty implementation
|
||||
Lib_Zlib, ///< The LibSceZlib implementation.
|
||||
Frontend, ///< Emulator UI
|
||||
Render, ///< Video Core
|
||||
Render_Vulkan, ///< Vulkan backend
|
||||
|
@ -54,6 +54,7 @@
|
||||
#include "core/libraries/videodec/videodec2.h"
|
||||
#include "core/libraries/videoout/video_out.h"
|
||||
#include "core/libraries/web_browser_dialog/webbrowserdialog.h"
|
||||
#include "core/libraries/zlib/zlib_sce.h"
|
||||
#include "fiber/fiber.h"
|
||||
#include "jpeg/jpegenc.h"
|
||||
|
||||
@ -111,6 +112,7 @@ void InitHLELibs(Core::Loader::SymbolsResolver* sym) {
|
||||
Libraries::Mouse::RegisterlibSceMouse(sym);
|
||||
Libraries::WebBrowserDialog::RegisterlibSceWebBrowserDialog(sym);
|
||||
Libraries::NpParty::RegisterlibSceNpParty(sym);
|
||||
Libraries::Zlib::RegisterlibSceZlib(sym);
|
||||
}
|
||||
|
||||
} // namespace Libraries
|
||||
|
@ -9,7 +9,7 @@
|
||||
|
||||
namespace Libraries::Videodec {
|
||||
|
||||
static constexpr u64 kMinimumMemorySize = 8_MB; ///> Fake minimum memory size for querying
|
||||
static constexpr u64 kMinimumMemorySize = 16_MB; ///> Fake minimum memory size for querying
|
||||
|
||||
int PS4_SYSV_ABI sceVideodecCreateDecoder(const OrbisVideodecConfigInfo* pCfgInfoIn,
|
||||
const OrbisVideodecResourceInfo* pRsrcInfoIn,
|
||||
|
@ -10,7 +10,7 @@
|
||||
|
||||
namespace Libraries::Vdec2 {
|
||||
|
||||
static constexpr u64 kMinimumMemorySize = 8_MB; ///> Fake minimum memory size for querying
|
||||
static constexpr u64 kMinimumMemorySize = 16_MB; ///> Fake minimum memory size for querying
|
||||
|
||||
s32 PS4_SYSV_ABI
|
||||
sceVideodec2QueryComputeMemoryInfo(OrbisVideodec2ComputeMemoryInfo* computeMemInfo) {
|
||||
|
183
src/core/libraries/zlib/zlib.cpp
Normal file
183
src/core/libraries/zlib/zlib.cpp
Normal file
@ -0,0 +1,183 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include <condition_variable>
|
||||
#include <mutex>
|
||||
#include <stop_token>
|
||||
#include <unordered_map>
|
||||
#include <queue>
|
||||
#include <zlib.h>
|
||||
|
||||
#include "common/logging/log.h"
|
||||
#include "common/thread.h"
|
||||
#include "core/libraries/kernel/threads.h"
|
||||
#include "core/libraries/libs.h"
|
||||
#include "core/libraries/zlib/zlib_error.h"
|
||||
#include "core/libraries/zlib/zlib_sce.h"
|
||||
|
||||
namespace Libraries::Zlib {
|
||||
|
||||
struct InflateTask {
|
||||
u64 request_id;
|
||||
const void* src;
|
||||
u32 src_length;
|
||||
void* dst;
|
||||
u32 dst_length;
|
||||
};
|
||||
|
||||
struct InflateResult {
|
||||
u32 length;
|
||||
s32 status;
|
||||
};
|
||||
|
||||
static Kernel::Thread task_thread;
|
||||
|
||||
static std::mutex mutex;
|
||||
static std::queue<InflateTask> task_queue;
|
||||
static std::condition_variable_any task_queue_cv;
|
||||
static std::queue<u64> done_queue;
|
||||
static std::condition_variable_any done_queue_cv;
|
||||
static std::unordered_map<u64, InflateResult> results;
|
||||
static u64 next_request_id;
|
||||
|
||||
void ZlibTaskThread(const std::stop_token& stop) {
|
||||
Common::SetCurrentThreadName("shadPS4:ZlibTaskThread");
|
||||
|
||||
while (!stop.stop_requested()) {
|
||||
InflateTask task;
|
||||
{
|
||||
// Lock and pop from the task queue, unless stop has been requested.
|
||||
std::unique_lock lock(mutex);
|
||||
if (!task_queue_cv.wait(lock, stop, [&] { return !task_queue.empty(); })) {
|
||||
break;
|
||||
}
|
||||
task = task_queue.back();
|
||||
task_queue.pop();
|
||||
}
|
||||
|
||||
uLongf decompressed_length = task.dst_length;
|
||||
const auto ret = uncompress(static_cast<Bytef*>(task.dst), &decompressed_length,
|
||||
static_cast<const Bytef*>(task.src), task.src_length);
|
||||
|
||||
{
|
||||
// Lock, insert the new result, and push the finished request ID to the done queue.
|
||||
std::unique_lock lock(mutex);
|
||||
results[task.request_id] = InflateResult{
|
||||
.length = static_cast<u32>(decompressed_length),
|
||||
.status = ret == Z_BUF_ERROR ? ORBIS_ZLIB_ERROR_NOSPACE
|
||||
: ret == Z_OK ? ORBIS_OK
|
||||
: ORBIS_ZLIB_ERROR_FATAL,
|
||||
};
|
||||
done_queue.push(task.request_id);
|
||||
}
|
||||
done_queue_cv.notify_one();
|
||||
}
|
||||
}
|
||||
|
||||
s32 PS4_SYSV_ABI sceZlibInitialize(const void* buffer, u32 length) {
|
||||
LOG_INFO(Lib_Zlib, "called");
|
||||
if (task_thread.Joinable()) {
|
||||
return ORBIS_ZLIB_ERROR_ALREADY_INITIALIZED;
|
||||
}
|
||||
|
||||
// Initialize with empty task data
|
||||
task_queue = std::queue<InflateTask>();
|
||||
done_queue = std::queue<u64>();
|
||||
results.clear();
|
||||
next_request_id = 1;
|
||||
|
||||
task_thread.Run([](const std::stop_token& stop) { ZlibTaskThread(stop); });
|
||||
return ORBIS_OK;
|
||||
}
|
||||
|
||||
s32 PS4_SYSV_ABI sceZlibInflate(const void* src, u32 src_len, void* dst, u32 dst_len,
|
||||
u64* request_id) {
|
||||
LOG_DEBUG(Lib_Zlib, "(STUBBED) called");
|
||||
if (!task_thread.Joinable()) {
|
||||
return ORBIS_ZLIB_ERROR_NOT_INITIALIZED;
|
||||
}
|
||||
if (!src || !src_len || !dst || !dst_len || !request_id || dst_len > 64_KB ||
|
||||
dst_len % 2_KB != 0) {
|
||||
return ORBIS_ZLIB_ERROR_INVALID;
|
||||
}
|
||||
|
||||
{
|
||||
std::unique_lock lock(mutex);
|
||||
*request_id = next_request_id++;
|
||||
task_queue.emplace(InflateTask{
|
||||
.request_id = *request_id,
|
||||
.src = src,
|
||||
.src_length = src_len,
|
||||
.dst = dst,
|
||||
.dst_length = dst_len,
|
||||
});
|
||||
task_queue_cv.notify_one();
|
||||
}
|
||||
return ORBIS_OK;
|
||||
}
|
||||
|
||||
s32 PS4_SYSV_ABI sceZlibWaitForDone(u64* request_id, const u32* timeout) {
|
||||
LOG_DEBUG(Lib_Zlib, "(STUBBED) called");
|
||||
if (!task_thread.Joinable()) {
|
||||
return ORBIS_ZLIB_ERROR_NOT_INITIALIZED;
|
||||
}
|
||||
if (!request_id) {
|
||||
return ORBIS_ZLIB_ERROR_INVALID;
|
||||
}
|
||||
|
||||
{
|
||||
// Pop from the done queue, unless the timeout is reached.
|
||||
std::unique_lock lock(mutex);
|
||||
const auto pred = [] { return !done_queue.empty(); };
|
||||
if (timeout) {
|
||||
if (!done_queue_cv.wait_for(lock, std::chrono::milliseconds(*timeout), pred)) {
|
||||
return ORBIS_ZLIB_ERROR_TIMEDOUT;
|
||||
}
|
||||
} else {
|
||||
done_queue_cv.wait(lock, pred);
|
||||
}
|
||||
*request_id = done_queue.back();
|
||||
done_queue.pop();
|
||||
}
|
||||
return ORBIS_OK;
|
||||
}
|
||||
|
||||
s32 PS4_SYSV_ABI sceZlibGetResult(const u64 request_id, u32* dst_length, s32* status) {
|
||||
LOG_DEBUG(Lib_Zlib, "(STUBBED) called");
|
||||
if (!task_thread.Joinable()) {
|
||||
return ORBIS_ZLIB_ERROR_NOT_INITIALIZED;
|
||||
}
|
||||
if (!dst_length || !status) {
|
||||
return ORBIS_ZLIB_ERROR_INVALID;
|
||||
}
|
||||
|
||||
{
|
||||
std::unique_lock lock(mutex);
|
||||
if (!results.contains(request_id)) {
|
||||
return ORBIS_ZLIB_ERROR_NOT_FOUND;
|
||||
}
|
||||
const auto result = results[request_id];
|
||||
*dst_length = result.length;
|
||||
*status = result.status;
|
||||
}
|
||||
return ORBIS_OK;
|
||||
}
|
||||
|
||||
s32 PS4_SYSV_ABI sceZlibFinalize() {
|
||||
LOG_INFO(Lib_Zlib, "called");
|
||||
if (!task_thread.Joinable()) {
|
||||
return ORBIS_ZLIB_ERROR_NOT_INITIALIZED;
|
||||
}
|
||||
task_thread.Stop();
|
||||
return ORBIS_OK;
|
||||
}
|
||||
|
||||
void RegisterlibSceZlib(Core::Loader::SymbolsResolver* sym) {
|
||||
LIB_FUNCTION("m1YErdIXCp4", "libSceZlib", 1, "libSceZlib", 1, 1, sceZlibInitialize);
|
||||
LIB_FUNCTION("6na+Sa-B83w", "libSceZlib", 1, "libSceZlib", 1, 1, sceZlibFinalize);
|
||||
LIB_FUNCTION("TLar1HULv1Q", "libSceZlib", 1, "libSceZlib", 1, 1, sceZlibInflate);
|
||||
LIB_FUNCTION("uB8VlDD4e0s", "libSceZlib", 1, "libSceZlib", 1, 1, sceZlibWaitForDone);
|
||||
LIB_FUNCTION("2eDcGHC0YaM", "libSceZlib", 1, "libSceZlib", 1, 1, sceZlibGetResult);
|
||||
};
|
||||
|
||||
} // namespace Libraries::Zlib
|
18
src/core/libraries/zlib/zlib_error.h
Normal file
18
src/core/libraries/zlib/zlib_error.h
Normal file
@ -0,0 +1,18 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "core/libraries/error_codes.h"
|
||||
|
||||
// Zlib library
|
||||
constexpr int ORBIS_ZLIB_ERROR_NOT_FOUND = 0x81120002;
|
||||
constexpr int ORBIS_ZLIB_ERROR_BUSY = 0x8112000B;
|
||||
constexpr int ORBIS_ZLIB_ERROR_FAULT = 0x8112000E;
|
||||
constexpr int ORBIS_ZLIB_ERROR_INVALID = 0x81120016;
|
||||
constexpr int ORBIS_ZLIB_ERROR_NOSPACE = 0x8112001C;
|
||||
constexpr int ORBIS_ZLIB_ERROR_NOT_SUPPORTED = 0x81120025;
|
||||
constexpr int ORBIS_ZLIB_ERROR_TIMEDOUT = 0x81120027;
|
||||
constexpr int ORBIS_ZLIB_ERROR_NOT_INITIALIZED = 0x81120032;
|
||||
constexpr int ORBIS_ZLIB_ERROR_ALREADY_INITIALIZED = 0x81120033;
|
||||
constexpr int ORBIS_ZLIB_ERROR_FATAL = 0x811200FF;
|
21
src/core/libraries/zlib/zlib_sce.h
Normal file
21
src/core/libraries/zlib/zlib_sce.h
Normal file
@ -0,0 +1,21 @@
|
||||
// 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::Zlib {
|
||||
|
||||
s32 PS4_SYSV_ABI sceZlibInitialize(const void* buffer, u32 length);
|
||||
s32 PS4_SYSV_ABI sceZlibInflate(const void* src, u32 src_len, void* dst, u32 dst_len,
|
||||
u64* request_id);
|
||||
s32 PS4_SYSV_ABI sceZlibWaitForDone(u64* request_id, const u32* timeout);
|
||||
s32 PS4_SYSV_ABI sceZlibGetResult(u64 request_id, u32* dst_length, s32* status);
|
||||
s32 PS4_SYSV_ABI sceZlibFinalize();
|
||||
|
||||
void RegisterlibSceZlib(Core::Loader::SymbolsResolver* sym);
|
||||
} // namespace Libraries::Zlib
|
@ -52,10 +52,12 @@ public:
|
||||
// "Open Folder..." submenu
|
||||
QMenu* openFolderMenu = new QMenu(tr("Open Folder..."), widget);
|
||||
QAction* openGameFolder = new QAction(tr("Open Game Folder"), widget);
|
||||
QAction* openUpdateFolder = new QAction(tr("Open Update Folder"), widget);
|
||||
QAction* openSaveDataFolder = new QAction(tr("Open Save Data Folder"), widget);
|
||||
QAction* openLogFolder = new QAction(tr("Open Log Folder"), widget);
|
||||
|
||||
openFolderMenu->addAction(openGameFolder);
|
||||
openFolderMenu->addAction(openUpdateFolder);
|
||||
openFolderMenu->addAction(openSaveDataFolder);
|
||||
openFolderMenu->addAction(openLogFolder);
|
||||
|
||||
@ -87,10 +89,12 @@ public:
|
||||
QMenu* deleteMenu = new QMenu(tr("Delete..."), widget);
|
||||
QAction* deleteGame = new QAction(tr("Delete Game"), widget);
|
||||
QAction* deleteUpdate = new QAction(tr("Delete Update"), widget);
|
||||
QAction* deleteSaveData = new QAction(tr("Delete Save Data"), widget);
|
||||
QAction* deleteDLC = new QAction(tr("Delete DLC"), widget);
|
||||
|
||||
deleteMenu->addAction(deleteGame);
|
||||
deleteMenu->addAction(deleteUpdate);
|
||||
deleteMenu->addAction(deleteSaveData);
|
||||
deleteMenu->addAction(deleteDLC);
|
||||
|
||||
menu.addMenu(deleteMenu);
|
||||
@ -122,6 +126,18 @@ public:
|
||||
QDesktopServices::openUrl(QUrl::fromLocalFile(folderPath));
|
||||
}
|
||||
|
||||
if (selected == openUpdateFolder) {
|
||||
QString open_update_path;
|
||||
Common::FS::PathToQString(open_update_path, m_games[itemID].path);
|
||||
open_update_path += "-UPDATE";
|
||||
if (!std::filesystem::exists(Common::FS::PathFromQString(open_update_path))) {
|
||||
QMessageBox::critical(nullptr, tr("Error"),
|
||||
QString(tr("This game has no update folder to open!")));
|
||||
} else {
|
||||
QDesktopServices::openUrl(QUrl::fromLocalFile(open_update_path));
|
||||
}
|
||||
}
|
||||
|
||||
if (selected == openSaveDataFolder) {
|
||||
QString userPath;
|
||||
Common::FS::PathToQString(userPath,
|
||||
@ -143,7 +159,7 @@ public:
|
||||
PSF psf;
|
||||
std::filesystem::path game_folder_path = m_games[itemID].path;
|
||||
std::filesystem::path game_update_path = game_folder_path;
|
||||
game_update_path += "UPDATE";
|
||||
game_update_path += "-UPDATE";
|
||||
if (std::filesystem::exists(game_update_path)) {
|
||||
game_folder_path = game_update_path;
|
||||
}
|
||||
@ -238,6 +254,11 @@ public:
|
||||
QString trophyPath, gameTrpPath;
|
||||
Common::FS::PathToQString(trophyPath, m_games[itemID].serial);
|
||||
Common::FS::PathToQString(gameTrpPath, m_games[itemID].path);
|
||||
auto game_update_path = Common::FS::PathFromQString(gameTrpPath);
|
||||
game_update_path += "-UPDATE";
|
||||
if (std::filesystem::exists(game_update_path)) {
|
||||
Common::FS::PathToQString(gameTrpPath, game_update_path);
|
||||
}
|
||||
TrophyViewer* trophyViewer = new TrophyViewer(trophyPath, gameTrpPath);
|
||||
trophyViewer->show();
|
||||
connect(widget->parent(), &QWidget::destroyed, trophyViewer,
|
||||
@ -335,14 +356,18 @@ public:
|
||||
clipboard->setText(combinedText);
|
||||
}
|
||||
|
||||
if (selected == deleteGame || selected == deleteUpdate || selected == deleteDLC) {
|
||||
if (selected == deleteGame || selected == deleteUpdate || selected == deleteDLC ||
|
||||
selected == deleteSaveData) {
|
||||
bool error = false;
|
||||
QString folder_path, game_update_path, dlc_path;
|
||||
QString folder_path, game_update_path, dlc_path, save_data_path;
|
||||
Common::FS::PathToQString(folder_path, m_games[itemID].path);
|
||||
game_update_path = folder_path + "-UPDATE";
|
||||
Common::FS::PathToQString(
|
||||
dlc_path, Config::getAddonInstallDir() /
|
||||
Common::FS::PathFromQString(folder_path).parent_path().filename());
|
||||
Common::FS::PathToQString(save_data_path,
|
||||
Common::FS::GetUserPath(Common::FS::PathType::UserDir) /
|
||||
"savedata/1" / m_games[itemID].serial);
|
||||
QString message_type = tr("Game");
|
||||
|
||||
if (selected == deleteUpdate) {
|
||||
@ -363,6 +388,15 @@ public:
|
||||
folder_path = dlc_path;
|
||||
message_type = tr("DLC");
|
||||
}
|
||||
} else if (selected == deleteSaveData) {
|
||||
if (!std::filesystem::exists(Common::FS::PathFromQString(save_data_path))) {
|
||||
QMessageBox::critical(nullptr, tr("Error"),
|
||||
QString(tr("This game has no save data to delete!")));
|
||||
error = true;
|
||||
} else {
|
||||
folder_path = save_data_path;
|
||||
message_type = tr("Save Data");
|
||||
}
|
||||
}
|
||||
if (!error) {
|
||||
QString gameName = QString::fromStdString(m_games[itemID].name);
|
||||
@ -374,7 +408,10 @@ public:
|
||||
QMessageBox::Yes | QMessageBox::No);
|
||||
if (reply == QMessageBox::Yes) {
|
||||
dir.removeRecursively();
|
||||
widget->removeRow(itemID);
|
||||
if (selected == deleteGame) {
|
||||
widget->removeRow(itemID);
|
||||
m_games.removeAt(itemID);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include <QCheckBox>
|
||||
#include <QDialogButtonBox>
|
||||
#include <QDir>
|
||||
#include <QFileDialog>
|
||||
@ -15,10 +16,11 @@
|
||||
#include "install_dir_select.h"
|
||||
|
||||
InstallDirSelect::InstallDirSelect() : selected_dir() {
|
||||
selected_dir = Config::getGameInstallDirs().empty() ? "" : Config::getGameInstallDirs().front();
|
||||
auto install_dirs = Config::getGameInstallDirs();
|
||||
selected_dir = install_dirs.empty() ? "" : install_dirs.front();
|
||||
|
||||
if (!Config::getGameInstallDirs().empty() && Config::getGameInstallDirs().size() == 1) {
|
||||
reject();
|
||||
if (!install_dirs.empty() && install_dirs.size() == 1) {
|
||||
accept();
|
||||
}
|
||||
|
||||
auto layout = new QVBoxLayout(this);
|
||||
@ -53,6 +55,14 @@ QWidget* InstallDirSelect::SetupInstallDirList() {
|
||||
|
||||
vlayout->addWidget(m_path_list);
|
||||
|
||||
auto checkbox = new QCheckBox(tr("Install All Queued to Selected Folder"));
|
||||
connect(checkbox, &QCheckBox::toggled, this, &InstallDirSelect::setUseForAllQueued);
|
||||
vlayout->addWidget(checkbox);
|
||||
|
||||
auto checkbox2 = new QCheckBox(tr("Delete PKG File on Install"));
|
||||
connect(checkbox2, &QCheckBox::toggled, this, &InstallDirSelect::setDeleteFileOnInstall);
|
||||
vlayout->addWidget(checkbox2);
|
||||
|
||||
group->setLayout(vlayout);
|
||||
return group;
|
||||
}
|
||||
@ -66,6 +76,14 @@ void InstallDirSelect::setSelectedDirectory(QListWidgetItem* item) {
|
||||
}
|
||||
}
|
||||
|
||||
void InstallDirSelect::setUseForAllQueued(bool enabled) {
|
||||
use_for_all_queued = enabled;
|
||||
}
|
||||
|
||||
void InstallDirSelect::setDeleteFileOnInstall(bool enabled) {
|
||||
delete_file_on_install = enabled;
|
||||
}
|
||||
|
||||
QWidget* InstallDirSelect::SetupDialogActions() {
|
||||
auto actions = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
|
||||
|
||||
|
@ -22,9 +22,21 @@ public:
|
||||
return selected_dir;
|
||||
}
|
||||
|
||||
bool useForAllQueued() {
|
||||
return use_for_all_queued;
|
||||
}
|
||||
|
||||
bool deleteFileOnInstall() {
|
||||
return delete_file_on_install;
|
||||
}
|
||||
|
||||
private:
|
||||
QWidget* SetupInstallDirList();
|
||||
QWidget* SetupDialogActions();
|
||||
void setSelectedDirectory(QListWidgetItem* item);
|
||||
void setDeleteFileOnInstall(bool enabled);
|
||||
void setUseForAllQueued(bool enabled);
|
||||
std::filesystem::path selected_dir;
|
||||
bool delete_file_on_install = false;
|
||||
bool use_for_all_queued = false;
|
||||
};
|
||||
|
@ -725,9 +725,20 @@ void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int
|
||||
return;
|
||||
}
|
||||
auto category = psf.GetString("CATEGORY");
|
||||
InstallDirSelect ids;
|
||||
ids.exec();
|
||||
auto game_install_dir = ids.getSelectedDirectory();
|
||||
|
||||
if (!use_for_all_queued || pkgNum == 1) {
|
||||
InstallDirSelect ids;
|
||||
const auto selected = ids.exec();
|
||||
if (selected == QDialog::Rejected) {
|
||||
return;
|
||||
}
|
||||
|
||||
last_install_dir = ids.getSelectedDirectory();
|
||||
delete_file_on_install = ids.deleteFileOnInstall();
|
||||
use_for_all_queued = ids.useForAllQueued();
|
||||
}
|
||||
std::filesystem::path game_install_dir = last_install_dir;
|
||||
|
||||
auto game_folder_path = game_install_dir / pkg.GetTitleID();
|
||||
QString pkgType = QString::fromStdString(pkg.GetPkgFlags());
|
||||
bool use_game_update = pkgType.contains("PATCH") && Config::getSeparateUpdateEnabled();
|
||||
@ -879,8 +890,14 @@ void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int
|
||||
if (pkgNum == nPkg) {
|
||||
QString path;
|
||||
Common::FS::PathToQString(path, game_install_dir);
|
||||
QIcon windowIcon(
|
||||
Common::FS::PathToUTF8String(game_folder_path / "sce_sys/icon0.png")
|
||||
.c_str());
|
||||
QMessageBox extractMsgBox(this);
|
||||
extractMsgBox.setWindowTitle(tr("Extraction Finished"));
|
||||
if (!windowIcon.isNull()) {
|
||||
extractMsgBox.setWindowIcon(windowIcon);
|
||||
}
|
||||
extractMsgBox.setText(
|
||||
QString(tr("Game successfully installed at %1")).arg(path));
|
||||
extractMsgBox.addButton(QMessageBox::Ok);
|
||||
@ -894,6 +911,9 @@ void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int
|
||||
});
|
||||
extractMsgBox.exec();
|
||||
}
|
||||
if (delete_file_on_install) {
|
||||
std::filesystem::remove(file);
|
||||
}
|
||||
});
|
||||
connect(&dialog, &QProgressDialog::canceled, [&]() { futureWatcher.cancel(); });
|
||||
connect(&futureWatcher, &QFutureWatcher<void>::progressValueChanged, &dialog,
|
||||
|
@ -123,4 +123,8 @@ protected:
|
||||
}
|
||||
|
||||
void resizeEvent(QResizeEvent* event) override;
|
||||
|
||||
std::filesystem::path last_install_dir = "";
|
||||
bool delete_file_on_install = false;
|
||||
bool use_for_all_queued = false;
|
||||
};
|
||||
|
@ -146,19 +146,19 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Compatibility...</source>
|
||||
<translation>Compatibility...</translation>
|
||||
<translation>Compatibilité...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Update database</source>
|
||||
<translation>Update database</translation>
|
||||
<translation>Mettre à jour la base de données</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>View report</source>
|
||||
<translation>View report</translation>
|
||||
<translation>Voir rapport</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Submit a report</source>
|
||||
<translation>Submit a report</translation>
|
||||
<translation>Soumettre un rapport</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Shortcut creation</source>
|
||||
@ -186,7 +186,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>requiresEnableSeparateUpdateFolder_MSG</source>
|
||||
<translation>This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it.</translation>
|
||||
<translation>Cette fonctionnalité nécessite l'option 'Dossier séparé pour les mises à jour' pour fonctionner. Si vous voulez utiliser cette fonctionnalité, veuillez l'activer.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This game has no update to delete!</source>
|
||||
@ -546,7 +546,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Separate Update Folder</source>
|
||||
<translation>Dossier séparé pour les mises à jours</translation>
|
||||
<translation>Dossier séparé pour les mises à jour</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Default tab when opening settings</source>
|
||||
@ -574,11 +574,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Trophy Key</source>
|
||||
<translation>Trophy Key</translation>
|
||||
<translation>Clé de trophée</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Trophy</source>
|
||||
<translation>Trophy</translation>
|
||||
<translation>Trophée</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Logger</source>
|
||||
@ -586,11 +586,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Log Type</source>
|
||||
<translation>Type</translation>
|
||||
<translation>Type de journal</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Log Filter</source>
|
||||
<translation>Filtre</translation>
|
||||
<translation>Filtre du journal</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open Log Location</source>
|
||||
@ -722,7 +722,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Disable Trophy Pop-ups</source>
|
||||
<translation>Disable Trophy Pop-ups</translation>
|
||||
<translation>Désactiver les notifications de trophées</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Play title music</source>
|
||||
@ -730,19 +730,19 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Update Compatibility Database On Startup</source>
|
||||
<translation>Update Compatibility Database On Startup</translation>
|
||||
<translation>Mettre à jour la base de données de compatibilité au lancement</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Game Compatibility</source>
|
||||
<translation>Game Compatibility</translation>
|
||||
<translation>Compatibilité du jeu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Display Compatibility Data</source>
|
||||
<translation>Display Compatibility Data</translation>
|
||||
<translation>Afficher les données de compatibilité</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Update Compatibility Database</source>
|
||||
<translation>Update Compatibility Database</translation>
|
||||
<translation>Mettre à jour la base de données de compatibilité</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Volume</source>
|
||||
@ -750,7 +750,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Audio Backend</source>
|
||||
<translation>Audio Backend</translation>
|
||||
<translation>Back-end audio</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save</source>
|
||||
@ -786,7 +786,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>separateUpdatesCheckBox</source>
|
||||
<translation>Dossier séparé pour les mises à jours:\nInstalle les mises à jours des jeux dans un dossier séparé pour une gestion plus facile.</translation>
|
||||
<translation>Dossier séparé pour les mises à jour:\nInstalle les mises à jours des jeux dans un dossier séparé pour une gestion plus facile.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>showSplashCheckBox</source>
|
||||
@ -806,7 +806,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>TrophyKey</source>
|
||||
<translation>Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters.</translation>
|
||||
<translation>Clé de trophées:\nClé utilisée pour décrypter les trophées. Doit être obtenu à partir de votre console jailbreakée.\nDoit contenir des caractères hexadécimaux uniquement.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>logTypeGroupBox</source>
|
||||
@ -826,7 +826,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>disableTrophycheckBox</source>
|
||||
<translation>Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window).</translation>
|
||||
<translation>Désactiver les notifications de trophées:\nDésactive les notifications de trophées en jeu. La progression des trophées peut toujours être suivie à l'aide de la Visionneuse de trophées (clique droit sur le jeu sur la fenêtre principale).</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>hideCursorGroupBox</source>
|
||||
@ -842,15 +842,15 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>enableCompatibilityCheckBox</source>
|
||||
<translation>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information.</translation>
|
||||
<translation>Afficher les données de compatibilité:\nAffiche les informations de compatibilité des jeux dans une colonne dédiée. Activez "Mettre à jour la compatibilité au démarrage" pour avoir des informations à jour.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>checkCompatibilityOnStartupCheckBox</source>
|
||||
<translation>Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts.</translation>
|
||||
<translation>Mettre à jour la compatibilité au démarrage:\nMettre à jour automatiquement la base de données de compatibilité au démarrage de shadPS4.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>updateCompatibilityButton</source>
|
||||
<translation>Update Compatibility Database:\nImmediately update the compatibility database.</translation>
|
||||
<translation>Mettre à jour la compatibilité au démarrage:\nMet à jour immédiatement la base de données de compatibilité.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Never</source>
|
||||
@ -1093,7 +1093,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>DownloadComplete_MSG</source>
|
||||
<translation>Patchs téléchargés avec succès ! Tous les patches disponibles pour tous les jeux ont été 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. Si le correctif n'apparaît pas, il se peut qu'il n'existe pas pour le numéro de série et la version spécifiques du jeu.</translation>
|
||||
<translation>Patchs téléchargés avec succès ! Tous les patches disponibles pour tous les jeux ont été 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. Si le correctif n'apparaît pas, il se peut qu'il n'existe pas pour la série et la version spécifiques du jeu.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to parse JSON data from HTML.</source>
|
||||
@ -1113,7 +1113,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>You may need to update your game.</source>
|
||||
<translation>Vous devrez peut-être mettre à jour votre jeu.</translation>
|
||||
<translation>Vous devriez peut-être mettre à jour votre jeu.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Incompatibility Notice</source>
|
||||
@ -1137,7 +1137,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Directory does not exist:</source>
|
||||
<translation>Répertoire n'existe pas:</translation>
|
||||
<translation>Le répertoire n'existe pas:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to open files.json for reading.</source>
|
||||
@ -1149,7 +1149,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Can't apply cheats before the game is started</source>
|
||||
<translation>Impossible d'appliquer les Cheats avant que le jeu ne commence.</translation>
|
||||
<translation>Impossible d'appliquer les cheats avant que le jeu ne soit lancé</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -1168,7 +1168,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Compatibility</source>
|
||||
<translation>Compatibility</translation>
|
||||
<translation>Compatibilité</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Region</source>
|
||||
@ -1212,27 +1212,27 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Compatibility is untested</source>
|
||||
<translation>Compatibility is untested</translation>
|
||||
<translation>La compatibilité n'a pas été testé</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Game does not initialize properly / crashes the emulator</source>
|
||||
<translation>Game does not initialize properly / crashes the emulator</translation>
|
||||
<translation>Le jeu ne se lance pas correctement / crash l'émulateur</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Game boots, but only displays a blank screen</source>
|
||||
<translation>Game boots, but only displays a blank screen</translation>
|
||||
<translation>Le jeu démarre, mais n'affiche qu'un écran noir</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Game displays an image but does not go past the menu</source>
|
||||
<translation>Game displays an image but does not go past the menu</translation>
|
||||
<translation>Le jeu affiche une image mais ne dépasse pas le menu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Game has game-breaking glitches or unplayable performance</source>
|
||||
<translation>Game has game-breaking glitches or unplayable performance</translation>
|
||||
<translation>Le jeu a des problèmes majeurs ou des performances qui le rendent injouable</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Game can be completed with playable performance and no major glitches</source>
|
||||
<translation>Game can be completed with playable performance and no major glitches</translation>
|
||||
<translation>Le jeu peut être terminé avec des performances acceptables et sans problèmes majeurs</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -98,7 +98,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Open Folder...</source>
|
||||
<translation>Åpne mappen...</translation>
|
||||
<translation>Åpne mappe...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open Game Folder</source>
|
||||
@ -126,7 +126,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy All</source>
|
||||
<translation>Kopier alle</translation>
|
||||
<translation>Kopier alt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete...</source>
|
||||
@ -146,19 +146,19 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Compatibility...</source>
|
||||
<translation>Compatibility...</translation>
|
||||
<translation>Kompatibilitet...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Update database</source>
|
||||
<translation>Update database</translation>
|
||||
<translation>Oppdater database</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>View report</source>
|
||||
<translation>View report</translation>
|
||||
<translation>Vis rapport</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Submit a report</source>
|
||||
<translation>Submit a report</translation>
|
||||
<translation>Send inn en rapport</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Shortcut creation</source>
|
||||
@ -574,11 +574,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Trophy Key</source>
|
||||
<translation>Trophy Key</translation>
|
||||
<translation>Trofénøkkel</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Trophy</source>
|
||||
<translation>Trophy</translation>
|
||||
<translation>Trofé</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Logger</source>
|
||||
@ -658,7 +658,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Shaders Dumping</source>
|
||||
<translation>Aktiver dumping av skyggelegger</translation>
|
||||
<translation>Aktiver skyggeleggerdumping</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable NULL GPU</source>
|
||||
@ -666,7 +666,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Paths</source>
|
||||
<translation>Stier</translation>
|
||||
<translation>Mapper</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Game Folders</source>
|
||||
@ -686,7 +686,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Debug Dumping</source>
|
||||
<translation>Aktiver dumping av feilretting</translation>
|
||||
<translation>Aktiver feilrettingsdumping</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Vulkan Validation Layers</source>
|
||||
@ -718,7 +718,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>GUI Settings</source>
|
||||
<translation>GUI-innstillinger</translation>
|
||||
<translation>Grensesnitt-innstillinger</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Disable Trophy Pop-ups</source>
|
||||
@ -730,7 +730,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Update Compatibility Database On Startup</source>
|
||||
<translation>Oppdater kompatibilitets-database ved oppstart</translation>
|
||||
<translation>Oppdater database ved oppstart</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Game Compatibility</source>
|
||||
@ -750,7 +750,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Audio Backend</source>
|
||||
<translation>Audio Backend</translation>
|
||||
<translation>Lydsystem</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save</source>
|
||||
@ -806,7 +806,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>TrophyKey</source>
|
||||
<translation>Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters.</translation>
|
||||
<translation>Trofénøkkel:\nNøkkel brukes til å dekryptere trofeer. Må hentes fra din konsoll (jailbroken).\nMå bare inneholde sekskantede tegn.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>logTypeGroupBox</source>
|
||||
@ -846,7 +846,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>checkCompatibilityOnStartupCheckBox</source>
|
||||
<translation>Oppdater kompatibilitets-data ved oppstart:\nOppdaterer kompatibilitets-databasen automatisk når shadPS4 starter.</translation>
|
||||
<translation>Oppdater database ved oppstart:\nOppdaterer kompatibilitets-databasen automatisk når shadPS4 starter.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>updateCompatibilityButton</source>
|
||||
@ -894,7 +894,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>dumpShadersCheckBox</source>
|
||||
<translation>Aktiver dumping av skyggelegger:\nFor teknisk feilsøking lagrer skyggeleggerne fra spillet i en mappe mens de gjengis.</translation>
|
||||
<translation>Aktiver skyggeleggerdumping:\nFor teknisk feilsøking lagrer skyggeleggerne fra spillet i en mappe mens de gjengis.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>nullGpuCheckBox</source>
|
||||
@ -914,7 +914,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>debugDump</source>
|
||||
<translation>Aktiver dumping av feilsøking:\nLagrer import- og eksport-symbolene og filoverskriftsinformasjonen til det nåværende kjørende PS4-programmet i en katalog.</translation>
|
||||
<translation>Aktiver feilrettingsdumping:\nLagrer import- og eksport-symbolene og filoverskriftsinformasjonen til det nåværende kjørende PS4-programmet i en katalog.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>vkValidationCheckBox</source>
|
||||
@ -1188,7 +1188,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Path</source>
|
||||
<translation>Sti</translation>
|
||||
<translation>Adresse</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Play Time</source>
|
||||
@ -1232,7 +1232,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Game can be completed with playable performance and no major glitches</source>
|
||||
<translation>Spillet kan fullføres med spillbar ytelse og ingen store feil</translation>
|
||||
<translation>Spillet kan fullføres med spillbar ytelse og uten store feil</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -1361,4 +1361,4 @@
|
||||
<translation>TB</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
</TS>
|
||||
|
@ -126,11 +126,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy All</source>
|
||||
<translation>Копировать все</translation>
|
||||
<translation>Копировать всё</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete...</source>
|
||||
<translation>Удаление...</translation>
|
||||
<translation>Удалить...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete Game</source>
|
||||
@ -158,7 +158,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Submit a report</source>
|
||||
<translation>Отправить отчет</translation>
|
||||
<translation>Отправить отчёт</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Shortcut creation</source>
|
||||
@ -297,7 +297,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Elf Viewer</source>
|
||||
<translation>Elf</translation>
|
||||
<translation>Исполняемый файл</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Game Install Directory</source>
|
||||
@ -542,7 +542,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Fullscreen Mode</source>
|
||||
<translation>Режим Полного Экран</translation>
|
||||
<translation>Тип полноэкранного режима</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Separate Update Folder</source>
|
||||
@ -574,11 +574,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Trophy Key</source>
|
||||
<translation>Trophy Key</translation>
|
||||
<translation>Ключ трофеев</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Trophy</source>
|
||||
<translation>Trophy</translation>
|
||||
<translation>Трофеи</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Logger</source>
|
||||
@ -750,7 +750,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Audio Backend</source>
|
||||
<translation>Звуковая Подсистема</translation>
|
||||
<translation>Звуковая подсистема</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save</source>
|
||||
@ -826,7 +826,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>disableTrophycheckBox</source>
|
||||
<translation>Отключить уведомления о трофеях:\nОтключает внутриигровые уведомления о трофеях. Прогресс трофеев по прежнему можно отслеживать в меню Просмотр трофеев (правая кнопка мыши по игре в главном окне).</translation>
|
||||
<translation>Отключить уведомления о трофеях:\nОтключает внутриигровые уведомления о трофеях. Прогресс трофеев по прежнему можно отслеживать в меню просмотра трофеев (правая кнопка мыши по игре в главном окне).</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>hideCursorGroupBox</source>
|
||||
@ -1192,11 +1192,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Play Time</source>
|
||||
<translation>Времени в игре</translation>
|
||||
<translation>Время в игре</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Never Played</source>
|
||||
<translation>Вы не играли</translation>
|
||||
<translation>Нет</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>h</source>
|
||||
@ -1361,4 +1361,4 @@
|
||||
<translation>ТБ</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
</TS>
|
||||
|
@ -546,7 +546,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Separate Update Folder</source>
|
||||
<translation>Enable Separate Update Folder</translation>
|
||||
<translation>Ayrı Güncelleme Klasörünü Etkinleştir</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Default tab when opening settings</source>
|
||||
@ -554,7 +554,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Show Game Size In List</source>
|
||||
<translation>Göster oyun boyutunu listede</translation>
|
||||
<translation>Oyun Boyutunu Listede Göster</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show Splash</source>
|
||||
@ -574,11 +574,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Trophy Key</source>
|
||||
<translation>Trophy Key</translation>
|
||||
<translation>Kupa Anahtarı</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Trophy</source>
|
||||
<translation>Trophy</translation>
|
||||
<translation>Kupa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Logger</source>
|
||||
@ -722,7 +722,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Disable Trophy Pop-ups</source>
|
||||
<translation>Disable Trophy Pop-ups</translation>
|
||||
<translation>Kupa Açılır Pencerelerini Devre Dışı Bırak</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Play title music</source>
|
||||
@ -730,23 +730,23 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Update Compatibility Database On Startup</source>
|
||||
<translation>Update Compatibility Database On Startup</translation>
|
||||
<translation>Başlangıçta Uyumluluk Veritabanını Güncelle</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Game Compatibility</source>
|
||||
<translation>Game Compatibility</translation>
|
||||
<translation>Oyun Uyumluluğu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Display Compatibility Data</source>
|
||||
<translation>Display Compatibility Data</translation>
|
||||
<translation>Uyumluluk Verilerini Göster</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Update Compatibility Database</source>
|
||||
<translation>Update Compatibility Database</translation>
|
||||
<translation>Uyumluluk Veritabanını Güncelle</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Volume</source>
|
||||
<translation>Ses seviyesi</translation>
|
||||
<translation>Ses Seviyesi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Audio Backend</source>
|
||||
@ -1105,11 +1105,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>The game is in version: %1</source>
|
||||
<translation>Oyun sürümde: %1</translation>
|
||||
<translation>Oyun sürümü: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The downloaded patch only works on version: %1</source>
|
||||
<translation>İndirilen yamanın sadece sürümde çalışıyor: %1</translation>
|
||||
<translation>İndirilen yama sadece şu sürümde çalışıyor: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>You may need to update your game.</source>
|
||||
@ -1168,7 +1168,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Compatibility</source>
|
||||
<translation>Compatibility</translation>
|
||||
<translation>Uyumluluk</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Region</source>
|
||||
@ -1196,35 +1196,35 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Never Played</source>
|
||||
<translation>Never Played</translation>
|
||||
<translation>Hiç Oynanmadı</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>h</source>
|
||||
<translation>h</translation>
|
||||
<translation>sa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>m</source>
|
||||
<translation>m</translation>
|
||||
<translation>dk</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>s</source>
|
||||
<translation>s</translation>
|
||||
<translation>sn</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Compatibility is untested</source>
|
||||
<translation>Compatibility is untested</translation>
|
||||
<translation>Uyumluluk test edilmemiş</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Game does not initialize properly / crashes the emulator</source>
|
||||
<translation>Game does not initialize properly / crashes the emulator</translation>
|
||||
<translation>Oyun düzgün bir şekilde başlatılamıyor / emülatörü çökertiyor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Game boots, but only displays a blank screen</source>
|
||||
<translation>Game boots, but only displays a blank screen</translation>
|
||||
<translation>Oyun başlatılabiliyor ancak yalnızca boş bir ekran gösteriyor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Game displays an image but does not go past the menu</source>
|
||||
<translation>Game displays an image but does not go past the menu</translation>
|
||||
<translation>Oyun bir resim gösteriyor ancak menüleri geçemiyor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Game has game-breaking glitches or unplayable performance</source>
|
||||
@ -1232,7 +1232,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Game can be completed with playable performance and no major glitches</source>
|
||||
<translation>Game can be completed with playable performance and no major glitches</translation>
|
||||
<translation>Oyun, oynanabilir performansla tamamlanabilir ve büyük aksaklık yok</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -1267,7 +1267,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Your version is already up to date!</source>
|
||||
<translation>Versiyonunuz zaten güncel!</translation>
|
||||
<translation>Sürümünüz zaten güncel!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Update Available</source>
|
||||
@ -1279,11 +1279,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Current Version</source>
|
||||
<translation>Mevcut Versiyon</translation>
|
||||
<translation>Mevcut Sürüm</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Latest Version</source>
|
||||
<translation>Son Versiyon</translation>
|
||||
<translation>Son Sürüm</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Do you want to update?</source>
|
||||
@ -1335,7 +1335,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to create the update script file</source>
|
||||
<translation>Güncelleme betiği dosyası oluşturulamadı</translation>
|
||||
<translation>Güncelleme komut dosyası oluşturulamadı</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -1361,4 +1361,4 @@
|
||||
<translation>TB</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
</TS>
|
||||
|
Loading…
Reference in New Issue
Block a user