Merge remote-tracking branch 'upstream/main' into fs-cleanup

This commit is contained in:
Stephen Miller 2025-03-24 12:53:01 -05:00
commit 648be7dfac
137 changed files with 22709 additions and 1878 deletions

4
.gitmodules vendored
View File

@ -6,10 +6,6 @@
path = externals/cryptopp
url = https://github.com/shadps4-emu/ext-cryptopp.git
shallow = true
[submodule "externals/cryptoppwin"]
path = externals/cryptoppwin
url = https://github.com/shadps4-emu/ext-cryptoppwin.git
shallow = true
[submodule "externals/zlib-ng"]
path = externals/zlib-ng
url = https://github.com/shadps4-emu/ext-zlib-ng.git

View File

@ -37,8 +37,10 @@ option(ENABLE_UPDATER "Enables the options to updater" ON)
# First, determine whether to use CMAKE_OSX_ARCHITECTURES or CMAKE_SYSTEM_PROCESSOR.
if (APPLE AND CMAKE_OSX_ARCHITECTURES)
set(BASE_ARCHITECTURE "${CMAKE_OSX_ARCHITECTURES}")
else()
elseif (CMAKE_SYSTEM_PROCESSOR)
set(BASE_ARCHITECTURE "${CMAKE_SYSTEM_PROCESSOR}")
else()
set(BASE_ARCHITECTURE "${CMAKE_HOST_SYSTEM_PROCESSOR}")
endif()
# Next, match common architecture strings down to a known common value.
@ -50,7 +52,12 @@ else()
message(FATAL_ERROR "Unsupported CPU architecture: ${BASE_ARCHITECTURE}")
endif()
if (APPLE AND ARCHITECTURE STREQUAL "x86_64" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64")
if (ARCHITECTURE STREQUAL "x86_64")
# Set x86_64 target level to Sandy Bridge to generally match what is supported for PS4 guest code with CPU patches.
add_compile_options(-march=sandybridge)
endif()
if (APPLE AND ARCHITECTURE STREQUAL "x86_64" AND CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "arm64")
# Exclude ARM homebrew path to avoid conflicts when cross compiling.
list(APPEND CMAKE_IGNORE_PREFIX_PATH "/opt/homebrew")
@ -298,6 +305,7 @@ set(KERNEL_LIB src/core/libraries/kernel/sync/mutex.cpp
set(NETWORK_LIBS src/core/libraries/network/http.cpp
src/core/libraries/network/http.h
src/core/libraries/network/http_error.h
src/core/libraries/network/http2.cpp
src/core/libraries/network/http2.h
src/core/libraries/network/net.cpp
@ -583,6 +591,7 @@ set(COMMON src/common/logging/backend.cpp
src/common/spin_lock.h
src/common/stb.cpp
src/common/stb.h
src/common/string_literal.h
src/common/string_util.cpp
src/common/string_util.h
src/common/thread.cpp
@ -642,8 +651,6 @@ set(CORE src/core/aerolib/stubs.cpp
src/core/file_format/playgo_chunk.h
src/core/file_format/trp.cpp
src/core/file_format/trp.h
src/core/file_format/splash.h
src/core/file_format/splash.cpp
src/core/file_sys/fs.cpp
src/core/file_sys/fs.h
src/core/loader.cpp
@ -764,6 +771,7 @@ set(SHADER_RECOMPILER src/shader_recompiler/exception.h
src/shader_recompiler/ir/passes/identity_removal_pass.cpp
src/shader_recompiler/ir/passes/ir_passes.h
src/shader_recompiler/ir/passes/lower_buffer_format_to_raw.cpp
src/shader_recompiler/ir/passes/readlane_elimination_pass.cpp
src/shader_recompiler/ir/passes/resource_tracking_pass.cpp
src/shader_recompiler/ir/passes/ring_access_elimination.cpp
src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp
@ -844,6 +852,10 @@ set(VIDEO_CORE src/video_core/amdgpu/liverpool.cpp
src/video_core/renderer_vulkan/vk_shader_util.h
src/video_core/renderer_vulkan/vk_swapchain.cpp
src/video_core/renderer_vulkan/vk_swapchain.h
src/video_core/renderer_vulkan/host_passes/fsr_pass.cpp
src/video_core/renderer_vulkan/host_passes/fsr_pass.h
src/video_core/renderer_vulkan/host_passes/pp_pass.cpp
src/video_core/renderer_vulkan/host_passes/pp_pass.h
src/video_core/texture_cache/image.cpp
src/video_core/texture_cache/image.h
src/video_core/texture_cache/image_info.cpp
@ -916,6 +928,9 @@ set(QT_GUI src/qt_gui/about_dialog.cpp
src/qt_gui/control_settings.cpp
src/qt_gui/control_settings.h
src/qt_gui/control_settings.ui
src/qt_gui/kbm_gui.cpp
src/qt_gui/kbm_gui.h
src/qt_gui/kbm_gui.ui
src/qt_gui/main_window_ui.h
src/qt_gui/main_window.cpp
src/qt_gui/main_window.h
@ -988,7 +1003,7 @@ endif()
create_target_directory_groups(shadps4)
target_link_libraries(shadps4 PRIVATE magic_enum::magic_enum fmt::fmt toml11::toml11 tsl::robin_map xbyak::xbyak Tracy::TracyClient RenderDoc::API FFmpeg::ffmpeg Dear_ImGui gcn half::half ZLIB::ZLIB PNG::PNG)
target_link_libraries(shadps4 PRIVATE Boost::headers GPUOpen::VulkanMemoryAllocator LibAtrac9 sirit Vulkan::Headers xxHash::xxhash Zydis::Zydis glslang::glslang SDL3::SDL3 pugixml::pugixml stb::headers)
target_link_libraries(shadps4 PRIVATE Boost::headers GPUOpen::VulkanMemoryAllocator LibAtrac9 sirit Vulkan::Headers xxHash::xxhash Zydis::Zydis glslang::glslang SDL3::SDL3 pugixml::pugixml stb::headers cryptopp::cryptopp)
target_compile_definitions(shadps4 PRIVATE IMGUI_USER_CONFIG="imgui/imgui_config.h")
target_compile_definitions(Dear_ImGui PRIVATE IMGUI_USER_CONFIG="${PROJECT_SOURCE_DIR}/src/imgui/imgui_config.h")
@ -1037,12 +1052,6 @@ if (NOT ENABLE_QT_GUI)
target_link_libraries(shadps4 PRIVATE SDL3::SDL3)
endif()
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND MSVC)
target_link_libraries(shadps4 PRIVATE cryptoppwin)
else()
target_link_libraries(shadps4 PRIVATE cryptopp::cryptopp)
endif()
if (ENABLE_QT_GUI)
target_link_libraries(shadps4 PRIVATE Qt6::Widgets Qt6::Concurrent Qt6::Network Qt6::Multimedia)
add_definitions(-DENABLE_QT_GUI)
@ -1113,7 +1122,6 @@ cmrc_add_resource_library(embedded-resources
src/images/gold.png
src/images/platinum.png
src/images/silver.png)
target_link_libraries(shadps4 PRIVATE res::embedded)
# ImGui resources

View File

@ -30,6 +30,7 @@ path = [
"src/images/dump_icon.png",
"src/images/exit_icon.png",
"src/images/file_icon.png",
"src/images/trophy_icon.png",
"src/images/flag_china.png",
"src/images/flag_eu.png",
"src/images/flag_jp.png",
@ -41,6 +42,7 @@ path = [
"src/images/grid_icon.png",
"src/images/keyboard_icon.png",
"src/images/iconsize_icon.png",
"src/images/KBM.png",
"src/images/ko-fi.png",
"src/images/list_icon.png",
"src/images/list_mode_icon.png",
@ -111,3 +113,8 @@ SPDX-License-Identifier = "CC0-1.0"
path = "cmake/CMakeRC.cmake"
SPDX-FileCopyrightText = "Copyright (c) 2017 vector-of-bool <vectorofbool@gmail.com>"
SPDX-License-Identifier = "MIT"
[[annotations]]
path = "src/video_core/host_shaders/fsr/*"
SPDX-FileCopyrightText = "Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved."
SPDX-License-Identifier = "MIT"

View File

@ -37,6 +37,9 @@
<category translate="no">Game</category>
</categories>
<releases>
<release version="0.7.0" date="2025-03-23">
<url>https://github.com/shadps4-emu/shadPS4/releases/tag/v.0.7.0</url>
</release>
<release version="0.6.0" date="2025-01-31">
<url>https://github.com/shadps4-emu/shadPS4/releases/tag/v.0.6.0</url>
</release>

View File

@ -26,22 +26,19 @@ if (NOT TARGET fmt::fmt)
add_subdirectory(fmt)
endif()
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND MSVC)
# If it is clang and MSVC we will add a static lib
# CryptoPP
add_subdirectory(cryptoppwin)
target_include_directories(cryptoppwin INTERFACE cryptoppwin/include)
else()
# CryptoPP
if (NOT TARGET cryptopp::cryptopp)
set(CRYPTOPP_INSTALL OFF)
set(CRYPTOPP_BUILD_TESTING OFF)
set(CRYPTOPP_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/cryptopp)
add_subdirectory(cryptopp-cmake)
file(COPY cryptopp DESTINATION cryptopp FILES_MATCHING PATTERN "*.h")
# remove externals/cryptopp from include directories because it contains a conflicting zlib.h file
set_target_properties(cryptopp PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/cryptopp")
endif()
# CryptoPP
if (NOT TARGET cryptopp::cryptopp)
set(CRYPTOPP_INSTALL OFF)
set(CRYPTOPP_BUILD_TESTING OFF)
set(CRYPTOPP_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/cryptopp)
# cryptopp instruction set checks do not account for added compile options,
# so disable extensions in the library config to match our chosen target CPU.
set(CRYPTOPP_DISABLE_AESNI ON)
set(CRYPTOPP_DISABLE_AVX2 ON)
add_subdirectory(cryptopp-cmake)
file(COPY cryptopp DESTINATION cryptopp FILES_MATCHING PATTERN "*.h")
# remove externals/cryptopp from include directories because it contains a conflicting zlib.h file
set_target_properties(cryptopp PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/cryptopp")
endif()
if (NOT TARGET FFmpeg::ffmpeg)

2
externals/cryptopp vendored

@ -1 +1 @@
Subproject commit 60f81a77e0c9a0e7ffc1ca1bc438ddfa2e43b78e
Subproject commit effed0d0b865afc23ed67e0916f83734e4b9b3b7

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

View File

@ -53,6 +53,7 @@ static bool isShaderDebug = false;
static bool isShowSplash = false;
static bool isAutoUpdate = false;
static bool isAlwaysShowChangelog = false;
static std::string isSideTrophy = "right";
static bool isNullGpu = false;
static bool shouldCopyGPUBuffers = false;
static bool shouldDumpShaders = false;
@ -69,6 +70,7 @@ static bool isFpsColor = true;
static bool isSeparateLogFilesEnabled = false;
static s16 cursorState = HideCursorState::Idle;
static int cursorHideTimeout = 5; // 5 seconds (default)
static double trophyNotificationDuration = 6.0;
static bool useUnifiedInputConfig = true;
static bool overrideControllerColor = false;
static int controllerCustomColorRGB[3] = {0, 0, 255};
@ -79,7 +81,8 @@ static std::string trophyKey;
// Gui
static bool load_game_size = true;
std::vector<std::filesystem::path> settings_install_dirs = {};
static std::vector<GameInstallDir> settings_install_dirs = {};
std::vector<bool> install_dirs_enabled = {};
std::filesystem::path settings_addon_install_dir = {};
std::filesystem::path save_data_path = {};
u32 main_window_geometry_x = 400;
@ -196,6 +199,10 @@ int getCursorHideTimeout() {
return cursorHideTimeout;
}
double getTrophyNotificationDuration() {
return trophyNotificationDuration;
}
u32 getScreenWidth() {
return screenWidth;
}
@ -264,6 +271,10 @@ bool alwaysShowChangelog() {
return isAlwaysShowChangelog;
}
std::string sideTrophy() {
return isSideTrophy;
}
bool nullGpu() {
return isNullGpu;
}
@ -372,6 +383,10 @@ void setAlwaysShowChangelog(bool enable) {
isAlwaysShowChangelog = enable;
}
void setSideTrophy(std::string side) {
isSideTrophy = side;
}
void setNullGpu(bool enable) {
isNullGpu = enable;
}
@ -435,6 +450,9 @@ void setCursorState(s16 newCursorState) {
void setCursorHideTimeout(int newcursorHideTimeout) {
cursorHideTimeout = newcursorHideTimeout;
}
void setTrophyNotificationDuration(double newTrophyNotificationDuration) {
trophyNotificationDuration = newTrophyNotificationDuration;
}
void setLanguage(u32 language) {
m_language = language;
@ -502,22 +520,34 @@ void setMainWindowGeometry(u32 x, u32 y, u32 w, u32 h) {
main_window_geometry_h = h;
}
bool addGameInstallDir(const std::filesystem::path& dir) {
if (std::find(settings_install_dirs.begin(), settings_install_dirs.end(), dir) ==
settings_install_dirs.end()) {
settings_install_dirs.push_back(dir);
return true;
bool addGameInstallDir(const std::filesystem::path& dir, bool enabled) {
for (const auto& install_dir : settings_install_dirs) {
if (install_dir.path == dir) {
return false;
}
}
return false;
settings_install_dirs.push_back({dir, enabled});
return true;
}
void removeGameInstallDir(const std::filesystem::path& dir) {
auto iterator = std::find(settings_install_dirs.begin(), settings_install_dirs.end(), dir);
auto iterator =
std::find_if(settings_install_dirs.begin(), settings_install_dirs.end(),
[&dir](const GameInstallDir& install_dir) { return install_dir.path == dir; });
if (iterator != settings_install_dirs.end()) {
settings_install_dirs.erase(iterator);
}
}
void setGameInstallDirEnabled(const std::filesystem::path& dir, bool enabled) {
auto iterator =
std::find_if(settings_install_dirs.begin(), settings_install_dirs.end(),
[&dir](const GameInstallDir& install_dir) { return install_dir.path == dir; });
if (iterator != settings_install_dirs.end()) {
iterator->enabled = enabled;
}
}
void setAddonInstallDir(const std::filesystem::path& dir) {
settings_addon_install_dir = dir;
}
@ -573,8 +603,15 @@ void setEmulatorLanguage(std::string language) {
emulator_language = language;
}
void setGameInstallDirs(const std::vector<std::filesystem::path>& settings_install_dirs_config) {
settings_install_dirs = settings_install_dirs_config;
void setGameInstallDirs(const std::vector<std::filesystem::path>& dirs_config) {
settings_install_dirs.clear();
for (const auto& dir : dirs_config) {
settings_install_dirs.push_back({dir, true});
}
}
void setAllGameInstallDirs(const std::vector<GameInstallDir>& dirs_config) {
settings_install_dirs = dirs_config;
}
void setSaveDataPath(const std::filesystem::path& path) {
@ -597,8 +634,22 @@ u32 getMainWindowGeometryH() {
return main_window_geometry_h;
}
const std::vector<std::filesystem::path>& getGameInstallDirs() {
return settings_install_dirs;
const std::vector<std::filesystem::path> getGameInstallDirs() {
std::vector<std::filesystem::path> enabled_dirs;
for (const auto& dir : settings_install_dirs) {
if (dir.enabled) {
enabled_dirs.push_back(dir.path);
}
}
return enabled_dirs;
}
const std::vector<bool> getGameInstallDirsEnabled() {
std::vector<bool> enabled_dirs;
for (const auto& dir : settings_install_dirs) {
enabled_dirs.push_back(dir.enabled);
}
return enabled_dirs;
}
std::filesystem::path getAddonInstallDir() {
@ -706,6 +757,8 @@ void load(const std::filesystem::path& path) {
isNeo = toml::find_or<bool>(general, "isPS4Pro", false);
playBGM = toml::find_or<bool>(general, "playBGM", false);
isTrophyPopupDisabled = toml::find_or<bool>(general, "isTrophyPopupDisabled", false);
trophyNotificationDuration =
toml::find_or<double>(general, "trophyNotificationDuration", 5.0);
BGMvolume = toml::find_or<int>(general, "BGMvolume", 50);
enableDiscordRPC = toml::find_or<bool>(general, "enableDiscordRPC", true);
logFilter = toml::find_or<std::string>(general, "logFilter", "");
@ -719,6 +772,7 @@ void load(const std::filesystem::path& path) {
isShowSplash = toml::find_or<bool>(general, "showSplash", true);
isAutoUpdate = toml::find_or<bool>(general, "autoUpdate", false);
isAlwaysShowChangelog = toml::find_or<bool>(general, "alwaysShowChangelog", false);
isSideTrophy = toml::find_or<std::string>(general, "sideTrophy", "right");
separateupdatefolder = toml::find_or<bool>(general, "separateUpdateEnabled", false);
compatibilityData = toml::find_or<bool>(general, "compatibilityEnabled", false);
checkCompatibilityOnStartup =
@ -789,8 +843,22 @@ void load(const std::filesystem::path& path) {
const auto install_dir_array =
toml::find_or<std::vector<std::string>>(gui, "installDirs", {});
for (const auto& dir : install_dir_array) {
addGameInstallDir(std::filesystem::path{dir});
try {
install_dirs_enabled = toml::find<std::vector<bool>>(gui, "installDirsEnabled");
} catch (...) {
// If it does not exist, assume that all are enabled.
install_dirs_enabled.resize(install_dir_array.size(), true);
}
if (install_dirs_enabled.size() < install_dir_array.size()) {
install_dirs_enabled.resize(install_dir_array.size(), true);
}
settings_install_dirs.clear();
for (size_t i = 0; i < install_dir_array.size(); i++) {
settings_install_dirs.push_back(
{std::filesystem::path{install_dir_array[i]}, install_dirs_enabled[i]});
}
save_data_path = toml::find_fs_path_or(gui, "saveDataPath", {});
@ -833,6 +901,37 @@ void load(const std::filesystem::path& path) {
}
}
void sortTomlSections(toml::ordered_value& data) {
toml::ordered_value ordered_data;
std::vector<std::string> section_order = {"General", "Input", "GPU", "Vulkan",
"Debug", "Keys", "GUI", "Settings"};
for (const auto& section : section_order) {
if (data.contains(section)) {
std::vector<std::string> keys;
for (const auto& item : data.at(section).as_table()) {
keys.push_back(item.first);
}
std::sort(keys.begin(), keys.end(), [](const std::string& a, const std::string& b) {
return std::lexicographical_compare(
a.begin(), a.end(), b.begin(), b.end(), [](char a_char, char b_char) {
return std::tolower(a_char) < std::tolower(b_char);
});
});
toml::ordered_value ordered_section;
for (const auto& key : keys) {
ordered_section[key] = data.at(section).at(key);
}
ordered_data[section] = ordered_section;
}
}
data = ordered_data;
}
void save(const std::filesystem::path& path) {
toml::ordered_value data;
@ -857,6 +956,7 @@ void save(const std::filesystem::path& path) {
data["General"]["isPS4Pro"] = isNeo;
data["General"]["isTrophyPopupDisabled"] = isTrophyPopupDisabled;
data["General"]["trophyNotificationDuration"] = trophyNotificationDuration;
data["General"]["playBGM"] = playBGM;
data["General"]["BGMvolume"] = BGMvolume;
data["General"]["enableDiscordRPC"] = enableDiscordRPC;
@ -868,6 +968,7 @@ void save(const std::filesystem::path& path) {
data["General"]["showSplash"] = isShowSplash;
data["General"]["autoUpdate"] = isAutoUpdate;
data["General"]["alwaysShowChangelog"] = isAlwaysShowChangelog;
data["General"]["sideTrophy"] = isSideTrophy;
data["General"]["separateUpdateEnabled"] = separateupdatefolder;
data["General"]["compatibilityEnabled"] = compatibilityData;
data["General"]["checkCompatibilityOnStartup"] = checkCompatibilityOnStartup;
@ -900,14 +1001,37 @@ void save(const std::filesystem::path& path) {
data["Debug"]["CollectShader"] = isShaderDebug;
data["Debug"]["isSeparateLogFilesEnabled"] = isSeparateLogFilesEnabled;
data["Debug"]["FPSColor"] = isFpsColor;
data["Keys"]["TrophyKey"] = trophyKey;
std::vector<std::string> install_dirs;
for (const auto& dirString : settings_install_dirs) {
install_dirs.emplace_back(std::string{fmt::UTF(dirString.u8string()).data});
std::vector<bool> install_dirs_enabled;
// temporary structure for ordering
struct DirEntry {
std::string path_str;
bool enabled;
};
std::vector<DirEntry> sorted_dirs;
for (const auto& dirInfo : settings_install_dirs) {
sorted_dirs.push_back(
{std::string{fmt::UTF(dirInfo.path.u8string()).data}, dirInfo.enabled});
}
// Sort directories alphabetically
std::sort(sorted_dirs.begin(), sorted_dirs.end(), [](const DirEntry& a, const DirEntry& b) {
return std::lexicographical_compare(
a.path_str.begin(), a.path_str.end(), b.path_str.begin(), b.path_str.end(),
[](char a_char, char b_char) { return std::tolower(a_char) < std::tolower(b_char); });
});
for (const auto& entry : sorted_dirs) {
install_dirs.push_back(entry.path_str);
install_dirs_enabled.push_back(entry.enabled);
}
data["GUI"]["installDirs"] = install_dirs;
data["GUI"]["installDirsEnabled"] = install_dirs_enabled;
data["GUI"]["saveDataPath"] = std::string{fmt::UTF(save_data_path.u8string()).data};
data["GUI"]["loadGameSizeEnabled"] = load_game_size;
@ -918,9 +1042,13 @@ void save(const std::filesystem::path& path) {
data["GUI"]["showBackgroundImage"] = showBackgroundImage;
data["Settings"]["consoleLanguage"] = m_language;
// Sorting of TOML sections
sortTomlSections(data);
std::ofstream file(path, std::ios::binary);
file << data;
file.close();
saveMainWindow(path);
}
@ -962,6 +1090,9 @@ void saveMainWindow(const std::filesystem::path& path) {
data["GUI"]["elfDirs"] = m_elf_viewer;
data["GUI"]["recentFiles"] = m_recent_files;
// Sorting of TOML sections
sortTomlSections(data);
std::ofstream file(path, std::ios::binary);
file << data;
file.close();
@ -988,6 +1119,7 @@ void setDefaultValues() {
chooseHomeTab = "General";
cursorState = HideCursorState::Idle;
cursorHideTimeout = 5;
trophyNotificationDuration = 6.0;
backButtonBehavior = "left";
useSpecialPad = false;
specialPadClass = 1;
@ -996,6 +1128,7 @@ void setDefaultValues() {
isShowSplash = false;
isAutoUpdate = false;
isAlwaysShowChangelog = false;
isSideTrophy = "right";
isNullGpu = false;
shouldDumpShaders = false;
vblankDivider = 1;

View File

@ -9,6 +9,11 @@
namespace Config {
struct GameInstallDir {
std::filesystem::path path;
bool enabled;
};
enum HideCursorState : s16 { Never, Idle, Always };
void load(const std::filesystem::path& path);
@ -41,6 +46,7 @@ std::string getChooseHomeTab();
s16 getCursorState();
int getCursorHideTimeout();
double getTrophyNotificationDuration();
std::string getBackButtonBehavior();
bool getUseSpecialPad();
int getSpecialPadClass();
@ -62,6 +68,7 @@ bool collectShadersForDebug();
bool showSplash();
bool autoUpdate();
bool alwaysShowChangelog();
std::string sideTrophy();
bool nullGpu();
bool copyGPUCmdBuffers();
bool dumpShaders();
@ -75,6 +82,7 @@ void setCollectShaderForDebug(bool enable);
void setShowSplash(bool enable);
void setAutoUpdate(bool enable);
void setAlwaysShowChangelog(bool enable);
void setSideTrophy(std::string side);
void setNullGpu(bool enable);
void setAllowHDR(bool enable);
void setCopyGPUCmdBuffers(bool enable);
@ -95,7 +103,8 @@ void setUserName(const std::string& type);
void setUpdateChannel(const std::string& type);
void setChooseHomeTab(const std::string& type);
void setSeparateUpdateEnabled(bool use);
void setGameInstallDirs(const std::vector<std::filesystem::path>& settings_install_dirs_config);
void setGameInstallDirs(const std::vector<std::filesystem::path>& dirs_config);
void setAllGameInstallDirs(const std::vector<GameInstallDir>& dirs_config);
void setSaveDataPath(const std::filesystem::path& path);
void setCompatibilityEnabled(bool use);
void setCheckCompatibilityOnStartup(bool use);
@ -104,6 +113,7 @@ void setShowBackgroundImage(bool show);
void setCursorState(s16 cursorState);
void setCursorHideTimeout(int newcursorHideTimeout);
void setTrophyNotificationDuration(double newTrophyNotificationDuration);
void setBackButtonBehavior(const std::string& type);
void setUseSpecialPad(bool use);
void setSpecialPadClass(int type);
@ -129,8 +139,9 @@ void setVkGuestMarkersEnabled(bool enable);
// Gui
void setMainWindowGeometry(u32 x, u32 y, u32 w, u32 h);
bool addGameInstallDir(const std::filesystem::path& dir);
bool addGameInstallDir(const std::filesystem::path& dir, bool enabled = true);
void removeGameInstallDir(const std::filesystem::path& dir);
void setGameInstallDirEnabled(const std::filesystem::path& dir, bool enabled);
void setAddonInstallDir(const std::filesystem::path& dir);
void setMainWindowTheme(u32 theme);
void setIconSize(u32 size);
@ -149,7 +160,8 @@ u32 getMainWindowGeometryX();
u32 getMainWindowGeometryY();
u32 getMainWindowGeometryW();
u32 getMainWindowGeometryH();
const std::vector<std::filesystem::path>& getGameInstallDirs();
const std::vector<std::filesystem::path> getGameInstallDirs();
const std::vector<bool> getGameInstallDirsEnabled();
std::filesystem::path getAddonInstallDir();
u32 getMainWindowTheme();
u32 getIconSize();

View File

@ -3,6 +3,7 @@
#pragma once
#include <filesystem>
#include <string>
#include <string_view>
@ -69,6 +70,8 @@ class ElfInfo {
u32 raw_firmware_ver = 0;
PSFAttributes psf_attributes{};
std::filesystem::path splash_path{};
public:
static constexpr u32 FW_15 = 0x1500000;
static constexpr u32 FW_16 = 0x1600000;
@ -116,6 +119,10 @@ public:
ASSERT(initialized);
return psf_attributes;
}
[[nodiscard]] const std::filesystem::path& GetSplashPath() const {
return splash_path;
}
};
} // namespace Common

View File

@ -379,20 +379,6 @@ bool IOFile::Seek(s64 offset, SeekOrigin origin) const {
return false;
}
if (False(file_access_mode & (FileAccessMode::Write | FileAccessMode::Append))) {
u64 size = GetSize();
if (origin == SeekOrigin::CurrentPosition && Tell() + offset > size) {
LOG_ERROR(Common_Filesystem, "Seeking past the end of the file");
return false;
} else if (origin == SeekOrigin::SetOrigin && (u64)offset > size) {
LOG_ERROR(Common_Filesystem, "Seeking past the end of the file");
return false;
} else if (origin == SeekOrigin::End && offset > 0) {
LOG_ERROR(Common_Filesystem, "Seeking past the end of the file");
return false;
}
}
errno = 0;
const auto seek_result = fseeko(file, offset, ToSeekOrigin(origin)) == 0;

View File

@ -1,6 +1,7 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include <fstream>
#include <unordered_map>
#include "common/logging/log.h"
#include "common/path_util.h"
@ -16,6 +17,8 @@
#ifdef _WIN32
// This is the maximum number of UTF-16 code units permissible in Windows file paths
#define MAX_PATH 260
#include <Shlobj.h>
#include <windows.h>
#else
// This is the maximum number of UTF-8 code units permissible in all other OSes' file paths
#define MAX_PATH 1024
@ -105,6 +108,10 @@ static auto UserPaths = [] {
} else {
user_dir = std::filesystem::path(getenv("HOME")) / ".local" / "share" / "shadPS4";
}
#elif _WIN32
TCHAR appdata[MAX_PATH] = {0};
SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, appdata);
user_dir = std::filesystem::path(appdata) / "shadPS4";
#endif
}
@ -128,6 +135,22 @@ static auto UserPaths = [] {
create_path(PathType::CheatsDir, user_dir / CHEATS_DIR);
create_path(PathType::PatchesDir, user_dir / PATCHES_DIR);
create_path(PathType::MetaDataDir, user_dir / METADATA_DIR);
create_path(PathType::CustomTrophy, user_dir / CUSTOM_TROPHY);
std::ofstream notice_file(user_dir / CUSTOM_TROPHY / "Notice.txt");
if (notice_file.is_open()) {
notice_file
<< "++++++++++++++++++++++++++++++++\n+ Custom Trophy Images / Sound "
"+\n++++++++++++++++++++++++++++++++\n\nYou can add custom images to the "
"trophies.\n*We recommend a square resolution image, for example 200x200, 500x500, "
"the same size as the height and width.\nIn this folder ('user\\custom_trophy'), "
"add the files with the following "
"names:\n\nbronze.png\nsilver.png\ngold.png\nplatinum.png\n\nYou can add a custom "
"sound for trophy notifications.\n*By default, no audio is played unless it is in "
"this folder and you are using the QT version.\nIn this folder "
"('user\\custom_trophy'), add the files with the following names:\n\ntrophy.mp3";
notice_file.close();
}
return paths;
}();

View File

@ -27,6 +27,7 @@ enum class PathType {
CheatsDir, // Where cheats are stored.
PatchesDir, // Where patches are stored.
MetaDataDir, // Where game metadata (e.g. trophies and menu backgrounds) is stored.
CustomTrophy, // Where custom files for trophies are stored.
};
constexpr auto PORTABLE_DIR = "user";
@ -44,6 +45,7 @@ constexpr auto CAPTURES_DIR = "captures";
constexpr auto CHEATS_DIR = "cheats";
constexpr auto PATCHES_DIR = "patches";
constexpr auto METADATA_DIR = "game_data";
constexpr auto CUSTOM_TROPHY = "custom_trophy";
// Filenames
constexpr auto LOG_FILE = "shad_log.txt";

View File

@ -0,0 +1,15 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
template <size_t N, typename C = char>
struct StringLiteral {
static constexpr size_t len = N;
constexpr StringLiteral(const C (&str)[N]) {
std::copy_n(str, N, value);
}
C value[N]{};
};

View File

@ -8,7 +8,7 @@
namespace Common {
constexpr char VERSION[] = "0.6.1 WIP";
constexpr char VERSION[] = "0.7.1 WIP";
constexpr bool isRelease = false;
} // namespace Common

View File

@ -180,28 +180,44 @@ static void RestoreStack(Xbyak::CodeGenerator& c) {
c.mov(rsp, qword[reinterpret_cast<void*>(stack_pointer_slot * sizeof(void*))]);
}
/// Validates that the dst register is supported given the SaveStack/RestoreStack implementation.
static void ValidateDst(const Xbyak::Reg& dst) {
// No restrictions.
}
#else
// These utilities are not implemented as we can't save anything to thread local storage without
// temporary registers.
void InitializeThreadPatchStack() {
// No-op
}
// NOTE: Since stack pointer here is subtracted through safe zone and not saved anywhere,
// it must not be modified during the instruction. Otherwise, we will not be able to find
// and load registers back from where they were saved. Thus, a limitation is placed on
// instructions, that they must not use the stack pointer register as a destination.
/// Saves the stack pointer to thread local storage and loads the patch stack.
static void SaveStack(Xbyak::CodeGenerator& c) {
UNIMPLEMENTED();
c.lea(rsp, ptr[rsp - 128]); // red zone
}
/// Restores the stack pointer from thread local storage.
static void RestoreStack(Xbyak::CodeGenerator& c) {
UNIMPLEMENTED();
c.lea(rsp, ptr[rsp + 128]); // red zone
}
/// Validates that the dst register is supported given the SaveStack/RestoreStack implementation.
static void ValidateDst(const Xbyak::Reg& dst) {
// Stack pointer is not preserved, so it can't be used as a dst.
ASSERT_MSG(dst.getIdx() != rsp.getIdx(), "Stack pointer not supported as destination.");
}
#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) {
// Uses a more robust solution for saving registers on MacOS to avoid potential stack corruption
// if games decide to not follow the ABI and use the red zone.
SaveStack(c);
for (const auto& reg : regs) {
c.push(reg.cvt64());
@ -257,12 +273,11 @@ static void RestoreContext(Xbyak::CodeGenerator& c, const Xbyak::Operand& dst,
RestoreStack(c);
}
#ifdef __APPLE__
static void GenerateANDN(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) {
const auto dst = ZydisToXbyakRegisterOperand(operands[0]);
const auto src1 = ZydisToXbyakRegisterOperand(operands[1]);
const auto src2 = ZydisToXbyakOperand(operands[2]);
ValidateDst(dst);
// Check if src2 is a memory operand or a register different to dst.
// In those cases, we don't need to use a temporary register and are free to modify dst.
@ -301,6 +316,7 @@ static void GenerateBEXTR(const ZydisDecodedOperand* operands, Xbyak::CodeGenera
const auto dst = ZydisToXbyakRegisterOperand(operands[0]);
const auto src = ZydisToXbyakOperand(operands[1]);
const auto start_len = ZydisToXbyakRegisterOperand(operands[2]);
ValidateDst(dst);
const Xbyak::Reg32e shift(Xbyak::Operand::RCX, static_cast<int>(start_len.getBit()));
const auto scratch1 =
@ -338,6 +354,7 @@ static void GenerateBEXTR(const ZydisDecodedOperand* operands, Xbyak::CodeGenera
static void GenerateBLSI(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) {
const auto dst = ZydisToXbyakRegisterOperand(operands[0]);
const auto src = ZydisToXbyakOperand(operands[1]);
ValidateDst(dst);
const auto scratch = AllocateScratchRegister({&dst, src.get()}, dst.getBit());
@ -367,6 +384,7 @@ static void GenerateBLSI(const ZydisDecodedOperand* operands, Xbyak::CodeGenerat
static void GenerateBLSMSK(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) {
const auto dst = ZydisToXbyakRegisterOperand(operands[0]);
const auto src = ZydisToXbyakOperand(operands[1]);
ValidateDst(dst);
const auto scratch = AllocateScratchRegister({&dst, src.get()}, dst.getBit());
@ -395,9 +413,37 @@ static void GenerateBLSMSK(const ZydisDecodedOperand* operands, Xbyak::CodeGener
RestoreRegisters(c, {scratch});
}
static void GenerateTZCNT(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) {
const auto dst = ZydisToXbyakRegisterOperand(operands[0]);
const auto src = ZydisToXbyakOperand(operands[1]);
ValidateDst(dst);
Xbyak::Label src_zero, end;
c.cmp(*src, 0);
c.je(src_zero);
// If src is not zero, functions like a BSF, but also clears the CF
c.bsf(dst, *src);
c.clc();
c.jmp(end);
c.L(src_zero);
c.mov(dst, operands[0].size);
// Since dst is not zero, also set ZF to zero. Testing dst with itself when we know
// it isn't zero is a good way to do this.
// Use cvt32 to avoid REX/Operand size prefixes.
c.test(dst.cvt32(), dst.cvt32());
// When source is zero, TZCNT also sets CF.
c.stc();
c.L(end);
}
static void GenerateBLSR(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) {
const auto dst = ZydisToXbyakRegisterOperand(operands[0]);
const auto src = ZydisToXbyakOperand(operands[1]);
ValidateDst(dst);
const auto scratch = AllocateScratchRegister({&dst, src.get()}, dst.getBit());
@ -426,6 +472,8 @@ static void GenerateBLSR(const ZydisDecodedOperand* operands, Xbyak::CodeGenerat
RestoreRegisters(c, {scratch});
}
#ifdef __APPLE__
static __attribute__((sysv_abi)) void PerformVCVTPH2PS(float* out, const half_float::half* in,
const u32 count) {
for (u32 i = 0; i < count; i++) {
@ -616,6 +664,11 @@ static bool FilterNoSSE4a(const ZydisDecodedOperand*) {
return !cpu.has(Cpu::tSSE4a);
}
static bool FilterNoBMI1(const ZydisDecodedOperand*) {
Cpu cpu;
return !cpu.has(Cpu::tBMI1);
}
static void GenerateEXTRQ(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) {
bool immediateForm = operands[1].type == ZYDIS_OPERAND_TYPE_IMMEDIATE &&
operands[2].type == ZYDIS_OPERAND_TYPE_IMMEDIATE;
@ -897,14 +950,16 @@ static const std::unordered_map<ZydisMnemonic, PatchInfo> Patches = {
{ZYDIS_MNEMONIC_EXTRQ, {FilterNoSSE4a, GenerateEXTRQ, true}},
{ZYDIS_MNEMONIC_INSERTQ, {FilterNoSSE4a, GenerateINSERTQ, true}},
// BMI1
{ZYDIS_MNEMONIC_ANDN, {FilterNoBMI1, GenerateANDN, true}},
{ZYDIS_MNEMONIC_BEXTR, {FilterNoBMI1, GenerateBEXTR, true}},
{ZYDIS_MNEMONIC_BLSI, {FilterNoBMI1, GenerateBLSI, true}},
{ZYDIS_MNEMONIC_BLSMSK, {FilterNoBMI1, GenerateBLSMSK, true}},
{ZYDIS_MNEMONIC_BLSR, {FilterNoBMI1, GenerateBLSR, true}},
{ZYDIS_MNEMONIC_TZCNT, {FilterNoBMI1, GenerateTZCNT, true}},
#ifdef __APPLE__
// Patches for instruction sets not supported by Rosetta 2.
// BMI1
{ZYDIS_MNEMONIC_ANDN, {FilterRosetta2Only, GenerateANDN, true}},
{ZYDIS_MNEMONIC_BEXTR, {FilterRosetta2Only, GenerateBEXTR, true}},
{ZYDIS_MNEMONIC_BLSI, {FilterRosetta2Only, GenerateBLSI, true}},
{ZYDIS_MNEMONIC_BLSMSK, {FilterRosetta2Only, GenerateBLSMSK, true}},
{ZYDIS_MNEMONIC_BLSR, {FilterRosetta2Only, GenerateBLSR, true}},
// F16C
{ZYDIS_MNEMONIC_VCVTPH2PS, {FilterRosetta2Only, GenerateVCVTPH2PS, true}},
{ZYDIS_MNEMONIC_VCVTPS2PH, {FilterRosetta2Only, GenerateVCVTPS2PH, true}},

View File

@ -158,6 +158,10 @@ public:
float Framerate = 1.0f / 60.0f;
float FrameDeltaTime;
std::pair<u32, u32> game_resolution{};
std::pair<u32, u32> output_resolution{};
bool is_using_fsr{};
void ShowDebugMessage(std::string message) {
if (message.empty()) {
return;

View File

@ -21,8 +21,8 @@
extern std::unique_ptr<Vulkan::Presenter> presenter;
using namespace ImGui;
using namespace Core::Devtools;
using L = Core::Devtools::Layer;
using namespace ::Core::Devtools;
using L = ::Core::Devtools::Layer;
static bool show_simple_fps = false;
static bool visibility_toggled = false;
@ -81,8 +81,24 @@ void L::DrawMenuBar() {
ImGui::EndMenu();
}
if (BeginMenu("Display")) {
auto& pp_settings = presenter->GetPPSettingsRef();
if (BeginMenu("Brightness")) {
SliderFloat("Gamma", &presenter->GetGammaRef(), 0.1f, 2.0f);
SliderFloat("Gamma", &pp_settings.gamma, 0.1f, 2.0f);
ImGui::EndMenu();
}
if (BeginMenu("FSR")) {
auto& fsr = presenter->GetFsrSettingsRef();
Checkbox("FSR Enabled", &fsr.enable);
BeginDisabled(!fsr.enable);
{
Checkbox("RCAS", &fsr.use_rcas);
BeginDisabled(!fsr.use_rcas);
{
SliderFloat("RCAS Attenuation", &fsr.rcas_attenuation, 0.0, 3.0);
}
EndDisabled();
}
EndDisabled();
ImGui::EndMenu();
}
ImGui::EndMenu();

View File

@ -74,7 +74,7 @@ void FrameGraph::Draw() {
if (!is_open) {
return;
}
SetNextWindowSize({340.0, 185.0f}, ImGuiCond_FirstUseEver);
SetNextWindowSize({308.0, 270.0f}, ImGuiCond_FirstUseEver);
if (Begin("Video debug info", &is_open)) {
const auto& ctx = *GImGui;
const auto& io = ctx.IO;
@ -88,13 +88,20 @@ void FrameGraph::Draw() {
frameRate = 1000.0f / deltaTime;
}
SeparatorText("Frame graph");
DrawFrameGraph();
SeparatorText("Renderer info");
Text("Frame time: %.3f ms (%.1f FPS)", deltaTime, frameRate);
Text("Presenter time: %.3f ms (%.1f FPS)", io.DeltaTime * 1000.0f, 1.0f / io.DeltaTime);
Text("Flip frame: %d Gnm submit frame: %d", DebugState.flip_frame_count.load(),
DebugState.gnm_frame_count.load());
SeparatorText("Frame graph");
DrawFrameGraph();
Text("Game Res: %dx%d", DebugState.game_resolution.first,
DebugState.game_resolution.second);
Text("Output Res: %dx%d", DebugState.output_resolution.first,
DebugState.output_resolution.second);
Text("FSR: %s", DebugState.is_using_fsr ? "on" : "off");
}
End();
}

View File

@ -350,7 +350,7 @@ bool PKG::Extract(const std::filesystem::path& filepath, const std::filesystem::
auto title_id = GetTitleID();
if (parent_path.filename() != title_id &&
!fmt::UTF(extract_path.u8string()).data.ends_with("-UPDATE")) {
!fmt::UTF(extract_path.u8string()).data.ends_with("-patch")) {
extractPaths[ndinode_counter] = parent_path / title_id;
} else {
// DLCs path has different structure

View File

@ -1,38 +0,0 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include <fstream>
#include "common/assert.h"
#include "common/io_file.h"
#include "common/stb.h"
#include "splash.h"
bool Splash::Open(const std::filesystem::path& filepath) {
ASSERT_MSG(filepath.extension().string() == ".png", "Unexpected file format passed");
Common::FS::IOFile file(filepath, Common::FS::FileAccessMode::Read);
if (!file.IsOpen()) {
return false;
}
std::vector<u8> png_file{};
const auto png_size = file.GetSize();
png_file.resize(png_size);
file.Seek(0);
file.Read(png_file);
auto* img_mem = stbi_load_from_memory(png_file.data(), png_file.size(),
reinterpret_cast<int*>(&img_info.width),
reinterpret_cast<int*>(&img_info.height),
reinterpret_cast<int*>(&img_info.num_channels), 4);
if (!img_mem) {
return false;
}
const auto img_size = img_info.GetSizeBytes();
img_data.resize(img_size);
std::memcpy(img_data.data(), img_mem, img_size);
stbi_image_free(img_mem);
return true;
}

View File

@ -1,42 +0,0 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <filesystem>
#include <string>
#include <vector>
#include "common/types.h"
class Splash {
public:
struct ImageInfo {
u32 width;
u32 height;
u32 num_channels;
u32 GetSizeBytes() const {
return width * height * 4; // we always forcing rgba8 for simplicity
}
};
Splash() = default;
~Splash() = default;
bool Open(const std::filesystem::path& filepath);
[[nodiscard]] bool IsLoaded() const {
return img_data.size();
}
const auto& GetImageData() const {
return img_data;
}
ImageInfo GetImageInfo() const {
return img_info;
}
private:
ImageInfo img_info{};
std::vector<u8> img_data{};
};

View File

@ -70,6 +70,10 @@ std::filesystem::path MntPoints::GetHostPath(std::string_view path, bool* is_rea
std::filesystem::path host_path = mount->host_path / rel_path;
std::filesystem::path patch_path = mount->host_path;
patch_path += "-UPDATE";
if (!std::filesystem::exists(patch_path)) {
patch_path = mount->host_path;
patch_path += "-patch";
}
patch_path /= rel_path;
if ((corrected_path.starts_with("/app0") || corrected_path.starts_with("/hostapp")) &&

View File

@ -1087,7 +1087,8 @@ s32 PS4_SYSV_ABI sceGnmInsertWaitFlipDone(u32* cmdbuf, u32 size, s32 vo_handle,
}
uintptr_t label_addr{};
VideoOut::sceVideoOutGetBufferLabelAddress(vo_handle, &label_addr);
ASSERT_MSG(VideoOut::sceVideoOutGetBufferLabelAddress(vo_handle, &label_addr) == 16,
"sceVideoOutGetBufferLabelAddress call failed");
auto* wait_reg_mem = reinterpret_cast<PM4CmdWaitRegMem*>(cmdbuf);
wait_reg_mem->header = PM4Type3Header{PM4ItOpcode::WaitRegMem, 5};
@ -2041,7 +2042,8 @@ static inline s32 PatchFlipRequest(u32* cmdbuf, u32 size, u32 vo_handle, u32 buf
}
uintptr_t label_addr{};
VideoOut::sceVideoOutGetBufferLabelAddress(vo_handle, &label_addr);
ASSERT_MSG(VideoOut::sceVideoOutGetBufferLabelAddress(vo_handle, &label_addr) == 16,
"sceVideoOutGetBufferLabelAddress call failed");
// Write event to lock the VO surface
auto* write_lock = reinterpret_cast<PM4CmdWriteData*>(cmdbuf);

View File

@ -49,9 +49,9 @@ public:
// Are we supposed to call the event handler on init with
// ADD_OSK?
if (!ime_mode && False(m_param.key.option & OrbisImeKeyboardOption::AddOsk)) {
/* if (!ime_mode && False(m_param.key.option & OrbisImeKeyboardOption::AddOsk)) {
Execute(nullptr, &openEvent, true);
}
}*/
if (ime_mode) {
g_ime_state = ImeState(&m_param.ime);
@ -274,6 +274,13 @@ s32 PS4_SYSV_ABI sceImeKeyboardOpen(s32 userId, const OrbisImeKeyboardParam* par
if (!param) {
return ORBIS_IME_ERROR_INVALID_ADDRESS;
}
if (!param->arg) {
return ORBIS_IME_ERROR_INVALID_ARG;
}
if (!param->handler) {
return ORBIS_IME_ERROR_INVALID_HANDLER;
}
if (g_keyboard_handler) {
return ORBIS_IME_ERROR_BUSY;
}

View File

@ -20,7 +20,7 @@ enum class OrbisImeKeyboardOption : u32 {
Repeat = 1,
RepeatEachKey = 2,
AddOsk = 4,
EffectiveWithTime = 8,
EffectiveWithIme = 8,
DisableResume = 16,
DisableCapslockWithoutShift = 32,
};

View File

@ -5,6 +5,7 @@
#include <algorithm>
#include <fmt/core.h>
#include "common/string_literal.h"
#include "common/types.h"
#include "core/libraries/kernel/orbis_error.h"
@ -18,15 +19,6 @@ void ErrSceToPosix(int result);
int ErrnoToSceKernelError(int e);
void SetPosixErrno(int e);
template <size_t N>
struct StringLiteral {
constexpr StringLiteral(const char (&str)[N]) {
std::copy_n(str, N, value);
}
char value[N];
};
template <StringLiteral name, class F, F f>
struct WrapperImpl;

View File

@ -79,6 +79,9 @@ s32 PS4_SYSV_ABI sceKernelAllocateMainDirectMemory(size_t len, size_t alignment,
}
s32 PS4_SYSV_ABI sceKernelCheckedReleaseDirectMemory(u64 start, size_t len) {
if (len == 0) {
return ORBIS_OK;
}
LOG_INFO(Kernel_Vmm, "called start = {:#x}, len = {:#x}", start, len);
auto* memory = Core::Memory::Instance();
memory->Free(start, len);
@ -86,6 +89,9 @@ s32 PS4_SYSV_ABI sceKernelCheckedReleaseDirectMemory(u64 start, size_t len) {
}
s32 PS4_SYSV_ABI sceKernelReleaseDirectMemory(u64 start, size_t len) {
if (len == 0) {
return ORBIS_OK;
}
auto* memory = Core::Memory::Instance();
memory->Free(start, len);
return ORBIS_OK;
@ -507,7 +513,7 @@ s32 PS4_SYSV_ABI sceKernelConfiguredFlexibleMemorySize(u64* sizeOut) {
int PS4_SYSV_ABI sceKernelMunmap(void* addr, size_t len) {
LOG_INFO(Kernel_Vmm, "addr = {}, len = {:#x}", fmt::ptr(addr), len);
if (len == 0) {
return ORBIS_OK;
return ORBIS_KERNEL_ERROR_EINVAL;
}
auto* memory = Core::Memory::Instance();
return memory->UnmapMemory(std::bit_cast<VAddr>(addr), len);

View File

@ -32,44 +32,44 @@ void* PS4_SYSV_ABI sceKernelGetProcParam() {
return linker->GetProcParam();
}
s32 PS4_SYSV_ABI sceKernelLoadStartModule(const char* moduleFileName, size_t args, const void* argp,
s32 PS4_SYSV_ABI sceKernelLoadStartModule(const char* moduleFileName, u64 args, const void* argp,
u32 flags, const void* pOpt, int* pRes) {
LOG_INFO(Lib_Kernel, "called filename = {}, args = {}", moduleFileName, args);
if (flags != 0) {
return ORBIS_KERNEL_ERROR_EINVAL;
}
ASSERT(flags == 0);
auto* mnt = Common::Singleton<Core::FileSys::MntPoints>::Instance();
const auto path = mnt->GetHostPath(moduleFileName);
// Load PRX module and relocate any modules that import it.
auto* linker = Common::Singleton<Core::Linker>::Instance();
u32 handle = linker->FindByName(path);
if (handle != -1) {
return handle;
}
handle = linker->LoadModule(path, true);
if (handle == -1) {
return ORBIS_KERNEL_ERROR_ESRCH;
}
auto* module = linker->GetModule(handle);
linker->RelocateAnyImports(module);
// If the new module has a TLS image, trigger its load when TlsGetAddr is called.
if (module->tls.image_size != 0) {
linker->AdvanceGenerationCounter();
std::filesystem::path path;
std::string guest_path(moduleFileName);
s32 handle = -1;
if (guest_path[0] == '/') {
// try load /system/common/lib/ +path
// try load /system/priv/lib/ +path
path = mnt->GetHostPath(guest_path);
handle = linker->LoadAndStartModule(path, args, argp, pRes);
if (handle != -1)
return handle;
} else {
if (!guest_path.contains('/')) {
path = mnt->GetHostPath("/app0/" + guest_path);
handle = linker->LoadAndStartModule(path, args, argp, pRes);
if (handle != -1)
return handle;
// if ((flags & 0x10000) != 0)
// try load /system/priv/lib/ +basename
// try load /system/common/lib/ +basename
} else {
path = mnt->GetHostPath(guest_path);
handle = linker->LoadAndStartModule(path, args, argp, pRes);
if (handle != -1)
return handle;
}
}
// Retrieve and verify proc param according to libkernel.
u64* param = module->GetProcParam<u64*>();
ASSERT_MSG(!param || param[0] >= 0x18, "Invalid module param size: {}", param[0]);
s32 ret = module->Start(args, argp, param);
if (pRes) {
*pRes = ret;
}
return handle;
return ORBIS_KERNEL_ERROR_ENOENT;
}
s32 PS4_SYSV_ABI sceKernelDlsym(s32 handle, const char* symbol, void** addrp) {
@ -85,19 +85,7 @@ s32 PS4_SYSV_ABI sceKernelDlsym(s32 handle, const char* symbol, void** addrp) {
return ORBIS_OK;
}
static constexpr size_t ORBIS_DBG_MAX_NAME_LENGTH = 256;
struct OrbisModuleInfoForUnwind {
u64 st_size;
std::array<char, ORBIS_DBG_MAX_NAME_LENGTH> name;
VAddr eh_frame_hdr_addr;
VAddr eh_frame_addr;
u64 eh_frame_size;
VAddr seg0_addr;
u64 seg0_size;
};
s32 PS4_SYSV_ABI sceKernelGetModuleInfoForUnwind(VAddr addr, int flags,
s32 PS4_SYSV_ABI sceKernelGetModuleInfoForUnwind(VAddr addr, s32 flags,
OrbisModuleInfoForUnwind* info) {
if (flags >= 3) {
std::memset(info, 0, sizeof(OrbisModuleInfoForUnwind));

View File

@ -11,10 +11,25 @@ class SymbolsResolver;
namespace Libraries::Kernel {
static constexpr size_t ORBIS_DBG_MAX_NAME_LENGTH = 256;
struct OrbisModuleInfoForUnwind {
u64 st_size;
std::array<char, ORBIS_DBG_MAX_NAME_LENGTH> name;
VAddr eh_frame_hdr_addr;
VAddr eh_frame_addr;
u64 eh_frame_size;
VAddr seg0_addr;
u64 seg0_size;
};
int PS4_SYSV_ABI sceKernelIsNeoMode();
int PS4_SYSV_ABI sceKernelGetCompiledSdkVersion(int* ver);
s32 PS4_SYSV_ABI sceKernelGetModuleInfoForUnwind(VAddr addr, s32 flags,
OrbisModuleInfoForUnwind* info);
void RegisterProcess(Core::Loader::SymbolsResolver* sym);
} // namespace Libraries::Kernel

View File

@ -5,6 +5,7 @@
#include "common/assert.h"
#include "common/native_clock.h"
#include "core/libraries/kernel/kernel.h"
#include "core/libraries/kernel/orbis_error.h"
#include "core/libraries/kernel/time.h"
#include "core/libraries/libs.h"
@ -19,6 +20,7 @@
#if __APPLE__
#include <date/tz.h>
#endif
#include <sys/resource.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>
@ -93,44 +95,189 @@ u32 PS4_SYSV_ABI sceKernelSleep(u32 seconds) {
return 0;
}
int PS4_SYSV_ABI sceKernelClockGettime(s32 clock_id, OrbisKernelTimespec* tp) {
if (tp == nullptr) {
#ifdef _WIN64
#ifndef CLOCK_REALTIME
#define CLOCK_REALTIME 0
#endif
#ifndef CLOCK_MONOTONIC
#define CLOCK_MONOTONIC 1
#endif
#ifndef CLOCK_PROCESS_CPUTIME_ID
#define CLOCK_PROCESS_CPUTIME_ID 2
#endif
#ifndef CLOCK_THREAD_CPUTIME_ID
#define CLOCK_THREAD_CPUTIME_ID 3
#endif
#ifndef CLOCK_REALTIME_COARSE
#define CLOCK_REALTIME_COARSE 5
#endif
#ifndef CLOCK_MONOTONIC_COARSE
#define CLOCK_MONOTONIC_COARSE 6
#endif
#define DELTA_EPOCH_IN_100NS 116444736000000000ULL
static u64 FileTimeTo100Ns(FILETIME& ft) {
return *reinterpret_cast<u64*>(&ft);
}
static s32 clock_gettime(u32 clock_id, struct timespec* ts) {
switch (clock_id) {
case CLOCK_REALTIME:
case CLOCK_REALTIME_COARSE: {
FILETIME ft;
GetSystemTimeAsFileTime(&ft);
const u64 ns = FileTimeTo100Ns(ft) - DELTA_EPOCH_IN_100NS;
ts->tv_sec = ns / 10'000'000;
ts->tv_nsec = (ns % 10'000'000) * 100;
return 0;
}
case CLOCK_MONOTONIC:
case CLOCK_MONOTONIC_COARSE: {
static LARGE_INTEGER pf = [] {
LARGE_INTEGER res{};
QueryPerformanceFrequency(&pf);
return res;
}();
LARGE_INTEGER pc{};
QueryPerformanceCounter(&pc);
ts->tv_sec = pc.QuadPart / pf.QuadPart;
ts->tv_nsec = ((pc.QuadPart % pf.QuadPart) * 1000'000'000) / pf.QuadPart;
return 0;
}
case CLOCK_PROCESS_CPUTIME_ID: {
FILETIME ct, et, kt, ut;
if (!GetProcessTimes(GetCurrentProcess(), &ct, &et, &kt, &ut)) {
return EFAULT;
}
const u64 ns = FileTimeTo100Ns(ut) + FileTimeTo100Ns(kt);
ts->tv_sec = ns / 10'000'000;
ts->tv_nsec = (ns % 10'000'000) * 100;
return 0;
}
case CLOCK_THREAD_CPUTIME_ID: {
FILETIME ct, et, kt, ut;
if (!GetThreadTimes(GetCurrentThread(), &ct, &et, &kt, &ut)) {
return EFAULT;
}
const u64 ns = FileTimeTo100Ns(ut) + FileTimeTo100Ns(kt);
ts->tv_sec = ns / 10'000'000;
ts->tv_nsec = (ns % 10'000'000) * 100;
return 0;
}
default:
return EINVAL;
}
}
#endif
int PS4_SYSV_ABI orbis_clock_gettime(s32 clock_id, struct OrbisKernelTimespec* ts) {
if (ts == nullptr) {
return ORBIS_KERNEL_ERROR_EFAULT;
}
clockid_t pclock_id = CLOCK_REALTIME;
clockid_t pclock_id = CLOCK_MONOTONIC;
switch (clock_id) {
case ORBIS_CLOCK_REALTIME:
case ORBIS_CLOCK_REALTIME_PRECISE:
case ORBIS_CLOCK_REALTIME_FAST:
pclock_id = CLOCK_REALTIME;
break;
case ORBIS_CLOCK_SECOND:
case ORBIS_CLOCK_REALTIME_FAST:
#ifndef __APPLE__
pclock_id = CLOCK_REALTIME_COARSE;
#else
pclock_id = CLOCK_REALTIME;
#endif
break;
case ORBIS_CLOCK_UPTIME:
case ORBIS_CLOCK_UPTIME_PRECISE:
case ORBIS_CLOCK_MONOTONIC:
case ORBIS_CLOCK_MONOTONIC_PRECISE:
case ORBIS_CLOCK_MONOTONIC_FAST:
pclock_id = CLOCK_MONOTONIC;
break;
default:
LOG_ERROR(Lib_Kernel, "unsupported = {} using CLOCK_REALTIME", clock_id);
case ORBIS_CLOCK_UPTIME_FAST:
case ORBIS_CLOCK_MONOTONIC_FAST:
#ifndef __APPLE__
pclock_id = CLOCK_MONOTONIC_COARSE;
#else
pclock_id = CLOCK_MONOTONIC;
#endif
break;
case ORBIS_CLOCK_THREAD_CPUTIME_ID:
pclock_id = CLOCK_THREAD_CPUTIME_ID;
break;
case ORBIS_CLOCK_PROCTIME: {
const auto us = sceKernelGetProcessTime();
ts->tv_sec = us / 1'000'000;
ts->tv_nsec = (us % 1'000'000) * 1000;
return 0;
}
case ORBIS_CLOCK_VIRTUAL: {
#ifdef _WIN64
FILETIME ct, et, kt, ut;
if (!GetProcessTimes(GetCurrentProcess(), &ct, &et, &kt, &ut)) {
return EFAULT;
}
const u64 ns = FileTimeTo100Ns(ut);
ts->tv_sec = ns / 10'000'000;
ts->tv_nsec = (ns % 10'000'000) * 100;
#else
struct rusage ru;
const auto res = getrusage(RUSAGE_SELF, &ru);
if (res < 0) {
return res;
}
ts->tv_sec = ru.ru_utime.tv_sec;
ts->tv_nsec = ru.ru_utime.tv_usec * 1000;
#endif
return 0;
}
case ORBIS_CLOCK_PROF: {
#ifdef _WIN64
FILETIME ct, et, kt, ut;
if (!GetProcessTimes(GetCurrentProcess(), &ct, &et, &kt, &ut)) {
return EFAULT;
}
const u64 ns = FileTimeTo100Ns(kt);
ts->tv_sec = ns / 10'000'000;
ts->tv_nsec = (ns % 10'000'000) * 100;
#else
struct rusage ru;
const auto res = getrusage(RUSAGE_SELF, &ru);
if (res < 0) {
return res;
}
ts->tv_sec = ru.ru_stime.tv_sec;
ts->tv_nsec = ru.ru_stime.tv_usec * 1000;
#endif
return 0;
}
case ORBIS_CLOCK_EXT_NETWORK:
case ORBIS_CLOCK_EXT_DEBUG_NETWORK:
case ORBIS_CLOCK_EXT_AD_NETWORK:
case ORBIS_CLOCK_EXT_RAW_NETWORK:
pclock_id = CLOCK_MONOTONIC;
LOG_ERROR(Lib_Kernel, "unsupported = {} using CLOCK_MONOTONIC", clock_id);
break;
default:
return EINVAL;
}
timespec t{};
int result = clock_gettime(pclock_id, &t);
tp->tv_sec = t.tv_sec;
tp->tv_nsec = t.tv_nsec;
if (result == 0) {
return ORBIS_OK;
}
return ORBIS_KERNEL_ERROR_EINVAL;
ts->tv_sec = t.tv_sec;
ts->tv_nsec = t.tv_nsec;
return result;
}
int PS4_SYSV_ABI posix_clock_gettime(s32 clock_id, OrbisKernelTimespec* time) {
int result = sceKernelClockGettime(clock_id, time);
if (result < 0) {
UNREACHABLE(); // TODO return posix error code
int PS4_SYSV_ABI sceKernelClockGettime(s32 clock_id, OrbisKernelTimespec* tp) {
const auto res = orbis_clock_gettime(clock_id, tp);
if (res < 0) {
return ErrnoToSceKernelError(res);
}
return result;
return ORBIS_OK;
}
int PS4_SYSV_ABI posix_nanosleep(const OrbisKernelTimespec* rqtp, OrbisKernelTimespec* rmtp) {
@ -316,8 +463,8 @@ void RegisterTime(Core::Loader::SymbolsResolver* sym) {
LIB_FUNCTION("yS8U2TGCe1A", "libScePosix", 1, "libkernel", 1, 1, posix_nanosleep);
LIB_FUNCTION("QBi7HCK03hw", "libkernel", 1, "libkernel", 1, 1, sceKernelClockGettime);
LIB_FUNCTION("kOcnerypnQA", "libkernel", 1, "libkernel", 1, 1, sceKernelGettimezone);
LIB_FUNCTION("lLMT9vJAck0", "libkernel", 1, "libkernel", 1, 1, posix_clock_gettime);
LIB_FUNCTION("lLMT9vJAck0", "libScePosix", 1, "libkernel", 1, 1, posix_clock_gettime);
LIB_FUNCTION("lLMT9vJAck0", "libkernel", 1, "libkernel", 1, 1, orbis_clock_gettime);
LIB_FUNCTION("lLMT9vJAck0", "libScePosix", 1, "libkernel", 1, 1, orbis_clock_gettime);
LIB_FUNCTION("smIj7eqzZE8", "libScePosix", 1, "libkernel", 1, 1, posix_clock_getres);
LIB_FUNCTION("0NTHN1NKONI", "libkernel", 1, "libkernel", 1, 1, sceKernelConvertLocaltimeToUtc);
LIB_FUNCTION("-o5uEDpN+oY", "libkernel", 1, "libkernel", 1, 1, sceKernelConvertUtcToLocaltime);

View File

@ -5,6 +5,7 @@
#include "core/libraries/error_codes.h"
#include "core/libraries/libs.h"
#include "core/libraries/network/http.h"
#include "http_error.h"
namespace Libraries::Http {
@ -566,17 +567,277 @@ int PS4_SYSV_ABI sceHttpUriMerge() {
return ORBIS_OK;
}
int PS4_SYSV_ABI sceHttpUriParse() {
int PS4_SYSV_ABI sceHttpUriParse(OrbisHttpUriElement* out, const char* srcUri, void* pool,
size_t* require, size_t prepare) {
LOG_INFO(Lib_Http, "srcUri = {}", std::string(srcUri));
if (!srcUri) {
LOG_ERROR(Lib_Http, "invalid url");
return ORBIS_HTTP_ERROR_INVALID_URL;
}
if (!out && !pool && !require) {
LOG_ERROR(Lib_Http, "invalid values");
return ORBIS_HTTP_ERROR_INVALID_VALUE;
}
if (out && pool) {
memset(out, 0, sizeof(OrbisHttpUriElement));
out->scheme = (char*)pool;
}
// Track the total required buffer size
size_t requiredSize = 0;
// Parse the scheme (e.g., "http:", "https:", "file:")
size_t schemeLength = 0;
while (srcUri[schemeLength] && srcUri[schemeLength] != ':') {
if (!isalnum(srcUri[schemeLength])) {
LOG_ERROR(Lib_Http, "invalid url");
return ORBIS_HTTP_ERROR_INVALID_URL;
}
schemeLength++;
}
if (pool && prepare < schemeLength + 1) {
LOG_ERROR(Lib_Http, "out of memory");
return ORBIS_HTTP_ERROR_OUT_OF_MEMORY;
}
if (out && pool) {
memcpy(out->scheme, srcUri, schemeLength);
out->scheme[schemeLength] = '\0';
}
requiredSize += schemeLength + 1;
// Move past the scheme and ':' character
size_t offset = schemeLength + 1;
// Check if "//" appears after the scheme
if (strncmp(srcUri + offset, "//", 2) == 0) {
// "//" is present
if (out) {
out->opaque = false;
}
offset += 2; // Move past "//"
} else {
// "//" is not present
if (out) {
out->opaque = true;
}
}
// Handle "file" scheme
if (strncmp(srcUri, "file", 4) == 0) {
// File URIs typically start with "file://"
if (out && !out->opaque) {
// Skip additional slashes (e.g., "////")
while (srcUri[offset] == '/') {
offset++;
}
// Parse the path (everything after the slashes)
char* pathStart = (char*)srcUri + offset;
size_t pathLength = 0;
while (pathStart[pathLength] && pathStart[pathLength] != '?' &&
pathStart[pathLength] != '#') {
pathLength++;
}
// Ensure the path starts with '/'
if (pathLength > 0 && pathStart[0] != '/') {
// Prepend '/' to the path
requiredSize += pathLength + 2; // Include '/' and null terminator
if (pool && prepare < requiredSize) {
LOG_ERROR(Lib_Http, "out of memory");
return ORBIS_HTTP_ERROR_OUT_OF_MEMORY;
}
if (out && pool) {
out->path = (char*)pool + (requiredSize - pathLength - 2);
out->path[0] = '/'; // Add leading '/'
memcpy(out->path + 1, pathStart, pathLength);
out->path[pathLength + 1] = '\0';
}
} else {
// Path already starts with '/'
requiredSize += pathLength + 1;
if (pool && prepare < requiredSize) {
LOG_ERROR(Lib_Http, "out of memory");
return ORBIS_HTTP_ERROR_OUT_OF_MEMORY;
}
if (out && pool) {
memcpy((char*)pool + (requiredSize - pathLength - 1), pathStart, pathLength);
out->path = (char*)pool + (requiredSize - pathLength - 1);
out->path[pathLength] = '\0';
}
}
// Move past the path
offset += pathLength;
}
}
// Handle non-file schemes (e.g., "http", "https")
else {
// Parse the host and port
char* hostStart = (char*)srcUri + offset;
while (*hostStart == '/') {
hostStart++;
}
size_t hostLength = 0;
while (hostStart[hostLength] && hostStart[hostLength] != '/' &&
hostStart[hostLength] != '?' && hostStart[hostLength] != ':') {
hostLength++;
}
requiredSize += hostLength + 1;
if (pool && prepare < requiredSize) {
LOG_ERROR(Lib_Http, "out of memory");
return ORBIS_HTTP_ERROR_OUT_OF_MEMORY;
}
if (out && pool) {
memcpy((char*)pool + (requiredSize - hostLength - 1), hostStart, hostLength);
out->hostname = (char*)pool + (requiredSize - hostLength - 1);
out->hostname[hostLength] = '\0';
}
// Move past the host
offset += hostLength;
// Parse the port (if present)
if (hostStart[hostLength] == ':') {
char* portStart = hostStart + hostLength + 1;
size_t portLength = 0;
while (portStart[portLength] && isdigit(portStart[portLength])) {
portLength++;
}
requiredSize += portLength + 1;
if (pool && prepare < requiredSize) {
LOG_ERROR(Lib_Http, "out of memory");
return ORBIS_HTTP_ERROR_OUT_OF_MEMORY;
}
// Convert the port string to a uint16_t
char portStr[6]; // Max length for a port number (65535)
if (portLength > 5) {
LOG_ERROR(Lib_Http, "invalid url");
return ORBIS_HTTP_ERROR_INVALID_URL;
}
memcpy(portStr, portStart, portLength);
portStr[portLength] = '\0';
uint16_t port = (uint16_t)atoi(portStr);
if (port == 0 && portStr[0] != '0') {
LOG_ERROR(Lib_Http, "invalid url");
return ORBIS_HTTP_ERROR_INVALID_URL;
}
// Set the port in the output structure
if (out) {
out->port = port;
}
// Move past the port
offset += portLength + 1;
}
}
// Parse the path (if present)
if (srcUri[offset] == '/') {
char* pathStart = (char*)srcUri + offset;
size_t pathLength = 0;
while (pathStart[pathLength] && pathStart[pathLength] != '?' &&
pathStart[pathLength] != '#') {
pathLength++;
}
requiredSize += pathLength + 1;
if (pool && prepare < requiredSize) {
LOG_ERROR(Lib_Http, "out of memory");
return ORBIS_HTTP_ERROR_OUT_OF_MEMORY;
}
if (out && pool) {
memcpy((char*)pool + (requiredSize - pathLength - 1), pathStart, pathLength);
out->path = (char*)pool + (requiredSize - pathLength - 1);
out->path[pathLength] = '\0';
}
// Move past the path
offset += pathLength;
}
// Parse the query (if present)
if (srcUri[offset] == '?') {
char* queryStart = (char*)srcUri + offset + 1;
size_t queryLength = 0;
while (queryStart[queryLength] && queryStart[queryLength] != '#') {
queryLength++;
}
requiredSize += queryLength + 1;
if (pool && prepare < requiredSize) {
LOG_ERROR(Lib_Http, "out of memory");
return ORBIS_HTTP_ERROR_OUT_OF_MEMORY;
}
if (out && pool) {
memcpy((char*)pool + (requiredSize - queryLength - 1), queryStart, queryLength);
out->query = (char*)pool + (requiredSize - queryLength - 1);
out->query[queryLength] = '\0';
}
// Move past the query
offset += queryLength + 1;
}
// Parse the fragment (if present)
if (srcUri[offset] == '#') {
char* fragmentStart = (char*)srcUri + offset + 1;
size_t fragmentLength = 0;
while (fragmentStart[fragmentLength]) {
fragmentLength++;
}
requiredSize += fragmentLength + 1;
if (pool && prepare < requiredSize) {
LOG_ERROR(Lib_Http, "out of memory");
return ORBIS_HTTP_ERROR_OUT_OF_MEMORY;
}
if (out && pool) {
memcpy((char*)pool + (requiredSize - fragmentLength - 1), fragmentStart,
fragmentLength);
out->fragment = (char*)pool + (requiredSize - fragmentLength - 1);
out->fragment[fragmentLength] = '\0';
}
}
// Calculate the total required buffer size
if (require) {
*require = requiredSize; // Update with actual required size
}
return ORBIS_OK;
}
int PS4_SYSV_ABI sceHttpUriSweepPath(char* dst, const char* src, size_t srcSize) {
LOG_ERROR(Lib_Http, "(STUBBED) called");
return ORBIS_OK;
}
int PS4_SYSV_ABI sceHttpUriSweepPath() {
LOG_ERROR(Lib_Http, "(STUBBED) called");
return ORBIS_OK;
}
int PS4_SYSV_ABI sceHttpUriUnescape() {
int PS4_SYSV_ABI sceHttpUriUnescape(char* out, size_t* require, size_t prepare, const char* in) {
LOG_ERROR(Lib_Http, "(STUBBED) called");
return ORBIS_OK;
}

View File

@ -11,6 +11,19 @@ class SymbolsResolver;
namespace Libraries::Http {
struct OrbisHttpUriElement {
bool opaque;
char* scheme;
char* username;
char* password;
char* hostname;
char* path;
char* query;
char* fragment;
u16 port;
u8 reserved[10];
};
int PS4_SYSV_ABI sceHttpAbortRequest();
int PS4_SYSV_ABI sceHttpAbortRequestForce();
int PS4_SYSV_ABI sceHttpAbortWaitRequest();
@ -122,9 +135,10 @@ int PS4_SYSV_ABI sceHttpUriBuild();
int PS4_SYSV_ABI sceHttpUriCopy();
int PS4_SYSV_ABI sceHttpUriEscape();
int PS4_SYSV_ABI sceHttpUriMerge();
int PS4_SYSV_ABI sceHttpUriParse();
int PS4_SYSV_ABI sceHttpUriSweepPath();
int PS4_SYSV_ABI sceHttpUriUnescape();
int PS4_SYSV_ABI sceHttpUriParse(OrbisHttpUriElement* out, const char* srcUri, void* pool,
size_t* require, size_t prepare);
int PS4_SYSV_ABI sceHttpUriSweepPath(char* dst, const char* src, size_t srcSize);
int PS4_SYSV_ABI sceHttpUriUnescape(char* out, size_t* require, size_t prepare, const char* in);
int PS4_SYSV_ABI sceHttpWaitRequest();
void RegisterlibSceHttp(Core::Loader::SymbolsResolver* sym);

View File

@ -0,0 +1,66 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include "core/libraries/error_codes.h"
constexpr int ORBIS_HTTP_ERROR_BEFORE_INIT = 0x80431001;
constexpr int ORBIS_HTTP_ERROR_ALREADY_INITED = 0x80431020;
constexpr int ORBIS_HTTP_ERROR_BUSY = 0x80431021;
constexpr int ORBIS_HTTP_ERROR_OUT_OF_MEMORY = 0x80431022;
constexpr int ORBIS_HTTP_ERROR_NOT_FOUND = 0x80431025;
constexpr int ORBIS_HTTP_ERROR_INVALID_VERSION = 0x8043106a;
constexpr int ORBIS_HTTP_ERROR_INVALID_ID = 0x80431100;
constexpr int ORBIS_HTTP_ERROR_OUT_OF_SIZE = 0x80431104;
constexpr int ORBIS_HTTP_ERROR_INVALID_VALUE = 0x804311fe;
constexpr int ORBIS_HTTP_ERROR_INVALID_URL = 0x80433060;
constexpr int ORBIS_HTTP_ERROR_UNKNOWN_SCHEME = 0x80431061;
constexpr int ORBIS_HTTP_ERROR_NETWORK = 0x80431063;
constexpr int ORBIS_HTTP_ERROR_BAD_RESPONSE = 0x80431064;
constexpr int ORBIS_HTTP_ERROR_BEFORE_SEND = 0x80431065;
constexpr int ORBIS_HTTP_ERROR_AFTER_SEND = 0x80431066;
constexpr int ORBIS_HTTP_ERROR_TIMEOUT = 0x80431068;
constexpr int ORBIS_HTTP_ERROR_UNKNOWN_AUTH_TYPE = 0x80431069;
constexpr int ORBIS_HTTP_ERROR_UNKNOWN_METHOD = 0x8043106b;
constexpr int ORBIS_HTTP_ERROR_READ_BY_HEAD_METHOD = 0x8043106f;
constexpr int ORBIS_HTTP_ERROR_NOT_IN_COM = 0x80431070;
constexpr int ORBIS_HTTP_ERROR_NO_CONTENT_LENGTH = 0x80431071;
constexpr int ORBIS_HTTP_ERROR_CHUNK_ENC = 0x80431072;
constexpr int ORBIS_HTTP_ERROR_TOO_LARGE_RESPONSE_HEADER = 0x80431073;
constexpr int ORBIS_HTTP_ERROR_SSL = 0x80431075;
constexpr int ORBIS_HTTP_ERROR_INSUFFICIENT_STACKSIZE = 0x80431076;
constexpr int ORBIS_HTTP_ERROR_ABORTED = 0x80431080;
constexpr int ORBIS_HTTP_ERROR_UNKNOWN = 0x80431081;
constexpr int ORBIS_HTTP_ERROR_EAGAIN = 0x80431082;
constexpr int ORBIS_HTTP_ERROR_PROXY = 0x80431084;
constexpr int ORBIS_HTTP_ERROR_BROKEN = 0x80431085;
constexpr int ORBIS_HTTP_ERROR_PARSE_HTTP_NOT_FOUND = 0x80432025;
constexpr int ORBIS_HTTP_ERROR_PARSE_HTTP_INVALID_RESPONSE = 0x80432060;
constexpr int ORBIS_HTTP_ERROR_PARSE_HTTP_INVALID_VALUE = 0x804321fe;
constexpr int ORBIS_HTTP_ERROR_RESOLVER_EPACKET = 0x80436001;
constexpr int ORBIS_HTTP_ERROR_RESOLVER_ENODNS = 0x80436002;
constexpr int ORBIS_HTTP_ERROR_RESOLVER_ETIMEDOUT = 0x80436003;
constexpr int ORBIS_HTTP_ERROR_RESOLVER_ENOSUPPORT = 0x80436004;
constexpr int ORBIS_HTTP_ERROR_RESOLVER_EFORMAT = 0x80436005;
constexpr int ORBIS_HTTP_ERROR_RESOLVER_ESERVERFAILURE = 0x80436006;
constexpr int ORBIS_HTTP_ERROR_RESOLVER_ENOHOST = 0x80436007;
constexpr int ORBIS_HTTP_ERROR_RESOLVER_ENOTIMPLEMENTED = 0x80436008;
constexpr int ORBIS_HTTP_ERROR_RESOLVER_ESERVERREFUSED = 0x80436009;
constexpr int ORBIS_HTTP_ERROR_RESOLVER_ENORECORD = 0x8043600a;
constexpr int ORBIS_HTTPS_ERROR_CERT = 0x80435060;
constexpr int ORBIS_HTTPS_ERROR_HANDSHAKE = 0x80435061;
constexpr int ORBIS_HTTPS_ERROR_IO = 0x80435062;
constexpr int ORBIS_HTTPS_ERROR_INTERNAL = 0x80435063;
constexpr int ORBIS_HTTPS_ERROR_PROXY = 0x80435064;
constexpr int ORBIS_HTTPS_ERROR_SSL_INTERNAL = 0x01;
constexpr int ORBIS_HTTPS_ERROR_SSL_INVALID_CERT = 0x02;
constexpr int ORBIS_HTTPS_ERROR_SSL_CN_CHECK = 0x04;
constexpr int ORBIS_HTTPS_ERROR_SSL_NOT_AFTER_CHECK = 0x08;
constexpr int ORBIS_HTTPS_ERROR_SSL_NOT_BEFORE_CHECK = 0x10;
constexpr int ORBIS_HTTPS_ERROR_SSL_UNKNOWN_CA = 0x20;

View File

@ -923,15 +923,16 @@ int PS4_SYSV_ABI sceNpTrophyUnlockTrophy(OrbisNpTrophyContext context, OrbisNpTr
node.attribute("unlockstate").set_value("true");
}
Rtc::OrbisRtcTick trophyTimestamp;
Rtc::sceRtcGetCurrentTick(&trophyTimestamp);
auto trophyTimestamp = std::chrono::duration_cast<std::chrono::seconds>(
std::chrono::system_clock::now().time_since_epoch())
.count();
if (node.attribute("timestamp").empty()) {
node.append_attribute("timestamp") =
std::to_string(trophyTimestamp.tick).c_str();
std::to_string(trophyTimestamp).c_str();
} else {
node.attribute("timestamp")
.set_value(std::to_string(trophyTimestamp.tick).c_str());
.set_value(std::to_string(trophyTimestamp).c_str());
}
std::string trophy_icon_file = "TROP";
@ -955,15 +956,16 @@ int PS4_SYSV_ABI sceNpTrophyUnlockTrophy(OrbisNpTrophyContext context, OrbisNpTr
platinum_node.attribute("unlockstate").set_value("true");
}
Rtc::OrbisRtcTick trophyTimestamp;
Rtc::sceRtcGetCurrentTick(&trophyTimestamp);
auto trophyTimestamp = std::chrono::duration_cast<std::chrono::seconds>(
std::chrono::system_clock::now().time_since_epoch())
.count();
if (platinum_node.attribute("timestamp").empty()) {
platinum_node.append_attribute("timestamp") =
std::to_string(trophyTimestamp.tick).c_str();
std::to_string(trophyTimestamp).c_str();
} else {
platinum_node.attribute("timestamp")
.set_value(std::to_string(trophyTimestamp.tick).c_str());
.set_value(std::to_string(trophyTimestamp).c_str());
}
int platinum_trophy_id =

View File

@ -2,9 +2,17 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#include <chrono>
#include <filesystem>
#include <fstream>
#include <mutex>
#include <cmrc/cmrc.hpp>
#include <common/path_util.h>
#include <imgui.h>
#ifdef ENABLE_QT_GUI
#include <qt_gui/background_music_player.h>
#endif
#include "common/assert.h"
#include "common/config.h"
#include "common/singleton.h"
@ -12,7 +20,7 @@
#include "trophy_ui.h"
CMRC_DECLARE(res);
namespace fs = std::filesystem;
using namespace ImGui;
namespace Libraries::NpTrophy {
@ -20,10 +28,18 @@ std::optional<TrophyUI> current_trophy_ui;
std::queue<TrophyInfo> trophy_queue;
std::mutex queueMtx;
std::string side = "right";
double trophy_timer;
TrophyUI::TrophyUI(const std::filesystem::path& trophyIconPath, const std::string& trophyName,
const std::string_view& rarity)
: trophy_name(trophyName), trophy_type(rarity) {
side = Config::sideTrophy();
trophy_timer = Config::getTrophyNotificationDuration();
if (std::filesystem::exists(trophyIconPath)) {
trophy_icon = RefCountedTexture::DecodePngFile(trophyIconPath);
} else {
@ -31,23 +47,61 @@ TrophyUI::TrophyUI(const std::filesystem::path& trophyIconPath, const std::strin
fmt::UTF(trophyIconPath.u8string()));
}
std::string pathString;
std::string pathString = "src/images/";
if (trophy_type == "P") {
pathString = "src/images/platinum.png";
pathString += "platinum.png";
} else if (trophy_type == "G") {
pathString = "src/images/gold.png";
pathString += "gold.png";
} else if (trophy_type == "S") {
pathString = "src/images/silver.png";
pathString += "silver.png";
} else if (trophy_type == "B") {
pathString = "src/images/bronze.png";
pathString += "bronze.png";
}
const auto CustomTrophy_Dir = Common::FS::GetUserPath(Common::FS::PathType::CustomTrophy);
std::string customPath;
if (trophy_type == "P" && fs::exists(CustomTrophy_Dir / "platinum.png")) {
customPath = (CustomTrophy_Dir / "platinum.png").string();
} else if (trophy_type == "G" && fs::exists(CustomTrophy_Dir / "gold.png")) {
customPath = (CustomTrophy_Dir / "gold.png").string();
} else if (trophy_type == "S" && fs::exists(CustomTrophy_Dir / "silver.png")) {
customPath = (CustomTrophy_Dir / "silver.png").string();
} else if (trophy_type == "B" && fs::exists(CustomTrophy_Dir / "bronze.png")) {
customPath = (CustomTrophy_Dir / "bronze.png").string();
}
std::vector<u8> imgdata;
if (!customPath.empty()) {
std::ifstream file(customPath, std::ios::binary);
if (file) {
imgdata = std::vector<u8>(std::istreambuf_iterator<char>(file),
std::istreambuf_iterator<char>());
} else {
LOG_ERROR(Lib_NpTrophy, "Could not open custom file for trophy in {}", customPath);
}
} else {
auto resource = cmrc::res::get_filesystem();
auto file = resource.open(pathString);
imgdata = std::vector<u8>(file.begin(), file.end());
}
auto resource = cmrc::res::get_filesystem();
auto file = resource.open(pathString);
std::vector<u8> imgdata(file.begin(), file.end());
trophy_type_icon = RefCountedTexture::DecodePngTexture(imgdata);
AddLayer(this);
#ifdef ENABLE_QT_GUI
QString musicPathWav = QString::fromStdString(CustomTrophy_Dir.string() + "/trophy.wav");
QString musicPathMp3 = QString::fromStdString(CustomTrophy_Dir.string() + "/trophy.mp3");
if (fs::exists(musicPathWav.toStdString())) {
BackgroundMusicPlayer::getInstance().setVolume(100);
BackgroundMusicPlayer::getInstance().playMusic(musicPathWav, false);
} else if (fs::exists(musicPathMp3.toStdString())) {
BackgroundMusicPlayer::getInstance().setVolume(100);
BackgroundMusicPlayer::getInstance().playMusic(musicPathMp3, false);
}
#endif
}
TrophyUI::~TrophyUI() {
@ -58,36 +112,94 @@ void TrophyUI::Finish() {
RemoveLayer(this);
}
float fade_opacity = 0.0f; // Initial opacity (invisible)
ImVec2 start_pos = ImVec2(1280.0f, 50.0f); // Starts off screen, right
ImVec2 target_pos = ImVec2(0.0f, 50.0f); // Final position
float animation_duration = 0.5f; // Animation duration
float elapsed_time = 0.0f; // Animation time
float fade_out_duration = 0.5f; // Final fade duration
void TrophyUI::Draw() {
const auto& io = GetIO();
float AdjustWidth = io.DisplaySize.x / 1280;
float AdjustHeight = io.DisplaySize.y / 720;
float AdjustWidth = io.DisplaySize.x / 1920;
float AdjustHeight = io.DisplaySize.y / 1080;
const ImVec2 window_size{
std::min(io.DisplaySize.x, (350 * AdjustWidth)),
std::min(io.DisplaySize.y, (70 * AdjustHeight)),
};
elapsed_time += io.DeltaTime;
float progress = std::min(elapsed_time / animation_duration, 1.0f);
float final_pos_x, start_x;
float final_pos_y, start_y;
if (side == "top") {
start_x = (io.DisplaySize.x - window_size.x) * 0.5f;
start_y = -window_size.y;
final_pos_x = start_x;
final_pos_y = 20 * AdjustHeight;
} else if (side == "left") {
start_x = -window_size.x;
start_y = 50 * AdjustHeight;
final_pos_x = 20 * AdjustWidth;
final_pos_y = start_y;
} else if (side == "right") {
start_x = io.DisplaySize.x;
start_y = 50 * AdjustHeight;
final_pos_x = io.DisplaySize.x - window_size.x - 20 * AdjustWidth;
final_pos_y = start_y;
} else if (side == "bottom") {
start_x = (io.DisplaySize.x - window_size.x) * 0.5f;
start_y = io.DisplaySize.y;
final_pos_x = start_x;
final_pos_y = io.DisplaySize.y - window_size.y - 20 * AdjustHeight;
}
ImVec2 current_pos = ImVec2(start_x + (final_pos_x - start_x) * progress,
start_y + (final_pos_y - start_y) * progress);
trophy_timer -= io.DeltaTime;
ImGui::SetNextWindowPos(current_pos);
// If the remaining time of the trophy is less than or equal to 1 second, the fade-out begins.
if (trophy_timer <= 1.0f) {
float fade_out_time = 1.0f - (trophy_timer / 1.0f);
fade_opacity = 1.0f - fade_out_time;
} else {
// Fade in , 0 to 1
fade_opacity = progress;
}
fade_opacity = std::max(0.0f, std::min(fade_opacity, 1.0f));
SetNextWindowSize(window_size);
SetNextWindowPos(current_pos);
SetNextWindowCollapsed(false);
SetNextWindowPos(ImVec2(io.DisplaySize.x - (370 * AdjustWidth), (50 * AdjustHeight)));
KeepNavHighlight();
PushStyleVar(ImGuiStyleVar_Alpha, fade_opacity);
if (Begin("Trophy Window", nullptr,
ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoSavedSettings |
ImGuiWindowFlags_NoInputs)) {
// Displays the trophy icon
if (trophy_type_icon) {
SetCursorPosY((window_size.y * 0.5f) - (25 * AdjustHeight));
Image(trophy_type_icon.GetTexture().im_id,
ImVec2((50 * AdjustWidth), (50 * AdjustHeight)));
ImGui::SameLine();
} else {
// placeholder
// Placeholder
const auto pos = GetCursorScreenPos();
ImGui::GetWindowDrawList()->AddRectFilled(pos, pos + ImVec2{50.0f * AdjustHeight},
GetColorU32(ImVec4{0.7f}));
ImGui::Indent(60);
}
// Displays the name of the trophy
const std::string combinedString = "Trophy earned!\n%s" + trophy_name;
const float wrap_width =
CalcWrapWidthForPos(GetCursorScreenPos(), (window_size.x - (60 * AdjustWidth)));
@ -104,15 +216,23 @@ void TrophyUI::Draw() {
const float text_height = ImGui::CalcTextSize(combinedString.c_str()).y;
SetCursorPosY((window_size.y - text_height) * 0.5);
}
if (side == "top" || side == "bottom") {
float text_width = ImGui::CalcTextSize(trophy_name.c_str()).x;
float centered_x = (window_size.x - text_width) * 0.5f;
ImGui::SetCursorPosX(std::max(centered_x, 10.0f * AdjustWidth));
}
ImGui::PushTextWrapPos(window_size.x - (60 * AdjustWidth));
TextWrapped("Trophy earned!\n%s", trophy_name.c_str());
ImGui::SameLine(window_size.x - (60 * AdjustWidth));
// Displays the trophy icon
if (trophy_icon) {
SetCursorPosY((window_size.y * 0.5f) - (25 * AdjustHeight));
Image(trophy_icon.GetTexture().im_id, ImVec2((50 * AdjustWidth), (50 * AdjustHeight)));
} else {
// placeholder
// Placeholder
const auto pos = GetCursorScreenPos();
ImGui::GetWindowDrawList()->AddRectFilled(pos, pos + ImVec2{50.0f * AdjustHeight},
GetColorU32(ImVec4{0.7f}));
@ -120,7 +240,8 @@ void TrophyUI::Draw() {
}
End();
trophy_timer -= io.DeltaTime;
PopStyleVar();
if (trophy_timer <= 0) {
std::lock_guard<std::mutex> lock(queueMtx);
if (!trophy_queue.empty()) {
@ -141,13 +262,27 @@ void AddTrophyToQueue(const std::filesystem::path& trophyIconPath, const std::st
if (Config::getisTrophyPopupDisabled()) {
return;
} else if (current_trophy_ui.has_value()) {
TrophyInfo new_trophy;
new_trophy.trophy_icon_path = trophyIconPath;
new_trophy.trophy_name = trophyName;
new_trophy.trophy_type = rarity;
trophy_queue.push(new_trophy);
} else {
current_trophy_ui.emplace(trophyIconPath, trophyName, rarity);
current_trophy_ui.reset();
}
TrophyInfo new_trophy;
new_trophy.trophy_icon_path = trophyIconPath;
new_trophy.trophy_name = trophyName;
new_trophy.trophy_type = rarity;
trophy_queue.push(new_trophy);
if (!current_trophy_ui.has_value()) {
#ifdef ENABLE_QT_GUI
BackgroundMusicPlayer::getInstance().stopMusic();
#endif
// Resetting the animation for the next trophy
elapsed_time = 0.0f; // Resetting animation time
fade_opacity = 0.0f; // Starts invisible
start_pos = ImVec2(1280.0f, 50.0f); // Starts off screen, right
TrophyInfo next_trophy = trophy_queue.front();
trophy_queue.pop();
current_trophy_ui.emplace(next_trophy.trophy_icon_path, next_trophy.trophy_name,
next_trophy.trophy_type);
}
}

View File

@ -28,7 +28,6 @@ public:
private:
std::string trophy_name;
std::string_view trophy_type;
float trophy_timer = 5.0f;
ImGui::RefCountedTexture trophy_icon;
ImGui::RefCountedTexture trophy_type_icon;
};

View File

@ -7,6 +7,7 @@
#include "common/logging/log.h"
#include "core/libraries/error_codes.h"
#include "core/libraries/kernel/process.h"
#include "core/libraries/libs.h"
#include "core/libraries/system/sysmodule.h"
#include "core/libraries/system/system_error.h"
@ -18,9 +19,12 @@ int PS4_SYSV_ABI sceSysmoduleGetModuleHandleInternal() {
return ORBIS_OK;
}
int PS4_SYSV_ABI sceSysmoduleGetModuleInfoForUnwind() {
s32 PS4_SYSV_ABI sceSysmoduleGetModuleInfoForUnwind(VAddr addr, s32 flags, void* info) {
LOG_ERROR(Lib_SysModule, "(STUBBED) called");
return ORBIS_OK;
Kernel::OrbisModuleInfoForUnwind module_info;
module_info.st_size = 0x130;
s32 res = Kernel::sceKernelGetModuleInfoForUnwind(addr, flags, &module_info);
return res;
}
int PS4_SYSV_ABI sceSysmoduleIsCalledFromSysModule() {

View File

@ -152,7 +152,7 @@ enum class OrbisSysModuleInternal : u32 {
};
int PS4_SYSV_ABI sceSysmoduleGetModuleHandleInternal();
int PS4_SYSV_ABI sceSysmoduleGetModuleInfoForUnwind();
s32 PS4_SYSV_ABI sceSysmoduleGetModuleInfoForUnwind(VAddr addr, s32 flags, void* info);
int PS4_SYSV_ABI sceSysmoduleIsCalledFromSysModule();
int PS4_SYSV_ABI sceSysmoduleIsCameraPreloaded();
int PS4_SYSV_ABI sceSysmoduleIsLoaded(OrbisSysModule id);

View File

@ -1893,7 +1893,7 @@ int PS4_SYSV_ABI sceSystemServiceNavigateToGoHome() {
s32 PS4_SYSV_ABI sceSystemServiceParamGetInt(OrbisSystemServiceParamId param_id, int* value) {
// TODO this probably should be stored in config for UI configuration
LOG_INFO(Lib_SystemService, "called param_id {}", u32(param_id));
LOG_DEBUG(Lib_SystemService, "called param_id {}", u32(param_id));
if (value == nullptr) {
LOG_ERROR(Lib_SystemService, "value is null");
return ORBIS_SYSTEM_SERVICE_ERROR_PARAMETER;

View File

@ -1043,7 +1043,7 @@ int PS4_SYSV_ABI sceUserServiceGetTraditionalChineseInputType() {
s32 PS4_SYSV_ABI sceUserServiceGetUserColor(int user_id, OrbisUserServiceUserColor* color) {
// TODO fix me better
LOG_INFO(Lib_UserService, "called user_id = {}", user_id);
LOG_DEBUG(Lib_UserService, "called user_id = {}", user_id);
if (color == nullptr) {
LOG_ERROR(Lib_UserService, "color is null");
return ORBIS_USER_SERVICE_ERROR_INVALID_ARGUMENT;
@ -1068,7 +1068,7 @@ int PS4_SYSV_ABI sceUserServiceGetUserGroupNum() {
}
s32 PS4_SYSV_ABI sceUserServiceGetUserName(int user_id, char* user_name, std::size_t size) {
LOG_INFO(Lib_UserService, "called user_id = {} ,size = {} ", user_id, size);
LOG_DEBUG(Lib_UserService, "called user_id = {} ,size = {} ", user_id, size);
if (user_name == nullptr) {
LOG_ERROR(Lib_UserService, "user_name is null");
return ORBIS_USER_SERVICE_ERROR_INVALID_ARGUMENT;

View File

@ -63,6 +63,7 @@ void VideoOutDriver::Close(s32 handle) {
main_port.is_open = false;
main_port.flip_rate = 0;
main_port.prev_index = -1;
ASSERT(main_port.flip_events.empty());
}
@ -133,6 +134,10 @@ int VideoOutDriver::RegisterBuffers(VideoOutPort* port, s32 startIndex, void* co
.address_right = 0,
};
// Reset flip label also when registering buffer
port->buffer_labels[startIndex + i] = 0;
port->SignalVoLabel();
presenter->RegisterVideoOutSurface(group, address);
LOG_INFO(Lib_VideoOut, "buffers[{}] = {:#x}", i + startIndex, address);
}
@ -160,11 +165,8 @@ int VideoOutDriver::UnregisterBuffers(VideoOutPort* port, s32 attributeIndex) {
}
void VideoOutDriver::Flip(const Request& req) {
// Whatever the game is rendering show splash if it is active
if (!presenter->ShowSplash(req.frame)) {
// Present the frame.
presenter->Present(req.frame);
}
// Present the frame.
presenter->Present(req.frame);
// Update flip status.
auto* port = req.port;
@ -193,17 +195,16 @@ void VideoOutDriver::Flip(const Request& req) {
}
}
// Reset flip label
if (req.index != -1) {
port->buffer_labels[req.index] = 0;
// Reset prev flip label
if (port->prev_index != -1) {
port->buffer_labels[port->prev_index] = 0;
port->SignalVoLabel();
}
// save to prev buf index
port->prev_index = req.index;
}
void VideoOutDriver::DrawBlankFrame() {
if (presenter->ShowSplash(nullptr)) {
return;
}
const auto empty_frame = presenter->PrepareBlankFrame(false);
presenter->Present(empty_frame);
}

View File

@ -32,6 +32,7 @@ struct VideoOutPort {
std::condition_variable vo_cv;
std::condition_variable vblank_cv;
int flip_rate = 0;
int prev_index = -1;
bool is_open = false;
bool is_mode_changing = false; // Used to prevent flip during mode change

View File

@ -295,10 +295,16 @@ s32 PS4_SYSV_ABI sceVideoOutUnregisterBuffers(s32 handle, s32 attributeIndex) {
return driver->UnregisterBuffers(port, attributeIndex);
}
void sceVideoOutGetBufferLabelAddress(s32 handle, uintptr_t* label_addr) {
s32 PS4_SYSV_ABI sceVideoOutGetBufferLabelAddress(s32 handle, uintptr_t* label_addr) {
if (label_addr == nullptr) {
return ORBIS_VIDEO_OUT_ERROR_INVALID_ADDRESS;
}
auto* port = driver->GetPort(handle);
ASSERT(port);
if (!port) {
return ORBIS_VIDEO_OUT_ERROR_INVALID_HANDLE;
}
*label_addr = reinterpret_cast<uintptr_t>(port->buffer_labels.data());
return 16;
}
s32 sceVideoOutSubmitEopFlip(s32 handle, u32 buf_id, u32 mode, u32 arg, void** unk) {
@ -360,7 +366,7 @@ s32 PS4_SYSV_ABI sceVideoOutAdjustColor(s32 handle, const SceVideoOutColorSettin
return ORBIS_VIDEO_OUT_ERROR_INVALID_HANDLE;
}
presenter->GetGammaRef() = settings->gamma;
presenter->GetPPSettingsRef().gamma = settings->gamma;
return ORBIS_OK;
}
@ -430,6 +436,8 @@ void RegisterLib(Core::Loader::SymbolsResolver* sym) {
sceVideoOutIsFlipPending);
LIB_FUNCTION("N5KDtkIjjJ4", "libSceVideoOut", 1, "libSceVideoOut", 0, 0,
sceVideoOutUnregisterBuffers);
LIB_FUNCTION("OcQybQejHEY", "libSceVideoOut", 1, "libSceVideoOut", 0, 0,
sceVideoOutGetBufferLabelAddress);
LIB_FUNCTION("uquVH4-Du78", "libSceVideoOut", 1, "libSceVideoOut", 0, 0, sceVideoOutClose);
LIB_FUNCTION("1FZBKy8HeNU", "libSceVideoOut", 1, "libSceVideoOut", 0, 0,
sceVideoOutGetVblankStatus);
@ -460,6 +468,8 @@ void RegisterLib(Core::Loader::SymbolsResolver* sym) {
sceVideoOutSetBufferAttribute);
LIB_FUNCTION("w3BY+tAEiQY", "libSceVideoOut", 1, "libSceVideoOut", 1, 1,
sceVideoOutRegisterBuffers);
LIB_FUNCTION("OcQybQejHEY", "libSceVideoOut", 1, "libSceVideoOut", 1, 1,
sceVideoOutGetBufferLabelAddress);
LIB_FUNCTION("U46NwOiJpys", "libSceVideoOut", 1, "libSceVideoOut", 1, 1, sceVideoOutSubmitFlip);
LIB_FUNCTION("SbU3dwp80lQ", "libSceVideoOut", 1, "libSceVideoOut", 1, 1,
sceVideoOutGetFlipStatus);

View File

@ -118,6 +118,7 @@ s32 PS4_SYSV_ABI sceVideoOutAddFlipEvent(Kernel::SceKernelEqueue eq, s32 handle,
s32 PS4_SYSV_ABI sceVideoOutAddVblankEvent(Kernel::SceKernelEqueue eq, s32 handle, void* udata);
s32 PS4_SYSV_ABI sceVideoOutRegisterBuffers(s32 handle, s32 startIndex, void* const* addresses,
s32 bufferNum, const BufferAttribute* attribute);
s32 PS4_SYSV_ABI sceVideoOutGetBufferLabelAddress(s32 handle, uintptr_t* label_addr);
s32 PS4_SYSV_ABI sceVideoOutSetFlipRate(s32 handle, s32 rate);
s32 PS4_SYSV_ABI sceVideoOutIsFlipPending(s32 handle);
s32 PS4_SYSV_ABI sceVideoOutWaitVblank(s32 handle);
@ -133,7 +134,6 @@ s32 PS4_SYSV_ABI sceVideoOutColorSettingsSetGamma(SceVideoOutColorSettings* sett
s32 PS4_SYSV_ABI sceVideoOutAdjustColor(s32 handle, const SceVideoOutColorSettings* settings);
// Internal system functions
void sceVideoOutGetBufferLabelAddress(s32 handle, uintptr_t* label_addr);
s32 sceVideoOutSubmitEopFlip(s32 handle, u32 buf_id, u32 mode, u32 arg, void** unk);
void RegisterLib(Core::Loader::SymbolsResolver* sym);

View File

@ -139,6 +139,35 @@ s32 Linker::LoadModule(const std::filesystem::path& elf_name, bool is_dynamic) {
return m_modules.size() - 1;
}
s32 Linker::LoadAndStartModule(const std::filesystem::path& path, u64 args, const void* argp,
int* pRes) {
u32 handle = FindByName(path);
if (handle != -1) {
return handle;
}
handle = LoadModule(path, true);
if (handle == -1) {
return -1;
}
auto* module = GetModule(handle);
RelocateAnyImports(module);
// If the new module has a TLS image, trigger its load when TlsGetAddr is called.
if (module->tls.image_size != 0) {
AdvanceGenerationCounter();
}
// Retrieve and verify proc param according to libkernel.
u64* param = module->GetProcParam<u64*>();
ASSERT_MSG(!param || param[0] >= 0x18, "Invalid module param size: {}", param[0]);
s32 ret = module->Start(args, argp, param);
if (pRes) {
*pRes = ret;
}
return handle;
}
Module* Linker::FindByAddress(VAddr address) {
for (auto& module : m_modules) {
const VAddr base = module->GetBaseAddress();

View File

@ -144,6 +144,8 @@ public:
void FreeTlsForNonPrimaryThread(void* pointer);
s32 LoadModule(const std::filesystem::path& elf_name, bool is_dynamic = false);
s32 LoadAndStartModule(const std::filesystem::path& path, u64 args, const void* argp,
int* pRes);
Module* FindByAddress(VAddr address);
void Relocate(Module* module);

View File

@ -94,7 +94,7 @@ Module::Module(Core::MemoryManager* memory_, const std::filesystem::path& file_,
Module::~Module() = default;
s32 Module::Start(size_t args, const void* argp, void* param) {
s32 Module::Start(u64 args, const void* argp, void* param) {
LOG_INFO(Core_Linker, "Module started : {}", name);
const VAddr addr = dynamic_info.init_virtual_addr + GetBaseAddress();
return ExecuteGuest(reinterpret_cast<EntryFunc>(addr), args, argp, param);

View File

@ -203,7 +203,7 @@ public:
return (rela_bits[index >> 3] >> (index & 7)) & 1;
}
s32 Start(size_t args, const void* argp, void* param);
s32 Start(u64 args, const void* argp, void* param);
void LoadModuleToMemory(u32& max_tls_index);
void LoadDynamicInfo();
void LoadSymbols();

View File

@ -24,7 +24,6 @@
#include "common/singleton.h"
#include "common/version.h"
#include "core/file_format/psf.h"
#include "core/file_format/splash.h"
#include "core/file_format/trp.h"
#include "core/file_sys/fs.h"
#include "core/libraries/disc_map/disc_map.h"
@ -81,7 +80,7 @@ void Emulator::Run(const std::filesystem::path& file, const std::vector<std::str
const auto eboot_name = file.filename().string();
auto game_folder = file.parent_path();
if (const auto game_folder_name = game_folder.filename().string();
game_folder_name.ends_with("-UPDATE")) {
game_folder_name.ends_with("-UPDATE") || game_folder_name.ends_with("-patch")) {
// If an executable was launched from a separate update directory,
// use the base game directory as the game folder.
const auto base_name = game_folder_name.substr(0, game_folder_name.size() - 7);
@ -185,12 +184,7 @@ void Emulator::Run(const std::filesystem::path& file, const std::vector<std::str
const auto pic1_path = mnt->GetHostPath("/app0/sce_sys/pic1.png");
if (std::filesystem::exists(pic1_path)) {
auto* splash = Common::Singleton<Splash>::Instance();
if (!splash->IsLoaded()) {
if (!splash->Open(pic1_path)) {
LOG_ERROR(Loader, "Game splash: unable to open file");
}
}
game_info.splash_path = pic1_path;
}
game_info.initialized = true;

BIN
src/images/KBM.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

BIN
src/images/trophy_icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -175,6 +175,7 @@ void WorkerLoop() {
auto texture = Vulkan::UploadTexture(pixels, vk::Format::eR8G8B8A8Unorm, width, height,
width * height * 4 * sizeof(stbi_uc));
stbi_image_free((void*)pixels);
core->upload_data = texture;
core->width = width;

View File

@ -7,7 +7,6 @@ BackgroundMusicPlayer::BackgroundMusicPlayer(QObject* parent) : QObject(parent)
m_mediaPlayer = new QMediaPlayer(this);
m_audioOutput = new QAudioOutput(this);
m_mediaPlayer->setAudioOutput(m_audioOutput);
m_mediaPlayer->setLoops(QMediaPlayer::Infinite);
}
void BackgroundMusicPlayer::setVolume(int volume) {
@ -16,7 +15,7 @@ void BackgroundMusicPlayer::setVolume(int volume) {
m_audioOutput->setVolume(linearVolume);
}
void BackgroundMusicPlayer::playMusic(const QString& snd0path) {
void BackgroundMusicPlayer::playMusic(const QString& snd0path, bool loops) {
if (snd0path.isEmpty()) {
stopMusic();
return;
@ -28,6 +27,12 @@ void BackgroundMusicPlayer::playMusic(const QString& snd0path) {
return;
}
if (loops) {
m_mediaPlayer->setLoops(QMediaPlayer::Infinite);
} else {
m_mediaPlayer->setLoops(1);
}
m_currentMusic = newMusic;
m_mediaPlayer->setSource(newMusic);
m_mediaPlayer->play();
@ -35,4 +40,5 @@ void BackgroundMusicPlayer::playMusic(const QString& snd0path) {
void BackgroundMusicPlayer::stopMusic() {
m_mediaPlayer->stop();
m_mediaPlayer->setSource(QUrl(""));
}

View File

@ -17,7 +17,7 @@ public:
}
void setVolume(int volume);
void playMusic(const QString& snd0path);
void playMusic(const QString& snd0path, bool loops = true);
void stopMusic();
private:

View File

@ -1082,7 +1082,11 @@ void CheatsPatches::addCheatsToLayout(const QJsonArray& modsArray, const QJsonAr
QLabel* creditsLabel = new QLabel();
QString creditsText = tr("Author: ");
if (!creditsArray.isEmpty()) {
creditsText += creditsArray[0].toString();
QStringList authors;
for (const QJsonValue& credit : creditsArray) {
authors << credit.toString();
}
creditsText += authors.join(", ");
}
creditsLabel->setText(creditsText);
creditsLabel->setAlignment(Qt::AlignLeft);

View File

@ -19,7 +19,7 @@
#include <QStandardPaths>
#include <QString>
#include <QStringList>
#include <QTextEdit>
#include <QTextBrowser>
#include <QVBoxLayout>
#include <common/config.h>
#include <common/path_util.h>
@ -247,7 +247,7 @@ void CheckUpdate::setupUI(const QString& downloadUrl, const QString& latestDate,
bool latest_isWIP = latestRev.endsWith("WIP", Qt::CaseInsensitive);
if (current_isWIP && !latest_isWIP) {
} else {
QTextEdit* textField = new QTextEdit(this);
QTextBrowser* textField = new QTextBrowser(this);
textField->setReadOnly(true);
textField->setFixedWidth(500);
textField->setFixedHeight(200);
@ -349,8 +349,28 @@ void CheckUpdate::requestChangelog(const QString& currentRev, const QString& lat
}
// Update the text field with the changelog
QTextEdit* textField = findChild<QTextEdit*>();
QTextBrowser* textField = findChild<QTextBrowser*>();
if (textField) {
QRegularExpression re("\\(\\#(\\d+)\\)");
QString newChanges;
int lastIndex = 0;
QRegularExpressionMatchIterator i = re.globalMatch(changes);
while (i.hasNext()) {
QRegularExpressionMatch match = i.next();
newChanges += changes.mid(lastIndex, match.capturedStart() - lastIndex);
QString num = match.captured(1);
newChanges +=
QString(
"(<a "
"href=\"https://github.com/shadps4-emu/shadPS4/pull/%1\">#%1</a>)")
.arg(num);
lastIndex = match.capturedEnd();
}
newChanges += changes.mid(lastIndex);
changes = newChanges;
textField->setOpenExternalLinks(true);
textField->setHtml("<h2>" + tr("Changes") + ":</h2>" + changes);
}

View File

@ -78,25 +78,38 @@ void CompatibilityInfoClass::UpdateCompatibilityDatabase(QWidget* parent, bool f
CompatibilityEntry CompatibilityInfoClass::GetCompatibilityInfo(const std::string& serial) {
QString title_id = QString::fromStdString(serial);
if (m_compatibility_database.contains(title_id)) {
{
QJsonObject compatibility_obj = m_compatibility_database[title_id].toObject();
for (int os_int = 0; os_int != static_cast<int>(OSType::Last); os_int++) {
QString os_string = OSTypeToString.at(static_cast<OSType>(os_int));
if (compatibility_obj.contains(os_string)) {
QJsonObject compatibility_entry_obj = compatibility_obj[os_string].toObject();
CompatibilityEntry compatibility_entry{
LabelToCompatStatus.at(compatibility_entry_obj["status"].toString()),
compatibility_entry_obj["version"].toString(),
QDateTime::fromString(compatibility_entry_obj["last_tested"].toString(),
Qt::ISODate),
compatibility_entry_obj["url"].toString(),
compatibility_entry_obj["issue_number"].toString()};
return compatibility_entry;
}
}
QJsonObject compatibility_obj = m_compatibility_database[title_id].toObject();
// Set current_os automatically
QString current_os;
#ifdef Q_OS_WIN
current_os = "os-windows";
#elif defined(Q_OS_MAC)
current_os = "os-macOS";
#elif defined(Q_OS_LINUX)
current_os = "os-linux";
#else
current_os = "os-unknown";
#endif
// Check if the game is compatible with the current operating system
if (compatibility_obj.contains(current_os)) {
QJsonObject compatibility_entry_obj = compatibility_obj[current_os].toObject();
CompatibilityEntry compatibility_entry{
LabelToCompatStatus.at(compatibility_entry_obj["status"].toString()),
compatibility_entry_obj["version"].toString(),
QDateTime::fromString(compatibility_entry_obj["last_tested"].toString(),
Qt::ISODate),
compatibility_entry_obj["url"].toString(),
compatibility_entry_obj["issue_number"].toString()};
return compatibility_entry;
} else {
// If there is no entry for the current operating system, return "Unknown"
return CompatibilityEntry{CompatibilityStatus::Unknown, "",
QDateTime::currentDateTime(), "", 0};
}
}
// If title not found, return "Unknown"
return CompatibilityEntry{CompatibilityStatus::Unknown, "", QDateTime::currentDateTime(), "",
0};
}

View File

@ -28,6 +28,11 @@ ControlSettings::ControlSettings(std::shared_ptr<GameInfoClass> game_info_get, Q
}
});
ui->buttonBox->button(QDialogButtonBox::Save)->setText(tr("Save"));
ui->buttonBox->button(QDialogButtonBox::Apply)->setText(tr("Apply"));
ui->buttonBox->button(QDialogButtonBox::RestoreDefaults)->setText(tr("Restore Defaults"));
ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel"));
connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &QWidget::close);
connect(ui->ProfileComboBox, &QComboBox::currentTextChanged, this, [this] {
@ -100,8 +105,8 @@ void ControlSettings::SaveControllerConfig(bool CloseOnSave) {
if (count_axis_left_x > 1 | count_axis_left_y > 1 | count_axis_right_x > 1 |
count_axis_right_y > 1) {
QMessageBox::StandardButton nosave;
nosave = QMessageBox::information(this, "Unable to Save",
"Cannot bind axis values more than once");
nosave = QMessageBox::information(this, tr("Unable to Save"),
tr("Cannot bind axis values more than once"));
return;
}

View File

@ -20,7 +20,7 @@ void ScanDirectoryRecursively(const QString& dir, QStringList& filePaths, int cu
QFileInfoList entries = directory.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
for (const auto& entry : entries) {
if (entry.fileName().endsWith("-UPDATE")) {
if (entry.fileName().endsWith("-UPDATE") || entry.fileName().endsWith("-patch")) {
continue;
}

View File

@ -34,6 +34,12 @@ public:
game_update_path += "-UPDATE";
if (std::filesystem::exists(game_update_path / "sce_sys" / "param.sfo")) {
sce_folder_path = game_update_path / "sce_sys" / "param.sfo";
} else {
game_update_path = filePath;
game_update_path += "-patch";
if (std::filesystem::exists(game_update_path / "sce_sys" / "param.sfo")) {
sce_folder_path = game_update_path / "sce_sys" / "param.sfo";
}
}
PSF psf;

View File

@ -10,8 +10,10 @@
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <qt_gui/background_music_player.h>
#include "cheats_patches.h"
#include "common/config.h"
#include "common/path_util.h"
#include "common/version.h"
#include "compatibility_info.h"
#include "game_info.h"
@ -25,12 +27,11 @@
#include <shobjidl.h>
#include <wrl/client.h>
#endif
#include "common/path_util.h"
class GuiContextMenus : public QObject {
Q_OBJECT
public:
void RequestGameMenu(const QPoint& pos, QVector<GameInfo> m_games,
void RequestGameMenu(const QPoint& pos, QVector<GameInfo>& m_games,
std::shared_ptr<CompatibilityInfoClass> m_compat_info,
QTableWidget* widget, bool isList) {
QPoint global_pos = widget->viewport()->mapToGlobal(pos);
@ -97,11 +98,13 @@ public:
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);
QAction* deleteTrophy = new QAction(tr("Delete Trophy"), widget);
deleteMenu->addAction(deleteGame);
deleteMenu->addAction(deleteUpdate);
deleteMenu->addAction(deleteSaveData);
deleteMenu->addAction(deleteDLC);
deleteMenu->addAction(deleteTrophy);
menu.addMenu(deleteMenu);
@ -113,7 +116,9 @@ public:
compatibilityMenu->addAction(updateCompatibility);
compatibilityMenu->addAction(viewCompatibilityReport);
compatibilityMenu->addAction(submitCompatibilityReport);
if (Common::isRelease) {
compatibilityMenu->addAction(submitCompatibilityReport);
}
menu.addMenu(compatibilityMenu);
@ -137,8 +142,12 @@ public:
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!")));
Common::FS::PathToQString(open_update_path, m_games[itemID].path);
open_update_path += "-patch";
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));
}
@ -155,10 +164,54 @@ public:
}
if (selected == openLogFolder) {
QString userPath;
Common::FS::PathToQString(userPath,
Common::FS::GetUserPath(Common::FS::PathType::UserDir));
QDesktopServices::openUrl(QUrl::fromLocalFile(userPath + "/log"));
QString logPath;
Common::FS::PathToQString(logPath,
Common::FS::GetUserPath(Common::FS::PathType::LogDir));
if (!Config::getSeparateLogFilesEnabled()) {
QDesktopServices::openUrl(QUrl::fromLocalFile(logPath));
} else {
QString fileName = QString::fromStdString(m_games[itemID].serial) + ".log";
QString filePath = logPath + "/" + fileName;
QStringList arguments;
if (QFile::exists(filePath)) {
#ifdef Q_OS_WIN
arguments << "/select," << filePath.replace("/", "\\");
QProcess::startDetached("explorer", arguments);
#elif defined(Q_OS_MAC)
arguments << "-R" << filePath;
QProcess::startDetached("open", arguments);
#elif defined(Q_OS_LINUX)
QStringList arguments;
arguments << "--select" << filePath;
if (!QProcess::startDetached("nautilus", arguments)) {
// Failed to open Nautilus to select file
arguments.clear();
arguments << logPath;
if (!QProcess::startDetached("xdg-open", arguments)) {
// Failed to open directory on Linux
}
}
#else
QDesktopServices::openUrl(QUrl::fromLocalFile(logPath));
#endif
} else {
QMessageBox msgBox;
msgBox.setIcon(QMessageBox::Information);
msgBox.setText(tr("No log file found for this game!"));
QPushButton* okButton = msgBox.addButton(QMessageBox::Ok);
QPushButton* openFolderButton =
msgBox.addButton(tr("Open Log Folder"), QMessageBox::ActionRole);
msgBox.exec();
if (msgBox.clickedButton() == openFolderButton) {
QDesktopServices::openUrl(QUrl::fromLocalFile(logPath));
}
}
}
}
if (selected == &openSfoViewer) {
@ -169,6 +222,12 @@ public:
game_update_path += "-UPDATE";
if (std::filesystem::exists(game_update_path)) {
game_folder_path = game_update_path;
} else {
game_update_path = game_folder_path;
game_update_path += "-patch";
if (std::filesystem::exists(game_update_path)) {
game_folder_path = game_update_path;
}
}
if (psf.Open(game_folder_path / "sce_sys" / "param.sfo")) {
int rows = psf.GetEntries().size();
@ -265,8 +324,40 @@ public:
game_update_path += "-UPDATE";
if (std::filesystem::exists(game_update_path)) {
Common::FS::PathToQString(gameTrpPath, game_update_path);
} else {
game_update_path = Common::FS::PathFromQString(gameTrpPath);
game_update_path += "-patch";
if (std::filesystem::exists(game_update_path)) {
Common::FS::PathToQString(gameTrpPath, game_update_path);
}
}
TrophyViewer* trophyViewer = new TrophyViewer(trophyPath, gameTrpPath);
// Array with all games and their trophy information
QVector<TrophyGameInfo> allTrophyGames;
for (const auto& game : m_games) {
TrophyGameInfo gameInfo;
gameInfo.name = QString::fromStdString(game.name);
Common::FS::PathToQString(gameInfo.trophyPath, game.serial);
Common::FS::PathToQString(gameInfo.gameTrpPath, game.path);
auto update_path = Common::FS::PathFromQString(gameInfo.gameTrpPath);
update_path += "-UPDATE";
if (std::filesystem::exists(update_path)) {
Common::FS::PathToQString(gameInfo.gameTrpPath, update_path);
} else {
update_path = Common::FS::PathFromQString(gameInfo.gameTrpPath);
update_path += "-patch";
if (std::filesystem::exists(update_path)) {
Common::FS::PathToQString(gameInfo.gameTrpPath, update_path);
}
}
allTrophyGames.append(gameInfo);
}
QString gameName = QString::fromStdString(m_games[itemID].name);
TrophyViewer* trophyViewer =
new TrophyViewer(trophyPath, gameTrpPath, gameName, allTrophyGames);
trophyViewer->show();
connect(widget->parent(), &QWidget::destroyed, trophyViewer,
[trophyViewer]() { trophyViewer->deleteLater(); });
@ -380,20 +471,31 @@ public:
}
if (selected == deleteGame || selected == deleteUpdate || selected == deleteDLC ||
selected == deleteSaveData) {
selected == deleteSaveData || selected == deleteTrophy) {
bool error = false;
QString folder_path, game_update_path, dlc_path, save_data_path;
QString folder_path, game_update_path, dlc_path, save_data_path, trophy_data_path;
Common::FS::PathToQString(folder_path, m_games[itemID].path);
game_update_path = folder_path + "-UPDATE";
if (!std::filesystem::exists(Common::FS::PathFromQString(game_update_path))) {
game_update_path = folder_path + "-patch";
}
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) {
Common::FS::PathToQString(trophy_data_path,
Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) /
m_games[itemID].serial / "TrophyFiles");
QString message_type;
if (selected == deleteGame) {
BackgroundMusicPlayer::getInstance().stopMusic();
message_type = tr("Game");
} else if (selected == deleteUpdate) {
if (!std::filesystem::exists(Common::FS::PathFromQString(game_update_path))) {
QMessageBox::critical(nullptr, tr("Error"),
QString(tr("This game has no update to delete!")));
@ -420,6 +522,16 @@ public:
folder_path = save_data_path;
message_type = tr("Save Data");
}
} else if (selected == deleteTrophy) {
if (!std::filesystem::exists(Common::FS::PathFromQString(trophy_data_path))) {
QMessageBox::critical(
nullptr, tr("Error"),
QString(tr("This game has no saved trophies to delete!")));
error = true;
} else {
folder_path = trophy_data_path;
message_type = tr("Trophy");
}
}
if (!error) {
QString gameName = QString::fromStdString(m_games[itemID].name);
@ -456,7 +568,7 @@ public:
"title", QString("%1 - %2").arg(QString::fromStdString(m_games[itemID].serial),
QString::fromStdString(m_games[itemID].name)));
query.addQueryItem("game-name", QString::fromStdString(m_games[itemID].name));
query.addQueryItem("game-code", QString::fromStdString(m_games[itemID].serial));
query.addQueryItem("game-serial", QString::fromStdString(m_games[itemID].serial));
query.addQueryItem("game-version", QString::fromStdString(m_games[itemID].version));
query.addQueryItem("emulator-version", QString(Common::VERSION));
url.setQuery(query);

View File

@ -28,7 +28,7 @@ HelpDialog* helpDialog;
EditorDialog::EditorDialog(QWidget* parent) : QDialog(parent) {
setWindowTitle("Edit Keyboard + Mouse and Controller input bindings");
setWindowTitle(tr("Edit Keyboard + Mouse and Controller input bindings"));
resize(600, 400);
// Create the editor widget
@ -42,7 +42,7 @@ EditorDialog::EditorDialog(QWidget* parent) : QDialog(parent) {
// Load all installed games
loadInstalledGames();
QCheckBox* unifiedInputCheckBox = new QCheckBox("Use Per-Game configs", this);
QCheckBox* unifiedInputCheckBox = new QCheckBox(tr("Use Per-Game configs"), this);
unifiedInputCheckBox->setChecked(!Config::GetUseUnifiedInputConfig());
// Connect checkbox signal
@ -94,7 +94,7 @@ void EditorDialog::loadFile(QString game) {
originalConfig = editor->toPlainText();
file.close();
} else {
QMessageBox::warning(this, "Error", "Could not open the file for reading");
QMessageBox::warning(this, tr("Error"), tr("Could not open the file for reading"));
}
}
@ -108,7 +108,7 @@ void EditorDialog::saveFile(QString game) {
out << editor->toPlainText();
file.close();
} else {
QMessageBox::warning(this, "Error", "Could not open the file for writing");
QMessageBox::warning(this, tr("Error"), tr("Could not open the file for writing"));
}
}
@ -121,7 +121,7 @@ void EditorDialog::closeEvent(QCloseEvent* event) {
}
if (hasUnsavedChanges()) {
QMessageBox::StandardButton reply;
reply = QMessageBox::question(this, "Save Changes", "Do you want to save changes?",
reply = QMessageBox::question(this, tr("Save Changes"), tr("Do you want to save changes?"),
QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);
if (reply == QMessageBox::Yes) {
@ -168,7 +168,7 @@ void EditorDialog::onCancelClicked() {
void EditorDialog::onHelpClicked() {
if (!isHelpOpen) {
helpDialog = new HelpDialog(&isHelpOpen, this);
helpDialog->setWindowTitle("Help");
helpDialog->setWindowTitle(tr("Help"));
helpDialog->setAttribute(Qt::WA_DeleteOnClose); // Clean up on close
// Get the position and size of the Config window
QRect configGeometry = this->geometry();
@ -188,10 +188,10 @@ void EditorDialog::onResetToDefaultClicked() {
bool default_default = gameComboBox->currentText() == "default";
QString prompt =
default_default
? "Do you want to reset your custom default config to the original default config?"
: "Do you want to reset this config to your custom default config?";
QMessageBox::StandardButton reply =
QMessageBox::question(this, "Reset to Default", prompt, QMessageBox::Yes | QMessageBox::No);
? tr("Do you want to reset your custom default config to the original default config?")
: tr("Do you want to reset this config to your custom default config?");
QMessageBox::StandardButton reply = QMessageBox::question(this, tr("Reset to Default"), prompt,
QMessageBox::Yes | QMessageBox::No);
if (reply == QMessageBox::Yes) {
if (default_default) {
@ -206,7 +206,7 @@ void EditorDialog::onResetToDefaultClicked() {
editor->setPlainText(in.readAll());
file.close();
} else {
QMessageBox::warning(this, "Error", "Could not open the file for reading");
QMessageBox::warning(this, tr("Error"), tr("Could not open the file for reading"));
}
// saveFile(gameComboBox->currentText());
}
@ -225,7 +225,8 @@ void EditorDialog::loadInstalledGames() {
QDir parentFolder(installDir);
QFileInfoList fileList = parentFolder.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
for (const auto& fileInfo : fileList) {
if (fileInfo.isDir() && !fileInfo.filePath().endsWith("-UPDATE")) {
if (fileInfo.isDir() && (!fileInfo.filePath().endsWith("-UPDATE") ||
!fileInfo.filePath().endsWith("-patch"))) {
gameComboBox->addItem(fileInfo.fileName()); // Add game name to combo box
}
}

1050
src/qt_gui/kbm_gui.cpp Normal file

File diff suppressed because it is too large Load Diff

56
src/qt_gui/kbm_gui.h Normal file
View File

@ -0,0 +1,56 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include <QDialog>
#include "game_info.h"
namespace Ui {
class KBMSettings;
}
class KBMSettings : public QDialog {
Q_OBJECT
public:
explicit KBMSettings(std::shared_ptr<GameInfoClass> game_info_get, QWidget* parent = nullptr);
~KBMSettings();
private Q_SLOTS:
void SaveKBMConfig(bool CloseOnSave);
void SetDefault();
void CheckMapping(QPushButton*& button);
void StartTimer(QPushButton*& button);
void onHelpClicked();
private:
std::unique_ptr<Ui::KBMSettings> ui;
std::shared_ptr<GameInfoClass> m_game_info;
bool eventFilter(QObject* obj, QEvent* event) override;
void ButtonConnects();
void SetUIValuestoMappings(std::string config_id);
void GetGameTitle();
void DisableMappingButtons();
void EnableMappingButtons();
void SetMapping(QString input);
bool EnableMapping = false;
bool MappingCompleted = false;
bool HelpWindowOpen = false;
QString mapping;
QString modifier;
int MappingTimer;
QTimer* timer;
QPushButton* MappingButton;
QList<QPushButton*> ButtonsList;
std::string config_id;
const std::vector<std::string> ControllerInputs = {
"cross", "circle", "square", "triangle", "l1",
"r1", "l2", "r2", "l3",
"r3", "options", "pad_up",
"pad_down",
"pad_left", "pad_right", "axis_left_x", "axis_left_y", "axis_right_x",
"axis_right_y", "back"};
};

1942
src/qt_gui/kbm_gui.ui Normal file

File diff suppressed because it is too large Load Diff

View File

@ -77,11 +77,11 @@ HelpDialog::HelpDialog(bool* open_flag, QWidget* parent) : QDialog(parent) {
QVBoxLayout* containerLayout = new QVBoxLayout(containerWidget);
// Add expandable sections to container layout
auto* quickstartSection = new ExpandableSection("Quickstart", quickstart());
auto* faqSection = new ExpandableSection("FAQ", faq());
auto* syntaxSection = new ExpandableSection("Syntax", syntax());
auto* specialSection = new ExpandableSection("Special Bindings", special());
auto* bindingsSection = new ExpandableSection("Keybindings", bindings());
auto* quickstartSection = new ExpandableSection(tr("Quickstart"), quickstart());
auto* faqSection = new ExpandableSection(tr("FAQ"), faq());
auto* syntaxSection = new ExpandableSection(tr("Syntax"), syntax());
auto* specialSection = new ExpandableSection(tr("Special Bindings"), special());
auto* bindingsSection = new ExpandableSection(tr("Keybindings"), bindings());
containerLayout->addWidget(quickstartSection);
containerLayout->addWidget(faqSection);

View File

@ -157,8 +157,13 @@ int main(int argc, char* argv[]) {
}
}
bool allInstallDirsDisabled =
std::all_of(Config::getGameInstallDirsEnabled().begin(),
Config::getGameInstallDirsEnabled().end(), [](bool val) { return !val; });
// If no game directory is set and no command line argument, prompt for it
if (Config::getGameInstallDirs().empty() && !has_command_line_argument) {
if (Config::getGameInstallDirs().empty() && allInstallDirsDisabled &&
!has_command_line_argument) {
GameInstallDialog dlg;
dlg.exec();
}

View File

@ -21,11 +21,10 @@
#include "core/loader.h"
#include "game_install_dialog.h"
#include "install_dir_select.h"
#include "kbm_gui.h"
#include "main_window.h"
#include "settings_dialog.h"
#include "kbm_config_dialog.h"
#include "video_core/renderer_vulkan/vk_instance.h"
#ifdef ENABLE_DISCORD_RPC
#include "common/discord_rpc_handler.h"
@ -348,14 +347,13 @@ void MainWindow::CreateConnects() {
settingsDialog->exec();
});
// this is the editor for kbm keybinds
connect(ui->controllerButton, &QPushButton::clicked, this, [this]() {
auto configWindow = new ControlSettings(m_game_info, this);
configWindow->exec();
});
connect(ui->keyboardButton, &QPushButton::clicked, this, [this]() {
auto kbmWindow = new EditorDialog(this);
auto kbmWindow = new KBMSettings(m_game_info, this);
kbmWindow->exec();
});
@ -595,6 +593,60 @@ void MainWindow::CreateConnects() {
pkgViewer->show();
});
// Trophy Viewer
connect(ui->trophyViewerAct, &QAction::triggered, this, [this]() {
if (m_game_info->m_games.empty()) {
QMessageBox::information(
this, tr("Trophy Viewer"),
tr("No games found. Please add your games to your library first."));
return;
}
const auto& firstGame = m_game_info->m_games[0];
QString trophyPath, gameTrpPath;
Common::FS::PathToQString(trophyPath, firstGame.serial);
Common::FS::PathToQString(gameTrpPath, firstGame.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);
} else {
game_update_path = Common::FS::PathFromQString(gameTrpPath);
game_update_path += "-patch";
if (std::filesystem::exists(game_update_path)) {
Common::FS::PathToQString(gameTrpPath, game_update_path);
}
}
QVector<TrophyGameInfo> allTrophyGames;
for (const auto& game : m_game_info->m_games) {
TrophyGameInfo gameInfo;
gameInfo.name = QString::fromStdString(game.name);
Common::FS::PathToQString(gameInfo.trophyPath, game.serial);
Common::FS::PathToQString(gameInfo.gameTrpPath, game.path);
auto update_path = Common::FS::PathFromQString(gameInfo.gameTrpPath);
update_path += "-UPDATE";
if (std::filesystem::exists(update_path)) {
Common::FS::PathToQString(gameInfo.gameTrpPath, update_path);
} else {
update_path = Common::FS::PathFromQString(gameInfo.gameTrpPath);
update_path += "-patch";
if (std::filesystem::exists(update_path)) {
Common::FS::PathToQString(gameInfo.gameTrpPath, update_path);
}
}
allTrophyGames.append(gameInfo);
}
QString gameName = QString::fromStdString(firstGame.name);
TrophyViewer* trophyViewer =
new TrophyViewer(trophyPath, gameTrpPath, gameName, allTrophyGames);
trophyViewer->show();
});
// Themes
connect(ui->setThemeDark, &QAction::triggered, &m_window_themes, [this]() {
m_window_themes.SetWindowTheme(Theme::Dark, ui->mw_searchbar);
@ -842,7 +894,7 @@ void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int
// Default paths
auto game_folder_path = game_install_dir / pkg.GetTitleID();
auto game_update_path = use_game_update ? game_folder_path.parent_path() /
(std::string{pkg.GetTitleID()} + "-UPDATE")
(std::string{pkg.GetTitleID()} + "-patch")
: game_folder_path;
const int max_depth = 5;
@ -853,7 +905,7 @@ void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int
if (found_game.has_value()) {
game_folder_path = found_game.value().parent_path();
game_update_path = use_game_update ? game_folder_path.parent_path() /
(std::string{pkg.GetTitleID()} + "-UPDATE")
(std::string{pkg.GetTitleID()} + "-patch")
: game_folder_path;
}
} else {
@ -868,7 +920,7 @@ void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int
game_folder_path = game_install_dir / pkg.GetTitleID();
}
game_update_path = use_game_update ? game_folder_path.parent_path() /
(std::string{pkg.GetTitleID()} + "-UPDATE")
(std::string{pkg.GetTitleID()} + "-patch")
: game_folder_path;
}
@ -1171,6 +1223,7 @@ void MainWindow::SetUiIcons(bool isWhite) {
ui->refreshGameListAct->setIcon(RecolorIcon(ui->refreshGameListAct->icon(), isWhite));
ui->menuGame_List_Mode->setIcon(RecolorIcon(ui->menuGame_List_Mode->icon(), isWhite));
ui->pkgViewerAct->setIcon(RecolorIcon(ui->pkgViewerAct->icon(), isWhite));
ui->trophyViewerAct->setIcon(RecolorIcon(ui->trophyViewerAct->icon(), isWhite));
ui->configureAct->setIcon(RecolorIcon(ui->configureAct->icon(), isWhite));
ui->addElfFolderAct->setIcon(RecolorIcon(ui->addElfFolderAct->icon(), isWhite));
}

View File

@ -27,6 +27,7 @@ public:
QAction* downloadCheatsPatchesAct;
QAction* dumpGameListAct;
QAction* pkgViewerAct;
QAction* trophyViewerAct;
#ifdef ENABLE_UPDATER
QAction* updaterAct;
#endif
@ -139,6 +140,10 @@ public:
pkgViewerAct = new QAction(MainWindow);
pkgViewerAct->setObjectName("pkgViewer");
pkgViewerAct->setIcon(QIcon(":images/file_icon.png"));
trophyViewerAct = new QAction(MainWindow);
trophyViewerAct->setObjectName("trophyViewer");
trophyViewerAct->setIcon(QIcon(":images/trophy_icon.png"));
#ifdef ENABLE_UPDATER
updaterAct = new QAction(MainWindow);
updaterAct->setObjectName("updaterAct");
@ -321,6 +326,7 @@ public:
menuUtils->addAction(downloadCheatsPatchesAct);
menuUtils->addAction(dumpGameListAct);
menuUtils->addAction(pkgViewerAct);
menuUtils->addAction(trophyViewerAct);
#ifdef ENABLE_UPDATER
menuHelp->addAction(updaterAct);
#endif
@ -379,6 +385,8 @@ public:
dumpGameListAct->setText(
QCoreApplication::translate("MainWindow", "Dump Game List", nullptr));
pkgViewerAct->setText(QCoreApplication::translate("MainWindow", "PKG Viewer", nullptr));
trophyViewerAct->setText(
QCoreApplication::translate("MainWindow", "Trophy Viewer", nullptr));
mw_searchbar->setPlaceholderText(
QCoreApplication::translate("MainWindow", "Search...", nullptr));
menuFile->setTitle(QCoreApplication::translate("MainWindow", "File", nullptr));

View File

@ -5,6 +5,7 @@
#include <QDirIterator>
#include <QFileDialog>
#include <QHoverEvent>
#include <QMessageBox>
#include <fmt/format.h>
#include "common/config.h"
@ -225,6 +226,17 @@ SettingsDialog::SettingsDialog(std::span<const QString> physical_devices,
Config::setShowBackgroundImage(state == Qt::Checked);
});
}
// User TAB
{
connect(ui->OpenCustomTrophyLocationButton, &QPushButton::clicked, this, []() {
QString userPath;
Common::FS::PathToQString(userPath,
Common::FS::GetUserPath(Common::FS::PathType::CustomTrophy));
QDesktopServices::openUrl(QUrl::fromLocalFile(userPath));
});
}
// Input TAB
{
connect(ui->hideCursorComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
@ -234,12 +246,13 @@ SettingsDialog::SettingsDialog(std::span<const QString> physical_devices,
// PATH TAB
{
connect(ui->addFolderButton, &QPushButton::clicked, this, [this]() {
const auto config_dir = Config::getGameInstallDirs();
QString file_path_string =
QFileDialog::getExistingDirectory(this, tr("Directory to install games"));
auto file_path = Common::FS::PathFromQString(file_path_string);
if (!file_path.empty() && Config::addGameInstallDir(file_path)) {
if (!file_path.empty() && Config::addGameInstallDir(file_path, true)) {
QListWidgetItem* item = new QListWidgetItem(file_path_string);
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
item->setCheckState(Qt::Checked);
ui->gameFoldersListWidget->addItem(item);
}
});
@ -273,6 +286,21 @@ SettingsDialog::SettingsDialog(std::span<const QString> physical_devices,
ui->currentSaveDataPath->setText(save_data_path_string);
}
});
connect(ui->PortableUserButton, &QPushButton::clicked, this, []() {
QString userDir;
Common::FS::PathToQString(userDir, std::filesystem::current_path() / "user");
if (std::filesystem::exists(std::filesystem::current_path() / "user")) {
QMessageBox::information(NULL, tr("Cannot create portable user folder"),
tr("%1 already exists").arg(userDir));
} else {
std::filesystem::copy(Common::FS::GetUserPath(Common::FS::PathType::UserDir),
std::filesystem::current_path() / "user",
std::filesystem::copy_options::recursive);
QMessageBox::information(NULL, tr("Portable user folder created"),
tr("%1 successfully created.").arg(userDir));
}
});
}
// DEBUG TAB
@ -280,8 +308,8 @@ SettingsDialog::SettingsDialog(std::span<const QString> physical_devices,
connect(ui->OpenLogLocationButton, &QPushButton::clicked, this, []() {
QString userPath;
Common::FS::PathToQString(userPath,
Common::FS::GetUserPath(Common::FS::PathType::UserDir));
QDesktopServices::openUrl(QUrl::fromLocalFile(userPath + "/log"));
Common::FS::GetUserPath(Common::FS::PathType::LogDir));
QDesktopServices::openUrl(QUrl::fromLocalFile(userPath));
});
}
@ -308,6 +336,9 @@ SettingsDialog::SettingsDialog(std::span<const QString> physical_devices,
ui->checkCompatibilityOnStartupCheckBox->installEventFilter(this);
ui->updateCompatibilityButton->installEventFilter(this);
// User
ui->OpenCustomTrophyLocationButton->installEventFilter(this);
// Input
ui->hideCursorGroupBox->installEventFilter(this);
ui->idleTimeoutGroupBox->installEventFilter(this);
@ -330,6 +361,7 @@ SettingsDialog::SettingsDialog(std::span<const QString> physical_devices,
ui->saveDataGroupBox->installEventFilter(this);
ui->currentSaveDataPath->installEventFilter(this);
ui->browseButton->installEventFilter(this);
ui->PortableUserFolderGroupBox->installEventFilter(this);
// Debug
ui->debugDump->installEventFilter(this);
@ -399,10 +431,19 @@ void SettingsDialog::LoadValuesFromConfig() {
ui->vblankSpinBox->setValue(toml::find_or<int>(data, "GPU", "vblankDivider", 1));
ui->dumpShadersCheckBox->setChecked(toml::find_or<bool>(data, "GPU", "dumpShaders", false));
ui->nullGpuCheckBox->setChecked(toml::find_or<bool>(data, "GPU", "nullGpu", false));
ui->enableHDRCheckBox->setChecked(toml::find_or<bool>(data, "General", "allowHDR", false));
ui->enableHDRCheckBox->setChecked(toml::find_or<bool>(data, "GPU", "allowHDR", false));
ui->playBGMCheckBox->setChecked(toml::find_or<bool>(data, "General", "playBGM", false));
ui->disableTrophycheckBox->setChecked(
toml::find_or<bool>(data, "General", "isTrophyPopupDisabled", false));
ui->popUpDurationSpinBox->setValue(Config::getTrophyNotificationDuration());
QString side = QString::fromStdString(Config::sideTrophy());
ui->radioButton_Left->setChecked(side == "left");
ui->radioButton_Right->setChecked(side == "right");
ui->radioButton_Top->setChecked(side == "top");
ui->radioButton_Bottom->setChecked(side == "bottom");
ui->BGMVolumeSlider->setValue(toml::find_or<int>(data, "General", "BGMvolume", 50));
ui->discordRPCCheckbox->setChecked(
toml::find_or<bool>(data, "General", "enableDiscordRPC", true));
@ -593,6 +634,11 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) {
text = tr("Update Compatibility Database:\\nImmediately update the compatibility database.");
}
//User
if (elementName == "OpenCustomTrophyLocationButton") {
text = tr("Open the custom trophy images/sounds folder:\\nYou can add custom images to the trophies and an audio.\\nAdd the files to custom_trophy with the following names:\\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\\nNote: The sound will only work in QT versions.");
}
// Input
if (elementName == "hideCursorGroupBox") {
text = tr("Hide Cursor:\\nChoose when the cursor will disappear:\\nNever: You will always see the mouse.\\nidle: Set a time for it to disappear after being idle.\\nAlways: you will never see the mouse.");
@ -622,6 +668,8 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) {
text = tr("Add:\\nAdd a folder to the list.");
} else if (elementName == "removeFolderButton") {
text = tr("Remove:\\nRemove a folder from the list.");
} else if (elementName == "PortableUserFolderGroupBox") {
text = tr("Portable user folder:\\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.");
}
// Save Data
@ -683,6 +731,18 @@ void SettingsDialog::UpdateSettings() {
screenModeMap.value(ui->displayModeComboBox->currentText()).toStdString());
Config::setIsMotionControlsEnabled(ui->motionControlsCheckBox->isChecked());
Config::setisTrophyPopupDisabled(ui->disableTrophycheckBox->isChecked());
Config::setTrophyNotificationDuration(ui->popUpDurationSpinBox->value());
if (ui->radioButton_Top->isChecked()) {
Config::setSideTrophy("top");
} else if (ui->radioButton_Left->isChecked()) {
Config::setSideTrophy("left");
} else if (ui->radioButton_Right->isChecked()) {
Config::setSideTrophy("right");
} else if (ui->radioButton_Bottom->isChecked()) {
Config::setSideTrophy("bottom");
}
Config::setPlayBGM(ui->playBGMCheckBox->isChecked());
Config::setAllowHDR(ui->enableHDRCheckBox->isChecked());
Config::setLogType(logTypeMap.value(ui->logTypeComboBox->currentText()).toStdString());
@ -724,6 +784,17 @@ void SettingsDialog::UpdateSettings() {
emit BackgroundOpacityChanged(ui->backgroundImageOpacitySlider->value());
Config::setShowBackgroundImage(ui->showBackgroundImageCheckBox->isChecked());
std::vector<Config::GameInstallDir> dirs_with_states;
for (int i = 0; i < ui->gameFoldersListWidget->count(); i++) {
QListWidgetItem* item = ui->gameFoldersListWidget->item(i);
QString path_string = item->text();
auto path = Common::FS::PathFromQString(path_string);
bool enabled = (item->checkState() == Qt::Checked);
dirs_with_states.push_back({path, enabled});
}
Config::setAllGameInstallDirs(dirs_with_states);
#ifdef ENABLE_DISCORD_RPC
auto* rpc = Common::Singleton<DiscordRPCHandler::RPC>::Instance();
if (Config::getEnableDiscordRPC()) {
@ -738,6 +809,7 @@ void SettingsDialog::UpdateSettings() {
}
void SettingsDialog::ResetInstallFolders() {
ui->gameFoldersListWidget->clear();
std::filesystem::path userdir = Common::FS::GetUserPath(Common::FS::PathType::UserDir);
const toml::value data = toml::parse(userdir / "config.toml");
@ -746,21 +818,36 @@ void SettingsDialog::ResetInstallFolders() {
const toml::value& gui = data.at("GUI");
const auto install_dir_array =
toml::find_or<std::vector<std::string>>(gui, "installDirs", {});
std::vector<std::filesystem::path> settings_install_dirs_config = {};
for (const auto& dir : install_dir_array) {
if (std::find(settings_install_dirs_config.begin(), settings_install_dirs_config.end(),
dir) == settings_install_dirs_config.end()) {
settings_install_dirs_config.push_back(dir);
}
std::vector<bool> install_dirs_enabled;
try {
install_dirs_enabled = Config::getGameInstallDirsEnabled();
} catch (...) {
// If it does not exist, assume that all are enabled.
install_dirs_enabled.resize(install_dir_array.size(), true);
}
for (const auto& dir : settings_install_dirs_config) {
if (install_dirs_enabled.size() < install_dir_array.size()) {
install_dirs_enabled.resize(install_dir_array.size(), true);
}
std::vector<Config::GameInstallDir> settings_install_dirs_config;
for (size_t i = 0; i < install_dir_array.size(); i++) {
std::filesystem::path dir = install_dir_array[i];
bool enabled = install_dirs_enabled[i];
settings_install_dirs_config.push_back({dir, enabled});
QString path_string;
Common::FS::PathToQString(path_string, dir);
QListWidgetItem* item = new QListWidgetItem(path_string);
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
item->setCheckState(enabled ? Qt::Checked : Qt::Unchecked);
ui->gameFoldersListWidget->addItem(item);
}
Config::setGameInstallDirs(settings_install_dirs_config);
Config::setAllGameInstallDirs(settings_install_dirs_config);
}
}

View File

@ -31,7 +31,7 @@
<string>Settings</string>
</property>
<property name="windowIcon">
<iconset>
<iconset resource="../shadps4.qrc">
<normaloff>:/images/shadps4.ico</normaloff>:/images/shadps4.ico</iconset>
</property>
<property name="sizeGripEnabled">
@ -59,7 +59,7 @@
</size>
</property>
<property name="currentIndex">
<number>6</number>
<number>5</number>
</property>
<widget class="QScrollArea" name="generalTab">
<property name="widgetResizable">
@ -73,8 +73,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>718</width>
<height>332</height>
<width>946</width>
<height>536</height>
</rect>
</property>
<layout class="QVBoxLayout" name="generalTabVLayout" stretch="0">
@ -130,9 +130,6 @@
<property name="bottomMargin">
<number>9</number>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop</set>
</property>
<item>
<layout class="QVBoxLayout" name="emulatorverticalLayout">
<property name="spacing">
@ -454,8 +451,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>646</width>
<height>395</height>
<width>946</width>
<height>536</height>
</rect>
</property>
<layout class="QVBoxLayout" name="guiTabVLayout" stretch="0">
@ -903,8 +900,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>545</width>
<height>141</height>
<width>946</width>
<height>536</height>
</rect>
</property>
<layout class="QVBoxLayout" name="graphicsTabVLayout" stretch="0,0">
@ -1198,8 +1195,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>234</width>
<height>292</height>
<width>946</width>
<height>536</height>
</rect>
</property>
<layout class="QVBoxLayout" name="userTabVLayout" stretch="0,0,1">
@ -1264,30 +1261,128 @@
<item>
<widget class="QCheckBox" name="disableTrophycheckBox">
<property name="text">
<string>Disable Trophy Pop-ups</string>
<string>Disable Trophy Notification</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_Trophy">
<layout class="QHBoxLayout" name="horizontalLayout_SidePopUps">
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label_SidePopUps">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Trophy Notification Position</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="radioButton_Left">
<property name="text">
<string>Left</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="radioButton_Right">
<property name="text">
<string>Right</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="radioButton_Top">
<property name="text">
<string>Top</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="radioButton_Bottom">
<property name="text">
<string>Bottom</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_PopUpsDuration">
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label_PopUpDuration">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Notification Duration</string>
</property>
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="popUpDurationSpinBox"/>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_trophyKey">
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label_Trophy">
<property name="text">
<string>Trophy Key</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="trophyKeyLineEdit">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
<bold>false</bold>
</font>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QPushButton" name="OpenCustomTrophyLocationButton">
<property name="text">
<string>Trophy Key</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="trophyKeyLineEdit">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
<bold>false</bold>
</font>
<string>Open the custom trophy images/sounds folder</string>
</property>
</widget>
</item>
@ -1342,8 +1437,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>455</width>
<height>252</height>
<width>946</width>
<height>536</height>
</rect>
</property>
<layout class="QVBoxLayout" name="inputTabVLayout" stretch="0,0">
@ -1626,8 +1721,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>216</width>
<height>254</height>
<width>946</width>
<height>536</height>
</rect>
</property>
<layout class="QVBoxLayout" name="pathsTabLayout">
@ -1701,6 +1796,58 @@
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="PortableUserFolderGroupBox">
<property name="title">
<string>Portable User Folder</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_9">
<item>
<spacer name="horizontalSpacer_6">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="PortableUserButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Create Portable User Folder from Common User Folder</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</widget>
@ -1969,6 +2116,8 @@
</item>
</layout>
</widget>
<resources/>
<resources>
<include location="../shadps4.qrc"/>
</resources>
<connections/>
</ui>

View File

@ -541,6 +541,77 @@
<source>Override Color</source>
<translation type="unfinished">Override Color</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind axis values more than once</source>
<translation type="unfinished">Cannot bind axis values more than once</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>EditorDialog</name>
<message>
<source>Edit Keyboard + Mouse and Controller input bindings</source>
<translation type="unfinished">Edit Keyboard + Mouse and Controller input bindings</translation>
</message>
<message>
<source>Use Per-Game configs</source>
<translation type="unfinished">Use Per-Game configs</translation>
</message>
<message>
<source>Error</source>
<translation type="unfinished">Error</translation>
</message>
<message>
<source>Could not open the file for reading</source>
<translation type="unfinished">Could not open the file for reading</translation>
</message>
<message>
<source>Could not open the file for writing</source>
<translation type="unfinished">Could not open the file for writing</translation>
</message>
<message>
<source>Save Changes</source>
<translation type="unfinished">Save Changes</translation>
</message>
<message>
<source>Do you want to save changes?</source>
<translation type="unfinished">Do you want to save changes?</translation>
</message>
<message>
<source>Help</source>
<translation>المساعدة</translation>
</message>
<message>
<source>Do you want to reset your custom default config to the original default config?</source>
<translation type="unfinished">Do you want to reset your custom default config to the original default config?</translation>
</message>
<message>
<source>Do you want to reset this config to your custom default config?</source>
<translation type="unfinished">Do you want to reset this config to your custom default config?</translation>
</message>
<message>
<source>Reset to Default</source>
<translation type="unfinished">Reset to Default</translation>
</message>
</context>
<context>
<name>ElfViewer</name>
@ -584,7 +655,7 @@
</message>
<message>
<source>Directory to install DLC</source>
<translation type="unfinished">Directory to install DLC</translation>
<translation>مكان تثبيت حزمات DLC</translation>
</message>
</context>
<context>
@ -603,7 +674,7 @@
</message>
<message>
<source>Compatibility</source>
<translation type="unfinished">Compatibility</translation>
<translation>التوافق</translation>
</message>
<message>
<source>Region</source>
@ -775,6 +846,10 @@
<source>Delete DLC</source>
<translation type="unfinished">Delete DLC</translation>
</message>
<message>
<source>Delete Trophy</source>
<translation type="unfinished">Delete Trophy</translation>
</message>
<message>
<source>Compatibility...</source>
<translation type="unfinished">Compatibility...</translation>
@ -851,6 +926,10 @@
<source>This game has no update folder to open!</source>
<translation type="unfinished">This game has no update folder to open!</translation>
</message>
<message>
<source>No log file found for this game!</source>
<translation type="unfinished">No log file found for this game!</translation>
</message>
<message>
<source>Failed to convert icon.</source>
<translation type="unfinished">Failed to convert icon.</translation>
@ -859,15 +938,46 @@
<source>This game has no save data to delete!</source>
<translation type="unfinished">This game has no save data to delete!</translation>
</message>
<message>
<source>This game has no saved trophies to delete!</source>
<translation type="unfinished">This game has no saved trophies to delete!</translation>
</message>
<message>
<source>Save Data</source>
<translation type="unfinished">Save Data</translation>
</message>
<message>
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>Quickstart</source>
<translation type="unfinished">Quickstart</translation>
</message>
<message>
<source>FAQ</source>
<translation type="unfinished">FAQ</translation>
</message>
<message>
<source>Syntax</source>
<translation type="unfinished">Syntax</translation>
</message>
<message>
<source>Special Bindings</source>
<translation type="unfinished">Special Bindings</translation>
</message>
<message>
<source>Keybindings</source>
<translation type="unfinished">Keybindings</translation>
</message>
</context>
<context>
<name>InstallDirSelect</name>
<message>
@ -887,6 +997,217 @@
<translation type="unfinished">Delete PKG File on Install</translation>
</message>
</context>
<context>
<name>KBMSettings</name>
<message>
<source>Configure Controls</source>
<translation type="unfinished">Configure Controls</translation>
</message>
<message>
<source>D-Pad</source>
<translation type="unfinished">D-Pad</translation>
</message>
<message>
<source>Up</source>
<translation type="unfinished">Up</translation>
</message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Down</source>
<translation type="unfinished">Down</translation>
</message>
<message>
<source>Left Analog Halfmode</source>
<translation type="unfinished">Left Analog Halfmode</translation>
</message>
<message>
<source>hold to move left stick at half-speed</source>
<translation type="unfinished">hold to move left stick at half-speed</translation>
</message>
<message>
<source>Left Stick</source>
<translation type="unfinished">Left Stick</translation>
</message>
<message>
<source>Config Selection</source>
<translation type="unfinished">Config Selection</translation>
</message>
<message>
<source>Common Config</source>
<translation type="unfinished">Common Config</translation>
</message>
<message>
<source>Use per-game configs</source>
<translation type="unfinished">Use per-game configs</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Text Editor</source>
<translation type="unfinished">Text Editor</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>L3</source>
<translation type="unfinished">L3</translation>
</message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished">Touchpad Click</translation>
</message>
<message>
<source>Mouse to Joystick</source>
<translation type="unfinished">Mouse to Joystick</translation>
</message>
<message>
<source>*press F7 ingame to activate</source>
<translation type="unfinished">*press F7 ingame to activate</translation>
</message>
<message>
<source>R3</source>
<translation type="unfinished">R3</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>Mouse Movement Parameters</source>
<translation type="unfinished">Mouse Movement Parameters</translation>
</message>
<message>
<source>note: click Help Button/Special Keybindings for more information</source>
<translation type="unfinished">note: click Help Button/Special Keybindings for more information</translation>
</message>
<message>
<source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation>
</message>
<message>
<source>Triangle</source>
<translation type="unfinished">Triangle</translation>
</message>
<message>
<source>Square</source>
<translation type="unfinished">Square</translation>
</message>
<message>
<source>Circle</source>
<translation type="unfinished">Circle</translation>
</message>
<message>
<source>Cross</source>
<translation type="unfinished">Cross</translation>
</message>
<message>
<source>Right Analog Halfmode</source>
<translation type="unfinished">Right Analog Halfmode</translation>
</message>
<message>
<source>hold to move right stick at half-speed</source>
<translation type="unfinished">hold to move right stick at half-speed</translation>
</message>
<message>
<source>Right Stick</source>
<translation type="unfinished">Right Stick</translation>
</message>
<message>
<source>Speed Offset (def 0.125):</source>
<translation type="unfinished">Speed Offset (def 0.125):</translation>
</message>
<message>
<source>Copy from Common Config</source>
<translation type="unfinished">Copy from Common Config</translation>
</message>
<message>
<source>Deadzone Offset (def 0.50):</source>
<translation type="unfinished">Deadzone Offset (def 0.50):</translation>
</message>
<message>
<source>Speed Multiplier (def 1.0):</source>
<translation type="unfinished">Speed Multiplier (def 1.0):</translation>
</message>
<message>
<source>Common Config Selected</source>
<translation type="unfinished">Common Config Selected</translation>
</message>
<message>
<source>This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</source>
<translation type="unfinished">This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</translation>
</message>
<message>
<source>Copy values from Common Config</source>
<translation type="unfinished">Copy values from Common Config</translation>
</message>
<message>
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
<translation type="unfinished">Do you want to overwrite existing mappings with the mappings from the Common Config?</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind any unique input more than once</source>
<translation type="unfinished">Cannot bind any unique input more than once</translation>
</message>
<message>
<source>Press a key</source>
<translation type="unfinished">Press a key</translation>
</message>
<message>
<source>Cannot set mapping</source>
<translation type="unfinished">Cannot set mapping</translation>
</message>
<message>
<source>Mousewheel cannot be mapped to stick outputs</source>
<translation type="unfinished">Mousewheel cannot be mapped to stick outputs</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
@ -1311,6 +1632,10 @@
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder</source>
<translation type="unfinished">Open the custom trophy images/sounds folder</translation>
</message>
<message>
<source>Logger</source>
<translation>المسجل</translation>
@ -1476,8 +1801,8 @@
<translation type="unfinished">Title Music</translation>
</message>
<message>
<source>Disable Trophy Pop-ups</source>
<translation type="unfinished">Disable Trophy Pop-ups</translation>
<source>Disable Trophy Notification</source>
<translation type="unfinished">Disable Trophy Notification</translation>
</message>
<message>
<source>Background Image</source>
@ -1803,6 +2128,62 @@
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
<message>
<source>Trophy Notification Position</source>
<translation type="unfinished">Trophy Notification Position</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Top</source>
<translation type="unfinished">Top</translation>
</message>
<message>
<source>Bottom</source>
<translation type="unfinished">Bottom</translation>
</message>
<message>
<source>Notification Duration</source>
<translation type="unfinished">Notification Duration</translation>
</message>
<message>
<source>Portable User Folder</source>
<translation type="unfinished">Portable User Folder</translation>
</message>
<message>
<source>Create Portable User Folder from Common User Folder</source>
<translation type="unfinished">Create Portable User Folder from Common User Folder</translation>
</message>
<message>
<source>Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</source>
<translation type="unfinished">Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</translation>
</message>
<message>
<source>Cannot create portable user folder</source>
<translation type="unfinished">Cannot create portable user folder</translation>
</message>
<message>
<source>%1 already exists</source>
<translation type="unfinished">%1 already exists</translation>
</message>
<message>
<source>Portable user folder created</source>
<translation type="unfinished">Portable user folder created</translation>
</message>
<message>
<source>%1 successfully created.</source>
<translation type="unfinished">%1 successfully created.</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</source>
<translation type="unfinished">Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>
@ -1810,5 +2191,21 @@
<source>Trophy Viewer</source>
<translation>عارض الجوائز</translation>
</message>
<message>
<source>Progress</source>
<translation type="unfinished">Progress</translation>
</message>
<message>
<source>Show Earned Trophies</source>
<translation type="unfinished">Show Earned Trophies</translation>
</message>
<message>
<source>Show Not Earned Trophies</source>
<translation type="unfinished">Show Not Earned Trophies</translation>
</message>
<message>
<source>Show Hidden Trophies</source>
<translation type="unfinished">Show Hidden Trophies</translation>
</message>
</context>
</TS>

View File

@ -541,6 +541,77 @@
<source>Override Color</source>
<translation type="unfinished">Override Color</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind axis values more than once</source>
<translation type="unfinished">Cannot bind axis values more than once</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>EditorDialog</name>
<message>
<source>Edit Keyboard + Mouse and Controller input bindings</source>
<translation type="unfinished">Edit Keyboard + Mouse and Controller input bindings</translation>
</message>
<message>
<source>Use Per-Game configs</source>
<translation type="unfinished">Use Per-Game configs</translation>
</message>
<message>
<source>Error</source>
<translation type="unfinished">Error</translation>
</message>
<message>
<source>Could not open the file for reading</source>
<translation type="unfinished">Could not open the file for reading</translation>
</message>
<message>
<source>Could not open the file for writing</source>
<translation type="unfinished">Could not open the file for writing</translation>
</message>
<message>
<source>Save Changes</source>
<translation type="unfinished">Save Changes</translation>
</message>
<message>
<source>Do you want to save changes?</source>
<translation type="unfinished">Do you want to save changes?</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>Do you want to reset your custom default config to the original default config?</source>
<translation type="unfinished">Do you want to reset your custom default config to the original default config?</translation>
</message>
<message>
<source>Do you want to reset this config to your custom default config?</source>
<translation type="unfinished">Do you want to reset this config to your custom default config?</translation>
</message>
<message>
<source>Reset to Default</source>
<translation type="unfinished">Reset to Default</translation>
</message>
</context>
<context>
<name>ElfViewer</name>
@ -775,6 +846,10 @@
<source>Delete DLC</source>
<translation type="unfinished">Delete DLC</translation>
</message>
<message>
<source>Delete Trophy</source>
<translation type="unfinished">Delete Trophy</translation>
</message>
<message>
<source>Compatibility...</source>
<translation type="unfinished">Compatibility...</translation>
@ -851,6 +926,10 @@
<source>This game has no update folder to open!</source>
<translation type="unfinished">This game has no update folder to open!</translation>
</message>
<message>
<source>No log file found for this game!</source>
<translation type="unfinished">No log file found for this game!</translation>
</message>
<message>
<source>Failed to convert icon.</source>
<translation type="unfinished">Failed to convert icon.</translation>
@ -859,15 +938,46 @@
<source>This game has no save data to delete!</source>
<translation type="unfinished">This game has no save data to delete!</translation>
</message>
<message>
<source>This game has no saved trophies to delete!</source>
<translation type="unfinished">This game has no saved trophies to delete!</translation>
</message>
<message>
<source>Save Data</source>
<translation type="unfinished">Save Data</translation>
</message>
<message>
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>Quickstart</source>
<translation type="unfinished">Quickstart</translation>
</message>
<message>
<source>FAQ</source>
<translation type="unfinished">FAQ</translation>
</message>
<message>
<source>Syntax</source>
<translation type="unfinished">Syntax</translation>
</message>
<message>
<source>Special Bindings</source>
<translation type="unfinished">Special Bindings</translation>
</message>
<message>
<source>Keybindings</source>
<translation type="unfinished">Keybindings</translation>
</message>
</context>
<context>
<name>InstallDirSelect</name>
<message>
@ -887,6 +997,217 @@
<translation type="unfinished">Delete PKG File on Install</translation>
</message>
</context>
<context>
<name>KBMSettings</name>
<message>
<source>Configure Controls</source>
<translation type="unfinished">Configure Controls</translation>
</message>
<message>
<source>D-Pad</source>
<translation type="unfinished">D-Pad</translation>
</message>
<message>
<source>Up</source>
<translation type="unfinished">Up</translation>
</message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Down</source>
<translation type="unfinished">Down</translation>
</message>
<message>
<source>Left Analog Halfmode</source>
<translation type="unfinished">Left Analog Halfmode</translation>
</message>
<message>
<source>hold to move left stick at half-speed</source>
<translation type="unfinished">hold to move left stick at half-speed</translation>
</message>
<message>
<source>Left Stick</source>
<translation type="unfinished">Left Stick</translation>
</message>
<message>
<source>Config Selection</source>
<translation type="unfinished">Config Selection</translation>
</message>
<message>
<source>Common Config</source>
<translation type="unfinished">Common Config</translation>
</message>
<message>
<source>Use per-game configs</source>
<translation type="unfinished">Use per-game configs</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Text Editor</source>
<translation type="unfinished">Text Editor</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>L3</source>
<translation type="unfinished">L3</translation>
</message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished">Touchpad Click</translation>
</message>
<message>
<source>Mouse to Joystick</source>
<translation type="unfinished">Mouse to Joystick</translation>
</message>
<message>
<source>*press F7 ingame to activate</source>
<translation type="unfinished">*press F7 ingame to activate</translation>
</message>
<message>
<source>R3</source>
<translation type="unfinished">R3</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>Mouse Movement Parameters</source>
<translation type="unfinished">Mouse Movement Parameters</translation>
</message>
<message>
<source>note: click Help Button/Special Keybindings for more information</source>
<translation type="unfinished">note: click Help Button/Special Keybindings for more information</translation>
</message>
<message>
<source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation>
</message>
<message>
<source>Triangle</source>
<translation type="unfinished">Triangle</translation>
</message>
<message>
<source>Square</source>
<translation type="unfinished">Square</translation>
</message>
<message>
<source>Circle</source>
<translation type="unfinished">Circle</translation>
</message>
<message>
<source>Cross</source>
<translation type="unfinished">Cross</translation>
</message>
<message>
<source>Right Analog Halfmode</source>
<translation type="unfinished">Right Analog Halfmode</translation>
</message>
<message>
<source>hold to move right stick at half-speed</source>
<translation type="unfinished">hold to move right stick at half-speed</translation>
</message>
<message>
<source>Right Stick</source>
<translation type="unfinished">Right Stick</translation>
</message>
<message>
<source>Speed Offset (def 0.125):</source>
<translation type="unfinished">Speed Offset (def 0.125):</translation>
</message>
<message>
<source>Copy from Common Config</source>
<translation type="unfinished">Copy from Common Config</translation>
</message>
<message>
<source>Deadzone Offset (def 0.50):</source>
<translation type="unfinished">Deadzone Offset (def 0.50):</translation>
</message>
<message>
<source>Speed Multiplier (def 1.0):</source>
<translation type="unfinished">Speed Multiplier (def 1.0):</translation>
</message>
<message>
<source>Common Config Selected</source>
<translation type="unfinished">Common Config Selected</translation>
</message>
<message>
<source>This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</source>
<translation type="unfinished">This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</translation>
</message>
<message>
<source>Copy values from Common Config</source>
<translation type="unfinished">Copy values from Common Config</translation>
</message>
<message>
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
<translation type="unfinished">Do you want to overwrite existing mappings with the mappings from the Common Config?</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind any unique input more than once</source>
<translation type="unfinished">Cannot bind any unique input more than once</translation>
</message>
<message>
<source>Press a key</source>
<translation type="unfinished">Press a key</translation>
</message>
<message>
<source>Cannot set mapping</source>
<translation type="unfinished">Cannot set mapping</translation>
</message>
<message>
<source>Mousewheel cannot be mapped to stick outputs</source>
<translation type="unfinished">Mousewheel cannot be mapped to stick outputs</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
@ -1311,6 +1632,10 @@
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder</source>
<translation type="unfinished">Open the custom trophy images/sounds folder</translation>
</message>
<message>
<source>Logger</source>
<translation type="unfinished">Logger</translation>
@ -1476,8 +1801,8 @@
<translation type="unfinished">Title Music</translation>
</message>
<message>
<source>Disable Trophy Pop-ups</source>
<translation type="unfinished">Disable Trophy Pop-ups</translation>
<source>Disable Trophy Notification</source>
<translation type="unfinished">Disable Trophy Notification</translation>
</message>
<message>
<source>Background Image</source>
@ -1803,6 +2128,62 @@
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
<message>
<source>Trophy Notification Position</source>
<translation type="unfinished">Trophy Notification Position</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Top</source>
<translation type="unfinished">Top</translation>
</message>
<message>
<source>Bottom</source>
<translation type="unfinished">Bottom</translation>
</message>
<message>
<source>Notification Duration</source>
<translation type="unfinished">Notification Duration</translation>
</message>
<message>
<source>Portable User Folder</source>
<translation type="unfinished">Portable User Folder</translation>
</message>
<message>
<source>Create Portable User Folder from Common User Folder</source>
<translation type="unfinished">Create Portable User Folder from Common User Folder</translation>
</message>
<message>
<source>Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</source>
<translation type="unfinished">Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</translation>
</message>
<message>
<source>Cannot create portable user folder</source>
<translation type="unfinished">Cannot create portable user folder</translation>
</message>
<message>
<source>%1 already exists</source>
<translation type="unfinished">%1 already exists</translation>
</message>
<message>
<source>Portable user folder created</source>
<translation type="unfinished">Portable user folder created</translation>
</message>
<message>
<source>%1 successfully created.</source>
<translation type="unfinished">%1 successfully created.</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</source>
<translation type="unfinished">Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>
@ -1810,5 +2191,21 @@
<source>Trophy Viewer</source>
<translation type="unfinished">Trophy Viewer</translation>
</message>
<message>
<source>Progress</source>
<translation type="unfinished">Progress</translation>
</message>
<message>
<source>Show Earned Trophies</source>
<translation type="unfinished">Show Earned Trophies</translation>
</message>
<message>
<source>Show Not Earned Trophies</source>
<translation type="unfinished">Show Not Earned Trophies</translation>
</message>
<message>
<source>Show Hidden Trophies</source>
<translation type="unfinished">Show Hidden Trophies</translation>
</message>
</context>
</TS>

File diff suppressed because it is too large Load Diff

View File

@ -541,6 +541,77 @@
<source>Override Color</source>
<translation type="unfinished">Override Color</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind axis values more than once</source>
<translation type="unfinished">Cannot bind axis values more than once</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>EditorDialog</name>
<message>
<source>Edit Keyboard + Mouse and Controller input bindings</source>
<translation type="unfinished">Edit Keyboard + Mouse and Controller input bindings</translation>
</message>
<message>
<source>Use Per-Game configs</source>
<translation type="unfinished">Use Per-Game configs</translation>
</message>
<message>
<source>Error</source>
<translation type="unfinished">Error</translation>
</message>
<message>
<source>Could not open the file for reading</source>
<translation type="unfinished">Could not open the file for reading</translation>
</message>
<message>
<source>Could not open the file for writing</source>
<translation type="unfinished">Could not open the file for writing</translation>
</message>
<message>
<source>Save Changes</source>
<translation type="unfinished">Save Changes</translation>
</message>
<message>
<source>Do you want to save changes?</source>
<translation type="unfinished">Do you want to save changes?</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>Do you want to reset your custom default config to the original default config?</source>
<translation type="unfinished">Do you want to reset your custom default config to the original default config?</translation>
</message>
<message>
<source>Do you want to reset this config to your custom default config?</source>
<translation type="unfinished">Do you want to reset this config to your custom default config?</translation>
</message>
<message>
<source>Reset to Default</source>
<translation type="unfinished">Reset to Default</translation>
</message>
</context>
<context>
<name>ElfViewer</name>
@ -775,6 +846,10 @@
<source>Delete DLC</source>
<translation type="unfinished">Delete DLC</translation>
</message>
<message>
<source>Delete Trophy</source>
<translation type="unfinished">Delete Trophy</translation>
</message>
<message>
<source>Compatibility...</source>
<translation type="unfinished">Compatibility...</translation>
@ -851,6 +926,10 @@
<source>This game has no update folder to open!</source>
<translation type="unfinished">This game has no update folder to open!</translation>
</message>
<message>
<source>No log file found for this game!</source>
<translation type="unfinished">No log file found for this game!</translation>
</message>
<message>
<source>Failed to convert icon.</source>
<translation type="unfinished">Failed to convert icon.</translation>
@ -859,15 +938,46 @@
<source>This game has no save data to delete!</source>
<translation type="unfinished">This game has no save data to delete!</translation>
</message>
<message>
<source>This game has no saved trophies to delete!</source>
<translation type="unfinished">This game has no saved trophies to delete!</translation>
</message>
<message>
<source>Save Data</source>
<translation type="unfinished">Save Data</translation>
</message>
<message>
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>Quickstart</source>
<translation type="unfinished">Quickstart</translation>
</message>
<message>
<source>FAQ</source>
<translation type="unfinished">FAQ</translation>
</message>
<message>
<source>Syntax</source>
<translation type="unfinished">Syntax</translation>
</message>
<message>
<source>Special Bindings</source>
<translation type="unfinished">Special Bindings</translation>
</message>
<message>
<source>Keybindings</source>
<translation type="unfinished">Keybindings</translation>
</message>
</context>
<context>
<name>InstallDirSelect</name>
<message>
@ -887,6 +997,217 @@
<translation type="unfinished">Delete PKG File on Install</translation>
</message>
</context>
<context>
<name>KBMSettings</name>
<message>
<source>Configure Controls</source>
<translation type="unfinished">Configure Controls</translation>
</message>
<message>
<source>D-Pad</source>
<translation type="unfinished">D-Pad</translation>
</message>
<message>
<source>Up</source>
<translation type="unfinished">Up</translation>
</message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Down</source>
<translation type="unfinished">Down</translation>
</message>
<message>
<source>Left Analog Halfmode</source>
<translation type="unfinished">Left Analog Halfmode</translation>
</message>
<message>
<source>hold to move left stick at half-speed</source>
<translation type="unfinished">hold to move left stick at half-speed</translation>
</message>
<message>
<source>Left Stick</source>
<translation type="unfinished">Left Stick</translation>
</message>
<message>
<source>Config Selection</source>
<translation type="unfinished">Config Selection</translation>
</message>
<message>
<source>Common Config</source>
<translation type="unfinished">Common Config</translation>
</message>
<message>
<source>Use per-game configs</source>
<translation type="unfinished">Use per-game configs</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Text Editor</source>
<translation type="unfinished">Text Editor</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>L3</source>
<translation type="unfinished">L3</translation>
</message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished">Touchpad Click</translation>
</message>
<message>
<source>Mouse to Joystick</source>
<translation type="unfinished">Mouse to Joystick</translation>
</message>
<message>
<source>*press F7 ingame to activate</source>
<translation type="unfinished">*press F7 ingame to activate</translation>
</message>
<message>
<source>R3</source>
<translation type="unfinished">R3</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>Mouse Movement Parameters</source>
<translation type="unfinished">Mouse Movement Parameters</translation>
</message>
<message>
<source>note: click Help Button/Special Keybindings for more information</source>
<translation type="unfinished">note: click Help Button/Special Keybindings for more information</translation>
</message>
<message>
<source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation>
</message>
<message>
<source>Triangle</source>
<translation type="unfinished">Triangle</translation>
</message>
<message>
<source>Square</source>
<translation type="unfinished">Square</translation>
</message>
<message>
<source>Circle</source>
<translation type="unfinished">Circle</translation>
</message>
<message>
<source>Cross</source>
<translation type="unfinished">Cross</translation>
</message>
<message>
<source>Right Analog Halfmode</source>
<translation type="unfinished">Right Analog Halfmode</translation>
</message>
<message>
<source>hold to move right stick at half-speed</source>
<translation type="unfinished">hold to move right stick at half-speed</translation>
</message>
<message>
<source>Right Stick</source>
<translation type="unfinished">Right Stick</translation>
</message>
<message>
<source>Speed Offset (def 0.125):</source>
<translation type="unfinished">Speed Offset (def 0.125):</translation>
</message>
<message>
<source>Copy from Common Config</source>
<translation type="unfinished">Copy from Common Config</translation>
</message>
<message>
<source>Deadzone Offset (def 0.50):</source>
<translation type="unfinished">Deadzone Offset (def 0.50):</translation>
</message>
<message>
<source>Speed Multiplier (def 1.0):</source>
<translation type="unfinished">Speed Multiplier (def 1.0):</translation>
</message>
<message>
<source>Common Config Selected</source>
<translation type="unfinished">Common Config Selected</translation>
</message>
<message>
<source>This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</source>
<translation type="unfinished">This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</translation>
</message>
<message>
<source>Copy values from Common Config</source>
<translation type="unfinished">Copy values from Common Config</translation>
</message>
<message>
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
<translation type="unfinished">Do you want to overwrite existing mappings with the mappings from the Common Config?</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind any unique input more than once</source>
<translation type="unfinished">Cannot bind any unique input more than once</translation>
</message>
<message>
<source>Press a key</source>
<translation type="unfinished">Press a key</translation>
</message>
<message>
<source>Cannot set mapping</source>
<translation type="unfinished">Cannot set mapping</translation>
</message>
<message>
<source>Mousewheel cannot be mapped to stick outputs</source>
<translation type="unfinished">Mousewheel cannot be mapped to stick outputs</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
@ -1311,6 +1632,10 @@
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder</source>
<translation type="unfinished">Open the custom trophy images/sounds folder</translation>
</message>
<message>
<source>Logger</source>
<translation type="unfinished">Logger</translation>
@ -1476,8 +1801,8 @@
<translation type="unfinished">Title Music</translation>
</message>
<message>
<source>Disable Trophy Pop-ups</source>
<translation type="unfinished">Disable Trophy Pop-ups</translation>
<source>Disable Trophy Notification</source>
<translation type="unfinished">Disable Trophy Notification</translation>
</message>
<message>
<source>Background Image</source>
@ -1803,6 +2128,62 @@
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
<message>
<source>Trophy Notification Position</source>
<translation type="unfinished">Trophy Notification Position</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Top</source>
<translation type="unfinished">Top</translation>
</message>
<message>
<source>Bottom</source>
<translation type="unfinished">Bottom</translation>
</message>
<message>
<source>Notification Duration</source>
<translation type="unfinished">Notification Duration</translation>
</message>
<message>
<source>Portable User Folder</source>
<translation type="unfinished">Portable User Folder</translation>
</message>
<message>
<source>Create Portable User Folder from Common User Folder</source>
<translation type="unfinished">Create Portable User Folder from Common User Folder</translation>
</message>
<message>
<source>Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</source>
<translation type="unfinished">Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</translation>
</message>
<message>
<source>Cannot create portable user folder</source>
<translation type="unfinished">Cannot create portable user folder</translation>
</message>
<message>
<source>%1 already exists</source>
<translation type="unfinished">%1 already exists</translation>
</message>
<message>
<source>Portable user folder created</source>
<translation type="unfinished">Portable user folder created</translation>
</message>
<message>
<source>%1 successfully created.</source>
<translation type="unfinished">%1 successfully created.</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</source>
<translation type="unfinished">Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>
@ -1810,5 +2191,21 @@
<source>Trophy Viewer</source>
<translation type="unfinished">Trophy Viewer</translation>
</message>
<message>
<source>Progress</source>
<translation type="unfinished">Progress</translation>
</message>
<message>
<source>Show Earned Trophies</source>
<translation type="unfinished">Show Earned Trophies</translation>
</message>
<message>
<source>Show Not Earned Trophies</source>
<translation type="unfinished">Show Not Earned Trophies</translation>
</message>
<message>
<source>Show Hidden Trophies</source>
<translation type="unfinished">Show Hidden Trophies</translation>
</message>
</context>
</TS>

View File

@ -419,11 +419,11 @@
</message>
<message>
<source>Left</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Down</source>
@ -541,6 +541,77 @@
<source>Override Color</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cannot bind axis values more than once</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>EditorDialog</name>
<message>
<source>Edit Keyboard + Mouse and Controller input bindings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use Per-Game configs</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error</source>
<translation type="unfinished">Error</translation>
</message>
<message>
<source>Could not open the file for reading</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Could not open the file for writing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save Changes</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Do you want to save changes?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>Do you want to reset your custom default config to the original default config?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Do you want to reset this config to your custom default config?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reset to Default</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ElfViewer</name>
@ -775,6 +846,10 @@
<source>Delete DLC</source>
<translation>Delete DLC</translation>
</message>
<message>
<source>Delete Trophy</source>
<translation>Delete Trophy</translation>
</message>
<message>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
@ -851,6 +926,10 @@
<source>This game has no update folder to open!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>No log file found for this game!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Failed to convert icon.</source>
<translation type="unfinished"></translation>
@ -859,15 +938,46 @@
<source>This game has no save data to delete!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This game has no saved trophies to delete!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>SFO Viewer for </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>Quickstart</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FAQ</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Syntax</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Special Bindings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Keybindings</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>InstallDirSelect</name>
<message>
@ -887,6 +997,217 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KBMSettings</name>
<message>
<source>Configure Controls</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>D-Pad</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Up</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>unmapped</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Down</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Left Analog Halfmode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>hold to move left stick at half-speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Left Stick</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Config Selection</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Common Config</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use per-game configs</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Text Editor</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>L3</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Mouse to Joystick</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>*press F7 ingame to activate</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>R3</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Mouse Movement Parameters</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>note: click Help Button/Special Keybindings for more information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Face Buttons</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Triangle</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Square</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Circle</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cross</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right Analog Halfmode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>hold to move right stick at half-speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Right Stick</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Offset (def 0.125):</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copy from Common Config</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Deadzone Offset (def 0.50):</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed Multiplier (def 1.0):</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Common Config Selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copy values from Common Config</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cannot bind any unique input more than once</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Press a key</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cannot set mapping</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Mousewheel cannot be mapped to stick outputs</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
@ -985,6 +1306,14 @@
<source>Dump Game List</source>
<translation>Dump Game List</translation>
</message>
<message>
<source>Trophy Viewer</source>
<translation>Trophy Viewer</translation>
</message>
<message>
<source>No games found. Please add your games to your library first.</source>
<translation>No games found. Please add your games to your library first.</translation>
</message>
<message>
<source>PKG Viewer</source>
<translation>PKG Viewer</translation>
@ -1311,6 +1640,10 @@
<source>Trophy</source>
<translation>Trophy</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder</source>
<translation>Open the custom trophy images/sounds folder</translation>
</message>
<message>
<source>Logger</source>
<translation>Logger</translation>
@ -1476,8 +1809,8 @@
<translation>Title Music</translation>
</message>
<message>
<source>Disable Trophy Pop-ups</source>
<translation>Disable Trophy Pop-ups</translation>
<source>Disable Trophy Notification</source>
<translation>Disable Trophy Notification</translation>
</message>
<message>
<source>Background Image</source>
@ -1803,6 +2136,62 @@
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Trophy Notification Position</source>
<translation>Trophy Notification Position</translation>
</message>
<message>
<source>Left</source>
<translation>Left</translation>
</message>
<message>
<source>Right</source>
<translation>Right</translation>
</message>
<message>
<source>Top</source>
<translation>Top</translation>
</message>
<message>
<source>Bottom</source>
<translation>Bottom</translation>
</message>
<message>
<source>Notification Duration</source>
<translation>Notification Duration</translation>
</message>
<message>
<source>Portable User Folder</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Create Portable User Folder from Common User Folder</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cannot create portable user folder</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 already exists</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Portable user folder created</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 successfully created.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TrophyViewer</name>
@ -1810,5 +2199,25 @@
<source>Trophy Viewer</source>
<translation>Trophy Viewer</translation>
</message>
<message>
<source>Select Game:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Progress</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show Earned Trophies</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show Not Earned Trophies</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show Hidden Trophies</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

File diff suppressed because it is too large Load Diff

View File

@ -541,6 +541,77 @@
<source>Override Color</source>
<translation type="unfinished">Override Color</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind axis values more than once</source>
<translation type="unfinished">Cannot bind axis values more than once</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>EditorDialog</name>
<message>
<source>Edit Keyboard + Mouse and Controller input bindings</source>
<translation type="unfinished">Edit Keyboard + Mouse and Controller input bindings</translation>
</message>
<message>
<source>Use Per-Game configs</source>
<translation type="unfinished">Use Per-Game configs</translation>
</message>
<message>
<source>Error</source>
<translation type="unfinished">Error</translation>
</message>
<message>
<source>Could not open the file for reading</source>
<translation type="unfinished">Could not open the file for reading</translation>
</message>
<message>
<source>Could not open the file for writing</source>
<translation type="unfinished">Could not open the file for writing</translation>
</message>
<message>
<source>Save Changes</source>
<translation type="unfinished">Save Changes</translation>
</message>
<message>
<source>Do you want to save changes?</source>
<translation type="unfinished">Do you want to save changes?</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>Do you want to reset your custom default config to the original default config?</source>
<translation type="unfinished">Do you want to reset your custom default config to the original default config?</translation>
</message>
<message>
<source>Do you want to reset this config to your custom default config?</source>
<translation type="unfinished">Do you want to reset this config to your custom default config?</translation>
</message>
<message>
<source>Reset to Default</source>
<translation type="unfinished">Reset to Default</translation>
</message>
</context>
<context>
<name>ElfViewer</name>
@ -775,6 +846,10 @@
<source>Delete DLC</source>
<translation>حذف محتوای اضافی (DLC)</translation>
</message>
<message>
<source>Delete Trophy</source>
<translation type="unfinished">Delete Trophy</translation>
</message>
<message>
<source>Compatibility...</source>
<translation type="unfinished">Compatibility...</translation>
@ -851,6 +926,10 @@
<source>This game has no update folder to open!</source>
<translation type="unfinished">This game has no update folder to open!</translation>
</message>
<message>
<source>No log file found for this game!</source>
<translation type="unfinished">No log file found for this game!</translation>
</message>
<message>
<source>Failed to convert icon.</source>
<translation type="unfinished">Failed to convert icon.</translation>
@ -859,15 +938,46 @@
<source>This game has no save data to delete!</source>
<translation type="unfinished">This game has no save data to delete!</translation>
</message>
<message>
<source>This game has no saved trophies to delete!</source>
<translation type="unfinished">This game has no saved trophies to delete!</translation>
</message>
<message>
<source>Save Data</source>
<translation type="unfinished">Save Data</translation>
</message>
<message>
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>Quickstart</source>
<translation type="unfinished">Quickstart</translation>
</message>
<message>
<source>FAQ</source>
<translation type="unfinished">FAQ</translation>
</message>
<message>
<source>Syntax</source>
<translation type="unfinished">Syntax</translation>
</message>
<message>
<source>Special Bindings</source>
<translation type="unfinished">Special Bindings</translation>
</message>
<message>
<source>Keybindings</source>
<translation type="unfinished">Keybindings</translation>
</message>
</context>
<context>
<name>InstallDirSelect</name>
<message>
@ -887,6 +997,217 @@
<translation type="unfinished">Delete PKG File on Install</translation>
</message>
</context>
<context>
<name>KBMSettings</name>
<message>
<source>Configure Controls</source>
<translation type="unfinished">Configure Controls</translation>
</message>
<message>
<source>D-Pad</source>
<translation type="unfinished">D-Pad</translation>
</message>
<message>
<source>Up</source>
<translation type="unfinished">Up</translation>
</message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Down</source>
<translation type="unfinished">Down</translation>
</message>
<message>
<source>Left Analog Halfmode</source>
<translation type="unfinished">Left Analog Halfmode</translation>
</message>
<message>
<source>hold to move left stick at half-speed</source>
<translation type="unfinished">hold to move left stick at half-speed</translation>
</message>
<message>
<source>Left Stick</source>
<translation type="unfinished">Left Stick</translation>
</message>
<message>
<source>Config Selection</source>
<translation type="unfinished">Config Selection</translation>
</message>
<message>
<source>Common Config</source>
<translation type="unfinished">Common Config</translation>
</message>
<message>
<source>Use per-game configs</source>
<translation type="unfinished">Use per-game configs</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Text Editor</source>
<translation type="unfinished">Text Editor</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>L3</source>
<translation type="unfinished">L3</translation>
</message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished">Touchpad Click</translation>
</message>
<message>
<source>Mouse to Joystick</source>
<translation type="unfinished">Mouse to Joystick</translation>
</message>
<message>
<source>*press F7 ingame to activate</source>
<translation type="unfinished">*press F7 ingame to activate</translation>
</message>
<message>
<source>R3</source>
<translation type="unfinished">R3</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>Mouse Movement Parameters</source>
<translation type="unfinished">Mouse Movement Parameters</translation>
</message>
<message>
<source>note: click Help Button/Special Keybindings for more information</source>
<translation type="unfinished">note: click Help Button/Special Keybindings for more information</translation>
</message>
<message>
<source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation>
</message>
<message>
<source>Triangle</source>
<translation type="unfinished">Triangle</translation>
</message>
<message>
<source>Square</source>
<translation type="unfinished">Square</translation>
</message>
<message>
<source>Circle</source>
<translation type="unfinished">Circle</translation>
</message>
<message>
<source>Cross</source>
<translation type="unfinished">Cross</translation>
</message>
<message>
<source>Right Analog Halfmode</source>
<translation type="unfinished">Right Analog Halfmode</translation>
</message>
<message>
<source>hold to move right stick at half-speed</source>
<translation type="unfinished">hold to move right stick at half-speed</translation>
</message>
<message>
<source>Right Stick</source>
<translation type="unfinished">Right Stick</translation>
</message>
<message>
<source>Speed Offset (def 0.125):</source>
<translation type="unfinished">Speed Offset (def 0.125):</translation>
</message>
<message>
<source>Copy from Common Config</source>
<translation type="unfinished">Copy from Common Config</translation>
</message>
<message>
<source>Deadzone Offset (def 0.50):</source>
<translation type="unfinished">Deadzone Offset (def 0.50):</translation>
</message>
<message>
<source>Speed Multiplier (def 1.0):</source>
<translation type="unfinished">Speed Multiplier (def 1.0):</translation>
</message>
<message>
<source>Common Config Selected</source>
<translation type="unfinished">Common Config Selected</translation>
</message>
<message>
<source>This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</source>
<translation type="unfinished">This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</translation>
</message>
<message>
<source>Copy values from Common Config</source>
<translation type="unfinished">Copy values from Common Config</translation>
</message>
<message>
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
<translation type="unfinished">Do you want to overwrite existing mappings with the mappings from the Common Config?</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind any unique input more than once</source>
<translation type="unfinished">Cannot bind any unique input more than once</translation>
</message>
<message>
<source>Press a key</source>
<translation type="unfinished">Press a key</translation>
</message>
<message>
<source>Cannot set mapping</source>
<translation type="unfinished">Cannot set mapping</translation>
</message>
<message>
<source>Mousewheel cannot be mapped to stick outputs</source>
<translation type="unfinished">Mousewheel cannot be mapped to stick outputs</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
@ -1311,6 +1632,10 @@
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder</source>
<translation type="unfinished">Open the custom trophy images/sounds folder</translation>
</message>
<message>
<source>Logger</source>
<translation type="unfinished">Logger</translation>
@ -1476,8 +1801,8 @@
<translation type="unfinished">Title Music</translation>
</message>
<message>
<source>Disable Trophy Pop-ups</source>
<translation>غیرفعال کردن نمایش جوایز</translation>
<source>Disable Trophy Notification</source>
<translation type="unfinished">Disable Trophy Notification</translation>
</message>
<message>
<source>Background Image</source>
@ -1803,6 +2128,62 @@
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
<message>
<source>Trophy Notification Position</source>
<translation type="unfinished">Trophy Notification Position</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Top</source>
<translation type="unfinished">Top</translation>
</message>
<message>
<source>Bottom</source>
<translation type="unfinished">Bottom</translation>
</message>
<message>
<source>Notification Duration</source>
<translation type="unfinished">Notification Duration</translation>
</message>
<message>
<source>Portable User Folder</source>
<translation type="unfinished">Portable User Folder</translation>
</message>
<message>
<source>Create Portable User Folder from Common User Folder</source>
<translation type="unfinished">Create Portable User Folder from Common User Folder</translation>
</message>
<message>
<source>Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</source>
<translation type="unfinished">Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</translation>
</message>
<message>
<source>Cannot create portable user folder</source>
<translation type="unfinished">Cannot create portable user folder</translation>
</message>
<message>
<source>%1 already exists</source>
<translation type="unfinished">%1 already exists</translation>
</message>
<message>
<source>Portable user folder created</source>
<translation type="unfinished">Portable user folder created</translation>
</message>
<message>
<source>%1 successfully created.</source>
<translation type="unfinished">%1 successfully created.</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</source>
<translation type="unfinished">Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>
@ -1810,5 +2191,21 @@
<source>Trophy Viewer</source>
<translation>مشاهده جوایز</translation>
</message>
<message>
<source>Progress</source>
<translation type="unfinished">Progress</translation>
</message>
<message>
<source>Show Earned Trophies</source>
<translation type="unfinished">Show Earned Trophies</translation>
</message>
<message>
<source>Show Not Earned Trophies</source>
<translation type="unfinished">Show Not Earned Trophies</translation>
</message>
<message>
<source>Show Hidden Trophies</source>
<translation type="unfinished">Show Hidden Trophies</translation>
</message>
</context>
</TS>

View File

@ -541,6 +541,77 @@
<source>Override Color</source>
<translation type="unfinished">Override Color</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind axis values more than once</source>
<translation type="unfinished">Cannot bind axis values more than once</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>EditorDialog</name>
<message>
<source>Edit Keyboard + Mouse and Controller input bindings</source>
<translation type="unfinished">Edit Keyboard + Mouse and Controller input bindings</translation>
</message>
<message>
<source>Use Per-Game configs</source>
<translation type="unfinished">Use Per-Game configs</translation>
</message>
<message>
<source>Error</source>
<translation type="unfinished">Error</translation>
</message>
<message>
<source>Could not open the file for reading</source>
<translation type="unfinished">Could not open the file for reading</translation>
</message>
<message>
<source>Could not open the file for writing</source>
<translation type="unfinished">Could not open the file for writing</translation>
</message>
<message>
<source>Save Changes</source>
<translation type="unfinished">Save Changes</translation>
</message>
<message>
<source>Do you want to save changes?</source>
<translation type="unfinished">Do you want to save changes?</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>Do you want to reset your custom default config to the original default config?</source>
<translation type="unfinished">Do you want to reset your custom default config to the original default config?</translation>
</message>
<message>
<source>Do you want to reset this config to your custom default config?</source>
<translation type="unfinished">Do you want to reset this config to your custom default config?</translation>
</message>
<message>
<source>Reset to Default</source>
<translation type="unfinished">Reset to Default</translation>
</message>
</context>
<context>
<name>ElfViewer</name>
@ -775,6 +846,10 @@
<source>Delete DLC</source>
<translation>Poista Lisäsisältö</translation>
</message>
<message>
<source>Delete Trophy</source>
<translation type="unfinished">Delete Trophy</translation>
</message>
<message>
<source>Compatibility...</source>
<translation>Yhteensopivuus...</translation>
@ -851,6 +926,10 @@
<source>This game has no update folder to open!</source>
<translation type="unfinished">This game has no update folder to open!</translation>
</message>
<message>
<source>No log file found for this game!</source>
<translation type="unfinished">No log file found for this game!</translation>
</message>
<message>
<source>Failed to convert icon.</source>
<translation type="unfinished">Failed to convert icon.</translation>
@ -859,15 +938,46 @@
<source>This game has no save data to delete!</source>
<translation type="unfinished">This game has no save data to delete!</translation>
</message>
<message>
<source>This game has no saved trophies to delete!</source>
<translation type="unfinished">This game has no saved trophies to delete!</translation>
</message>
<message>
<source>Save Data</source>
<translation type="unfinished">Save Data</translation>
</message>
<message>
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>Quickstart</source>
<translation type="unfinished">Quickstart</translation>
</message>
<message>
<source>FAQ</source>
<translation type="unfinished">FAQ</translation>
</message>
<message>
<source>Syntax</source>
<translation type="unfinished">Syntax</translation>
</message>
<message>
<source>Special Bindings</source>
<translation type="unfinished">Special Bindings</translation>
</message>
<message>
<source>Keybindings</source>
<translation type="unfinished">Keybindings</translation>
</message>
</context>
<context>
<name>InstallDirSelect</name>
<message>
@ -887,6 +997,217 @@
<translation type="unfinished">Delete PKG File on Install</translation>
</message>
</context>
<context>
<name>KBMSettings</name>
<message>
<source>Configure Controls</source>
<translation type="unfinished">Configure Controls</translation>
</message>
<message>
<source>D-Pad</source>
<translation type="unfinished">D-Pad</translation>
</message>
<message>
<source>Up</source>
<translation type="unfinished">Up</translation>
</message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Down</source>
<translation type="unfinished">Down</translation>
</message>
<message>
<source>Left Analog Halfmode</source>
<translation type="unfinished">Left Analog Halfmode</translation>
</message>
<message>
<source>hold to move left stick at half-speed</source>
<translation type="unfinished">hold to move left stick at half-speed</translation>
</message>
<message>
<source>Left Stick</source>
<translation type="unfinished">Left Stick</translation>
</message>
<message>
<source>Config Selection</source>
<translation type="unfinished">Config Selection</translation>
</message>
<message>
<source>Common Config</source>
<translation type="unfinished">Common Config</translation>
</message>
<message>
<source>Use per-game configs</source>
<translation type="unfinished">Use per-game configs</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Text Editor</source>
<translation type="unfinished">Text Editor</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>L3</source>
<translation type="unfinished">L3</translation>
</message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished">Touchpad Click</translation>
</message>
<message>
<source>Mouse to Joystick</source>
<translation type="unfinished">Mouse to Joystick</translation>
</message>
<message>
<source>*press F7 ingame to activate</source>
<translation type="unfinished">*press F7 ingame to activate</translation>
</message>
<message>
<source>R3</source>
<translation type="unfinished">R3</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>Mouse Movement Parameters</source>
<translation type="unfinished">Mouse Movement Parameters</translation>
</message>
<message>
<source>note: click Help Button/Special Keybindings for more information</source>
<translation type="unfinished">note: click Help Button/Special Keybindings for more information</translation>
</message>
<message>
<source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation>
</message>
<message>
<source>Triangle</source>
<translation type="unfinished">Triangle</translation>
</message>
<message>
<source>Square</source>
<translation type="unfinished">Square</translation>
</message>
<message>
<source>Circle</source>
<translation type="unfinished">Circle</translation>
</message>
<message>
<source>Cross</source>
<translation type="unfinished">Cross</translation>
</message>
<message>
<source>Right Analog Halfmode</source>
<translation type="unfinished">Right Analog Halfmode</translation>
</message>
<message>
<source>hold to move right stick at half-speed</source>
<translation type="unfinished">hold to move right stick at half-speed</translation>
</message>
<message>
<source>Right Stick</source>
<translation type="unfinished">Right Stick</translation>
</message>
<message>
<source>Speed Offset (def 0.125):</source>
<translation type="unfinished">Speed Offset (def 0.125):</translation>
</message>
<message>
<source>Copy from Common Config</source>
<translation type="unfinished">Copy from Common Config</translation>
</message>
<message>
<source>Deadzone Offset (def 0.50):</source>
<translation type="unfinished">Deadzone Offset (def 0.50):</translation>
</message>
<message>
<source>Speed Multiplier (def 1.0):</source>
<translation type="unfinished">Speed Multiplier (def 1.0):</translation>
</message>
<message>
<source>Common Config Selected</source>
<translation type="unfinished">Common Config Selected</translation>
</message>
<message>
<source>This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</source>
<translation type="unfinished">This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</translation>
</message>
<message>
<source>Copy values from Common Config</source>
<translation type="unfinished">Copy values from Common Config</translation>
</message>
<message>
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
<translation type="unfinished">Do you want to overwrite existing mappings with the mappings from the Common Config?</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind any unique input more than once</source>
<translation type="unfinished">Cannot bind any unique input more than once</translation>
</message>
<message>
<source>Press a key</source>
<translation type="unfinished">Press a key</translation>
</message>
<message>
<source>Cannot set mapping</source>
<translation type="unfinished">Cannot set mapping</translation>
</message>
<message>
<source>Mousewheel cannot be mapped to stick outputs</source>
<translation type="unfinished">Mousewheel cannot be mapped to stick outputs</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
@ -1311,6 +1632,10 @@
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder</source>
<translation type="unfinished">Open the custom trophy images/sounds folder</translation>
</message>
<message>
<source>Logger</source>
<translation>Lokinkerääjä</translation>
@ -1476,8 +1801,8 @@
<translation type="unfinished">Title Music</translation>
</message>
<message>
<source>Disable Trophy Pop-ups</source>
<translation>Poista Trophy Pop-upit Käytöstä</translation>
<source>Disable Trophy Notification</source>
<translation type="unfinished">Disable Trophy Notification</translation>
</message>
<message>
<source>Background Image</source>
@ -1803,6 +2128,62 @@
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
<message>
<source>Trophy Notification Position</source>
<translation type="unfinished">Trophy Notification Position</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Top</source>
<translation type="unfinished">Top</translation>
</message>
<message>
<source>Bottom</source>
<translation type="unfinished">Bottom</translation>
</message>
<message>
<source>Notification Duration</source>
<translation type="unfinished">Notification Duration</translation>
</message>
<message>
<source>Portable User Folder</source>
<translation type="unfinished">Portable User Folder</translation>
</message>
<message>
<source>Create Portable User Folder from Common User Folder</source>
<translation type="unfinished">Create Portable User Folder from Common User Folder</translation>
</message>
<message>
<source>Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</source>
<translation type="unfinished">Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</translation>
</message>
<message>
<source>Cannot create portable user folder</source>
<translation type="unfinished">Cannot create portable user folder</translation>
</message>
<message>
<source>%1 already exists</source>
<translation type="unfinished">%1 already exists</translation>
</message>
<message>
<source>Portable user folder created</source>
<translation type="unfinished">Portable user folder created</translation>
</message>
<message>
<source>%1 successfully created.</source>
<translation type="unfinished">%1 successfully created.</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</source>
<translation type="unfinished">Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>
@ -1810,5 +2191,21 @@
<source>Trophy Viewer</source>
<translation>Trophy Selain</translation>
</message>
<message>
<source>Progress</source>
<translation type="unfinished">Progress</translation>
</message>
<message>
<source>Show Earned Trophies</source>
<translation type="unfinished">Show Earned Trophies</translation>
</message>
<message>
<source>Show Not Earned Trophies</source>
<translation type="unfinished">Show Not Earned Trophies</translation>
</message>
<message>
<source>Show Hidden Trophies</source>
<translation type="unfinished">Show Hidden Trophies</translation>
</message>
</context>
</TS>

View File

@ -487,7 +487,7 @@
</message>
<message>
<source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation>
<translation>Touches d'action</translation>
</message>
<message>
<source>Triangle / Y</source>
@ -519,27 +519,98 @@
</message>
<message>
<source>Color Adjustment</source>
<translation type="unfinished">Color Adjustment</translation>
<translation>Ajustement des couleurs</translation>
</message>
<message>
<source>R:</source>
<translation type="unfinished">R:</translation>
<translation>R:</translation>
</message>
<message>
<source>G:</source>
<translation type="unfinished">G:</translation>
<translation>G:</translation>
</message>
<message>
<source>B:</source>
<translation type="unfinished">B:</translation>
<translation>B:</translation>
</message>
<message>
<source>Override Lightbar Color</source>
<translation type="unfinished">Override Lightbar Color</translation>
<translation>Remplacer la couleur de la barre de lumière</translation>
</message>
<message>
<source>Override Color</source>
<translation type="unfinished">Override Color</translation>
<translation>Remplacer la couleur</translation>
</message>
<message>
<source>Unable to Save</source>
<translation>Impossible de sauvegarder</translation>
</message>
<message>
<source>Cannot bind axis values more than once</source>
<translation>Impossible de lier les valeurs de l'axe plusieurs fois</translation>
</message>
<message>
<source>Save</source>
<translation>Enregistrer</translation>
</message>
<message>
<source>Apply</source>
<translation>Appliquer</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation>Réinitialiser par défaut</translation>
</message>
<message>
<source>Cancel</source>
<translation>Annuler</translation>
</message>
</context>
<context>
<name>EditorDialog</name>
<message>
<source>Edit Keyboard + Mouse and Controller input bindings</source>
<translation>Modifier les raccourcis d'entrée clavier + souris et contrôleur</translation>
</message>
<message>
<source>Use Per-Game configs</source>
<translation>Utiliser les configurations pour chaque jeu</translation>
</message>
<message>
<source>Error</source>
<translation>Erreur</translation>
</message>
<message>
<source>Could not open the file for reading</source>
<translation>Impossible d'ouvrir le fichier pour la lecture</translation>
</message>
<message>
<source>Could not open the file for writing</source>
<translation>Impossible d'ouvrir le fichier pour l'écriture</translation>
</message>
<message>
<source>Save Changes</source>
<translation>Enregistrer les Modifications</translation>
</message>
<message>
<source>Do you want to save changes?</source>
<translation>Voulez-vous sauvegarder les modifications?</translation>
</message>
<message>
<source>Help</source>
<translation>Aide</translation>
</message>
<message>
<source>Do you want to reset your custom default config to the original default config?</source>
<translation>Voulez-vous réinitialiser votre configuration par défaut personnalisée à la configuration par défaut d'origine ?</translation>
</message>
<message>
<source>Do you want to reset this config to your custom default config?</source>
<translation>Voulez-vous réinitialiser cette configuration à votre configuration personnalisée par défaut ?</translation>
</message>
<message>
<source>Reset to Default</source>
<translation>Rétablir par défaut</translation>
</message>
</context>
<context>
@ -775,6 +846,10 @@
<source>Delete DLC</source>
<translation>Supprimer DLC</translation>
</message>
<message>
<source>Delete Trophy</source>
<translation>Supprimer Trophée</translation>
</message>
<message>
<source>Compatibility...</source>
<translation>Compatibilité...</translation>
@ -851,6 +926,10 @@
<source>This game has no update folder to open!</source>
<translation>Ce jeu n'a pas de dossier de mise à jour à ouvrir!</translation>
</message>
<message>
<source>No log file found for this game!</source>
<translation>Aucun fichier journal trouvé pour ce jeu!</translation>
</message>
<message>
<source>Failed to convert icon.</source>
<translation>Échec de la conversion de l'icône.</translation>
@ -859,15 +938,46 @@
<source>This game has no save data to delete!</source>
<translation>Ce jeu n'a pas de mise à jour à supprimer!</translation>
</message>
<message>
<source>This game has no saved trophies to delete!</source>
<translation>Ce jeu n'a aucun trophée sauvegardé à supprimer!</translation>
</message>
<message>
<source>Save Data</source>
<translation>Enregistrer les Données</translation>
</message>
<message>
<source>Trophy</source>
<translation>Trophée</translation>
</message>
<message>
<source>SFO Viewer for </source>
<translation>Visionneuse SFO pour </translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>Quickstart</source>
<translation>Démarrage rapide</translation>
</message>
<message>
<source>FAQ</source>
<translation>FAQ</translation>
</message>
<message>
<source>Syntax</source>
<translation>Syntaxe</translation>
</message>
<message>
<source>Special Bindings</source>
<translation>Special bindings</translation>
</message>
<message>
<source>Keybindings</source>
<translation>Raccourcis</translation>
</message>
</context>
<context>
<name>InstallDirSelect</name>
<message>
@ -887,6 +997,217 @@
<translation>Supprimer le fichier PKG à l'installation</translation>
</message>
</context>
<context>
<name>KBMSettings</name>
<message>
<source>Configure Controls</source>
<translation>Configurer les Commandes</translation>
</message>
<message>
<source>D-Pad</source>
<translation>Croix directionnelle</translation>
</message>
<message>
<source>Up</source>
<translation>Haut</translation>
</message>
<message>
<source>unmapped</source>
<translation>non mappé</translation>
</message>
<message>
<source>Left</source>
<translation>Gauche</translation>
</message>
<message>
<source>Right</source>
<translation>Droite</translation>
</message>
<message>
<source>Down</source>
<translation>Bas</translation>
</message>
<message>
<source>Left Analog Halfmode</source>
<translation>Demi-mode analogique gauche</translation>
</message>
<message>
<source>hold to move left stick at half-speed</source>
<translation>maintenez pour déplacer le joystick gauche à mi-vitesse</translation>
</message>
<message>
<source>Left Stick</source>
<translation>Joystick gauche</translation>
</message>
<message>
<source>Config Selection</source>
<translation>Sélection de la Configuration</translation>
</message>
<message>
<source>Common Config</source>
<translation>Configuration Commune</translation>
</message>
<message>
<source>Use per-game configs</source>
<translation>Utiliser les configurations par jeu</translation>
</message>
<message>
<source>L1</source>
<translation>L1</translation>
</message>
<message>
<source>L2</source>
<translation>L2</translation>
</message>
<message>
<source>Text Editor</source>
<translation>Éditeur de Texte</translation>
</message>
<message>
<source>Help</source>
<translation>Aide</translation>
</message>
<message>
<source>R1</source>
<translation>R1</translation>
</message>
<message>
<source>R2</source>
<translation>R2</translation>
</message>
<message>
<source>L3</source>
<translation>L3</translation>
</message>
<message>
<source>Touchpad Click</source>
<translation>Clic tactile</translation>
</message>
<message>
<source>Mouse to Joystick</source>
<translation>Souris vers Joystick</translation>
</message>
<message>
<source>*press F7 ingame to activate</source>
<translation>*Appuyez sur F7 en jeu pour activer</translation>
</message>
<message>
<source>R3</source>
<translation>R3</translation>
</message>
<message>
<source>Options</source>
<translation>Options</translation>
</message>
<message>
<source>Mouse Movement Parameters</source>
<translation>Paramètres du mouvement de la souris</translation>
</message>
<message>
<source>note: click Help Button/Special Keybindings for more information</source>
<translation>remarque: cliquez sur le bouton Aide / Raccourcis spéciaux pour plus d'informations</translation>
</message>
<message>
<source>Face Buttons</source>
<translation>Touches d'action</translation>
</message>
<message>
<source>Triangle</source>
<translation>Triangle</translation>
</message>
<message>
<source>Square</source>
<translation>Carré</translation>
</message>
<message>
<source>Circle</source>
<translation>Rond</translation>
</message>
<message>
<source>Cross</source>
<translation>Croix</translation>
</message>
<message>
<source>Right Analog Halfmode</source>
<translation>Demi-mode analogique droit</translation>
</message>
<message>
<source>hold to move right stick at half-speed</source>
<translation>maintenez pour déplacer le joystick droit à mi-vitesse</translation>
</message>
<message>
<source>Right Stick</source>
<translation>Joystick Droit</translation>
</message>
<message>
<source>Speed Offset (def 0.125):</source>
<translation>Décalage de vitesse (def 0,125) :</translation>
</message>
<message>
<source>Copy from Common Config</source>
<translation>Copier à partir de la configuration commune</translation>
</message>
<message>
<source>Deadzone Offset (def 0.50):</source>
<translation>Deadzone Offset (def 0,50):</translation>
</message>
<message>
<source>Speed Multiplier (def 1.0):</source>
<translation>Multiplicateur de vitesse (def 1,0) :</translation>
</message>
<message>
<source>Common Config Selected</source>
<translation>Configuration courante sélectionnée</translation>
</message>
<message>
<source>This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</source>
<translation>Ce bouton copie les mappings de la configuration commune vers le profil actuellement sélectionné, et ne peut pas être utilisé lorsque le profil actuellement sélectionné est la configuration commune.</translation>
</message>
<message>
<source>Copy values from Common Config</source>
<translation>Copier à partir de la configuration commune</translation>
</message>
<message>
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
<translation>Voulez-vous remplacer les mappings existants par les mappings de la configuration commune ?</translation>
</message>
<message>
<source>Unable to Save</source>
<translation>Impossible de sauvegarder</translation>
</message>
<message>
<source>Cannot bind any unique input more than once</source>
<translation>Impossible de lier une entrée unique plus d'une fois</translation>
</message>
<message>
<source>Press a key</source>
<translation>Appuyez sur un bouton</translation>
</message>
<message>
<source>Cannot set mapping</source>
<translation>Impossible de définir le mapping</translation>
</message>
<message>
<source>Mousewheel cannot be mapped to stick outputs</source>
<translation>La molette de la souris ne peut pas être affectée aux sorties de la manette</translation>
</message>
<message>
<source>Save</source>
<translation>Enregistrer</translation>
</message>
<message>
<source>Apply</source>
<translation>Appliquer</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation>Réinitialiser par défaut</translation>
</message>
<message>
<source>Cancel</source>
<translation>Annuler</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
@ -1234,7 +1555,7 @@
</message>
<message>
<source>Flags</source>
<translation type="unfinished">Flags</translation>
<translation>Les indicateurs</translation>
</message>
<message>
<source>Path</source>
@ -1311,6 +1632,10 @@
<source>Trophy</source>
<translation>Trophée</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder</source>
<translation>Ouvrir le dossier des images/sons de trophée personnalisé</translation>
</message>
<message>
<source>Logger</source>
<translation>Journalisation</translation>
@ -1476,8 +1801,8 @@
<translation>Musique du titre</translation>
</message>
<message>
<source>Disable Trophy Pop-ups</source>
<translation>Désactiver les notifications de trophées</translation>
<source>Disable Trophy Notification</source>
<translation>Désactiver la notification de trophée</translation>
</message>
<message>
<source>Background Image</source>
@ -1577,7 +1902,7 @@
</message>
<message>
<source>Background Image:\nControl the opacity of the game background image.</source>
<translation type="unfinished">Background Image:\nControl the opacity of the game background image.</translation>
<translation>Image de fond :\nContrôle l'opacité de l'image de fond du jeu.</translation>
</message>
<message>
<source>Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI.</source>
@ -1661,7 +1986,7 @@
</message>
<message>
<source>Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format.</source>
<translation type="unfinished">Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format.</translation>
<translation>Activer HDR:\nActive le HDR dans les jeux qui le supportent.\nVotre moniteur doit avoir la prise en charge de l'espace couleur PQ BT2020 et du format swapchain RGB10A2.</translation>
</message>
<message>
<source>Game Folders:\nThe list of folders to check for installed games.</source>
@ -1717,15 +2042,15 @@
</message>
<message>
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
<translation type="unfinished">Browse:\nBrowse for a folder to set as the save data path.</translation>
<translation>Parcourir:\nNaviguez pour trouver un dossier pour définir le chemin des données de sauvegarde.</translation>
</message>
<message>
<source>Release</source>
<translation type="unfinished">Release</translation>
<translation>Sortie</translation>
</message>
<message>
<source>Nightly</source>
<translation type="unfinished">Nightly</translation>
<translation>Nocturne</translation>
</message>
<message>
<source>Set the volume of the background music.</source>
@ -1737,7 +2062,7 @@
</message>
<message>
<source>Save Data Path</source>
<translation type="unfinished">Save Data Path</translation>
<translation>Enregistrer le chemin vers les données</translation>
</message>
<message>
<source>Browse</source>
@ -1745,15 +2070,15 @@
</message>
<message>
<source>async</source>
<translation type="unfinished">async</translation>
<translation>asynchrone</translation>
</message>
<message>
<source>sync</source>
<translation type="unfinished">sync</translation>
<translation>synchrone</translation>
</message>
<message>
<source>Auto Select</source>
<translation type="unfinished">Auto Select</translation>
<translation>Sélection automatique</translation>
</message>
<message>
<source>Directory to install games</source>
@ -1761,47 +2086,103 @@
</message>
<message>
<source>Directory to save data</source>
<translation type="unfinished">Directory to save data</translation>
<translation>Répertoire d'enregistrement des données</translation>
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
<translation>Vidéo</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
<translation>Mode d'affichage</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
<translation>Fenêtré</translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation>
<translation>Plein écran</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation>
<translation>Plein écran (sans bordure)</translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished">Window Size</translation>
<translation>Taille de fenêtre</translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished">W:</translation>
<translation>W:</translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished">H:</translation>
<translation>H:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished">Separate Log Files</translation>
<translation>Séparer les fichiers de log</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
<translation>Fichiers journaux séparés :\nÉcrit un fichier journal séparé pour chaque jeu.</translation>
</message>
<message>
<source>Trophy Notification Position</source>
<translation>Position de notification du trophée</translation>
</message>
<message>
<source>Left</source>
<translation>Gauche</translation>
</message>
<message>
<source>Right</source>
<translation>Droite</translation>
</message>
<message>
<source>Top</source>
<translation>Haut</translation>
</message>
<message>
<source>Bottom</source>
<translation>Bas</translation>
</message>
<message>
<source>Notification Duration</source>
<translation>Durée de la notification</translation>
</message>
<message>
<source>Portable User Folder</source>
<translation>Dossier d'utilisateur portable</translation>
</message>
<message>
<source>Create Portable User Folder from Common User Folder</source>
<translation>Créer un dossier utilisateur portable à partir du dossier utilisateur commun</translation>
</message>
<message>
<source>Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</source>
<translation>Dossier utilisateur portable :\nStocke les paramètres et données shadPS4 qui seront appliqués uniquement à la version shadPS4 située dans le dossier actuel. Redémarrez l'application après avoir créé le dossier utilisateur portable pour commencer à l'utiliser.</translation>
</message>
<message>
<source>Cannot create portable user folder</source>
<translation>Impossible de créer le dossier utilisateur portable</translation>
</message>
<message>
<source>%1 already exists</source>
<translation>%1 existe déjà</translation>
</message>
<message>
<source>Portable user folder created</source>
<translation>Dossier utilisateur portable créé</translation>
</message>
<message>
<source>%1 successfully created.</source>
<translation>%1 a é créé avec succès.</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</source>
<translation>Ouvrez le dossier des images/sons des trophées personnalisés:\nVous pouvez ajouter des images personnalisées aux trophées et aux sons.\nAjoutez les fichiers à custom_trophy avec les noms suivants:\ntrophy.wav OU trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote : Le son ne fonctionnera que dans les versions QT.</translation>
</message>
</context>
<context>
@ -1810,5 +2191,21 @@
<source>Trophy Viewer</source>
<translation>Visionneuse de trophées</translation>
</message>
<message>
<source>Progress</source>
<translation>Progression</translation>
</message>
<message>
<source>Show Earned Trophies</source>
<translation>Afficher les trophées gagnés</translation>
</message>
<message>
<source>Show Not Earned Trophies</source>
<translation>Afficher les trophées non gagnés</translation>
</message>
<message>
<source>Show Hidden Trophies</source>
<translation>Afficher les trophées cachés</translation>
</message>
</context>
</TS>

View File

@ -541,6 +541,77 @@
<source>Override Color</source>
<translation type="unfinished">Override Color</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind axis values more than once</source>
<translation type="unfinished">Cannot bind axis values more than once</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>EditorDialog</name>
<message>
<source>Edit Keyboard + Mouse and Controller input bindings</source>
<translation type="unfinished">Edit Keyboard + Mouse and Controller input bindings</translation>
</message>
<message>
<source>Use Per-Game configs</source>
<translation type="unfinished">Use Per-Game configs</translation>
</message>
<message>
<source>Error</source>
<translation type="unfinished">Error</translation>
</message>
<message>
<source>Could not open the file for reading</source>
<translation type="unfinished">Could not open the file for reading</translation>
</message>
<message>
<source>Could not open the file for writing</source>
<translation type="unfinished">Could not open the file for writing</translation>
</message>
<message>
<source>Save Changes</source>
<translation type="unfinished">Save Changes</translation>
</message>
<message>
<source>Do you want to save changes?</source>
<translation type="unfinished">Do you want to save changes?</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>Do you want to reset your custom default config to the original default config?</source>
<translation type="unfinished">Do you want to reset your custom default config to the original default config?</translation>
</message>
<message>
<source>Do you want to reset this config to your custom default config?</source>
<translation type="unfinished">Do you want to reset this config to your custom default config?</translation>
</message>
<message>
<source>Reset to Default</source>
<translation type="unfinished">Reset to Default</translation>
</message>
</context>
<context>
<name>ElfViewer</name>
@ -775,6 +846,10 @@
<source>Delete DLC</source>
<translation>DLC-k törlése</translation>
</message>
<message>
<source>Delete Trophy</source>
<translation type="unfinished">Delete Trophy</translation>
</message>
<message>
<source>Compatibility...</source>
<translation type="unfinished">Compatibility...</translation>
@ -851,6 +926,10 @@
<source>This game has no update folder to open!</source>
<translation type="unfinished">This game has no update folder to open!</translation>
</message>
<message>
<source>No log file found for this game!</source>
<translation type="unfinished">No log file found for this game!</translation>
</message>
<message>
<source>Failed to convert icon.</source>
<translation type="unfinished">Failed to convert icon.</translation>
@ -859,15 +938,46 @@
<source>This game has no save data to delete!</source>
<translation type="unfinished">This game has no save data to delete!</translation>
</message>
<message>
<source>This game has no saved trophies to delete!</source>
<translation type="unfinished">This game has no saved trophies to delete!</translation>
</message>
<message>
<source>Save Data</source>
<translation type="unfinished">Save Data</translation>
</message>
<message>
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>Quickstart</source>
<translation type="unfinished">Quickstart</translation>
</message>
<message>
<source>FAQ</source>
<translation type="unfinished">FAQ</translation>
</message>
<message>
<source>Syntax</source>
<translation type="unfinished">Syntax</translation>
</message>
<message>
<source>Special Bindings</source>
<translation type="unfinished">Special Bindings</translation>
</message>
<message>
<source>Keybindings</source>
<translation type="unfinished">Keybindings</translation>
</message>
</context>
<context>
<name>InstallDirSelect</name>
<message>
@ -887,6 +997,217 @@
<translation type="unfinished">Delete PKG File on Install</translation>
</message>
</context>
<context>
<name>KBMSettings</name>
<message>
<source>Configure Controls</source>
<translation type="unfinished">Configure Controls</translation>
</message>
<message>
<source>D-Pad</source>
<translation type="unfinished">D-Pad</translation>
</message>
<message>
<source>Up</source>
<translation type="unfinished">Up</translation>
</message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Down</source>
<translation type="unfinished">Down</translation>
</message>
<message>
<source>Left Analog Halfmode</source>
<translation type="unfinished">Left Analog Halfmode</translation>
</message>
<message>
<source>hold to move left stick at half-speed</source>
<translation type="unfinished">hold to move left stick at half-speed</translation>
</message>
<message>
<source>Left Stick</source>
<translation type="unfinished">Left Stick</translation>
</message>
<message>
<source>Config Selection</source>
<translation type="unfinished">Config Selection</translation>
</message>
<message>
<source>Common Config</source>
<translation type="unfinished">Common Config</translation>
</message>
<message>
<source>Use per-game configs</source>
<translation type="unfinished">Use per-game configs</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Text Editor</source>
<translation type="unfinished">Text Editor</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>L3</source>
<translation type="unfinished">L3</translation>
</message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished">Touchpad Click</translation>
</message>
<message>
<source>Mouse to Joystick</source>
<translation type="unfinished">Mouse to Joystick</translation>
</message>
<message>
<source>*press F7 ingame to activate</source>
<translation type="unfinished">*press F7 ingame to activate</translation>
</message>
<message>
<source>R3</source>
<translation type="unfinished">R3</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>Mouse Movement Parameters</source>
<translation type="unfinished">Mouse Movement Parameters</translation>
</message>
<message>
<source>note: click Help Button/Special Keybindings for more information</source>
<translation type="unfinished">note: click Help Button/Special Keybindings for more information</translation>
</message>
<message>
<source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation>
</message>
<message>
<source>Triangle</source>
<translation type="unfinished">Triangle</translation>
</message>
<message>
<source>Square</source>
<translation type="unfinished">Square</translation>
</message>
<message>
<source>Circle</source>
<translation type="unfinished">Circle</translation>
</message>
<message>
<source>Cross</source>
<translation type="unfinished">Cross</translation>
</message>
<message>
<source>Right Analog Halfmode</source>
<translation type="unfinished">Right Analog Halfmode</translation>
</message>
<message>
<source>hold to move right stick at half-speed</source>
<translation type="unfinished">hold to move right stick at half-speed</translation>
</message>
<message>
<source>Right Stick</source>
<translation type="unfinished">Right Stick</translation>
</message>
<message>
<source>Speed Offset (def 0.125):</source>
<translation type="unfinished">Speed Offset (def 0.125):</translation>
</message>
<message>
<source>Copy from Common Config</source>
<translation type="unfinished">Copy from Common Config</translation>
</message>
<message>
<source>Deadzone Offset (def 0.50):</source>
<translation type="unfinished">Deadzone Offset (def 0.50):</translation>
</message>
<message>
<source>Speed Multiplier (def 1.0):</source>
<translation type="unfinished">Speed Multiplier (def 1.0):</translation>
</message>
<message>
<source>Common Config Selected</source>
<translation type="unfinished">Common Config Selected</translation>
</message>
<message>
<source>This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</source>
<translation type="unfinished">This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</translation>
</message>
<message>
<source>Copy values from Common Config</source>
<translation type="unfinished">Copy values from Common Config</translation>
</message>
<message>
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
<translation type="unfinished">Do you want to overwrite existing mappings with the mappings from the Common Config?</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind any unique input more than once</source>
<translation type="unfinished">Cannot bind any unique input more than once</translation>
</message>
<message>
<source>Press a key</source>
<translation type="unfinished">Press a key</translation>
</message>
<message>
<source>Cannot set mapping</source>
<translation type="unfinished">Cannot set mapping</translation>
</message>
<message>
<source>Mousewheel cannot be mapped to stick outputs</source>
<translation type="unfinished">Mousewheel cannot be mapped to stick outputs</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
@ -1311,6 +1632,10 @@
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder</source>
<translation type="unfinished">Open the custom trophy images/sounds folder</translation>
</message>
<message>
<source>Logger</source>
<translation>Naplózó</translation>
@ -1476,8 +1801,8 @@
<translation type="unfinished">Title Music</translation>
</message>
<message>
<source>Disable Trophy Pop-ups</source>
<translation type="unfinished">Disable Trophy Pop-ups</translation>
<source>Disable Trophy Notification</source>
<translation type="unfinished">Disable Trophy Notification</translation>
</message>
<message>
<source>Background Image</source>
@ -1803,6 +2128,62 @@
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
<message>
<source>Trophy Notification Position</source>
<translation type="unfinished">Trophy Notification Position</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Top</source>
<translation type="unfinished">Top</translation>
</message>
<message>
<source>Bottom</source>
<translation type="unfinished">Bottom</translation>
</message>
<message>
<source>Notification Duration</source>
<translation type="unfinished">Notification Duration</translation>
</message>
<message>
<source>Portable User Folder</source>
<translation type="unfinished">Portable User Folder</translation>
</message>
<message>
<source>Create Portable User Folder from Common User Folder</source>
<translation type="unfinished">Create Portable User Folder from Common User Folder</translation>
</message>
<message>
<source>Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</source>
<translation type="unfinished">Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</translation>
</message>
<message>
<source>Cannot create portable user folder</source>
<translation type="unfinished">Cannot create portable user folder</translation>
</message>
<message>
<source>%1 already exists</source>
<translation type="unfinished">%1 already exists</translation>
</message>
<message>
<source>Portable user folder created</source>
<translation type="unfinished">Portable user folder created</translation>
</message>
<message>
<source>%1 successfully created.</source>
<translation type="unfinished">%1 successfully created.</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</source>
<translation type="unfinished">Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>
@ -1810,5 +2191,21 @@
<source>Trophy Viewer</source>
<translation>Trófeák Megtekintése</translation>
</message>
<message>
<source>Progress</source>
<translation type="unfinished">Progress</translation>
</message>
<message>
<source>Show Earned Trophies</source>
<translation type="unfinished">Show Earned Trophies</translation>
</message>
<message>
<source>Show Not Earned Trophies</source>
<translation type="unfinished">Show Not Earned Trophies</translation>
</message>
<message>
<source>Show Hidden Trophies</source>
<translation type="unfinished">Show Hidden Trophies</translation>
</message>
</context>
</TS>

View File

@ -541,6 +541,77 @@
<source>Override Color</source>
<translation type="unfinished">Override Color</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind axis values more than once</source>
<translation type="unfinished">Cannot bind axis values more than once</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>EditorDialog</name>
<message>
<source>Edit Keyboard + Mouse and Controller input bindings</source>
<translation type="unfinished">Edit Keyboard + Mouse and Controller input bindings</translation>
</message>
<message>
<source>Use Per-Game configs</source>
<translation type="unfinished">Use Per-Game configs</translation>
</message>
<message>
<source>Error</source>
<translation type="unfinished">Error</translation>
</message>
<message>
<source>Could not open the file for reading</source>
<translation type="unfinished">Could not open the file for reading</translation>
</message>
<message>
<source>Could not open the file for writing</source>
<translation type="unfinished">Could not open the file for writing</translation>
</message>
<message>
<source>Save Changes</source>
<translation type="unfinished">Save Changes</translation>
</message>
<message>
<source>Do you want to save changes?</source>
<translation type="unfinished">Do you want to save changes?</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>Do you want to reset your custom default config to the original default config?</source>
<translation type="unfinished">Do you want to reset your custom default config to the original default config?</translation>
</message>
<message>
<source>Do you want to reset this config to your custom default config?</source>
<translation type="unfinished">Do you want to reset this config to your custom default config?</translation>
</message>
<message>
<source>Reset to Default</source>
<translation type="unfinished">Reset to Default</translation>
</message>
</context>
<context>
<name>ElfViewer</name>
@ -775,6 +846,10 @@
<source>Delete DLC</source>
<translation type="unfinished">Delete DLC</translation>
</message>
<message>
<source>Delete Trophy</source>
<translation type="unfinished">Delete Trophy</translation>
</message>
<message>
<source>Compatibility...</source>
<translation type="unfinished">Compatibility...</translation>
@ -851,6 +926,10 @@
<source>This game has no update folder to open!</source>
<translation type="unfinished">This game has no update folder to open!</translation>
</message>
<message>
<source>No log file found for this game!</source>
<translation type="unfinished">No log file found for this game!</translation>
</message>
<message>
<source>Failed to convert icon.</source>
<translation type="unfinished">Failed to convert icon.</translation>
@ -859,15 +938,46 @@
<source>This game has no save data to delete!</source>
<translation type="unfinished">This game has no save data to delete!</translation>
</message>
<message>
<source>This game has no saved trophies to delete!</source>
<translation type="unfinished">This game has no saved trophies to delete!</translation>
</message>
<message>
<source>Save Data</source>
<translation type="unfinished">Save Data</translation>
</message>
<message>
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>Quickstart</source>
<translation type="unfinished">Quickstart</translation>
</message>
<message>
<source>FAQ</source>
<translation type="unfinished">FAQ</translation>
</message>
<message>
<source>Syntax</source>
<translation type="unfinished">Syntax</translation>
</message>
<message>
<source>Special Bindings</source>
<translation type="unfinished">Special Bindings</translation>
</message>
<message>
<source>Keybindings</source>
<translation type="unfinished">Keybindings</translation>
</message>
</context>
<context>
<name>InstallDirSelect</name>
<message>
@ -887,6 +997,217 @@
<translation type="unfinished">Delete PKG File on Install</translation>
</message>
</context>
<context>
<name>KBMSettings</name>
<message>
<source>Configure Controls</source>
<translation type="unfinished">Configure Controls</translation>
</message>
<message>
<source>D-Pad</source>
<translation type="unfinished">D-Pad</translation>
</message>
<message>
<source>Up</source>
<translation type="unfinished">Up</translation>
</message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Down</source>
<translation type="unfinished">Down</translation>
</message>
<message>
<source>Left Analog Halfmode</source>
<translation type="unfinished">Left Analog Halfmode</translation>
</message>
<message>
<source>hold to move left stick at half-speed</source>
<translation type="unfinished">hold to move left stick at half-speed</translation>
</message>
<message>
<source>Left Stick</source>
<translation type="unfinished">Left Stick</translation>
</message>
<message>
<source>Config Selection</source>
<translation type="unfinished">Config Selection</translation>
</message>
<message>
<source>Common Config</source>
<translation type="unfinished">Common Config</translation>
</message>
<message>
<source>Use per-game configs</source>
<translation type="unfinished">Use per-game configs</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Text Editor</source>
<translation type="unfinished">Text Editor</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>L3</source>
<translation type="unfinished">L3</translation>
</message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished">Touchpad Click</translation>
</message>
<message>
<source>Mouse to Joystick</source>
<translation type="unfinished">Mouse to Joystick</translation>
</message>
<message>
<source>*press F7 ingame to activate</source>
<translation type="unfinished">*press F7 ingame to activate</translation>
</message>
<message>
<source>R3</source>
<translation type="unfinished">R3</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>Mouse Movement Parameters</source>
<translation type="unfinished">Mouse Movement Parameters</translation>
</message>
<message>
<source>note: click Help Button/Special Keybindings for more information</source>
<translation type="unfinished">note: click Help Button/Special Keybindings for more information</translation>
</message>
<message>
<source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation>
</message>
<message>
<source>Triangle</source>
<translation type="unfinished">Triangle</translation>
</message>
<message>
<source>Square</source>
<translation type="unfinished">Square</translation>
</message>
<message>
<source>Circle</source>
<translation type="unfinished">Circle</translation>
</message>
<message>
<source>Cross</source>
<translation type="unfinished">Cross</translation>
</message>
<message>
<source>Right Analog Halfmode</source>
<translation type="unfinished">Right Analog Halfmode</translation>
</message>
<message>
<source>hold to move right stick at half-speed</source>
<translation type="unfinished">hold to move right stick at half-speed</translation>
</message>
<message>
<source>Right Stick</source>
<translation type="unfinished">Right Stick</translation>
</message>
<message>
<source>Speed Offset (def 0.125):</source>
<translation type="unfinished">Speed Offset (def 0.125):</translation>
</message>
<message>
<source>Copy from Common Config</source>
<translation type="unfinished">Copy from Common Config</translation>
</message>
<message>
<source>Deadzone Offset (def 0.50):</source>
<translation type="unfinished">Deadzone Offset (def 0.50):</translation>
</message>
<message>
<source>Speed Multiplier (def 1.0):</source>
<translation type="unfinished">Speed Multiplier (def 1.0):</translation>
</message>
<message>
<source>Common Config Selected</source>
<translation type="unfinished">Common Config Selected</translation>
</message>
<message>
<source>This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</source>
<translation type="unfinished">This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</translation>
</message>
<message>
<source>Copy values from Common Config</source>
<translation type="unfinished">Copy values from Common Config</translation>
</message>
<message>
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
<translation type="unfinished">Do you want to overwrite existing mappings with the mappings from the Common Config?</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind any unique input more than once</source>
<translation type="unfinished">Cannot bind any unique input more than once</translation>
</message>
<message>
<source>Press a key</source>
<translation type="unfinished">Press a key</translation>
</message>
<message>
<source>Cannot set mapping</source>
<translation type="unfinished">Cannot set mapping</translation>
</message>
<message>
<source>Mousewheel cannot be mapped to stick outputs</source>
<translation type="unfinished">Mousewheel cannot be mapped to stick outputs</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
@ -1311,6 +1632,10 @@
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder</source>
<translation type="unfinished">Open the custom trophy images/sounds folder</translation>
</message>
<message>
<source>Logger</source>
<translation type="unfinished">Logger</translation>
@ -1476,8 +1801,8 @@
<translation type="unfinished">Title Music</translation>
</message>
<message>
<source>Disable Trophy Pop-ups</source>
<translation type="unfinished">Disable Trophy Pop-ups</translation>
<source>Disable Trophy Notification</source>
<translation type="unfinished">Disable Trophy Notification</translation>
</message>
<message>
<source>Background Image</source>
@ -1803,6 +2128,62 @@
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
<message>
<source>Trophy Notification Position</source>
<translation type="unfinished">Trophy Notification Position</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Top</source>
<translation type="unfinished">Top</translation>
</message>
<message>
<source>Bottom</source>
<translation type="unfinished">Bottom</translation>
</message>
<message>
<source>Notification Duration</source>
<translation type="unfinished">Notification Duration</translation>
</message>
<message>
<source>Portable User Folder</source>
<translation type="unfinished">Portable User Folder</translation>
</message>
<message>
<source>Create Portable User Folder from Common User Folder</source>
<translation type="unfinished">Create Portable User Folder from Common User Folder</translation>
</message>
<message>
<source>Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</source>
<translation type="unfinished">Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</translation>
</message>
<message>
<source>Cannot create portable user folder</source>
<translation type="unfinished">Cannot create portable user folder</translation>
</message>
<message>
<source>%1 already exists</source>
<translation type="unfinished">%1 already exists</translation>
</message>
<message>
<source>Portable user folder created</source>
<translation type="unfinished">Portable user folder created</translation>
</message>
<message>
<source>%1 successfully created.</source>
<translation type="unfinished">%1 successfully created.</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</source>
<translation type="unfinished">Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>
@ -1810,5 +2191,21 @@
<source>Trophy Viewer</source>
<translation type="unfinished">Trophy Viewer</translation>
</message>
<message>
<source>Progress</source>
<translation type="unfinished">Progress</translation>
</message>
<message>
<source>Show Earned Trophies</source>
<translation type="unfinished">Show Earned Trophies</translation>
</message>
<message>
<source>Show Not Earned Trophies</source>
<translation type="unfinished">Show Not Earned Trophies</translation>
</message>
<message>
<source>Show Hidden Trophies</source>
<translation type="unfinished">Show Hidden Trophies</translation>
</message>
</context>
</TS>

View File

@ -541,6 +541,77 @@
<source>Override Color</source>
<translation>Sostituisci Colore</translation>
</message>
<message>
<source>Unable to Save</source>
<translation>Impossibile Salvare</translation>
</message>
<message>
<source>Cannot bind axis values more than once</source>
<translation>Impossibile associare i valori degli assi più di una volta</translation>
</message>
<message>
<source>Save</source>
<translation>Salva</translation>
</message>
<message>
<source>Apply</source>
<translation>Applica</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation>Ripristina Impostazioni Predefinite</translation>
</message>
<message>
<source>Cancel</source>
<translation>Annulla</translation>
</message>
</context>
<context>
<name>EditorDialog</name>
<message>
<source>Edit Keyboard + Mouse and Controller input bindings</source>
<translation>Modifica le associazioni di input di tastiera + mouse e controller</translation>
</message>
<message>
<source>Use Per-Game configs</source>
<translation>Usa Configurazioni Per Gioco</translation>
</message>
<message>
<source>Error</source>
<translation>Errore</translation>
</message>
<message>
<source>Could not open the file for reading</source>
<translation>Impossibile aprire il file per la lettura</translation>
</message>
<message>
<source>Could not open the file for writing</source>
<translation>Impossibile aprire il file per la scrittura</translation>
</message>
<message>
<source>Save Changes</source>
<translation>Salva Modifiche</translation>
</message>
<message>
<source>Do you want to save changes?</source>
<translation>Vuoi salvare le modifiche?</translation>
</message>
<message>
<source>Help</source>
<translation>Aiuto</translation>
</message>
<message>
<source>Do you want to reset your custom default config to the original default config?</source>
<translation>Vuoi reimpostare la configurazione predefinita personalizzata alla configurazione predefinita originale?</translation>
</message>
<message>
<source>Do you want to reset this config to your custom default config?</source>
<translation>Vuoi reimpostare questa configurazione alla configurazione predefinita personalizzata?</translation>
</message>
<message>
<source>Reset to Default</source>
<translation>Ripristina a Predefinito</translation>
</message>
</context>
<context>
<name>ElfViewer</name>
@ -775,6 +846,10 @@
<source>Delete DLC</source>
<translation>Elimina DLC</translation>
</message>
<message>
<source>Delete Trophy</source>
<translation>Elimina Trofei</translation>
</message>
<message>
<source>Compatibility...</source>
<translation>Compatibilità...</translation>
@ -851,6 +926,10 @@
<source>This game has no update folder to open!</source>
<translation>Questo gioco non ha nessuna cartella di aggiornamento da aprire!</translation>
</message>
<message>
<source>No log file found for this game!</source>
<translation>Nessun file di log trovato per questo gioco!</translation>
</message>
<message>
<source>Failed to convert icon.</source>
<translation>Impossibile convertire l'icona.</translation>
@ -859,15 +938,46 @@
<source>This game has no save data to delete!</source>
<translation>Questo gioco non ha alcun salvataggio dati da eliminare!</translation>
</message>
<message>
<source>This game has no saved trophies to delete!</source>
<translation>Questo gioco non ha nessun trofeo salvato da eliminare!</translation>
</message>
<message>
<source>Save Data</source>
<translation>Dati Salvataggio</translation>
</message>
<message>
<source>Trophy</source>
<translation>Trofei</translation>
</message>
<message>
<source>SFO Viewer for </source>
<translation>Visualizzatore SFO per </translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>Quickstart</source>
<translation>Avvio rapido</translation>
</message>
<message>
<source>FAQ</source>
<translation>FAQ</translation>
</message>
<message>
<source>Syntax</source>
<translation>Sintassi</translation>
</message>
<message>
<source>Special Bindings</source>
<translation>Associazioni Speciali</translation>
</message>
<message>
<source>Keybindings</source>
<translation>Associazioni dei pulsanti</translation>
</message>
</context>
<context>
<name>InstallDirSelect</name>
<message>
@ -887,6 +997,217 @@
<translation>Elimina file PKG dopo Installazione</translation>
</message>
</context>
<context>
<name>KBMSettings</name>
<message>
<source>Configure Controls</source>
<translation>Configura Comandi</translation>
</message>
<message>
<source>D-Pad</source>
<translation>Croce direzionale</translation>
</message>
<message>
<source>Up</source>
<translation>Su</translation>
</message>
<message>
<source>unmapped</source>
<translation>non mappato</translation>
</message>
<message>
<source>Left</source>
<translation>Sinistra</translation>
</message>
<message>
<source>Right</source>
<translation>Destra</translation>
</message>
<message>
<source>Down</source>
<translation>Giù</translation>
</message>
<message>
<source>Left Analog Halfmode</source>
<translation>Mezza Modalità Analogico Sinistra</translation>
</message>
<message>
<source>hold to move left stick at half-speed</source>
<translation>tieni premuto per muovere la levetta analogica sinistra a metà velocità</translation>
</message>
<message>
<source>Left Stick</source>
<translation>Levetta Sinistra</translation>
</message>
<message>
<source>Config Selection</source>
<translation>Selezione Configurazione</translation>
</message>
<message>
<source>Common Config</source>
<translation>Configurazione Comune</translation>
</message>
<message>
<source>Use per-game configs</source>
<translation>Usa configurazioni per gioco</translation>
</message>
<message>
<source>L1</source>
<translation>L1</translation>
</message>
<message>
<source>L2</source>
<translation>L2</translation>
</message>
<message>
<source>Text Editor</source>
<translation>Editor Testuale</translation>
</message>
<message>
<source>Help</source>
<translation>Aiuto</translation>
</message>
<message>
<source>R1</source>
<translation>R1</translation>
</message>
<message>
<source>R2</source>
<translation>R2</translation>
</message>
<message>
<source>L3</source>
<translation>L3</translation>
</message>
<message>
<source>Touchpad Click</source>
<translation>Click Touchpad</translation>
</message>
<message>
<source>Mouse to Joystick</source>
<translation>Mouse a Joystick</translation>
</message>
<message>
<source>*press F7 ingame to activate</source>
<translation>*premere F7 in gioco per attivare</translation>
</message>
<message>
<source>R3</source>
<translation>R3</translation>
</message>
<message>
<source>Options</source>
<translation>Opzioni</translation>
</message>
<message>
<source>Mouse Movement Parameters</source>
<translation>Parametri Movimento Del Mouse</translation>
</message>
<message>
<source>note: click Help Button/Special Keybindings for more information</source>
<translation>nota: cliccare sul Pulsante Aiuto/Associazioni Speciali dei Tasti per maggiori informazioni</translation>
</message>
<message>
<source>Face Buttons</source>
<translation>Pulsanti Frontali</translation>
</message>
<message>
<source>Triangle</source>
<translation>Triangolo</translation>
</message>
<message>
<source>Square</source>
<translation>Quadrato</translation>
</message>
<message>
<source>Circle</source>
<translation>Cerchio</translation>
</message>
<message>
<source>Cross</source>
<translation>Croce</translation>
</message>
<message>
<source>Right Analog Halfmode</source>
<translation>Mezza Modalità Analogico Destra</translation>
</message>
<message>
<source>hold to move right stick at half-speed</source>
<translation>tieni premuto per muovere la levetta analogica destra a metà velocità</translation>
</message>
<message>
<source>Right Stick</source>
<translation>Levetta Destra</translation>
</message>
<message>
<source>Speed Offset (def 0.125):</source>
<translation>Scostamento Velocità (def 0,125):</translation>
</message>
<message>
<source>Copy from Common Config</source>
<translation>Copia da Configurazione Comune</translation>
</message>
<message>
<source>Deadzone Offset (def 0.50):</source>
<translation>Scostamento Zona Morta (def 0,50):</translation>
</message>
<message>
<source>Speed Multiplier (def 1.0):</source>
<translation>Moltiplicatore Di Velocità (def 1,0):</translation>
</message>
<message>
<source>Common Config Selected</source>
<translation>Configurazione Comune Selezionata</translation>
</message>
<message>
<source>This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</source>
<translation>Questo pulsante copia le mappature dalla Configurazione Comune al profilo attualmente selezionato, e non può essere usato quando il profilo attualmente selezionato è Configurazione Comune.</translation>
</message>
<message>
<source>Copy values from Common Config</source>
<translation>Copia valori da Configurazione Comune</translation>
</message>
<message>
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
<translation>Vuoi sovrascrivere le mappature esistenti con le mappature dalla Configurazione Comune?</translation>
</message>
<message>
<source>Unable to Save</source>
<translation>Impossibile Salvare</translation>
</message>
<message>
<source>Cannot bind any unique input more than once</source>
<translation>Non è possibile associare qualsiasi input univoco più di una volta</translation>
</message>
<message>
<source>Press a key</source>
<translation>Premi un tasto</translation>
</message>
<message>
<source>Cannot set mapping</source>
<translation>Impossibile impostare la mappatura</translation>
</message>
<message>
<source>Mousewheel cannot be mapped to stick outputs</source>
<translation>La rotella del mouse non può essere associata ai comandi della levetta analogica</translation>
</message>
<message>
<source>Save</source>
<translation>Salva</translation>
</message>
<message>
<source>Apply</source>
<translation>Applica</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation>Ripristina Impostazioni Predefinite</translation>
</message>
<message>
<source>Cancel</source>
<translation>Annulla</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
@ -1311,6 +1632,10 @@
<source>Trophy</source>
<translation>Trofei</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder</source>
<translation>Apri la cartella personalizzata delle immagini/suoni dei trofei</translation>
</message>
<message>
<source>Logger</source>
<translation>Registro</translation>
@ -1476,8 +1801,8 @@
<translation>Musica del Titolo</translation>
</message>
<message>
<source>Disable Trophy Pop-ups</source>
<translation>Disabilita Notifica Trofei</translation>
<source>Disable Trophy Notification</source>
<translation>Disabilita Notifiche Trofei</translation>
</message>
<message>
<source>Background Image</source>
@ -1803,6 +2128,62 @@
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation>File di registro separati:\nScrive un file di registro separato per ogni gioco.</translation>
</message>
<message>
<source>Trophy Notification Position</source>
<translation>Posizione Notifica Trofei</translation>
</message>
<message>
<source>Left</source>
<translation>Sinistra</translation>
</message>
<message>
<source>Right</source>
<translation>Destra</translation>
</message>
<message>
<source>Top</source>
<translation>In alto</translation>
</message>
<message>
<source>Bottom</source>
<translation>In basso</translation>
</message>
<message>
<source>Notification Duration</source>
<translation>Durata Notifica</translation>
</message>
<message>
<source>Portable User Folder</source>
<translation>Cartella Utente Portatile</translation>
</message>
<message>
<source>Create Portable User Folder from Common User Folder</source>
<translation>Crea una Cartella Utente Portatile dalla Cartella Comune Utente</translation>
</message>
<message>
<source>Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</source>
<translation>Cartella utente portatile:\nMemorizza le impostazioni e i dati shadPS4 che saranno applicati solo alla build shadPS4 situata nella cartella attuale. Riavviare l'applicazione dopo aver creato la cartella utente portatile per iniziare a usarla.</translation>
</message>
<message>
<source>Cannot create portable user folder</source>
<translation>Impossibile creare la cartella utente portatile</translation>
</message>
<message>
<source>%1 already exists</source>
<translation>%1: esiste già</translation>
</message>
<message>
<source>Portable user folder created</source>
<translation>Cartella utente portatile creata</translation>
</message>
<message>
<source>%1 successfully created.</source>
<translation>%1 creato con successo.</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</source>
<translation>Apri la cartella personalizzata delle immagini/suoni trofei:\ possibile aggiungere immagini personalizzate ai trofei e un audio.\nAggiungi i file a custom_trophy con i seguenti nomi:\ntrophy.wav OPPURE trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNota: Il suono funzionerà solo nelle versioni QT.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>
@ -1810,5 +2191,21 @@
<source>Trophy Viewer</source>
<translation>Visualizzatore Trofei</translation>
</message>
<message>
<source>Progress</source>
<translation>Progresso</translation>
</message>
<message>
<source>Show Earned Trophies</source>
<translation>Mostra Trofei Guadagnati</translation>
</message>
<message>
<source>Show Not Earned Trophies</source>
<translation>Mostra Trofei Non Guadagnati</translation>
</message>
<message>
<source>Show Hidden Trophies</source>
<translation>Mostra Trofei Nascosti</translation>
</message>
</context>
</TS>

View File

@ -541,6 +541,77 @@
<source>Override Color</source>
<translation type="unfinished">Override Color</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind axis values more than once</source>
<translation type="unfinished">Cannot bind axis values more than once</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>EditorDialog</name>
<message>
<source>Edit Keyboard + Mouse and Controller input bindings</source>
<translation type="unfinished">Edit Keyboard + Mouse and Controller input bindings</translation>
</message>
<message>
<source>Use Per-Game configs</source>
<translation type="unfinished">Use Per-Game configs</translation>
</message>
<message>
<source>Error</source>
<translation type="unfinished">Error</translation>
</message>
<message>
<source>Could not open the file for reading</source>
<translation type="unfinished">Could not open the file for reading</translation>
</message>
<message>
<source>Could not open the file for writing</source>
<translation type="unfinished">Could not open the file for writing</translation>
</message>
<message>
<source>Save Changes</source>
<translation type="unfinished">Save Changes</translation>
</message>
<message>
<source>Do you want to save changes?</source>
<translation type="unfinished">Do you want to save changes?</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>Do you want to reset your custom default config to the original default config?</source>
<translation type="unfinished">Do you want to reset your custom default config to the original default config?</translation>
</message>
<message>
<source>Do you want to reset this config to your custom default config?</source>
<translation type="unfinished">Do you want to reset this config to your custom default config?</translation>
</message>
<message>
<source>Reset to Default</source>
<translation type="unfinished">Reset to Default</translation>
</message>
</context>
<context>
<name>ElfViewer</name>
@ -775,6 +846,10 @@
<source>Delete DLC</source>
<translation>DLCを削除</translation>
</message>
<message>
<source>Delete Trophy</source>
<translation type="unfinished">Delete Trophy</translation>
</message>
<message>
<source>Compatibility...</source>
<translation>...</translation>
@ -851,6 +926,10 @@
<source>This game has no update folder to open!</source>
<translation></translation>
</message>
<message>
<source>No log file found for this game!</source>
<translation type="unfinished">No log file found for this game!</translation>
</message>
<message>
<source>Failed to convert icon.</source>
<translation></translation>
@ -859,15 +938,46 @@
<source>This game has no save data to delete!</source>
<translation></translation>
</message>
<message>
<source>This game has no saved trophies to delete!</source>
<translation type="unfinished">This game has no saved trophies to delete!</translation>
</message>
<message>
<source>Save Data</source>
<translation type="unfinished">Save Data</translation>
</message>
<message>
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>Quickstart</source>
<translation type="unfinished">Quickstart</translation>
</message>
<message>
<source>FAQ</source>
<translation type="unfinished">FAQ</translation>
</message>
<message>
<source>Syntax</source>
<translation type="unfinished">Syntax</translation>
</message>
<message>
<source>Special Bindings</source>
<translation type="unfinished">Special Bindings</translation>
</message>
<message>
<source>Keybindings</source>
<translation type="unfinished">Keybindings</translation>
</message>
</context>
<context>
<name>InstallDirSelect</name>
<message>
@ -887,6 +997,217 @@
<translation>PKGファイルを削除</translation>
</message>
</context>
<context>
<name>KBMSettings</name>
<message>
<source>Configure Controls</source>
<translation type="unfinished">Configure Controls</translation>
</message>
<message>
<source>D-Pad</source>
<translation type="unfinished">D-Pad</translation>
</message>
<message>
<source>Up</source>
<translation type="unfinished">Up</translation>
</message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Down</source>
<translation type="unfinished">Down</translation>
</message>
<message>
<source>Left Analog Halfmode</source>
<translation type="unfinished">Left Analog Halfmode</translation>
</message>
<message>
<source>hold to move left stick at half-speed</source>
<translation type="unfinished">hold to move left stick at half-speed</translation>
</message>
<message>
<source>Left Stick</source>
<translation type="unfinished">Left Stick</translation>
</message>
<message>
<source>Config Selection</source>
<translation type="unfinished">Config Selection</translation>
</message>
<message>
<source>Common Config</source>
<translation type="unfinished">Common Config</translation>
</message>
<message>
<source>Use per-game configs</source>
<translation type="unfinished">Use per-game configs</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Text Editor</source>
<translation type="unfinished">Text Editor</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>L3</source>
<translation type="unfinished">L3</translation>
</message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished">Touchpad Click</translation>
</message>
<message>
<source>Mouse to Joystick</source>
<translation type="unfinished">Mouse to Joystick</translation>
</message>
<message>
<source>*press F7 ingame to activate</source>
<translation type="unfinished">*press F7 ingame to activate</translation>
</message>
<message>
<source>R3</source>
<translation type="unfinished">R3</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>Mouse Movement Parameters</source>
<translation type="unfinished">Mouse Movement Parameters</translation>
</message>
<message>
<source>note: click Help Button/Special Keybindings for more information</source>
<translation type="unfinished">note: click Help Button/Special Keybindings for more information</translation>
</message>
<message>
<source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation>
</message>
<message>
<source>Triangle</source>
<translation type="unfinished">Triangle</translation>
</message>
<message>
<source>Square</source>
<translation type="unfinished">Square</translation>
</message>
<message>
<source>Circle</source>
<translation type="unfinished">Circle</translation>
</message>
<message>
<source>Cross</source>
<translation type="unfinished">Cross</translation>
</message>
<message>
<source>Right Analog Halfmode</source>
<translation type="unfinished">Right Analog Halfmode</translation>
</message>
<message>
<source>hold to move right stick at half-speed</source>
<translation type="unfinished">hold to move right stick at half-speed</translation>
</message>
<message>
<source>Right Stick</source>
<translation type="unfinished">Right Stick</translation>
</message>
<message>
<source>Speed Offset (def 0.125):</source>
<translation type="unfinished">Speed Offset (def 0.125):</translation>
</message>
<message>
<source>Copy from Common Config</source>
<translation type="unfinished">Copy from Common Config</translation>
</message>
<message>
<source>Deadzone Offset (def 0.50):</source>
<translation type="unfinished">Deadzone Offset (def 0.50):</translation>
</message>
<message>
<source>Speed Multiplier (def 1.0):</source>
<translation type="unfinished">Speed Multiplier (def 1.0):</translation>
</message>
<message>
<source>Common Config Selected</source>
<translation type="unfinished">Common Config Selected</translation>
</message>
<message>
<source>This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</source>
<translation type="unfinished">This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</translation>
</message>
<message>
<source>Copy values from Common Config</source>
<translation type="unfinished">Copy values from Common Config</translation>
</message>
<message>
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
<translation type="unfinished">Do you want to overwrite existing mappings with the mappings from the Common Config?</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind any unique input more than once</source>
<translation type="unfinished">Cannot bind any unique input more than once</translation>
</message>
<message>
<source>Press a key</source>
<translation type="unfinished">Press a key</translation>
</message>
<message>
<source>Cannot set mapping</source>
<translation type="unfinished">Cannot set mapping</translation>
</message>
<message>
<source>Mousewheel cannot be mapped to stick outputs</source>
<translation type="unfinished">Mousewheel cannot be mapped to stick outputs</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
@ -1311,6 +1632,10 @@
<source>Trophy</source>
<translation></translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder</source>
<translation type="unfinished">Open the custom trophy images/sounds folder</translation>
</message>
<message>
<source>Logger</source>
<translation></translation>
@ -1476,8 +1801,8 @@
<translation type="unfinished">Title Music</translation>
</message>
<message>
<source>Disable Trophy Pop-ups</source>
<translation></translation>
<source>Disable Trophy Notification</source>
<translation type="unfinished">Disable Trophy Notification</translation>
</message>
<message>
<source>Background Image</source>
@ -1803,6 +2128,62 @@
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
<message>
<source>Trophy Notification Position</source>
<translation type="unfinished">Trophy Notification Position</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Top</source>
<translation type="unfinished">Top</translation>
</message>
<message>
<source>Bottom</source>
<translation type="unfinished">Bottom</translation>
</message>
<message>
<source>Notification Duration</source>
<translation type="unfinished">Notification Duration</translation>
</message>
<message>
<source>Portable User Folder</source>
<translation type="unfinished">Portable User Folder</translation>
</message>
<message>
<source>Create Portable User Folder from Common User Folder</source>
<translation type="unfinished">Create Portable User Folder from Common User Folder</translation>
</message>
<message>
<source>Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</source>
<translation type="unfinished">Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</translation>
</message>
<message>
<source>Cannot create portable user folder</source>
<translation type="unfinished">Cannot create portable user folder</translation>
</message>
<message>
<source>%1 already exists</source>
<translation type="unfinished">%1 already exists</translation>
</message>
<message>
<source>Portable user folder created</source>
<translation type="unfinished">Portable user folder created</translation>
</message>
<message>
<source>%1 successfully created.</source>
<translation type="unfinished">%1 successfully created.</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</source>
<translation type="unfinished">Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>
@ -1810,5 +2191,21 @@
<source>Trophy Viewer</source>
<translation></translation>
</message>
<message>
<source>Progress</source>
<translation type="unfinished">Progress</translation>
</message>
<message>
<source>Show Earned Trophies</source>
<translation type="unfinished">Show Earned Trophies</translation>
</message>
<message>
<source>Show Not Earned Trophies</source>
<translation type="unfinished">Show Not Earned Trophies</translation>
</message>
<message>
<source>Show Hidden Trophies</source>
<translation type="unfinished">Show Hidden Trophies</translation>
</message>
</context>
</TS>

View File

@ -541,6 +541,77 @@
<source>Override Color</source>
<translation type="unfinished">Override Color</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind axis values more than once</source>
<translation type="unfinished">Cannot bind axis values more than once</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>EditorDialog</name>
<message>
<source>Edit Keyboard + Mouse and Controller input bindings</source>
<translation type="unfinished">Edit Keyboard + Mouse and Controller input bindings</translation>
</message>
<message>
<source>Use Per-Game configs</source>
<translation type="unfinished">Use Per-Game configs</translation>
</message>
<message>
<source>Error</source>
<translation type="unfinished">Error</translation>
</message>
<message>
<source>Could not open the file for reading</source>
<translation type="unfinished">Could not open the file for reading</translation>
</message>
<message>
<source>Could not open the file for writing</source>
<translation type="unfinished">Could not open the file for writing</translation>
</message>
<message>
<source>Save Changes</source>
<translation type="unfinished">Save Changes</translation>
</message>
<message>
<source>Do you want to save changes?</source>
<translation type="unfinished">Do you want to save changes?</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>Do you want to reset your custom default config to the original default config?</source>
<translation type="unfinished">Do you want to reset your custom default config to the original default config?</translation>
</message>
<message>
<source>Do you want to reset this config to your custom default config?</source>
<translation type="unfinished">Do you want to reset this config to your custom default config?</translation>
</message>
<message>
<source>Reset to Default</source>
<translation type="unfinished">Reset to Default</translation>
</message>
</context>
<context>
<name>ElfViewer</name>
@ -775,6 +846,10 @@
<source>Delete DLC</source>
<translation type="unfinished">Delete DLC</translation>
</message>
<message>
<source>Delete Trophy</source>
<translation type="unfinished">Delete Trophy</translation>
</message>
<message>
<source>Compatibility...</source>
<translation type="unfinished">Compatibility...</translation>
@ -851,6 +926,10 @@
<source>This game has no update folder to open!</source>
<translation type="unfinished">This game has no update folder to open!</translation>
</message>
<message>
<source>No log file found for this game!</source>
<translation type="unfinished">No log file found for this game!</translation>
</message>
<message>
<source>Failed to convert icon.</source>
<translation type="unfinished">Failed to convert icon.</translation>
@ -859,15 +938,46 @@
<source>This game has no save data to delete!</source>
<translation type="unfinished">This game has no save data to delete!</translation>
</message>
<message>
<source>This game has no saved trophies to delete!</source>
<translation type="unfinished">This game has no saved trophies to delete!</translation>
</message>
<message>
<source>Save Data</source>
<translation type="unfinished">Save Data</translation>
</message>
<message>
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>Quickstart</source>
<translation type="unfinished">Quickstart</translation>
</message>
<message>
<source>FAQ</source>
<translation type="unfinished">FAQ</translation>
</message>
<message>
<source>Syntax</source>
<translation type="unfinished">Syntax</translation>
</message>
<message>
<source>Special Bindings</source>
<translation type="unfinished">Special Bindings</translation>
</message>
<message>
<source>Keybindings</source>
<translation type="unfinished">Keybindings</translation>
</message>
</context>
<context>
<name>InstallDirSelect</name>
<message>
@ -887,6 +997,217 @@
<translation type="unfinished">Delete PKG File on Install</translation>
</message>
</context>
<context>
<name>KBMSettings</name>
<message>
<source>Configure Controls</source>
<translation type="unfinished">Configure Controls</translation>
</message>
<message>
<source>D-Pad</source>
<translation type="unfinished">D-Pad</translation>
</message>
<message>
<source>Up</source>
<translation type="unfinished">Up</translation>
</message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Down</source>
<translation type="unfinished">Down</translation>
</message>
<message>
<source>Left Analog Halfmode</source>
<translation type="unfinished">Left Analog Halfmode</translation>
</message>
<message>
<source>hold to move left stick at half-speed</source>
<translation type="unfinished">hold to move left stick at half-speed</translation>
</message>
<message>
<source>Left Stick</source>
<translation type="unfinished">Left Stick</translation>
</message>
<message>
<source>Config Selection</source>
<translation type="unfinished">Config Selection</translation>
</message>
<message>
<source>Common Config</source>
<translation type="unfinished">Common Config</translation>
</message>
<message>
<source>Use per-game configs</source>
<translation type="unfinished">Use per-game configs</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Text Editor</source>
<translation type="unfinished">Text Editor</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>L3</source>
<translation type="unfinished">L3</translation>
</message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished">Touchpad Click</translation>
</message>
<message>
<source>Mouse to Joystick</source>
<translation type="unfinished">Mouse to Joystick</translation>
</message>
<message>
<source>*press F7 ingame to activate</source>
<translation type="unfinished">*press F7 ingame to activate</translation>
</message>
<message>
<source>R3</source>
<translation type="unfinished">R3</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>Mouse Movement Parameters</source>
<translation type="unfinished">Mouse Movement Parameters</translation>
</message>
<message>
<source>note: click Help Button/Special Keybindings for more information</source>
<translation type="unfinished">note: click Help Button/Special Keybindings for more information</translation>
</message>
<message>
<source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation>
</message>
<message>
<source>Triangle</source>
<translation type="unfinished">Triangle</translation>
</message>
<message>
<source>Square</source>
<translation type="unfinished">Square</translation>
</message>
<message>
<source>Circle</source>
<translation type="unfinished">Circle</translation>
</message>
<message>
<source>Cross</source>
<translation type="unfinished">Cross</translation>
</message>
<message>
<source>Right Analog Halfmode</source>
<translation type="unfinished">Right Analog Halfmode</translation>
</message>
<message>
<source>hold to move right stick at half-speed</source>
<translation type="unfinished">hold to move right stick at half-speed</translation>
</message>
<message>
<source>Right Stick</source>
<translation type="unfinished">Right Stick</translation>
</message>
<message>
<source>Speed Offset (def 0.125):</source>
<translation type="unfinished">Speed Offset (def 0.125):</translation>
</message>
<message>
<source>Copy from Common Config</source>
<translation type="unfinished">Copy from Common Config</translation>
</message>
<message>
<source>Deadzone Offset (def 0.50):</source>
<translation type="unfinished">Deadzone Offset (def 0.50):</translation>
</message>
<message>
<source>Speed Multiplier (def 1.0):</source>
<translation type="unfinished">Speed Multiplier (def 1.0):</translation>
</message>
<message>
<source>Common Config Selected</source>
<translation type="unfinished">Common Config Selected</translation>
</message>
<message>
<source>This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</source>
<translation type="unfinished">This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</translation>
</message>
<message>
<source>Copy values from Common Config</source>
<translation type="unfinished">Copy values from Common Config</translation>
</message>
<message>
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
<translation type="unfinished">Do you want to overwrite existing mappings with the mappings from the Common Config?</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind any unique input more than once</source>
<translation type="unfinished">Cannot bind any unique input more than once</translation>
</message>
<message>
<source>Press a key</source>
<translation type="unfinished">Press a key</translation>
</message>
<message>
<source>Cannot set mapping</source>
<translation type="unfinished">Cannot set mapping</translation>
</message>
<message>
<source>Mousewheel cannot be mapped to stick outputs</source>
<translation type="unfinished">Mousewheel cannot be mapped to stick outputs</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
@ -1311,6 +1632,10 @@
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder</source>
<translation type="unfinished">Open the custom trophy images/sounds folder</translation>
</message>
<message>
<source>Logger</source>
<translation type="unfinished">Logger</translation>
@ -1476,8 +1801,8 @@
<translation type="unfinished">Title Music</translation>
</message>
<message>
<source>Disable Trophy Pop-ups</source>
<translation type="unfinished">Disable Trophy Pop-ups</translation>
<source>Disable Trophy Notification</source>
<translation type="unfinished">Disable Trophy Notification</translation>
</message>
<message>
<source>Background Image</source>
@ -1803,6 +2128,62 @@
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
<message>
<source>Trophy Notification Position</source>
<translation type="unfinished">Trophy Notification Position</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Top</source>
<translation type="unfinished">Top</translation>
</message>
<message>
<source>Bottom</source>
<translation type="unfinished">Bottom</translation>
</message>
<message>
<source>Notification Duration</source>
<translation type="unfinished">Notification Duration</translation>
</message>
<message>
<source>Portable User Folder</source>
<translation type="unfinished">Portable User Folder</translation>
</message>
<message>
<source>Create Portable User Folder from Common User Folder</source>
<translation type="unfinished">Create Portable User Folder from Common User Folder</translation>
</message>
<message>
<source>Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</source>
<translation type="unfinished">Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</translation>
</message>
<message>
<source>Cannot create portable user folder</source>
<translation type="unfinished">Cannot create portable user folder</translation>
</message>
<message>
<source>%1 already exists</source>
<translation type="unfinished">%1 already exists</translation>
</message>
<message>
<source>Portable user folder created</source>
<translation type="unfinished">Portable user folder created</translation>
</message>
<message>
<source>%1 successfully created.</source>
<translation type="unfinished">%1 successfully created.</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</source>
<translation type="unfinished">Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>
@ -1810,5 +2191,21 @@
<source>Trophy Viewer</source>
<translation type="unfinished">Trophy Viewer</translation>
</message>
<message>
<source>Progress</source>
<translation type="unfinished">Progress</translation>
</message>
<message>
<source>Show Earned Trophies</source>
<translation type="unfinished">Show Earned Trophies</translation>
</message>
<message>
<source>Show Not Earned Trophies</source>
<translation type="unfinished">Show Not Earned Trophies</translation>
</message>
<message>
<source>Show Hidden Trophies</source>
<translation type="unfinished">Show Hidden Trophies</translation>
</message>
</context>
</TS>

View File

@ -541,6 +541,77 @@
<source>Override Color</source>
<translation type="unfinished">Override Color</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind axis values more than once</source>
<translation type="unfinished">Cannot bind axis values more than once</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>EditorDialog</name>
<message>
<source>Edit Keyboard + Mouse and Controller input bindings</source>
<translation type="unfinished">Edit Keyboard + Mouse and Controller input bindings</translation>
</message>
<message>
<source>Use Per-Game configs</source>
<translation type="unfinished">Use Per-Game configs</translation>
</message>
<message>
<source>Error</source>
<translation type="unfinished">Error</translation>
</message>
<message>
<source>Could not open the file for reading</source>
<translation type="unfinished">Could not open the file for reading</translation>
</message>
<message>
<source>Could not open the file for writing</source>
<translation type="unfinished">Could not open the file for writing</translation>
</message>
<message>
<source>Save Changes</source>
<translation type="unfinished">Save Changes</translation>
</message>
<message>
<source>Do you want to save changes?</source>
<translation type="unfinished">Do you want to save changes?</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>Do you want to reset your custom default config to the original default config?</source>
<translation type="unfinished">Do you want to reset your custom default config to the original default config?</translation>
</message>
<message>
<source>Do you want to reset this config to your custom default config?</source>
<translation type="unfinished">Do you want to reset this config to your custom default config?</translation>
</message>
<message>
<source>Reset to Default</source>
<translation type="unfinished">Reset to Default</translation>
</message>
</context>
<context>
<name>ElfViewer</name>
@ -775,6 +846,10 @@
<source>Delete DLC</source>
<translation type="unfinished">Delete DLC</translation>
</message>
<message>
<source>Delete Trophy</source>
<translation type="unfinished">Delete Trophy</translation>
</message>
<message>
<source>Compatibility...</source>
<translation type="unfinished">Compatibility...</translation>
@ -851,6 +926,10 @@
<source>This game has no update folder to open!</source>
<translation type="unfinished">This game has no update folder to open!</translation>
</message>
<message>
<source>No log file found for this game!</source>
<translation type="unfinished">No log file found for this game!</translation>
</message>
<message>
<source>Failed to convert icon.</source>
<translation type="unfinished">Failed to convert icon.</translation>
@ -859,15 +938,46 @@
<source>This game has no save data to delete!</source>
<translation type="unfinished">This game has no save data to delete!</translation>
</message>
<message>
<source>This game has no saved trophies to delete!</source>
<translation type="unfinished">This game has no saved trophies to delete!</translation>
</message>
<message>
<source>Save Data</source>
<translation type="unfinished">Save Data</translation>
</message>
<message>
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>Quickstart</source>
<translation type="unfinished">Quickstart</translation>
</message>
<message>
<source>FAQ</source>
<translation type="unfinished">FAQ</translation>
</message>
<message>
<source>Syntax</source>
<translation type="unfinished">Syntax</translation>
</message>
<message>
<source>Special Bindings</source>
<translation type="unfinished">Special Bindings</translation>
</message>
<message>
<source>Keybindings</source>
<translation type="unfinished">Keybindings</translation>
</message>
</context>
<context>
<name>InstallDirSelect</name>
<message>
@ -887,6 +997,217 @@
<translation type="unfinished">Delete PKG File on Install</translation>
</message>
</context>
<context>
<name>KBMSettings</name>
<message>
<source>Configure Controls</source>
<translation type="unfinished">Configure Controls</translation>
</message>
<message>
<source>D-Pad</source>
<translation type="unfinished">D-Pad</translation>
</message>
<message>
<source>Up</source>
<translation type="unfinished">Up</translation>
</message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Down</source>
<translation type="unfinished">Down</translation>
</message>
<message>
<source>Left Analog Halfmode</source>
<translation type="unfinished">Left Analog Halfmode</translation>
</message>
<message>
<source>hold to move left stick at half-speed</source>
<translation type="unfinished">hold to move left stick at half-speed</translation>
</message>
<message>
<source>Left Stick</source>
<translation type="unfinished">Left Stick</translation>
</message>
<message>
<source>Config Selection</source>
<translation type="unfinished">Config Selection</translation>
</message>
<message>
<source>Common Config</source>
<translation type="unfinished">Common Config</translation>
</message>
<message>
<source>Use per-game configs</source>
<translation type="unfinished">Use per-game configs</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Text Editor</source>
<translation type="unfinished">Text Editor</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>L3</source>
<translation type="unfinished">L3</translation>
</message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished">Touchpad Click</translation>
</message>
<message>
<source>Mouse to Joystick</source>
<translation type="unfinished">Mouse to Joystick</translation>
</message>
<message>
<source>*press F7 ingame to activate</source>
<translation type="unfinished">*press F7 ingame to activate</translation>
</message>
<message>
<source>R3</source>
<translation type="unfinished">R3</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>Mouse Movement Parameters</source>
<translation type="unfinished">Mouse Movement Parameters</translation>
</message>
<message>
<source>note: click Help Button/Special Keybindings for more information</source>
<translation type="unfinished">note: click Help Button/Special Keybindings for more information</translation>
</message>
<message>
<source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation>
</message>
<message>
<source>Triangle</source>
<translation type="unfinished">Triangle</translation>
</message>
<message>
<source>Square</source>
<translation type="unfinished">Square</translation>
</message>
<message>
<source>Circle</source>
<translation type="unfinished">Circle</translation>
</message>
<message>
<source>Cross</source>
<translation type="unfinished">Cross</translation>
</message>
<message>
<source>Right Analog Halfmode</source>
<translation type="unfinished">Right Analog Halfmode</translation>
</message>
<message>
<source>hold to move right stick at half-speed</source>
<translation type="unfinished">hold to move right stick at half-speed</translation>
</message>
<message>
<source>Right Stick</source>
<translation type="unfinished">Right Stick</translation>
</message>
<message>
<source>Speed Offset (def 0.125):</source>
<translation type="unfinished">Speed Offset (def 0.125):</translation>
</message>
<message>
<source>Copy from Common Config</source>
<translation type="unfinished">Copy from Common Config</translation>
</message>
<message>
<source>Deadzone Offset (def 0.50):</source>
<translation type="unfinished">Deadzone Offset (def 0.50):</translation>
</message>
<message>
<source>Speed Multiplier (def 1.0):</source>
<translation type="unfinished">Speed Multiplier (def 1.0):</translation>
</message>
<message>
<source>Common Config Selected</source>
<translation type="unfinished">Common Config Selected</translation>
</message>
<message>
<source>This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</source>
<translation type="unfinished">This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</translation>
</message>
<message>
<source>Copy values from Common Config</source>
<translation type="unfinished">Copy values from Common Config</translation>
</message>
<message>
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
<translation type="unfinished">Do you want to overwrite existing mappings with the mappings from the Common Config?</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind any unique input more than once</source>
<translation type="unfinished">Cannot bind any unique input more than once</translation>
</message>
<message>
<source>Press a key</source>
<translation type="unfinished">Press a key</translation>
</message>
<message>
<source>Cannot set mapping</source>
<translation type="unfinished">Cannot set mapping</translation>
</message>
<message>
<source>Mousewheel cannot be mapped to stick outputs</source>
<translation type="unfinished">Mousewheel cannot be mapped to stick outputs</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
@ -1311,6 +1632,10 @@
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder</source>
<translation type="unfinished">Open the custom trophy images/sounds folder</translation>
</message>
<message>
<source>Logger</source>
<translation type="unfinished">Logger</translation>
@ -1476,8 +1801,8 @@
<translation type="unfinished">Title Music</translation>
</message>
<message>
<source>Disable Trophy Pop-ups</source>
<translation type="unfinished">Disable Trophy Pop-ups</translation>
<source>Disable Trophy Notification</source>
<translation type="unfinished">Disable Trophy Notification</translation>
</message>
<message>
<source>Background Image</source>
@ -1803,6 +2128,62 @@
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
<message>
<source>Trophy Notification Position</source>
<translation type="unfinished">Trophy Notification Position</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Top</source>
<translation type="unfinished">Top</translation>
</message>
<message>
<source>Bottom</source>
<translation type="unfinished">Bottom</translation>
</message>
<message>
<source>Notification Duration</source>
<translation type="unfinished">Notification Duration</translation>
</message>
<message>
<source>Portable User Folder</source>
<translation type="unfinished">Portable User Folder</translation>
</message>
<message>
<source>Create Portable User Folder from Common User Folder</source>
<translation type="unfinished">Create Portable User Folder from Common User Folder</translation>
</message>
<message>
<source>Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</source>
<translation type="unfinished">Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</translation>
</message>
<message>
<source>Cannot create portable user folder</source>
<translation type="unfinished">Cannot create portable user folder</translation>
</message>
<message>
<source>%1 already exists</source>
<translation type="unfinished">%1 already exists</translation>
</message>
<message>
<source>Portable user folder created</source>
<translation type="unfinished">Portable user folder created</translation>
</message>
<message>
<source>%1 successfully created.</source>
<translation type="unfinished">%1 successfully created.</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</source>
<translation type="unfinished">Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>
@ -1810,5 +2191,21 @@
<source>Trophy Viewer</source>
<translation type="unfinished">Trophy Viewer</translation>
</message>
<message>
<source>Progress</source>
<translation type="unfinished">Progress</translation>
</message>
<message>
<source>Show Earned Trophies</source>
<translation type="unfinished">Show Earned Trophies</translation>
</message>
<message>
<source>Show Not Earned Trophies</source>
<translation type="unfinished">Show Not Earned Trophies</translation>
</message>
<message>
<source>Show Hidden Trophies</source>
<translation type="unfinished">Show Hidden Trophies</translation>
</message>
</context>
</TS>

View File

@ -22,11 +22,11 @@
<name>CheatsPatches</name>
<message>
<source>Cheats / Patches for </source>
<translation>Juks / Programrettelser for </translation>
<translation>Juks og programrettelser for </translation>
</message>
<message>
<source>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:\n</source>
<translation>Juks/programrettelse er eksperimentelle.\nBruk med forsiktighet.\n\nLast ned juks individuelt ved å velge pakkebrønn og klikke nedlastingsknappen.\nPå fanen programrettelse kan du laste ned alle programrettelser samtidig, velge hvilke du ønsker å bruke, og lagre valget ditt.\n\nSiden vi ikke utvikler Juks/Programrettelse,\nvær vennlig å rapportere problemer til juks/programrettelse utvikleren.\n\nHar du laget en ny juks? Besøk:\n</translation>
<translation>Juks og programrettelser er eksperimentelle.\nBruk med forsiktighet.\n\nLast ned juks individuelt ved å velge pakkebrønn og trykke nedlastingsknappen.\nPå fanen programrettelser kan du laste ned alle programrettelser samtidig, velg hvilke du ønsker å bruke, og lagre valget ditt.\n\nSiden vi ikke utvikler juks eller programrettelser,\nmeld fra om feil til jukse eller programrettelse utvikleren.\n\nHar du utviklet en ny juks? Besøk:\n</translation>
</message>
<message>
<source>No Image Available</source>
@ -90,7 +90,7 @@
</message>
<message>
<source>Patches</source>
<translation>Programrettelse</translation>
<translation>Programrettelser</translation>
</message>
<message>
<source>Error</source>
@ -102,7 +102,7 @@
</message>
<message>
<source>Unable to open files.json for reading.</source>
<translation>Kan ikke åpne files.json for lesing.</translation>
<translation>Klarte ikke åpne files.json for lesing.</translation>
</message>
<message>
<source>No patch file found for the current serial.</source>
@ -110,11 +110,11 @@
</message>
<message>
<source>Unable to open the file for reading.</source>
<translation>Kan ikke åpne fila for lesing.</translation>
<translation>Klarte ikke åpne fila for lesing.</translation>
</message>
<message>
<source>Unable to open the file for writing.</source>
<translation>Kan ikke åpne fila for skriving.</translation>
<translation>Klarte ikke åpne fila for skriving.</translation>
</message>
<message>
<source>Failed to parse XML: </source>
@ -146,11 +146,11 @@
</message>
<message>
<source>Failed to save file:</source>
<translation>Kunne ikke lagre fila:</translation>
<translation>Klarte ikke lagre fila:</translation>
</message>
<message>
<source>Failed to download file:</source>
<translation>Kunne ikke laste ned fila:</translation>
<translation>Klarte ikke laste ned fila:</translation>
</message>
<message>
<source>Cheats Not Found</source>
@ -170,11 +170,11 @@
</message>
<message>
<source>Failed to save:</source>
<translation>Kunne ikke lagre:</translation>
<translation>Klarte ikke lagre:</translation>
</message>
<message>
<source>Failed to download:</source>
<translation>Kunne ikke laste ned:</translation>
<translation>Klarte ikke laste ned:</translation>
</message>
<message>
<source>Download Complete</source>
@ -186,11 +186,11 @@
</message>
<message>
<source>Failed to parse JSON data from HTML.</source>
<translation>Kunne ikke analysere JSON-data fra HTML.</translation>
<translation>Klarte ikke analysere JSON-data fra HTML.</translation>
</message>
<message>
<source>Failed to retrieve HTML page.</source>
<translation>Kunne ikke hente HTML-side.</translation>
<translation>Klarte ikke hente HTML-siden.</translation>
</message>
<message>
<source>The game is in version: %1</source>
@ -210,7 +210,7 @@
</message>
<message>
<source>Failed to open file:</source>
<translation>Kunne ikke åpne fila:</translation>
<translation>Klarte ikke åpne fila:</translation>
</message>
<message>
<source>XML ERROR:</source>
@ -230,7 +230,7 @@
</message>
<message>
<source>Failed to open files.json for reading.</source>
<translation>Kunne ikke åpne files.json for lesing.</translation>
<translation>Klarte ikke åpne files.json for lesing.</translation>
</message>
<message>
<source>Name:</source>
@ -265,7 +265,7 @@
</message>
<message>
<source>Failed to parse update information.</source>
<translation>Kunne ikke analysere oppdaterings-informasjonen.</translation>
<translation>Klarte ikke analysere oppdateringsinformasjon.</translation>
</message>
<message>
<source>No pre-releases found.</source>
@ -337,26 +337,26 @@
</message>
<message>
<source>The update has been downloaded, press OK to install.</source>
<translation>Oppdateringen har blitt lastet ned, trykk OK for å installere.</translation>
<translation>Oppdateringen ble lastet ned, trykk OK for å installere.</translation>
</message>
<message>
<source>Failed to save the update file at</source>
<translation>Kunne ikke lagre oppdateringsfila </translation>
<translation>Klarte ikke lagre oppdateringsfila </translation>
</message>
<message>
<source>Starting Update...</source>
<translation>Starter oppdatering...</translation>
<translation>Starter oppdatering </translation>
</message>
<message>
<source>Failed to create the update script file</source>
<translation>Kunne ikke opprette oppdateringsskriptfila</translation>
<translation>Klarte ikke opprette oppdateringsskriptfila</translation>
</message>
</context>
<context>
<name>CompatibilityInfoClass</name>
<message>
<source>Fetching compatibility data, please wait</source>
<translation>Henter kompatibilitetsdata, vennligst vent</translation>
<translation>Henter kompatibilitetsdata, vent litt.</translation>
</message>
<message>
<source>Cancel</source>
@ -364,7 +364,7 @@
</message>
<message>
<source>Loading...</source>
<translation>Laster...</translation>
<translation>Laster </translation>
</message>
<message>
<source>Error</source>
@ -372,11 +372,11 @@
</message>
<message>
<source>Unable to update compatibility data! Try again later.</source>
<translation>Kan ikke oppdatere kompatibilitetsdata! Prøv igjen senere.</translation>
<translation>Klarte ikke oppdatere kompatibilitetsdata! Prøv igjen senere.</translation>
</message>
<message>
<source>Unable to open compatibility_data.json for writing.</source>
<translation>Kan ikke åpne compatibility_data.json for skriving.</translation>
<translation>Klarte ikke åpne compatibility_data.json for skriving.</translation>
</message>
<message>
<source>Unknown</source>
@ -407,11 +407,11 @@
<name>ControlSettings</name>
<message>
<source>Configure Controls</source>
<translation>Sett opp kontroller</translation>
<translation>Kontrolleroppsett</translation>
</message>
<message>
<source>D-Pad</source>
<translation>D-Pad</translation>
<translation>Navigasjonsknapper</translation>
</message>
<message>
<source>Up</source>
@ -443,7 +443,7 @@
</message>
<message>
<source>Config Selection</source>
<translation>Utvalg av oppsett</translation>
<translation>Valg av oppsett</translation>
</message>
<message>
<source>Common Config</source>
@ -541,6 +541,77 @@
<source>Override Color</source>
<translation>Overstyr farge</translation>
</message>
<message>
<source>Unable to Save</source>
<translation>Klarte ikke lagre</translation>
</message>
<message>
<source>Cannot bind axis values more than once</source>
<translation>Kan ikke tildele akseverdier mer enn en gang</translation>
</message>
<message>
<source>Save</source>
<translation>Lagre</translation>
</message>
<message>
<source>Apply</source>
<translation>Bruk</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation>Gjenopprett standardinnstillinger</translation>
</message>
<message>
<source>Cancel</source>
<translation>Avbryt</translation>
</message>
</context>
<context>
<name>EditorDialog</name>
<message>
<source>Edit Keyboard + Mouse and Controller input bindings</source>
<translation>Rediger oppsett for tastatur, mus og kontroller</translation>
</message>
<message>
<source>Use Per-Game configs</source>
<translation>Bruk oppsett per spill</translation>
</message>
<message>
<source>Error</source>
<translation>Feil</translation>
</message>
<message>
<source>Could not open the file for reading</source>
<translation>Klarte ikke åpne fila for lesing</translation>
</message>
<message>
<source>Could not open the file for writing</source>
<translation>Klarte ikke åpne fila for skriving</translation>
</message>
<message>
<source>Save Changes</source>
<translation>Lagre endringer</translation>
</message>
<message>
<source>Do you want to save changes?</source>
<translation>Vil du lagre endringene?</translation>
</message>
<message>
<source>Help</source>
<translation>Hjelp</translation>
</message>
<message>
<source>Do you want to reset your custom default config to the original default config?</source>
<translation>Vil du tilbakestille alle dine tilpassede innstillinger til standarden?</translation>
</message>
<message>
<source>Do you want to reset this config to your custom default config?</source>
<translation>Vil du tilbakestille dette oppsettet til standard oppsett?</translation>
</message>
<message>
<source>Reset to Default</source>
<translation>Tilbakestill</translation>
</message>
</context>
<context>
<name>ElfViewer</name>
@ -553,7 +624,7 @@
<name>GameInfoClass</name>
<message>
<source>Loading game list, please wait :3</source>
<translation>Laster spilliste, vennligst vent :3</translation>
<translation>Laster spilliste, vent litt :3</translation>
</message>
<message>
<source>Cancel</source>
@ -561,7 +632,7 @@
</message>
<message>
<source>Loading...</source>
<translation>Laster...</translation>
<translation>Laster </translation>
</message>
</context>
<context>
@ -651,7 +722,7 @@
</message>
<message>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Spillet initialiseres ikke riktig / krasjer emulatoren</translation>
<translation>Spillet initialiseres ikke riktig eller krasjer emulatoren</translation>
</message>
<message>
<source>Game boots, but only displays a blank screen</source>
@ -671,7 +742,7 @@
</message>
<message>
<source>Click to see details on github</source>
<translation>Klikk for å se detaljer GitHub</translation>
<translation>Trykk for å se detaljer GitHub</translation>
</message>
<message>
<source>Last updated</source>
@ -709,11 +780,11 @@
</message>
<message>
<source>Cheats / Patches</source>
<translation>Juks / Programrettelse</translation>
<translation>Juks og programrettelser</translation>
</message>
<message>
<source>SFO Viewer</source>
<translation>SFO viser</translation>
<translation>SFO-viser</translation>
</message>
<message>
<source>Trophy Viewer</source>
@ -721,7 +792,7 @@
</message>
<message>
<source>Open Folder...</source>
<translation>Åpne mappe...</translation>
<translation>Åpne mappe </translation>
</message>
<message>
<source>Open Game Folder</source>
@ -737,7 +808,7 @@
</message>
<message>
<source>Copy info...</source>
<translation>Kopier info...</translation>
<translation>Kopier info </translation>
</message>
<message>
<source>Copy Name</source>
@ -761,7 +832,7 @@
</message>
<message>
<source>Delete...</source>
<translation>Slett...</translation>
<translation>Slett </translation>
</message>
<message>
<source>Delete Game</source>
@ -775,9 +846,13 @@
<source>Delete DLC</source>
<translation>Slett DLC</translation>
</message>
<message>
<source>Delete Trophy</source>
<translation>Slett trofé</translation>
</message>
<message>
<source>Compatibility...</source>
<translation>Kompatibilitet...</translation>
<translation>Kompatibilitet </translation>
</message>
<message>
<source>Update database</source>
@ -837,7 +912,7 @@
</message>
<message>
<source>Are you sure you want to delete %1&apos;s %2 directory?</source>
<translation>Er du sikker at du vil slette %1&apos;s %2 directory?</translation>
<translation>Er du sikker at du vil slette %1&apos;s %2 mappa?</translation>
</message>
<message>
<source>Open Update Folder</source>
@ -851,6 +926,10 @@
<source>This game has no update folder to open!</source>
<translation>Dette spillet har ingen oppdateringsmappe å åpne!</translation>
</message>
<message>
<source>No log file found for this game!</source>
<translation>Fant ingen loggfil for dette spillet!</translation>
</message>
<message>
<source>Failed to convert icon.</source>
<translation>Klarte ikke konvertere ikon.</translation>
@ -859,15 +938,46 @@
<source>This game has no save data to delete!</source>
<translation>Dette spillet har ingen lagret data å slette!</translation>
</message>
<message>
<source>This game has no saved trophies to delete!</source>
<translation>Dette spillet har ingen lagrede trofeer å slette!</translation>
</message>
<message>
<source>Save Data</source>
<translation>Lagret data</translation>
</message>
<message>
<source>Trophy</source>
<translation>Trofé</translation>
</message>
<message>
<source>SFO Viewer for </source>
<translation>SFO-viser for </translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>Quickstart</source>
<translation>Hurtigstart</translation>
</message>
<message>
<source>FAQ</source>
<translation>Ofte stilte spørsmål</translation>
</message>
<message>
<source>Syntax</source>
<translation>Syntaks</translation>
</message>
<message>
<source>Special Bindings</source>
<translation>Spesielle hurtigtaster</translation>
</message>
<message>
<source>Keybindings</source>
<translation>Hurtigtast</translation>
</message>
</context>
<context>
<name>InstallDirSelect</name>
<message>
@ -887,11 +997,222 @@
<translation>Slett PKG-fila ved installering</translation>
</message>
</context>
<context>
<name>KBMSettings</name>
<message>
<source>Configure Controls</source>
<translation>Tastaturoppsett</translation>
</message>
<message>
<source>D-Pad</source>
<translation>Navigasjonsknapper</translation>
</message>
<message>
<source>Up</source>
<translation>Opp</translation>
</message>
<message>
<source>unmapped</source>
<translation>Ikke satt opp</translation>
</message>
<message>
<source>Left</source>
<translation>Venstre</translation>
</message>
<message>
<source>Right</source>
<translation>Høyre</translation>
</message>
<message>
<source>Down</source>
<translation>Ned</translation>
</message>
<message>
<source>Left Analog Halfmode</source>
<translation>Venstre analog halvmodus</translation>
</message>
<message>
<source>hold to move left stick at half-speed</source>
<translation>Hold for å bevege venstre analog med halv hastighet</translation>
</message>
<message>
<source>Left Stick</source>
<translation>Venstre analog</translation>
</message>
<message>
<source>Config Selection</source>
<translation>Valg av oppsett</translation>
</message>
<message>
<source>Common Config</source>
<translation>Felles oppsett</translation>
</message>
<message>
<source>Use per-game configs</source>
<translation>Bruk oppsett per spill</translation>
</message>
<message>
<source>L1</source>
<translation>L1</translation>
</message>
<message>
<source>L2</source>
<translation>L2</translation>
</message>
<message>
<source>Text Editor</source>
<translation>Skriveprogram</translation>
</message>
<message>
<source>Help</source>
<translation>Hjelp</translation>
</message>
<message>
<source>R1</source>
<translation>R1</translation>
</message>
<message>
<source>R2</source>
<translation>R2</translation>
</message>
<message>
<source>L3</source>
<translation>L3</translation>
</message>
<message>
<source>Touchpad Click</source>
<translation>Berøringsplateknapp</translation>
</message>
<message>
<source>Mouse to Joystick</source>
<translation>Mus til styrespak</translation>
</message>
<message>
<source>*press F7 ingame to activate</source>
<translation>Trykk F7 i spillet for å bruke</translation>
</message>
<message>
<source>R3</source>
<translation>R3</translation>
</message>
<message>
<source>Options</source>
<translation>Options</translation>
</message>
<message>
<source>Mouse Movement Parameters</source>
<translation>Oppsett av musebevegelse</translation>
</message>
<message>
<source>note: click Help Button/Special Keybindings for more information</source>
<translation>Merk: Trykk hjelpeknappen for mer informasjon</translation>
</message>
<message>
<source>Face Buttons</source>
<translation>Handlingsknapper</translation>
</message>
<message>
<source>Triangle</source>
<translation>Triangel</translation>
</message>
<message>
<source>Square</source>
<translation>Firkant</translation>
</message>
<message>
<source>Circle</source>
<translation>Sirkel</translation>
</message>
<message>
<source>Cross</source>
<translation>Kryss</translation>
</message>
<message>
<source>Right Analog Halfmode</source>
<translation>Høyre analog halvmodus</translation>
</message>
<message>
<source>hold to move right stick at half-speed</source>
<translation>Hold for å bevege høyre analog med halv hastighet</translation>
</message>
<message>
<source>Right Stick</source>
<translation>Høyre analog</translation>
</message>
<message>
<source>Speed Offset (def 0.125):</source>
<translation>Hastighetsforskyvning (def 0.125):</translation>
</message>
<message>
<source>Copy from Common Config</source>
<translation>Kopier fra felles oppsettet</translation>
</message>
<message>
<source>Deadzone Offset (def 0.50):</source>
<translation>Dødsoneforskyvning (def 0.50):</translation>
</message>
<message>
<source>Speed Multiplier (def 1.0):</source>
<translation>Hastighetsmultiplikator (def 1.0):</translation>
</message>
<message>
<source>Common Config Selected</source>
<translation>Felles oppsett valgt</translation>
</message>
<message>
<source>This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</source>
<translation>Denne knappen kopierer oppsettet fra felles oppsettet til den valgte profilen, og kan ikke brukes når den gjeldende brukte profilen er felles oppsettet.</translation>
</message>
<message>
<source>Copy values from Common Config</source>
<translation>Kopier verdier fra felles oppsettet</translation>
</message>
<message>
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
<translation>Vil du overskrive eksisterende valg av oppsett med felles oppsettet?</translation>
</message>
<message>
<source>Unable to Save</source>
<translation>Klarte ikke lagre</translation>
</message>
<message>
<source>Cannot bind any unique input more than once</source>
<translation>Kan ikke tildele unike oppsett mer enn en gang</translation>
</message>
<message>
<source>Press a key</source>
<translation>Trykk en tast</translation>
</message>
<message>
<source>Cannot set mapping</source>
<translation>Klarte ikke tildele</translation>
</message>
<message>
<source>Mousewheel cannot be mapped to stick outputs</source>
<translation>Musehjulet kan ikke tildeles analogstikkene</translation>
</message>
<message>
<source>Save</source>
<translation>Lagre</translation>
</message>
<message>
<source>Apply</source>
<translation>Bruk</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation>Gjenopprett standardinnstillinger</translation>
</message>
<message>
<source>Cancel</source>
<translation>Avbryt</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<source>Open/Add Elf Folder</source>
<translation>Åpne/Legg til Elf-mappe</translation>
<translation>Åpne eller legg til Elf-mappe</translation>
</message>
<message>
<source>Install Packages (PKG)</source>
@ -911,7 +1232,7 @@
</message>
<message>
<source>Configure...</source>
<translation>Sett opp...</translation>
<translation>Sett opp </translation>
</message>
<message>
<source>Install application from a .pkg file</source>
@ -979,7 +1300,7 @@
</message>
<message>
<source>Download Cheats/Patches</source>
<translation>Last ned juks/programrettelse</translation>
<translation>Last ned juks og programrettelser</translation>
</message>
<message>
<source>Dump Game List</source>
@ -991,7 +1312,7 @@
</message>
<message>
<source>Search...</source>
<translation>Søk...</translation>
<translation>Søk </translation>
</message>
<message>
<source>File</source>
@ -1261,7 +1582,7 @@
</message>
<message>
<source>General</source>
<translation>Generell</translation>
<translation>Generelt</translation>
</message>
<message>
<source>System</source>
@ -1281,7 +1602,7 @@
</message>
<message>
<source>Enable Separate Update Folder</source>
<translation>Bruk seperat oppdateringsmappe</translation>
<translation>Bruk separat oppdateringsmappe</translation>
</message>
<message>
<source>Default tab when opening settings</source>
@ -1311,6 +1632,10 @@
<source>Trophy</source>
<translation>Trofé</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder</source>
<translation>Åpne mappa med tilpassede bilder og lyder for trofé</translation>
</message>
<message>
<source>Logger</source>
<translation>Loggføring</translation>
@ -1401,7 +1726,7 @@
</message>
<message>
<source>Add...</source>
<translation>Legg til...</translation>
<translation>Legg til </translation>
</message>
<message>
<source>Remove</source>
@ -1409,11 +1734,11 @@
</message>
<message>
<source>Debug</source>
<translation>Feilretting</translation>
<translation>Feilsøking</translation>
</message>
<message>
<source>Enable Debug Dumping</source>
<translation>Bruk feilrettingsdumping</translation>
<translation>Bruk feilsøkingsdumping</translation>
</message>
<message>
<source>Enable Vulkan Validation Layers</source>
@ -1476,8 +1801,8 @@
<translation>Tittelmusikk</translation>
</message>
<message>
<source>Disable Trophy Pop-ups</source>
<translation>Deaktiver trofé hurtigmeny</translation>
<source>Disable Trophy Notification</source>
<translation>Slå av trofévarsler</translation>
</message>
<message>
<source>Background Image</source>
@ -1493,7 +1818,7 @@
</message>
<message>
<source>Play title music</source>
<translation>Spill tittelmusikk</translation>
<translation>Spill av tittelmusikk</translation>
</message>
<message>
<source>Update Compatibility Database On Startup</source>
@ -1585,7 +1910,7 @@
</message>
<message>
<source>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).</source>
<translation>Deaktiver trofé hurtigmeny:\nDeaktiver trofévarsler i spillet. Trofé-fremgang kan fortsatt ved help av troféviseren (høyreklikk spillet i hovedvinduet).</translation>
<translation>Slå av trofévarsler:\nFjerner trofévarsler i spillet. Troféfremgang kan fortsatt vises ved hjelp av troféviseren (høyreklikk spillet i hovedvinduet).</translation>
</message>
<message>
<source>Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse.</source>
@ -1625,15 +1950,15 @@
</message>
<message>
<source>Touchpad Left</source>
<translation>Berøringsplate Venstre</translation>
<translation>Berøringsplate venstre</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Berøringsplate Høyre</translation>
<translation>Berøringsplate høyre</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Berøringsplate Midt</translation>
<translation>Berøringsplate midten</translation>
</message>
<message>
<source>None</source>
@ -1641,11 +1966,11 @@
</message>
<message>
<source>Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select &quot;Auto Select&quot; to automatically determine it.</source>
<translation>Grafikkenhet:\nI systemer med flere GPU-er, velg GPU-en emulatoren skal bruke fra rullegardinlista,\neller &quot;Velg automatisk&amp;quot.</translation>
<translation>Grafikkenhet:\nSystemer med flere GPU-er, kan emulatoren velge hvilken enhet som skal brukes fra rullegardinlista,\neller velg &quot;Velg automatisk&quot;.</translation>
</message>
<message>
<source>Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution.</source>
<translation>Bredde/Høyde:\nAngir størrelsen emulatorvinduet ved oppstart, som kan endres under spillingen.\nDette er forskjellig fra oppløsningen i spillet.</translation>
<translation>Bredde / Høyde:\nAngir størrelsen emulatorvinduet ved oppstart, som kan endres under spillingen.\nDette er annerledes fra oppløsningen i spillet.</translation>
</message>
<message>
<source>Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change!</source>
@ -1677,7 +2002,7 @@
</message>
<message>
<source>Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory.</source>
<translation>Bruk feilrettingsdumping:\nLagrer import- og eksport-symbolene og filoverskrifts-informasjonen til det nåværende kjørende PS4-programmet i en mappe.</translation>
<translation>Bruk feilsøkingsdumping:\nLagrer import- og eksport-symbolene og filoverskrifts-informasjonen til det nåværende kjørende PS4-programmet i en mappe.</translation>
</message>
<message>
<source>Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation.</source>
@ -1733,7 +2058,7 @@
</message>
<message>
<source>Enable Motion Controls</source>
<translation>Bruk bevegelseskontroller</translation>
<translation>Bruk bevegelsesstyring</translation>
</message>
<message>
<source>Save Data Path</source>
@ -1757,7 +2082,7 @@
</message>
<message>
<source>Directory to install games</source>
<translation>Mappe for å installere spill</translation>
<translation>Mappe for installering av spill</translation>
</message>
<message>
<source>Directory to save data</source>
@ -1803,6 +2128,62 @@
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation>Separate loggfiler:\nOppretter en separat loggfil for hvert spill.</translation>
</message>
<message>
<source>Trophy Notification Position</source>
<translation>Trofévarsel plassering</translation>
</message>
<message>
<source>Left</source>
<translation>Venstre</translation>
</message>
<message>
<source>Right</source>
<translation>Høyre</translation>
</message>
<message>
<source>Top</source>
<translation>Øverst</translation>
</message>
<message>
<source>Bottom</source>
<translation>Nederst</translation>
</message>
<message>
<source>Notification Duration</source>
<translation>Varslingsvarighet</translation>
</message>
<message>
<source>Portable User Folder</source>
<translation>Separat brukermappe</translation>
</message>
<message>
<source>Create Portable User Folder from Common User Folder</source>
<translation>Lag ny separat brukermappe fra fellesbrukermappa</translation>
</message>
<message>
<source>Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</source>
<translation>Separat brukermappe:\n Lagrer shadPS4-innstillinger og data som kun brukes til shadPS4 programmet i gjeldende mappe. Start programmet nytt etter opprettelsen av mappa for å ta den i bruk.</translation>
</message>
<message>
<source>Cannot create portable user folder</source>
<translation>Klarte ikke opprette separat brukermappe</translation>
</message>
<message>
<source>%1 already exists</source>
<translation>%1 finnes allerede</translation>
</message>
<message>
<source>Portable user folder created</source>
<translation>Separat brukermappe opprettet</translation>
</message>
<message>
<source>%1 successfully created.</source>
<translation>%1 opprettet.</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</source>
<translation>Åpne mappa med tilpassede bilder og lyder for trofé:\nDu kan legge til tilpassede bilder til trofeer og en lyd.\nLegg filene til custom_trophy med følgende navn:\ntrophy.wav ELLER trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nMerk: Lyden avspilles kun i Qt-versjonen.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>
@ -1810,5 +2191,21 @@
<source>Trophy Viewer</source>
<translation>Troféviser</translation>
</message>
<message>
<source>Progress</source>
<translation>Fremdrift</translation>
</message>
<message>
<source>Show Earned Trophies</source>
<translation>Vis opptjente trofeer</translation>
</message>
<message>
<source>Show Not Earned Trophies</source>
<translation>Vis ikke opptjente trofeer</translation>
</message>
<message>
<source>Show Hidden Trophies</source>
<translation>Vis skjulte trofeer</translation>
</message>
</context>
</TS>

View File

@ -541,6 +541,77 @@
<source>Override Color</source>
<translation type="unfinished">Override Color</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind axis values more than once</source>
<translation type="unfinished">Cannot bind axis values more than once</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>EditorDialog</name>
<message>
<source>Edit Keyboard + Mouse and Controller input bindings</source>
<translation type="unfinished">Edit Keyboard + Mouse and Controller input bindings</translation>
</message>
<message>
<source>Use Per-Game configs</source>
<translation type="unfinished">Use Per-Game configs</translation>
</message>
<message>
<source>Error</source>
<translation type="unfinished">Error</translation>
</message>
<message>
<source>Could not open the file for reading</source>
<translation type="unfinished">Could not open the file for reading</translation>
</message>
<message>
<source>Could not open the file for writing</source>
<translation type="unfinished">Could not open the file for writing</translation>
</message>
<message>
<source>Save Changes</source>
<translation type="unfinished">Save Changes</translation>
</message>
<message>
<source>Do you want to save changes?</source>
<translation type="unfinished">Do you want to save changes?</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>Do you want to reset your custom default config to the original default config?</source>
<translation type="unfinished">Do you want to reset your custom default config to the original default config?</translation>
</message>
<message>
<source>Do you want to reset this config to your custom default config?</source>
<translation type="unfinished">Do you want to reset this config to your custom default config?</translation>
</message>
<message>
<source>Reset to Default</source>
<translation type="unfinished">Reset to Default</translation>
</message>
</context>
<context>
<name>ElfViewer</name>
@ -775,6 +846,10 @@
<source>Delete DLC</source>
<translation type="unfinished">Delete DLC</translation>
</message>
<message>
<source>Delete Trophy</source>
<translation type="unfinished">Delete Trophy</translation>
</message>
<message>
<source>Compatibility...</source>
<translation type="unfinished">Compatibility...</translation>
@ -851,6 +926,10 @@
<source>This game has no update folder to open!</source>
<translation type="unfinished">This game has no update folder to open!</translation>
</message>
<message>
<source>No log file found for this game!</source>
<translation type="unfinished">No log file found for this game!</translation>
</message>
<message>
<source>Failed to convert icon.</source>
<translation type="unfinished">Failed to convert icon.</translation>
@ -859,15 +938,46 @@
<source>This game has no save data to delete!</source>
<translation type="unfinished">This game has no save data to delete!</translation>
</message>
<message>
<source>This game has no saved trophies to delete!</source>
<translation type="unfinished">This game has no saved trophies to delete!</translation>
</message>
<message>
<source>Save Data</source>
<translation type="unfinished">Save Data</translation>
</message>
<message>
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>Quickstart</source>
<translation type="unfinished">Quickstart</translation>
</message>
<message>
<source>FAQ</source>
<translation type="unfinished">FAQ</translation>
</message>
<message>
<source>Syntax</source>
<translation type="unfinished">Syntax</translation>
</message>
<message>
<source>Special Bindings</source>
<translation type="unfinished">Special Bindings</translation>
</message>
<message>
<source>Keybindings</source>
<translation type="unfinished">Keybindings</translation>
</message>
</context>
<context>
<name>InstallDirSelect</name>
<message>
@ -887,6 +997,217 @@
<translation type="unfinished">Delete PKG File on Install</translation>
</message>
</context>
<context>
<name>KBMSettings</name>
<message>
<source>Configure Controls</source>
<translation type="unfinished">Configure Controls</translation>
</message>
<message>
<source>D-Pad</source>
<translation type="unfinished">D-Pad</translation>
</message>
<message>
<source>Up</source>
<translation type="unfinished">Up</translation>
</message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Down</source>
<translation type="unfinished">Down</translation>
</message>
<message>
<source>Left Analog Halfmode</source>
<translation type="unfinished">Left Analog Halfmode</translation>
</message>
<message>
<source>hold to move left stick at half-speed</source>
<translation type="unfinished">hold to move left stick at half-speed</translation>
</message>
<message>
<source>Left Stick</source>
<translation type="unfinished">Left Stick</translation>
</message>
<message>
<source>Config Selection</source>
<translation type="unfinished">Config Selection</translation>
</message>
<message>
<source>Common Config</source>
<translation type="unfinished">Common Config</translation>
</message>
<message>
<source>Use per-game configs</source>
<translation type="unfinished">Use per-game configs</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Text Editor</source>
<translation type="unfinished">Text Editor</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>L3</source>
<translation type="unfinished">L3</translation>
</message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished">Touchpad Click</translation>
</message>
<message>
<source>Mouse to Joystick</source>
<translation type="unfinished">Mouse to Joystick</translation>
</message>
<message>
<source>*press F7 ingame to activate</source>
<translation type="unfinished">*press F7 ingame to activate</translation>
</message>
<message>
<source>R3</source>
<translation type="unfinished">R3</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>Mouse Movement Parameters</source>
<translation type="unfinished">Mouse Movement Parameters</translation>
</message>
<message>
<source>note: click Help Button/Special Keybindings for more information</source>
<translation type="unfinished">note: click Help Button/Special Keybindings for more information</translation>
</message>
<message>
<source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation>
</message>
<message>
<source>Triangle</source>
<translation type="unfinished">Triangle</translation>
</message>
<message>
<source>Square</source>
<translation type="unfinished">Square</translation>
</message>
<message>
<source>Circle</source>
<translation type="unfinished">Circle</translation>
</message>
<message>
<source>Cross</source>
<translation type="unfinished">Cross</translation>
</message>
<message>
<source>Right Analog Halfmode</source>
<translation type="unfinished">Right Analog Halfmode</translation>
</message>
<message>
<source>hold to move right stick at half-speed</source>
<translation type="unfinished">hold to move right stick at half-speed</translation>
</message>
<message>
<source>Right Stick</source>
<translation type="unfinished">Right Stick</translation>
</message>
<message>
<source>Speed Offset (def 0.125):</source>
<translation type="unfinished">Speed Offset (def 0.125):</translation>
</message>
<message>
<source>Copy from Common Config</source>
<translation type="unfinished">Copy from Common Config</translation>
</message>
<message>
<source>Deadzone Offset (def 0.50):</source>
<translation type="unfinished">Deadzone Offset (def 0.50):</translation>
</message>
<message>
<source>Speed Multiplier (def 1.0):</source>
<translation type="unfinished">Speed Multiplier (def 1.0):</translation>
</message>
<message>
<source>Common Config Selected</source>
<translation type="unfinished">Common Config Selected</translation>
</message>
<message>
<source>This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</source>
<translation type="unfinished">This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</translation>
</message>
<message>
<source>Copy values from Common Config</source>
<translation type="unfinished">Copy values from Common Config</translation>
</message>
<message>
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
<translation type="unfinished">Do you want to overwrite existing mappings with the mappings from the Common Config?</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind any unique input more than once</source>
<translation type="unfinished">Cannot bind any unique input more than once</translation>
</message>
<message>
<source>Press a key</source>
<translation type="unfinished">Press a key</translation>
</message>
<message>
<source>Cannot set mapping</source>
<translation type="unfinished">Cannot set mapping</translation>
</message>
<message>
<source>Mousewheel cannot be mapped to stick outputs</source>
<translation type="unfinished">Mousewheel cannot be mapped to stick outputs</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
@ -1311,6 +1632,10 @@
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder</source>
<translation type="unfinished">Open the custom trophy images/sounds folder</translation>
</message>
<message>
<source>Logger</source>
<translation type="unfinished">Logger</translation>
@ -1476,8 +1801,8 @@
<translation type="unfinished">Title Music</translation>
</message>
<message>
<source>Disable Trophy Pop-ups</source>
<translation type="unfinished">Disable Trophy Pop-ups</translation>
<source>Disable Trophy Notification</source>
<translation type="unfinished">Disable Trophy Notification</translation>
</message>
<message>
<source>Background Image</source>
@ -1803,6 +2128,62 @@
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
<message>
<source>Trophy Notification Position</source>
<translation type="unfinished">Trophy Notification Position</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Top</source>
<translation type="unfinished">Top</translation>
</message>
<message>
<source>Bottom</source>
<translation type="unfinished">Bottom</translation>
</message>
<message>
<source>Notification Duration</source>
<translation type="unfinished">Notification Duration</translation>
</message>
<message>
<source>Portable User Folder</source>
<translation type="unfinished">Portable User Folder</translation>
</message>
<message>
<source>Create Portable User Folder from Common User Folder</source>
<translation type="unfinished">Create Portable User Folder from Common User Folder</translation>
</message>
<message>
<source>Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</source>
<translation type="unfinished">Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</translation>
</message>
<message>
<source>Cannot create portable user folder</source>
<translation type="unfinished">Cannot create portable user folder</translation>
</message>
<message>
<source>%1 already exists</source>
<translation type="unfinished">%1 already exists</translation>
</message>
<message>
<source>Portable user folder created</source>
<translation type="unfinished">Portable user folder created</translation>
</message>
<message>
<source>%1 successfully created.</source>
<translation type="unfinished">%1 successfully created.</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</source>
<translation type="unfinished">Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>
@ -1810,5 +2191,21 @@
<source>Trophy Viewer</source>
<translation type="unfinished">Trophy Viewer</translation>
</message>
<message>
<source>Progress</source>
<translation type="unfinished">Progress</translation>
</message>
<message>
<source>Show Earned Trophies</source>
<translation type="unfinished">Show Earned Trophies</translation>
</message>
<message>
<source>Show Not Earned Trophies</source>
<translation type="unfinished">Show Not Earned Trophies</translation>
</message>
<message>
<source>Show Hidden Trophies</source>
<translation type="unfinished">Show Hidden Trophies</translation>
</message>
</context>
</TS>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -541,6 +541,77 @@
<source>Override Color</source>
<translation>Substituir Cor</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind axis values more than once</source>
<translation type="unfinished">Cannot bind axis values more than once</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>EditorDialog</name>
<message>
<source>Edit Keyboard + Mouse and Controller input bindings</source>
<translation type="unfinished">Edit Keyboard + Mouse and Controller input bindings</translation>
</message>
<message>
<source>Use Per-Game configs</source>
<translation type="unfinished">Use Per-Game configs</translation>
</message>
<message>
<source>Error</source>
<translation type="unfinished">Error</translation>
</message>
<message>
<source>Could not open the file for reading</source>
<translation type="unfinished">Could not open the file for reading</translation>
</message>
<message>
<source>Could not open the file for writing</source>
<translation type="unfinished">Could not open the file for writing</translation>
</message>
<message>
<source>Save Changes</source>
<translation type="unfinished">Save Changes</translation>
</message>
<message>
<source>Do you want to save changes?</source>
<translation type="unfinished">Do you want to save changes?</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>Do you want to reset your custom default config to the original default config?</source>
<translation type="unfinished">Do you want to reset your custom default config to the original default config?</translation>
</message>
<message>
<source>Do you want to reset this config to your custom default config?</source>
<translation type="unfinished">Do you want to reset this config to your custom default config?</translation>
</message>
<message>
<source>Reset to Default</source>
<translation type="unfinished">Reset to Default</translation>
</message>
</context>
<context>
<name>ElfViewer</name>
@ -775,6 +846,10 @@
<source>Delete DLC</source>
<translation>Eliminar DLC</translation>
</message>
<message>
<source>Delete Trophy</source>
<translation>Eliminar Troféu</translation>
</message>
<message>
<source>Compatibility...</source>
<translation>Compatibilidade...</translation>
@ -851,6 +926,10 @@
<source>This game has no update folder to open!</source>
<translation>Este jogo não tem nenhuma pasta de atualização para abrir!</translation>
</message>
<message>
<source>No log file found for this game!</source>
<translation>Não foi encontrado nenhum ficheiro de registo para este jogo!</translation>
</message>
<message>
<source>Failed to convert icon.</source>
<translation>Falha ao converter ícone.</translation>
@ -859,15 +938,46 @@
<source>This game has no save data to delete!</source>
<translation>Este jogo não tem dados guardados para eliminar!</translation>
</message>
<message>
<source>This game has no saved trophies to delete!</source>
<translation>Este jogo não tem troféus guardados para eliminar!</translation>
</message>
<message>
<source>Save Data</source>
<translation>Dados Guardados</translation>
</message>
<message>
<source>Trophy</source>
<translation>Troféus</translation>
</message>
<message>
<source>SFO Viewer for </source>
<translation>Visualizador SFO para </translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>Quickstart</source>
<translation type="unfinished">Quickstart</translation>
</message>
<message>
<source>FAQ</source>
<translation type="unfinished">FAQ</translation>
</message>
<message>
<source>Syntax</source>
<translation type="unfinished">Syntax</translation>
</message>
<message>
<source>Special Bindings</source>
<translation type="unfinished">Special Bindings</translation>
</message>
<message>
<source>Keybindings</source>
<translation type="unfinished">Keybindings</translation>
</message>
</context>
<context>
<name>InstallDirSelect</name>
<message>
@ -887,6 +997,217 @@
<translation>Eliminar Ficheiro PKG após Instalação</translation>
</message>
</context>
<context>
<name>KBMSettings</name>
<message>
<source>Configure Controls</source>
<translation>Configurar Comandos</translation>
</message>
<message>
<source>D-Pad</source>
<translation>Botões de Direção</translation>
</message>
<message>
<source>Up</source>
<translation>Cima</translation>
</message>
<message>
<source>unmapped</source>
<translation>não mapeado</translation>
</message>
<message>
<source>Left</source>
<translation>Esquerda</translation>
</message>
<message>
<source>Right</source>
<translation>Direita</translation>
</message>
<message>
<source>Down</source>
<translation>Baixo</translation>
</message>
<message>
<source>Left Analog Halfmode</source>
<translation>Meio Modo do Manípulo Esquerdo</translation>
</message>
<message>
<source>hold to move left stick at half-speed</source>
<translation>mantenha pressionado para mover o manípulo esquerdo à metade da velocidade</translation>
</message>
<message>
<source>Left Stick</source>
<translation>Manípulo Esquerdo</translation>
</message>
<message>
<source>Config Selection</source>
<translation>Seleção de Configuração</translation>
</message>
<message>
<source>Common Config</source>
<translation>Configuração Comum</translation>
</message>
<message>
<source>Use per-game configs</source>
<translation>Utilizar configurações por jogo</translation>
</message>
<message>
<source>L1</source>
<translation>L1</translation>
</message>
<message>
<source>L2</source>
<translation>L2</translation>
</message>
<message>
<source>Text Editor</source>
<translation>Editor de Texto</translation>
</message>
<message>
<source>Help</source>
<translation>Ajuda</translation>
</message>
<message>
<source>R1</source>
<translation>R1</translation>
</message>
<message>
<source>R2</source>
<translation>R2</translation>
</message>
<message>
<source>L3</source>
<translation>L3</translation>
</message>
<message>
<source>Touchpad Click</source>
<translation>Clique do Touchpad</translation>
</message>
<message>
<source>Mouse to Joystick</source>
<translation>Rato para Manípulo</translation>
</message>
<message>
<source>*press F7 ingame to activate</source>
<translation>*pressione F7 em jogo para ativar</translation>
</message>
<message>
<source>R3</source>
<translation>R3</translation>
</message>
<message>
<source>Options</source>
<translation>Opções</translation>
</message>
<message>
<source>Mouse Movement Parameters</source>
<translation>Parâmetros de Movimento do Rato</translation>
</message>
<message>
<source>note: click Help Button/Special Keybindings for more information</source>
<translation>nota: clique no Botão de Ajuda/Special Keybindings para obter mais informações</translation>
</message>
<message>
<source>Face Buttons</source>
<translation>Botões Frontais</translation>
</message>
<message>
<source>Triangle</source>
<translation>Triângulo</translation>
</message>
<message>
<source>Square</source>
<translation>Quadrado</translation>
</message>
<message>
<source>Circle</source>
<translation>Círculo</translation>
</message>
<message>
<source>Cross</source>
<translation>Cruz</translation>
</message>
<message>
<source>Right Analog Halfmode</source>
<translation>Meio Modo do Manípulo Direito</translation>
</message>
<message>
<source>hold to move right stick at half-speed</source>
<translation>mantenha pressionado para mover o manípulo direito à metade da velocidade</translation>
</message>
<message>
<source>Right Stick</source>
<translation>Manípulo Direito</translation>
</message>
<message>
<source>Speed Offset (def 0.125):</source>
<translation>Deslocamento de Velocidade (def 0,125):</translation>
</message>
<message>
<source>Copy from Common Config</source>
<translation type="unfinished">Copy from Common Config</translation>
</message>
<message>
<source>Deadzone Offset (def 0.50):</source>
<translation type="unfinished">Deadzone Offset (def 0.50):</translation>
</message>
<message>
<source>Speed Multiplier (def 1.0):</source>
<translation type="unfinished">Speed Multiplier (def 1.0):</translation>
</message>
<message>
<source>Common Config Selected</source>
<translation type="unfinished">Common Config Selected</translation>
</message>
<message>
<source>This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</source>
<translation type="unfinished">This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</translation>
</message>
<message>
<source>Copy values from Common Config</source>
<translation type="unfinished">Copy values from Common Config</translation>
</message>
<message>
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
<translation type="unfinished">Do you want to overwrite existing mappings with the mappings from the Common Config?</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind any unique input more than once</source>
<translation type="unfinished">Cannot bind any unique input more than once</translation>
</message>
<message>
<source>Press a key</source>
<translation type="unfinished">Press a key</translation>
</message>
<message>
<source>Cannot set mapping</source>
<translation type="unfinished">Cannot set mapping</translation>
</message>
<message>
<source>Mousewheel cannot be mapped to stick outputs</source>
<translation type="unfinished">Mousewheel cannot be mapped to stick outputs</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
@ -1311,6 +1632,10 @@
<source>Trophy</source>
<translation>Troféus</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder</source>
<translation>Abrir a pasta de imagens/sons de troféus personalizados</translation>
</message>
<message>
<source>Logger</source>
<translation>Registos</translation>
@ -1476,8 +1801,8 @@
<translation>Música de Título</translation>
</message>
<message>
<source>Disable Trophy Pop-ups</source>
<translation>Desativar Pop-ups dos Troféus</translation>
<source>Disable Trophy Notification</source>
<translation>Desativar Notificações de Troféus</translation>
</message>
<message>
<source>Background Image</source>
@ -1803,6 +2128,62 @@
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation>Separar Ficheiros de Registo:\nEscreve um ficheiro de registo para cada jogo.</translation>
</message>
<message>
<source>Trophy Notification Position</source>
<translation>Posição da Notificação do Troféu</translation>
</message>
<message>
<source>Left</source>
<translation>Esquerda</translation>
</message>
<message>
<source>Right</source>
<translation>Direita</translation>
</message>
<message>
<source>Top</source>
<translation>Acima</translation>
</message>
<message>
<source>Bottom</source>
<translation>Abaixo</translation>
</message>
<message>
<source>Notification Duration</source>
<translation>Duração da Notificação</translation>
</message>
<message>
<source>Portable User Folder</source>
<translation>Pasta de Utilizador Portátil</translation>
</message>
<message>
<source>Create Portable User Folder from Common User Folder</source>
<translation>Criar Pasta de Utilizador Portátil a partir da Pasta de Utilizador Comum</translation>
</message>
<message>
<source>Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</source>
<translation>Pasta de utilizador portátil:\nArmazena as definições e dados do shadPS4 que serão aplicados apenas na compilação do shadPS4 localizada na pasta atual. Reinicie a aplicação após criar a pasta de utilizador portátil para começar a usá-la.</translation>
</message>
<message>
<source>Cannot create portable user folder</source>
<translation type="unfinished">Cannot create portable user folder</translation>
</message>
<message>
<source>%1 already exists</source>
<translation type="unfinished">%1 already exists</translation>
</message>
<message>
<source>Portable user folder created</source>
<translation type="unfinished">Portable user folder created</translation>
</message>
<message>
<source>%1 successfully created.</source>
<translation type="unfinished">%1 successfully created.</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</source>
<translation type="unfinished">Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>
@ -1810,5 +2191,21 @@
<source>Trophy Viewer</source>
<translation>Visualizador de Troféus</translation>
</message>
<message>
<source>Progress</source>
<translation>Progresso</translation>
</message>
<message>
<source>Show Earned Trophies</source>
<translation>Mostrar Troféus Conquistados</translation>
</message>
<message>
<source>Show Not Earned Trophies</source>
<translation>Mostrar Troféus Não Conquistados</translation>
</message>
<message>
<source>Show Hidden Trophies</source>
<translation>Mostrar Troféus Ocultos</translation>
</message>
</context>
</TS>

View File

@ -7,7 +7,7 @@
<name>AboutDialog</name>
<message>
<source>About shadPS4</source>
<translation type="unfinished">About shadPS4</translation>
<translation>Despre shadPS4</translation>
</message>
<message>
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
@ -541,6 +541,77 @@
<source>Override Color</source>
<translation type="unfinished">Override Color</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind axis values more than once</source>
<translation type="unfinished">Cannot bind axis values more than once</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>EditorDialog</name>
<message>
<source>Edit Keyboard + Mouse and Controller input bindings</source>
<translation type="unfinished">Edit Keyboard + Mouse and Controller input bindings</translation>
</message>
<message>
<source>Use Per-Game configs</source>
<translation type="unfinished">Use Per-Game configs</translation>
</message>
<message>
<source>Error</source>
<translation type="unfinished">Error</translation>
</message>
<message>
<source>Could not open the file for reading</source>
<translation type="unfinished">Could not open the file for reading</translation>
</message>
<message>
<source>Could not open the file for writing</source>
<translation type="unfinished">Could not open the file for writing</translation>
</message>
<message>
<source>Save Changes</source>
<translation type="unfinished">Save Changes</translation>
</message>
<message>
<source>Do you want to save changes?</source>
<translation type="unfinished">Do you want to save changes?</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>Do you want to reset your custom default config to the original default config?</source>
<translation type="unfinished">Do you want to reset your custom default config to the original default config?</translation>
</message>
<message>
<source>Do you want to reset this config to your custom default config?</source>
<translation type="unfinished">Do you want to reset this config to your custom default config?</translation>
</message>
<message>
<source>Reset to Default</source>
<translation type="unfinished">Reset to Default</translation>
</message>
</context>
<context>
<name>ElfViewer</name>
@ -584,7 +655,7 @@
</message>
<message>
<source>Directory to install DLC</source>
<translation type="unfinished">Directory to install DLC</translation>
<translation>Director pentru a instala DLC</translation>
</message>
</context>
<context>
@ -775,6 +846,10 @@
<source>Delete DLC</source>
<translation type="unfinished">Delete DLC</translation>
</message>
<message>
<source>Delete Trophy</source>
<translation type="unfinished">Delete Trophy</translation>
</message>
<message>
<source>Compatibility...</source>
<translation type="unfinished">Compatibility...</translation>
@ -845,11 +920,15 @@
</message>
<message>
<source>Delete Save Data</source>
<translation type="unfinished">Delete Save Data</translation>
<translation>Șterge Salvare Date</translation>
</message>
<message>
<source>This game has no update folder to open!</source>
<translation type="unfinished">This game has no update folder to open!</translation>
<translation>Acest joc nu are folderul de actualizări pentru a fi deschis!</translation>
</message>
<message>
<source>No log file found for this game!</source>
<translation type="unfinished">No log file found for this game!</translation>
</message>
<message>
<source>Failed to convert icon.</source>
@ -859,15 +938,46 @@
<source>This game has no save data to delete!</source>
<translation type="unfinished">This game has no save data to delete!</translation>
</message>
<message>
<source>This game has no saved trophies to delete!</source>
<translation type="unfinished">This game has no saved trophies to delete!</translation>
</message>
<message>
<source>Save Data</source>
<translation type="unfinished">Save Data</translation>
</message>
<message>
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>Quickstart</source>
<translation type="unfinished">Quickstart</translation>
</message>
<message>
<source>FAQ</source>
<translation type="unfinished">FAQ</translation>
</message>
<message>
<source>Syntax</source>
<translation type="unfinished">Syntax</translation>
</message>
<message>
<source>Special Bindings</source>
<translation type="unfinished">Special Bindings</translation>
</message>
<message>
<source>Keybindings</source>
<translation type="unfinished">Keybindings</translation>
</message>
</context>
<context>
<name>InstallDirSelect</name>
<message>
@ -887,6 +997,217 @@
<translation type="unfinished">Delete PKG File on Install</translation>
</message>
</context>
<context>
<name>KBMSettings</name>
<message>
<source>Configure Controls</source>
<translation type="unfinished">Configure Controls</translation>
</message>
<message>
<source>D-Pad</source>
<translation type="unfinished">D-Pad</translation>
</message>
<message>
<source>Up</source>
<translation type="unfinished">Up</translation>
</message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Down</source>
<translation type="unfinished">Down</translation>
</message>
<message>
<source>Left Analog Halfmode</source>
<translation type="unfinished">Left Analog Halfmode</translation>
</message>
<message>
<source>hold to move left stick at half-speed</source>
<translation type="unfinished">hold to move left stick at half-speed</translation>
</message>
<message>
<source>Left Stick</source>
<translation type="unfinished">Left Stick</translation>
</message>
<message>
<source>Config Selection</source>
<translation type="unfinished">Config Selection</translation>
</message>
<message>
<source>Common Config</source>
<translation type="unfinished">Common Config</translation>
</message>
<message>
<source>Use per-game configs</source>
<translation type="unfinished">Use per-game configs</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Text Editor</source>
<translation type="unfinished">Text Editor</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>L3</source>
<translation type="unfinished">L3</translation>
</message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished">Touchpad Click</translation>
</message>
<message>
<source>Mouse to Joystick</source>
<translation type="unfinished">Mouse to Joystick</translation>
</message>
<message>
<source>*press F7 ingame to activate</source>
<translation type="unfinished">*press F7 ingame to activate</translation>
</message>
<message>
<source>R3</source>
<translation type="unfinished">R3</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>Mouse Movement Parameters</source>
<translation type="unfinished">Mouse Movement Parameters</translation>
</message>
<message>
<source>note: click Help Button/Special Keybindings for more information</source>
<translation type="unfinished">note: click Help Button/Special Keybindings for more information</translation>
</message>
<message>
<source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation>
</message>
<message>
<source>Triangle</source>
<translation type="unfinished">Triangle</translation>
</message>
<message>
<source>Square</source>
<translation type="unfinished">Square</translation>
</message>
<message>
<source>Circle</source>
<translation type="unfinished">Circle</translation>
</message>
<message>
<source>Cross</source>
<translation type="unfinished">Cross</translation>
</message>
<message>
<source>Right Analog Halfmode</source>
<translation type="unfinished">Right Analog Halfmode</translation>
</message>
<message>
<source>hold to move right stick at half-speed</source>
<translation type="unfinished">hold to move right stick at half-speed</translation>
</message>
<message>
<source>Right Stick</source>
<translation type="unfinished">Right Stick</translation>
</message>
<message>
<source>Speed Offset (def 0.125):</source>
<translation type="unfinished">Speed Offset (def 0.125):</translation>
</message>
<message>
<source>Copy from Common Config</source>
<translation type="unfinished">Copy from Common Config</translation>
</message>
<message>
<source>Deadzone Offset (def 0.50):</source>
<translation type="unfinished">Deadzone Offset (def 0.50):</translation>
</message>
<message>
<source>Speed Multiplier (def 1.0):</source>
<translation type="unfinished">Speed Multiplier (def 1.0):</translation>
</message>
<message>
<source>Common Config Selected</source>
<translation type="unfinished">Common Config Selected</translation>
</message>
<message>
<source>This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</source>
<translation type="unfinished">This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</translation>
</message>
<message>
<source>Copy values from Common Config</source>
<translation type="unfinished">Copy values from Common Config</translation>
</message>
<message>
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
<translation type="unfinished">Do you want to overwrite existing mappings with the mappings from the Common Config?</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind any unique input more than once</source>
<translation type="unfinished">Cannot bind any unique input more than once</translation>
</message>
<message>
<source>Press a key</source>
<translation type="unfinished">Press a key</translation>
</message>
<message>
<source>Cannot set mapping</source>
<translation type="unfinished">Cannot set mapping</translation>
</message>
<message>
<source>Mousewheel cannot be mapped to stick outputs</source>
<translation type="unfinished">Mousewheel cannot be mapped to stick outputs</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
@ -1190,7 +1511,7 @@
<name>PKGViewer</name>
<message>
<source>Open Folder</source>
<translation type="unfinished">Open Folder</translation>
<translation>Deschide Folder</translation>
</message>
<message>
<source>PKG ERROR</source>
@ -1311,6 +1632,10 @@
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder</source>
<translation type="unfinished">Open the custom trophy images/sounds folder</translation>
</message>
<message>
<source>Logger</source>
<translation type="unfinished">Logger</translation>
@ -1476,8 +1801,8 @@
<translation type="unfinished">Title Music</translation>
</message>
<message>
<source>Disable Trophy Pop-ups</source>
<translation type="unfinished">Disable Trophy Pop-ups</translation>
<source>Disable Trophy Notification</source>
<translation type="unfinished">Disable Trophy Notification</translation>
</message>
<message>
<source>Background Image</source>
@ -1803,6 +2128,62 @@
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
<message>
<source>Trophy Notification Position</source>
<translation type="unfinished">Trophy Notification Position</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Top</source>
<translation type="unfinished">Top</translation>
</message>
<message>
<source>Bottom</source>
<translation type="unfinished">Bottom</translation>
</message>
<message>
<source>Notification Duration</source>
<translation type="unfinished">Notification Duration</translation>
</message>
<message>
<source>Portable User Folder</source>
<translation type="unfinished">Portable User Folder</translation>
</message>
<message>
<source>Create Portable User Folder from Common User Folder</source>
<translation type="unfinished">Create Portable User Folder from Common User Folder</translation>
</message>
<message>
<source>Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</source>
<translation type="unfinished">Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</translation>
</message>
<message>
<source>Cannot create portable user folder</source>
<translation type="unfinished">Cannot create portable user folder</translation>
</message>
<message>
<source>%1 already exists</source>
<translation type="unfinished">%1 already exists</translation>
</message>
<message>
<source>Portable user folder created</source>
<translation type="unfinished">Portable user folder created</translation>
</message>
<message>
<source>%1 successfully created.</source>
<translation type="unfinished">%1 successfully created.</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</source>
<translation type="unfinished">Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>
@ -1810,5 +2191,21 @@
<source>Trophy Viewer</source>
<translation type="unfinished">Trophy Viewer</translation>
</message>
<message>
<source>Progress</source>
<translation type="unfinished">Progress</translation>
</message>
<message>
<source>Show Earned Trophies</source>
<translation type="unfinished">Show Earned Trophies</translation>
</message>
<message>
<source>Show Not Earned Trophies</source>
<translation type="unfinished">Show Not Earned Trophies</translation>
</message>
<message>
<source>Show Hidden Trophies</source>
<translation type="unfinished">Show Hidden Trophies</translation>
</message>
</context>
</TS>

View File

@ -541,6 +541,77 @@
<source>Override Color</source>
<translation>Заменить цвет</translation>
</message>
<message>
<source>Unable to Save</source>
<translation>Не удаётся сохранить</translation>
</message>
<message>
<source>Cannot bind axis values more than once</source>
<translation>Невозможно привязать значения оси более одного раза</translation>
</message>
<message>
<source>Save</source>
<translation>Сохранить</translation>
</message>
<message>
<source>Apply</source>
<translation>Применить</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation>По умолчанию</translation>
</message>
<message>
<source>Cancel</source>
<translation>Отмена</translation>
</message>
</context>
<context>
<name>EditorDialog</name>
<message>
<source>Edit Keyboard + Mouse and Controller input bindings</source>
<translation>Редактировать бинды клавиатуры + мыши и контроллера</translation>
</message>
<message>
<source>Use Per-Game configs</source>
<translation>Использовать настройки для каждой игры</translation>
</message>
<message>
<source>Error</source>
<translation>Ошибка</translation>
</message>
<message>
<source>Could not open the file for reading</source>
<translation>Не удалось открыть файл для чтения</translation>
</message>
<message>
<source>Could not open the file for writing</source>
<translation>Не удалось открыть файл для записи</translation>
</message>
<message>
<source>Save Changes</source>
<translation>Сохранить изменения</translation>
</message>
<message>
<source>Do you want to save changes?</source>
<translation>Хотите сохранить изменения?</translation>
</message>
<message>
<source>Help</source>
<translation>Помощь</translation>
</message>
<message>
<source>Do you want to reset your custom default config to the original default config?</source>
<translation>Хотите ли вы сбросить ваш пользовательский конфиг по умолчанию к первоначальному конфигу по умолчанию?</translation>
</message>
<message>
<source>Do you want to reset this config to your custom default config?</source>
<translation>Хотите ли вы сбросить этот конфиг к вашему пользовательскому конфигу по умолчанию?</translation>
</message>
<message>
<source>Reset to Default</source>
<translation>Сбросить по умолчанию</translation>
</message>
</context>
<context>
<name>ElfViewer</name>
@ -775,6 +846,10 @@
<source>Delete DLC</source>
<translation>Удалить DLC</translation>
</message>
<message>
<source>Delete Trophy</source>
<translation>Удалить трофей</translation>
</message>
<message>
<source>Compatibility...</source>
<translation>Совместимость...</translation>
@ -851,6 +926,10 @@
<source>This game has no update folder to open!</source>
<translation>У этой игры нет папки обновлений, которую можно открыть!</translation>
</message>
<message>
<source>No log file found for this game!</source>
<translation>Не найден файл логов для этой игры!</translation>
</message>
<message>
<source>Failed to convert icon.</source>
<translation>Не удалось преобразовать иконку.</translation>
@ -859,15 +938,46 @@
<source>This game has no save data to delete!</source>
<translation>У этой игры нет сохранений, которые можно удалить!</translation>
</message>
<message>
<source>This game has no saved trophies to delete!</source>
<translation>У этой игры нет сохраненных трофеев для удаления!</translation>
</message>
<message>
<source>Save Data</source>
<translation>Сохранения</translation>
</message>
<message>
<source>Trophy</source>
<translation>Трофей</translation>
</message>
<message>
<source>SFO Viewer for </source>
<translation>Просмотр SFO для</translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>Quickstart</source>
<translation>Быстрый старт</translation>
</message>
<message>
<source>FAQ</source>
<translation>ЧАВО</translation>
</message>
<message>
<source>Syntax</source>
<translation>Синтаксис</translation>
</message>
<message>
<source>Special Bindings</source>
<translation>Специальные бинды</translation>
</message>
<message>
<source>Keybindings</source>
<translation>Бинды клавиш</translation>
</message>
</context>
<context>
<name>InstallDirSelect</name>
<message>
@ -887,6 +997,217 @@
<translation>Удалить файл PKG при установке</translation>
</message>
</context>
<context>
<name>KBMSettings</name>
<message>
<source>Configure Controls</source>
<translation>Настроить управление</translation>
</message>
<message>
<source>D-Pad</source>
<translation>Крестовина</translation>
</message>
<message>
<source>Up</source>
<translation>Вверх</translation>
</message>
<message>
<source>unmapped</source>
<translation>не назначено</translation>
</message>
<message>
<source>Left</source>
<translation>Влево</translation>
</message>
<message>
<source>Right</source>
<translation>Вправо</translation>
</message>
<message>
<source>Down</source>
<translation>Вниз</translation>
</message>
<message>
<source>Left Analog Halfmode</source>
<translation>Левый стик вполовину</translation>
</message>
<message>
<source>hold to move left stick at half-speed</source>
<translation>удерживайте для перемещения левого стика вполовину меньше</translation>
</message>
<message>
<source>Left Stick</source>
<translation>Левый стик</translation>
</message>
<message>
<source>Config Selection</source>
<translation>Выбор конфига</translation>
</message>
<message>
<source>Common Config</source>
<translation>Общий конфиг</translation>
</message>
<message>
<source>Use per-game configs</source>
<translation>Использовать настройки для каждой игры</translation>
</message>
<message>
<source>L1</source>
<translation>L1</translation>
</message>
<message>
<source>L2</source>
<translation>L2</translation>
</message>
<message>
<source>Text Editor</source>
<translation>Текстовый редактор</translation>
</message>
<message>
<source>Help</source>
<translation>Помощь</translation>
</message>
<message>
<source>R1</source>
<translation>R1</translation>
</message>
<message>
<source>R2</source>
<translation>R2</translation>
</message>
<message>
<source>L3</source>
<translation>L3</translation>
</message>
<message>
<source>Touchpad Click</source>
<translation>Нажатие на тачпад</translation>
</message>
<message>
<source>Mouse to Joystick</source>
<translation>Мышь в джойстик</translation>
</message>
<message>
<source>*press F7 ingame to activate</source>
<translation>*нажмите F7 в игре для активации</translation>
</message>
<message>
<source>R3</source>
<translation>R3</translation>
</message>
<message>
<source>Options</source>
<translation>Options</translation>
</message>
<message>
<source>Mouse Movement Parameters</source>
<translation>Параметры движения мыши</translation>
</message>
<message>
<source>note: click Help Button/Special Keybindings for more information</source>
<translation>примечание: нажмите кнопку Помощь/Специальные бинды для получения дополнительной информации</translation>
</message>
<message>
<source>Face Buttons</source>
<translation>Кнопки действий</translation>
</message>
<message>
<source>Triangle</source>
<translation>Треугольник</translation>
</message>
<message>
<source>Square</source>
<translation>Квадрат</translation>
</message>
<message>
<source>Circle</source>
<translation>Круг</translation>
</message>
<message>
<source>Cross</source>
<translation>Крест</translation>
</message>
<message>
<source>Right Analog Halfmode</source>
<translation>Правый стик вполовину</translation>
</message>
<message>
<source>hold to move right stick at half-speed</source>
<translation>удерживайте для перемещения правого стика вполовину меньше</translation>
</message>
<message>
<source>Right Stick</source>
<translation>Правый стик</translation>
</message>
<message>
<source>Speed Offset (def 0.125):</source>
<translation>Смещение скорости (по умолч 0.125):</translation>
</message>
<message>
<source>Copy from Common Config</source>
<translation>Копировать из общего конфига</translation>
</message>
<message>
<source>Deadzone Offset (def 0.50):</source>
<translation>Смещение мёртвой зоны (по умолч 0.50)</translation>
</message>
<message>
<source>Speed Multiplier (def 1.0):</source>
<translation>Множитель скорости (по умолч 1.0)</translation>
</message>
<message>
<source>Common Config Selected</source>
<translation>Выбран общий конфиг</translation>
</message>
<message>
<source>This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</source>
<translation>Эта кнопка копирует настройки из общего конфига в текущий выбранный профиль, и не может быть использован, когда выбранный профиль это общий конфиг.</translation>
</message>
<message>
<source>Copy values from Common Config</source>
<translation>Копировать значения из общего конфига</translation>
</message>
<message>
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
<translation>Вы хотите перезаписать существующие настройки настройками из общего конфига?</translation>
</message>
<message>
<source>Unable to Save</source>
<translation>Не удаётся сохранить</translation>
</message>
<message>
<source>Cannot bind any unique input more than once</source>
<translation>Невозможно привязать уникальный ввод более одного раза</translation>
</message>
<message>
<source>Press a key</source>
<translation>Нажмите кнопку</translation>
</message>
<message>
<source>Cannot set mapping</source>
<translation>Не удаётся задать настройки</translation>
</message>
<message>
<source>Mousewheel cannot be mapped to stick outputs</source>
<translation>Колесо не может быть назначено для вывода стиков</translation>
</message>
<message>
<source>Save</source>
<translation>Сохранить</translation>
</message>
<message>
<source>Apply</source>
<translation>Применить</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation>По умолчанию</translation>
</message>
<message>
<source>Cancel</source>
<translation>Отмена</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
@ -1311,6 +1632,10 @@
<source>Trophy</source>
<translation>Трофеи</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder</source>
<translation>Открыть папку с пользовательскими изображениями/звуками трофеев</translation>
</message>
<message>
<source>Logger</source>
<translation>Логирование</translation>
@ -1476,8 +1801,8 @@
<translation>Заглавная музыка</translation>
</message>
<message>
<source>Disable Trophy Pop-ups</source>
<translation>Отключить уведомления о трофеях</translation>
<source>Disable Trophy Notification</source>
<translation>Отключить уведомления о трофее</translation>
</message>
<message>
<source>Background Image</source>
@ -1803,6 +2128,62 @@
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation>Отдельные файлы логов:\nПишет отдельный файл логов для каждой игры.</translation>
</message>
<message>
<source>Trophy Notification Position</source>
<translation>Местоположение уведомления о трофее</translation>
</message>
<message>
<source>Left</source>
<translation>Слева</translation>
</message>
<message>
<source>Right</source>
<translation>Справа</translation>
</message>
<message>
<source>Top</source>
<translation>Сверху</translation>
</message>
<message>
<source>Bottom</source>
<translation>Снизу</translation>
</message>
<message>
<source>Notification Duration</source>
<translation>Продолжительность уведомления</translation>
</message>
<message>
<source>Portable User Folder</source>
<translation>Портативная папка пользователя</translation>
</message>
<message>
<source>Create Portable User Folder from Common User Folder</source>
<translation>Создать портативную папку пользователя из общей папки пользователя</translation>
</message>
<message>
<source>Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</source>
<translation>Портативная папка пользователя:\nХранит настройки и данные shadPS4, которые будут применяться только к билду shadPS4, расположенному в этой папке. Перезагрузите приложение после создания портативной папки пользователя чтобы начать использовать её.</translation>
</message>
<message>
<source>Cannot create portable user folder</source>
<translation>Невозможно создать папку для портативной папки пользователя</translation>
</message>
<message>
<source>%1 already exists</source>
<translation>%1 уже существует</translation>
</message>
<message>
<source>Portable user folder created</source>
<translation>Портативная папка пользователя создана</translation>
</message>
<message>
<source>%1 successfully created.</source>
<translation>%1 успешно создано.</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</source>
<translation>Открыть папку с пользовательскими изображениями/звуками трофеев:\nВы можете добавить пользовательские изображения к трофеям и аудио.\обавьте файлы в custom_trophy со следующими именами:\ntrophy.wav ИЛИ trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\римечание: звук будет работать только в QT-версии.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>
@ -1810,5 +2191,21 @@
<source>Trophy Viewer</source>
<translation>Просмотр трофеев</translation>
</message>
<message>
<source>Progress</source>
<translation>Прогресс</translation>
</message>
<message>
<source>Show Earned Trophies</source>
<translation>Показать заработанные трофеи</translation>
</message>
<message>
<source>Show Not Earned Trophies</source>
<translation>Показать не заработанные трофеи</translation>
</message>
<message>
<source>Show Hidden Trophies</source>
<translation>Показать скрытые трофеи</translation>
</message>
</context>
</TS>

View File

@ -74,7 +74,7 @@
</message>
<message>
<source>Select Patch File:</source>
<translation>Përzgjidh Skedarin e Arnës:</translation>
<translation>Përzgjidh skedarin e arnës:</translation>
</message>
<message>
<source>Download Patches</source>
@ -138,7 +138,7 @@
</message>
<message>
<source>File Exists</source>
<translation>Skedari Ekziston</translation>
<translation>Skedari ekziston</translation>
</message>
<message>
<source>File already exists. Do you want to replace it?</source>
@ -411,7 +411,7 @@
</message>
<message>
<source>D-Pad</source>
<translation>D-Pad</translation>
<translation>Shigjetat</translation>
</message>
<message>
<source>Up</source>
@ -451,7 +451,7 @@
</message>
<message>
<source>Use per-game configs</source>
<translation>Përdor konfigurime për secilën lojë</translation>
<translation>Përdor konfigurime veçanta për secilën lojë</translation>
</message>
<message>
<source>L1 / LB</source>
@ -541,6 +541,77 @@
<source>Override Color</source>
<translation>Zëvendëso Ngjyrën</translation>
</message>
<message>
<source>Unable to Save</source>
<translation>Ruajtja Dështoi</translation>
</message>
<message>
<source>Cannot bind axis values more than once</source>
<translation>Nuk mund caktohen vlerat e boshtit shumë se një herë</translation>
</message>
<message>
<source>Save</source>
<translation>Ruaj</translation>
</message>
<message>
<source>Apply</source>
<translation>Zbato</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation>Rikthe Paracaktimet</translation>
</message>
<message>
<source>Cancel</source>
<translation>Anulo</translation>
</message>
</context>
<context>
<name>EditorDialog</name>
<message>
<source>Edit Keyboard + Mouse and Controller input bindings</source>
<translation>Redakto caktimet e hyrjeve për Tastierën + Miun dhe Dorezën</translation>
</message>
<message>
<source>Use Per-Game configs</source>
<translation>Përdor konfigurime për secilën lojë</translation>
</message>
<message>
<source>Error</source>
<translation>Gabim</translation>
</message>
<message>
<source>Could not open the file for reading</source>
<translation>Skedari nuk mund hapet për lexim</translation>
</message>
<message>
<source>Could not open the file for writing</source>
<translation>Skedari nuk mund hapet për shkrim</translation>
</message>
<message>
<source>Save Changes</source>
<translation>Ruaj Ndryshimet</translation>
</message>
<message>
<source>Do you want to save changes?</source>
<translation>Do ruash ndryshimet?</translation>
</message>
<message>
<source>Help</source>
<translation>Ndihmë</translation>
</message>
<message>
<source>Do you want to reset your custom default config to the original default config?</source>
<translation>A do ta rivendosësh konfigurimin tënd paracaktuar personalizuar te konfigurimi i paracaktuar origjinal?</translation>
</message>
<message>
<source>Do you want to reset this config to your custom default config?</source>
<translation>A do ta rivendosësh këtë konfigurim konfigurimin tënd paracaktuar personalizuar?</translation>
</message>
<message>
<source>Reset to Default</source>
<translation>Rivendos Paracaktuarit</translation>
</message>
</context>
<context>
<name>ElfViewer</name>
@ -775,6 +846,10 @@
<source>Delete DLC</source>
<translation>Fshi DLC-</translation>
</message>
<message>
<source>Delete Trophy</source>
<translation>Fshi Trofeun</translation>
</message>
<message>
<source>Compatibility...</source>
<translation>Përputhshmëria...</translation>
@ -851,6 +926,10 @@
<source>This game has no update folder to open!</source>
<translation>Kjo lojë nuk ka dosje përditësimi për hapur!</translation>
</message>
<message>
<source>No log file found for this game!</source>
<translation>Nuk u gjet asnjë skedar ditari për këtë lojë!</translation>
</message>
<message>
<source>Failed to convert icon.</source>
<translation>Konvertimi i ikonës dështoi.</translation>
@ -859,15 +938,46 @@
<source>This game has no save data to delete!</source>
<translation>Kjo lojë nuk ka dhëna ruajtje për fshirë!</translation>
</message>
<message>
<source>This game has no saved trophies to delete!</source>
<translation>Kjo lojë nuk ka trofe ruajtur për fshirë!</translation>
</message>
<message>
<source>Save Data</source>
<translation> dhënat e ruajtjes</translation>
</message>
<message>
<source>Trophy</source>
<translation>Trofeu</translation>
</message>
<message>
<source>SFO Viewer for </source>
<translation>Shikuesi SFO për </translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>Quickstart</source>
<translation>Nisje e shpejtë</translation>
</message>
<message>
<source>FAQ</source>
<translation>Pyetje Shpeshta</translation>
</message>
<message>
<source>Syntax</source>
<translation>Sintaksa</translation>
</message>
<message>
<source>Special Bindings</source>
<translation>Caktimet e Veçantë</translation>
</message>
<message>
<source>Keybindings</source>
<translation>Caktimet e Tasteve</translation>
</message>
</context>
<context>
<name>InstallDirSelect</name>
<message>
@ -887,6 +997,217 @@
<translation>Fshi skedarin PKG pas instalimit</translation>
</message>
</context>
<context>
<name>KBMSettings</name>
<message>
<source>Configure Controls</source>
<translation>Konfiguro Kontrollet</translation>
</message>
<message>
<source>D-Pad</source>
<translation>Shigjetat</translation>
</message>
<message>
<source>Up</source>
<translation>Lartë</translation>
</message>
<message>
<source>unmapped</source>
<translation>pacaktuar</translation>
</message>
<message>
<source>Left</source>
<translation>Majtas</translation>
</message>
<message>
<source>Right</source>
<translation>Djathtas</translation>
</message>
<message>
<source>Down</source>
<translation>Poshtë</translation>
</message>
<message>
<source>Left Analog Halfmode</source>
<translation>Mënyra e gjysmuar për levën e majtë</translation>
</message>
<message>
<source>hold to move left stick at half-speed</source>
<translation>mbaj shtypur për lëvizur levën e majtë me gjysmën e shpejtësisë</translation>
</message>
<message>
<source>Left Stick</source>
<translation>Leva e Majtë</translation>
</message>
<message>
<source>Config Selection</source>
<translation>Zgjedhja e Konfigurimit</translation>
</message>
<message>
<source>Common Config</source>
<translation>Konfigurim i Përbashkët</translation>
</message>
<message>
<source>Use per-game configs</source>
<translation>Përdor konfigurime për secilën lojë</translation>
</message>
<message>
<source>L1</source>
<translation>L1</translation>
</message>
<message>
<source>L2</source>
<translation>L2</translation>
</message>
<message>
<source>Text Editor</source>
<translation>Redaktuesi i Tekstit</translation>
</message>
<message>
<source>Help</source>
<translation>Ndihmë</translation>
</message>
<message>
<source>R1</source>
<translation>R1</translation>
</message>
<message>
<source>R2</source>
<translation>R2</translation>
</message>
<message>
<source>L3</source>
<translation>L3</translation>
</message>
<message>
<source>Touchpad Click</source>
<translation>Klikim i Panelit me Prekje</translation>
</message>
<message>
<source>Mouse to Joystick</source>
<translation>Miu Levë</translation>
</message>
<message>
<source>*press F7 ingame to activate</source>
<translation>*shtyp F7 gjatë lojës për ta aktivizuar</translation>
</message>
<message>
<source>R3</source>
<translation>R3</translation>
</message>
<message>
<source>Options</source>
<translation>Rregullime</translation>
</message>
<message>
<source>Mouse Movement Parameters</source>
<translation>Parametrat e Lëvizjes Miut</translation>
</message>
<message>
<source>note: click Help Button/Special Keybindings for more information</source>
<translation>shënim: kliko Butonin e Ndihmës/Caktimet e Tasteve Veçantë për shumë informacion</translation>
</message>
<message>
<source>Face Buttons</source>
<translation>Butonat Kryesore</translation>
</message>
<message>
<source>Triangle</source>
<translation>Trekëndësh</translation>
</message>
<message>
<source>Square</source>
<translation>Katror</translation>
</message>
<message>
<source>Circle</source>
<translation>Rreth</translation>
</message>
<message>
<source>Cross</source>
<translation>Kryq</translation>
</message>
<message>
<source>Right Analog Halfmode</source>
<translation>Mënyra e gjysmuar për levën e djathtë</translation>
</message>
<message>
<source>hold to move right stick at half-speed</source>
<translation>mbaj shtypur për lëvizur levën e djathtë me gjysmën e shpejtësisë</translation>
</message>
<message>
<source>Right Stick</source>
<translation>Leva e Djathtë</translation>
</message>
<message>
<source>Speed Offset (def 0.125):</source>
<translation>Ofset i Shpejtësisë (paracaktuar 0.125):</translation>
</message>
<message>
<source>Copy from Common Config</source>
<translation>Kopjo nga Konfigurimi i Përbashkët</translation>
</message>
<message>
<source>Deadzone Offset (def 0.50):</source>
<translation>Ofseti i Zonës Vdekur (paracaktuar 0.50):</translation>
</message>
<message>
<source>Speed Multiplier (def 1.0):</source>
<translation>Shumëzuesi i Shpejtësisë (paracaktuar 1.0):</translation>
</message>
<message>
<source>Common Config Selected</source>
<translation>Konfigurimi i Përbashkët i Zgjedhur</translation>
</message>
<message>
<source>This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</source>
<translation>Ky buton kopjon caktimet nga Konfigurimi i Përbashkët profilin e zgjedhur aktualisht, dhe nuk mund përdoret kur profili i zgjedhur aktualisht është Konfigurimi i Përbashkët.</translation>
</message>
<message>
<source>Copy values from Common Config</source>
<translation>Kopjo vlerat nga Konfigurimi i Përbashkët</translation>
</message>
<message>
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
<translation>A dëshiron mbishkruash caktimet ekzistuese me ato nga Konfigurimi i Përbashkët?</translation>
</message>
<message>
<source>Unable to Save</source>
<translation>Ruajtja Dështoi</translation>
</message>
<message>
<source>Cannot bind any unique input more than once</source>
<translation>Asnjë hyrje unike nuk mund caktohet shumë se një herë</translation>
</message>
<message>
<source>Press a key</source>
<translation>Shtyp një tast</translation>
</message>
<message>
<source>Cannot set mapping</source>
<translation>Caktimi nuk u vendos dot</translation>
</message>
<message>
<source>Mousewheel cannot be mapped to stick outputs</source>
<translation>Rrota e miut nuk mund caktohet për daljet e levës</translation>
</message>
<message>
<source>Save</source>
<translation>Ruaj</translation>
</message>
<message>
<source>Apply</source>
<translation>Zbato</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation>Rikthe Paracaktimet</translation>
</message>
<message>
<source>Cancel</source>
<translation>Anulo</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
@ -1285,7 +1606,7 @@
</message>
<message>
<source>Default tab when opening settings</source>
<translation>Skeda e parazgjedhur kur hapen cilësimet</translation>
<translation>Skeda e paracaktuar kur hapen cilësimet</translation>
</message>
<message>
<source>Show Game Size In List</source>
@ -1311,6 +1632,10 @@
<source>Trophy</source>
<translation>Trofeu</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder</source>
<translation>Hap dosjen e imazheve/tingujve trofeve personalizuar</translation>
</message>
<message>
<source>Logger</source>
<translation>Regjistruesi i ditarit</translation>
@ -1381,7 +1706,7 @@
</message>
<message>
<source>Enable Shaders Dumping</source>
<translation>Aktivizo Zbrazjen e Shaders-ave</translation>
<translation>Aktivizo Zbrazjen e Shader-ave</translation>
</message>
<message>
<source>Enable NULL GPU</source>
@ -1457,7 +1782,7 @@
</message>
<message>
<source>Always Show Changelog</source>
<translation>Shfaq gjithmonë regjistrin e ndryshimeve</translation>
<translation>Shfaq gjithmonë ditarin e ndryshimeve</translation>
</message>
<message>
<source>Update Channel</source>
@ -1476,8 +1801,8 @@
<translation>Muzika e titullit</translation>
</message>
<message>
<source>Disable Trophy Pop-ups</source>
<translation>Çaktivizo njoftimet për Trofetë</translation>
<source>Disable Trophy Notification</source>
<translation>Çaktivizo Njoftimin e Trofeut</translation>
</message>
<message>
<source>Background Image</source>
@ -1525,7 +1850,7 @@
</message>
<message>
<source>Restore Defaults</source>
<translation>Rikthe paracaktimet</translation>
<translation>Rikthe Paracaktimet</translation>
</message>
<message>
<source>Close</source>
@ -1597,7 +1922,7 @@
</message>
<message>
<source>Back Button Behavior:\nSets the controller&apos;s back button to emulate tapping the specified position on the PS4 touchpad.</source>
<translation>Sjellja e butonit mbrapa:\nLejon përcaktohet se cilën pjesë tastierës prekëse do imitojë një prekje butoni mbrapa.</translation>
<translation>Sjellja e butonit mbrapa:\nLejon përcaktohet se cilën pjesë panelit me prekje dorezës do imitojë një prekje butoni mbrapa.</translation>
</message>
<message>
<source>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable &quot;Update Compatibility On Startup&quot; to get up-to-date information.</source>
@ -1625,15 +1950,15 @@
</message>
<message>
<source>Touchpad Left</source>
<translation>Tastiera prekëse majtas</translation>
<translation>Paneli me Prekje Majtas</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Tastiera prekëse djathtas</translation>
<translation>Paneli me Prekje Djathtas</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Tastiera prekëse qendër</translation>
<translation>Paneli me Prekje Qendër</translation>
</message>
<message>
<source>None</source>
@ -1765,43 +2090,99 @@
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
<translation>Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
<translation>Mënyra e Shfaqjes</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
<translation>Dritare</translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation>
<translation>Ekran plotë</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation>
<translation>Ekran plotë (Pa kufij)</translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished">Window Size</translation>
<translation>Masa e Dritares</translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished">W:</translation>
<translation>Gjer:</translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished">H:</translation>
<translation>Lart:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished">Separate Log Files</translation>
<translation>Skedarë Ditarit Ndarë</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
<translation>Skedarë Ditarit Ndarë:\nShkruan një skedar ditarit veçuar për secilën lojë.</translation>
</message>
<message>
<source>Trophy Notification Position</source>
<translation>Pozicioni i Njoftimit Trofeve</translation>
</message>
<message>
<source>Left</source>
<translation>Majtas</translation>
</message>
<message>
<source>Right</source>
<translation>Djathtas</translation>
</message>
<message>
<source>Top</source>
<translation>Sipër</translation>
</message>
<message>
<source>Bottom</source>
<translation>Poshtë</translation>
</message>
<message>
<source>Notification Duration</source>
<translation>Kohëzgjatja e Njoftimit</translation>
</message>
<message>
<source>Portable User Folder</source>
<translation>Dosja Portative e Përdoruesit</translation>
</message>
<message>
<source>Create Portable User Folder from Common User Folder</source>
<translation>Krijo Dosje Portative Përdoruesit nga Dosja e Përbashkët e Përdoruesit</translation>
</message>
<message>
<source>Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</source>
<translation>Dosja portative e përdoruesit:\nRuan cilësimet dhe dhënat shadPS4 do zbatohen vetëm për konstruktin e shadPS4 vendosur dosjen aktuale. Rinis aplikacionin pasi krijosh dosjen portative te përdoruesit për ta përdorur.</translation>
</message>
<message>
<source>Cannot create portable user folder</source>
<translation>Dosja portative e përdoruesit nuk u krijua dot</translation>
</message>
<message>
<source>%1 already exists</source>
<translation>%1 tashmë ekziston</translation>
</message>
<message>
<source>Portable user folder created</source>
<translation>Dosja portative e përdoruesit u krijua</translation>
</message>
<message>
<source>%1 successfully created.</source>
<translation>%1 u krijua me sukses.</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</source>
<translation>Hap dosjen e imazheve/tingujve trofeve personalizuar:\nMund shtosh imazhe personalizuara për trofetë dhe një audio.\nShto skedarët dosjen custom_trophy me emrat vijojnë:\ntrophy.wav ose trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nShënim: Tingulli do punojë vetëm versionet QT.</translation>
</message>
</context>
<context>
@ -1810,5 +2191,21 @@
<source>Trophy Viewer</source>
<translation>Shikuesi i Trofeve</translation>
</message>
<message>
<source>Progress</source>
<translation>Ecuria</translation>
</message>
<message>
<source>Show Earned Trophies</source>
<translation>Shfaq Trofetë janë fituar</translation>
</message>
<message>
<source>Show Not Earned Trophies</source>
<translation>Shfaq Trofetë nuk janë fituar</translation>
</message>
<message>
<source>Show Hidden Trophies</source>
<translation>Shfaq Trofetë e Fshehur</translation>
</message>
</context>
</TS>

View File

@ -541,6 +541,77 @@
<source>Override Color</source>
<translation>Åsidosätt färg</translation>
</message>
<message>
<source>Unable to Save</source>
<translation>Kunde inte spara</translation>
</message>
<message>
<source>Cannot bind axis values more than once</source>
<translation>Kan inte binda axelvärden fler än en gång</translation>
</message>
<message>
<source>Save</source>
<translation>Spara</translation>
</message>
<message>
<source>Apply</source>
<translation>Tillämpa</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation>Återställ till standard</translation>
</message>
<message>
<source>Cancel</source>
<translation>Avbryt</translation>
</message>
</context>
<context>
<name>EditorDialog</name>
<message>
<source>Edit Keyboard + Mouse and Controller input bindings</source>
<translation>Redigera inmatningsbindningar för tangentbord + mus och kontroller</translation>
</message>
<message>
<source>Use Per-Game configs</source>
<translation>Använd konfigurationer per-spel</translation>
</message>
<message>
<source>Error</source>
<translation>Fel</translation>
</message>
<message>
<source>Could not open the file for reading</source>
<translation>Kunde inte öppna filen för läsning</translation>
</message>
<message>
<source>Could not open the file for writing</source>
<translation>Kunde inte öppna filen för skrivning</translation>
</message>
<message>
<source>Save Changes</source>
<translation>Spara ändringar</translation>
</message>
<message>
<source>Do you want to save changes?</source>
<translation>Vill du spara ändringarna?</translation>
</message>
<message>
<source>Help</source>
<translation>Hjälp</translation>
</message>
<message>
<source>Do you want to reset your custom default config to the original default config?</source>
<translation>Vill du återställa din anpassade standardkonfiguration till ursprungliga standardkonfigurationen?</translation>
</message>
<message>
<source>Do you want to reset this config to your custom default config?</source>
<translation>Vill du återställa denna konfiguration till din anpassade standardkonfiguration?</translation>
</message>
<message>
<source>Reset to Default</source>
<translation>Återställ till standard</translation>
</message>
</context>
<context>
<name>ElfViewer</name>
@ -775,6 +846,10 @@
<source>Delete DLC</source>
<translation>Ta bort DLC</translation>
</message>
<message>
<source>Delete Trophy</source>
<translation>Ta bort trofé</translation>
</message>
<message>
<source>Compatibility...</source>
<translation>Kompatibilitet...</translation>
@ -851,6 +926,10 @@
<source>This game has no update folder to open!</source>
<translation>Detta spel har ingen uppdateringsmapp att öppna!</translation>
</message>
<message>
<source>No log file found for this game!</source>
<translation>Ingen loggfil hittades för detta spel!</translation>
</message>
<message>
<source>Failed to convert icon.</source>
<translation>Misslyckades med att konvertera ikon.</translation>
@ -859,15 +938,46 @@
<source>This game has no save data to delete!</source>
<translation>Detta spel har inget sparat data att ta bort!</translation>
</message>
<message>
<source>This game has no saved trophies to delete!</source>
<translation>Detta spel har inga sparade troféer att ta bort!</translation>
</message>
<message>
<source>Save Data</source>
<translation>Sparat data</translation>
</message>
<message>
<source>Trophy</source>
<translation>Trofé</translation>
</message>
<message>
<source>SFO Viewer for </source>
<translation>SFO-visare för </translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>Quickstart</source>
<translation>Snabbstart</translation>
</message>
<message>
<source>FAQ</source>
<translation>Frågor och svar</translation>
</message>
<message>
<source>Syntax</source>
<translation>Syntax</translation>
</message>
<message>
<source>Special Bindings</source>
<translation>Speciella bindningar</translation>
</message>
<message>
<source>Keybindings</source>
<translation>Tangentbindningar</translation>
</message>
</context>
<context>
<name>InstallDirSelect</name>
<message>
@ -887,6 +997,217 @@
<translation>Ta bort PKG-fil efter installation</translation>
</message>
</context>
<context>
<name>KBMSettings</name>
<message>
<source>Configure Controls</source>
<translation>Konfigurera kontroller</translation>
</message>
<message>
<source>D-Pad</source>
<translation>Riktningsknappar</translation>
</message>
<message>
<source>Up</source>
<translation>Upp</translation>
</message>
<message>
<source>unmapped</source>
<translation>inte mappad</translation>
</message>
<message>
<source>Left</source>
<translation>Vänster</translation>
</message>
<message>
<source>Right</source>
<translation>Höger</translation>
</message>
<message>
<source>Down</source>
<translation>Ner</translation>
</message>
<message>
<source>Left Analog Halfmode</source>
<translation>Halvläge för vänster analog</translation>
</message>
<message>
<source>hold to move left stick at half-speed</source>
<translation>håll ner för att flytta vänster spak i halvfart</translation>
</message>
<message>
<source>Left Stick</source>
<translation>Vänster spak</translation>
</message>
<message>
<source>Config Selection</source>
<translation>Konfigurationsval</translation>
</message>
<message>
<source>Common Config</source>
<translation>Gemensam konfiguration</translation>
</message>
<message>
<source>Use per-game configs</source>
<translation>Använd konfiguration per-spel</translation>
</message>
<message>
<source>L1</source>
<translation>L1</translation>
</message>
<message>
<source>L2</source>
<translation>L2</translation>
</message>
<message>
<source>Text Editor</source>
<translation>Textredigerare</translation>
</message>
<message>
<source>Help</source>
<translation>Hjälp</translation>
</message>
<message>
<source>R1</source>
<translation>R1</translation>
</message>
<message>
<source>R2</source>
<translation>R2</translation>
</message>
<message>
<source>L3</source>
<translation>L3</translation>
</message>
<message>
<source>Touchpad Click</source>
<translation>Klick styrplatta</translation>
</message>
<message>
<source>Mouse to Joystick</source>
<translation>Mus till styrspak</translation>
</message>
<message>
<source>*press F7 ingame to activate</source>
<translation>*tryck F7 i spelet för att aktivera</translation>
</message>
<message>
<source>R3</source>
<translation>R3</translation>
</message>
<message>
<source>Options</source>
<translation>Alternativ</translation>
</message>
<message>
<source>Mouse Movement Parameters</source>
<translation>Parametrar för musrörelse</translation>
</message>
<message>
<source>note: click Help Button/Special Keybindings for more information</source>
<translation>observera: klicka Hjälp-knapp/Speciella tangentbindningar för mer information</translation>
</message>
<message>
<source>Face Buttons</source>
<translation>Handlingsknappar</translation>
</message>
<message>
<source>Triangle</source>
<translation>Triangel</translation>
</message>
<message>
<source>Square</source>
<translation>Fyrkant</translation>
</message>
<message>
<source>Circle</source>
<translation>Cirkel</translation>
</message>
<message>
<source>Cross</source>
<translation>Kryss</translation>
</message>
<message>
<source>Right Analog Halfmode</source>
<translation>Halvläge för höger analog</translation>
</message>
<message>
<source>hold to move right stick at half-speed</source>
<translation>håll ner för att flytta höger spak i halvfart</translation>
</message>
<message>
<source>Right Stick</source>
<translation>Höger spak</translation>
</message>
<message>
<source>Speed Offset (def 0.125):</source>
<translation>Offset för hastighet (standard 0.125):</translation>
</message>
<message>
<source>Copy from Common Config</source>
<translation>Kopiera från gemensam konfiguration</translation>
</message>
<message>
<source>Deadzone Offset (def 0.50):</source>
<translation>Offset för dödläge (standard 0.50):</translation>
</message>
<message>
<source>Speed Multiplier (def 1.0):</source>
<translation>Hastighetsmultiplikator (standard 1.0):</translation>
</message>
<message>
<source>Common Config Selected</source>
<translation>Gemensam konfiguration valdes</translation>
</message>
<message>
<source>This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</source>
<translation>Den här knappen kopierar mappningar från gemensam konfiguration till den aktuella valda profilen och kan inte användas när den aktuella valda profilen är gemensam konfiguration.</translation>
</message>
<message>
<source>Copy values from Common Config</source>
<translation>Kopiera värden från gemensam konfiguration</translation>
</message>
<message>
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
<translation>Vill du skriva över befintliga mappningar med mappningarna från gemensam konfiguration?</translation>
</message>
<message>
<source>Unable to Save</source>
<translation>Kunde inte spara</translation>
</message>
<message>
<source>Cannot bind any unique input more than once</source>
<translation>Kan inte binda någon unik inmatning fler än en gång</translation>
</message>
<message>
<source>Press a key</source>
<translation>Tryck en tangent</translation>
</message>
<message>
<source>Cannot set mapping</source>
<translation>Kan inte ställa in mappning</translation>
</message>
<message>
<source>Mousewheel cannot be mapped to stick outputs</source>
<translation>Mushjulet kan inte mappas till spakutmatningar</translation>
</message>
<message>
<source>Save</source>
<translation>Spara</translation>
</message>
<message>
<source>Apply</source>
<translation>Tillämpa</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation>Återställ till standard</translation>
</message>
<message>
<source>Cancel</source>
<translation>Avbryt</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
@ -1311,6 +1632,10 @@
<source>Trophy</source>
<translation>Troféer</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder</source>
<translation>Öppna mappen för anpassade trofébilder/ljud</translation>
</message>
<message>
<source>Logger</source>
<translation>Loggning</translation>
@ -1476,8 +1801,8 @@
<translation>Titelmusik</translation>
</message>
<message>
<source>Disable Trophy Pop-ups</source>
<translation>Inaktivera popup för troféer</translation>
<source>Disable Trophy Notification</source>
<translation>Inaktivera troféaviseringar</translation>
</message>
<message>
<source>Background Image</source>
@ -1765,43 +2090,99 @@
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
<translation>Video</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
<translation>Visningsläge</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
<translation>Fönster</translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation>
<translation>Helskärm</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation>
<translation>Helskärm (kantlöst)</translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished">Window Size</translation>
<translation>Fönsterstorlek</translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished">W:</translation>
<translation>B:</translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished">H:</translation>
<translation>H:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished">Separate Log Files</translation>
<translation>Separata loggfiler</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
<translation>Separata loggfiler:\nSkriver en separat loggfil för varje spel.</translation>
</message>
<message>
<source>Trophy Notification Position</source>
<translation>Aviseringsposition för trofé</translation>
</message>
<message>
<source>Left</source>
<translation>Vänster</translation>
</message>
<message>
<source>Right</source>
<translation>Höger</translation>
</message>
<message>
<source>Top</source>
<translation>Överst</translation>
</message>
<message>
<source>Bottom</source>
<translation>Nederst</translation>
</message>
<message>
<source>Notification Duration</source>
<translation>Varaktighet för avisering</translation>
</message>
<message>
<source>Portable User Folder</source>
<translation>Portabel användarmapp</translation>
</message>
<message>
<source>Create Portable User Folder from Common User Folder</source>
<translation>Skapa portabel användarmapp från gemensam användarmapp</translation>
</message>
<message>
<source>Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</source>
<translation>Portabel användarmapp:\nLagrar shadPS4-inställningar och data som endast tillämpas den shadPS4-version som finns i den aktuella mappen. Starta om appen efter att du har skapat den portabla användarmappen för att börja använda den.</translation>
</message>
<message>
<source>Cannot create portable user folder</source>
<translation>Kan inte skapa portabel användarmapp</translation>
</message>
<message>
<source>%1 already exists</source>
<translation>%1 finns redan</translation>
</message>
<message>
<source>Portable user folder created</source>
<translation>Portabel användarmapp skapad</translation>
</message>
<message>
<source>%1 successfully created.</source>
<translation>%1 skapades.</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</source>
<translation>Öppna mappen för anpassade trofébilder/ljud:\nDu kan lägga till egna bilder till troféerna och ett ljud.\nLägg till filerna i custom_trophy med följande namn:\ntrophy.wav ELLER trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nObservera: Ljudet fungerar endast i QT-versioner.</translation>
</message>
</context>
<context>
@ -1810,5 +2191,21 @@
<source>Trophy Viewer</source>
<translation>Trofé-visare</translation>
</message>
<message>
<source>Progress</source>
<translation>Förlopp</translation>
</message>
<message>
<source>Show Earned Trophies</source>
<translation>Visa förtjänade troféer</translation>
</message>
<message>
<source>Show Not Earned Trophies</source>
<translation>Visa icke-förtjänade troféer</translation>
</message>
<message>
<source>Show Hidden Trophies</source>
<translation>Visa dolda troféer</translation>
</message>
</context>
</TS>

View File

@ -26,11 +26,11 @@
</message>
<message>
<source>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:\n</source>
<translation>Cheats/Patches deneysel niteliktedir.\nDikkatli kullanın.\n\nCheat&apos;leri ayrı ayrı indirerek, depo seçerek ve indirme düğmesine tıklayarak indirin.\nPatches sekmesinde tüm patch&apos;leri bir kerede indirebilir, hangi patch&apos;leri kullanmak istediğinizi seçebilir ve seçiminizi kaydedebilirsiniz.\n\nCheats/Patches&apos;i geliştirmediğimiz için,\nproblemleri cheat yazarına bildirin.\n\nYeni bir cheat mi oluşturduğunuz? Şu adresi ziyaret edin:\n</translation>
<translation>Hileler/Yamalar deneysel özelliklerdir.\nDikkatli kullanın.\n\nHileleri depo seçerek ve indirme düğmesine tıklayarak ayrı ayrı indirin.\nYamalar sekmesinde tüm yamaları tek seferde indirebilir, hangi yamaları kullanmak istediğinizi seçebilir ve seçiminizi kaydedebilirsiniz.\n\nHileleri ve yamaları biz geliştirmediğimiz için\nsorunlarınızı hile geliştiricisine bildirin.\n\nYeni bir hile oluşturduysanız şu adresi ziyaret edin:\n</translation>
</message>
<message>
<source>No Image Available</source>
<translation>Görüntü Mevcut Değil</translation>
<translation>Kaynak Mevcut Değil</translation>
</message>
<message>
<source>Serial: </source>
@ -70,7 +70,7 @@
</message>
<message>
<source>Do you want to delete the selected file?\n%1</source>
<translation>Seçilen dosyayı silmek istiyor musunuz?\n%1</translation>
<translation>Seçili dosyayı silmek istiyor musunuz?\n%1</translation>
</message>
<message>
<source>Select Patch File:</source>
@ -122,7 +122,7 @@
</message>
<message>
<source>Success</source>
<translation>Başarı</translation>
<translation>Başarılı</translation>
</message>
<message>
<source>Options saved successfully.</source>
@ -138,11 +138,11 @@
</message>
<message>
<source>File Exists</source>
<translation>Dosya Var</translation>
<translation>Dosya mevcut</translation>
</message>
<message>
<source>File already exists. Do you want to replace it?</source>
<translation>Dosya zaten var. Üzerine yazmak ister misiniz?</translation>
<translation>Dosya zaten mevcut. Var olan dosyayı değiştirmek istiyor musunuz?</translation>
</message>
<message>
<source>Failed to save file:</source>
@ -431,7 +431,7 @@
</message>
<message>
<source>Left Stick Deadzone (def:2 max:127)</source>
<translation>Sol Analog Ö Bölgesi (şu an:2, en çok:127)</translation>
<translation>Sol Analog Ö Bölgesi (varsayılan: 2, en çok: 127)</translation>
</message>
<message>
<source>Left Deadzone</source>
@ -447,11 +447,11 @@
</message>
<message>
<source>Common Config</source>
<translation>Genel Yapılandırma</translation>
<translation>Ortak Yapılandırma</translation>
</message>
<message>
<source>Use per-game configs</source>
<translation>Oyuna özel yapılandırmaları kullan</translation>
<translation>Oyuna özel yapılandırma kullan</translation>
</message>
<message>
<source>L1 / LB</source>
@ -507,7 +507,7 @@
</message>
<message>
<source>Right Stick Deadzone (def:2, max:127)</source>
<translation>Sağ Analog Ö Bölgesi (şu an:2, en çok:127)</translation>
<translation>Sağ Analog Ö Bölgesi (varsayılan: 2, en çok: 127)</translation>
</message>
<message>
<source>Right Deadzone</source>
@ -541,6 +541,77 @@
<source>Override Color</source>
<translation>Rengi Geçersiz Kıl</translation>
</message>
<message>
<source>Unable to Save</source>
<translation>Kaydedilemedi</translation>
</message>
<message>
<source>Cannot bind axis values more than once</source>
<translation>Eksen değerleri birden fazla kez bağlanamaz</translation>
</message>
<message>
<source>Save</source>
<translation>Kaydet</translation>
</message>
<message>
<source>Apply</source>
<translation>Uygula</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation>Varsayılanlara Sıfırla</translation>
</message>
<message>
<source>Cancel</source>
<translation>İptal</translation>
</message>
</context>
<context>
<name>EditorDialog</name>
<message>
<source>Edit Keyboard + Mouse and Controller input bindings</source>
<translation>Klavye + Fare ve Kontrolcü tuş atamalarını düzenle</translation>
</message>
<message>
<source>Use Per-Game configs</source>
<translation>Oyuna özel yapılandırma kullan</translation>
</message>
<message>
<source>Error</source>
<translation>Hata</translation>
</message>
<message>
<source>Could not open the file for reading</source>
<translation>Dosya okumak için ılamadı</translation>
</message>
<message>
<source>Could not open the file for writing</source>
<translation>Dosya yazmak için ılamadı</translation>
</message>
<message>
<source>Save Changes</source>
<translation>Değişiklikleri Kaydet</translation>
</message>
<message>
<source>Do you want to save changes?</source>
<translation>Değişiklikleri kaydetmek istiyor musunuz?</translation>
</message>
<message>
<source>Help</source>
<translation>Yardım</translation>
</message>
<message>
<source>Do you want to reset your custom default config to the original default config?</source>
<translation>Özel varsayılan yapılandırmanızı, orijinal varsayılan yapılandırmaya sıfırlamak istiyor musunuz?</translation>
</message>
<message>
<source>Do you want to reset this config to your custom default config?</source>
<translation>Bu yapılandırmayı özel varsayılan yapılandırmanıza sıfırlamak istiyor musunuz?</translation>
</message>
<message>
<source>Reset to Default</source>
<translation>Varsayılanlara Sıfırla</translation>
</message>
</context>
<context>
<name>ElfViewer</name>
@ -584,7 +655,7 @@
</message>
<message>
<source>Directory to install DLC</source>
<translation>İndirilebilir içeriğin yükleneceği dizin</translation>
<translation>DLC'lerin yükleneceği dizin</translation>
</message>
</context>
<context>
@ -773,7 +844,11 @@
</message>
<message>
<source>Delete DLC</source>
<translation>İndirilebilir İçeriği Sil</translation>
<translation>DLC'yi Sil</translation>
</message>
<message>
<source>Delete Trophy</source>
<translation>Kupayı Sil</translation>
</message>
<message>
<source>Compatibility...</source>
@ -825,11 +900,11 @@
</message>
<message>
<source>This game has no DLC to delete!</source>
<translation>Bu oyunun silinecek indirilebilir içeriği yok!</translation>
<translation>Bu oyunun silinecek DLC'si yok!</translation>
</message>
<message>
<source>DLC</source>
<translation>İndirilebilir İçerik</translation>
<translation>DLC</translation>
</message>
<message>
<source>Delete %1</source>
@ -851,6 +926,10 @@
<source>This game has no update folder to open!</source>
<translation>Bu oyunun ılacak güncelleme klasörü yok!</translation>
</message>
<message>
<source>No log file found for this game!</source>
<translation>Bu oyun için günlük dosyası bulunamadı!</translation>
</message>
<message>
<source>Failed to convert icon.</source>
<translation>Simge dönüştürülemedi.</translation>
@ -859,15 +938,46 @@
<source>This game has no save data to delete!</source>
<translation>Bu oyunun silinecek kayıt verisi yok!</translation>
</message>
<message>
<source>This game has no saved trophies to delete!</source>
<translation>Bu oyunun silinecek kupası yok!</translation>
</message>
<message>
<source>Save Data</source>
<translation>Kayıt Verisi</translation>
</message>
<message>
<source>Trophy</source>
<translation>Kupa</translation>
</message>
<message>
<source>SFO Viewer for </source>
<translation>SFO Görüntüleyici: </translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>Quickstart</source>
<translation>Hızlı Başlangıç</translation>
</message>
<message>
<source>FAQ</source>
<translation>SSS</translation>
</message>
<message>
<source>Syntax</source>
<translation>Sözdizimi</translation>
</message>
<message>
<source>Special Bindings</source>
<translation>Özel Atamalar</translation>
</message>
<message>
<source>Keybindings</source>
<translation>Tuş Atamaları</translation>
</message>
</context>
<context>
<name>InstallDirSelect</name>
<message>
@ -887,11 +997,222 @@
<translation>Yüklemede PKG Dosyasını Sil</translation>
</message>
</context>
<context>
<name>KBMSettings</name>
<message>
<source>Configure Controls</source>
<translation>Kontrolleri Yapılandır</translation>
</message>
<message>
<source>D-Pad</source>
<translation>Yön Düğmeleri</translation>
</message>
<message>
<source>Up</source>
<translation>Yukarı</translation>
</message>
<message>
<source>unmapped</source>
<translation>atanmamış</translation>
</message>
<message>
<source>Left</source>
<translation>Sol</translation>
</message>
<message>
<source>Right</source>
<translation>Sağ</translation>
</message>
<message>
<source>Down</source>
<translation>Aşağı</translation>
</message>
<message>
<source>Left Analog Halfmode</source>
<translation>Sol Analog Yarı Modu</translation>
</message>
<message>
<source>hold to move left stick at half-speed</source>
<translation>sol analogu yarı hızda hareket ettirmek için basılı tutun</translation>
</message>
<message>
<source>Left Stick</source>
<translation>Sol Analog</translation>
</message>
<message>
<source>Config Selection</source>
<translation>Yapılandırma Seçimi</translation>
</message>
<message>
<source>Common Config</source>
<translation>Ortak Yapılandırma</translation>
</message>
<message>
<source>Use per-game configs</source>
<translation>Oyuna özel yapılandırma kullan</translation>
</message>
<message>
<source>L1</source>
<translation>L1</translation>
</message>
<message>
<source>L2</source>
<translation>L2</translation>
</message>
<message>
<source>Text Editor</source>
<translation>Metin Düzenleyici</translation>
</message>
<message>
<source>Help</source>
<translation>Yardım</translation>
</message>
<message>
<source>R1</source>
<translation>R1</translation>
</message>
<message>
<source>R2</source>
<translation>R2</translation>
</message>
<message>
<source>L3</source>
<translation>L3</translation>
</message>
<message>
<source>Touchpad Click</source>
<translation>Dokunmatik Yüzey Tıklaması</translation>
</message>
<message>
<source>Mouse to Joystick</source>
<translation>Mouse'dan Kontrolcü</translation>
</message>
<message>
<source>*press F7 ingame to activate</source>
<translation>*Etkinleştirmek için oyundayken F7'ye basın</translation>
</message>
<message>
<source>R3</source>
<translation>R3</translation>
</message>
<message>
<source>Options</source>
<translation>Seçenekler</translation>
</message>
<message>
<source>Mouse Movement Parameters</source>
<translation>Mouse Hızı Değişkenleri</translation>
</message>
<message>
<source>note: click Help Button/Special Keybindings for more information</source>
<translation>Not: Daha fazla bilgi için Yardım ya da Özel Atamalar'a tıklayın</translation>
</message>
<message>
<source>Face Buttons</source>
<translation>Eylem Düğmeleri</translation>
</message>
<message>
<source>Triangle</source>
<translation>Üçgen</translation>
</message>
<message>
<source>Square</source>
<translation>Kare</translation>
</message>
<message>
<source>Circle</source>
<translation>Daire</translation>
</message>
<message>
<source>Cross</source>
<translation>Çarpı</translation>
</message>
<message>
<source>Right Analog Halfmode</source>
<translation>Sağ Analog Yarı Modu</translation>
</message>
<message>
<source>hold to move right stick at half-speed</source>
<translation>sağ analogu yarı hızda hareket ettirmek için basılı tutun</translation>
</message>
<message>
<source>Right Stick</source>
<translation>Sağ Analog</translation>
</message>
<message>
<source>Speed Offset (def 0.125):</source>
<translation>Hız Sapması (varsayılan 0.125):</translation>
</message>
<message>
<source>Copy from Common Config</source>
<translation>Ortak Yapılandırmadan Kopyala</translation>
</message>
<message>
<source>Deadzone Offset (def 0.50):</source>
<translation>Ö Bölge Sapması (varsayılan 0.50):</translation>
</message>
<message>
<source>Speed Multiplier (def 1.0):</source>
<translation>Hız Çarpanı (varsayılan 1.0):</translation>
</message>
<message>
<source>Common Config Selected</source>
<translation>Ortak Yapılandırma Seçildi</translation>
</message>
<message>
<source>This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</source>
<translation>Bu tuş, Ortak Yapılandırma'daki atamaları seçili profile kopyalar ve seçili profil Ortak Yapılandırma ise kullanılamaz.</translation>
</message>
<message>
<source>Copy values from Common Config</source>
<translation>Ortak Yapılandırmadan Değerleri Kopyala</translation>
</message>
<message>
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
<translation>Mevcut atamaların üzerine ortak yapılandırmadaki atamaları yazmak istiyor musunuz?</translation>
</message>
<message>
<source>Unable to Save</source>
<translation>Kaydedilemedi</translation>
</message>
<message>
<source>Cannot bind any unique input more than once</source>
<translation>Herhangi bir benzersiz girdi birden fazla kez bağlanamaz</translation>
</message>
<message>
<source>Press a key</source>
<translation>Bir tuşa basın</translation>
</message>
<message>
<source>Cannot set mapping</source>
<translation>Atama ayarlanamıyor</translation>
</message>
<message>
<source>Mousewheel cannot be mapped to stick outputs</source>
<translation>Mouse tekerleği analog çıkışlarına atanamaz</translation>
</message>
<message>
<source>Save</source>
<translation>Kaydet</translation>
</message>
<message>
<source>Apply</source>
<translation>Uygula</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation>Varsayılanlara Sıfırla</translation>
</message>
<message>
<source>Cancel</source>
<translation>İptal</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<source>Open/Add Elf Folder</source>
<translation>Elf Klasörünü /Ekle</translation>
<translation>Elf Klasörü /Ekle</translation>
</message>
<message>
<source>Install Packages (PKG)</source>
@ -947,11 +1268,11 @@
</message>
<message>
<source>Tiny</source>
<translation>Küçük</translation>
<translation>Minik</translation>
</message>
<message>
<source>Small</source>
<translation>Ufak</translation>
<translation>Küçük</translation>
</message>
<message>
<source>Medium</source>
@ -1175,7 +1496,7 @@
</message>
<message>
<source>PKG is a patch or DLC, please install the game first!</source>
<translation>PKG bir yama ya da indirilebilir içerik, lütfen önce oyunu yükleyin!</translation>
<translation>PKG bir yama ya da DLC, lütfen önce oyunu yükleyin!</translation>
</message>
<message>
<source>Game is already running!</source>
@ -1311,6 +1632,10 @@
<source>Trophy</source>
<translation>Kupa</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder</source>
<translation>Özel kupa görüntüleri/sesleri klasörünü </translation>
</message>
<message>
<source>Logger</source>
<translation>Kayıt Tutucu</translation>
@ -1385,11 +1710,11 @@
</message>
<message>
<source>Enable NULL GPU</source>
<translation>NULL GPU&apos;yu Etkinleştir</translation>
<translation>NULL GPU'yu Etkinleştir</translation>
</message>
<message>
<source>Enable HDR</source>
<translation>HDR'yi Etkinleştir</translation>
<translation>HDR</translation>
</message>
<message>
<source>Paths</source>
@ -1476,8 +1801,8 @@
<translation>Oyun Müziği</translation>
</message>
<message>
<source>Disable Trophy Pop-ups</source>
<translation>Kupa ılır Pencerelerini Devre Dışı Bırak</translation>
<source>Disable Trophy Notification</source>
<translation>Kupa Bildirimini Devre Dışı Bırak</translation>
</message>
<message>
<source>Background Image</source>
@ -1533,7 +1858,7 @@
</message>
<message>
<source>Point your mouse at an option to display its description.</source>
<translation>Seçenek üzerinde farenizi tutarak ıklamasını görüntüleyin.</translation>
<translation>ıklamasını görüntülemek için mouse'unuzu bir seçeneğin üzerine getirin.</translation>
</message>
<message>
<source>Console Language:\nSets the language that the PS4 game uses.\nIt&apos;s recommended to set this to a language the game supports, which will vary by region.</source>
@ -1593,7 +1918,7 @@
</message>
<message>
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>Hareket etmeden sonra imlecin kaybolacağı süreyi ayarlayın.</translation>
<translation>İmleç İçin Hareketsizlik Zaman ımı:\nBoşta kalan imlecin kendini kaç saniye sonra gizleyeceğidir.</translation>
</message>
<message>
<source>Back Button Behavior:\nSets the controller&apos;s back button to emulate tapping the specified position on the PS4 touchpad.</source>
@ -1661,7 +1986,7 @@
</message>
<message>
<source>Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format.</source>
<translation type="unfinished">Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format.</translation>
<translation>HDR'yi Etkinleştir:\nDestekleyen oyunlarda HDR'yi etkinleştirir.\nMonitörünüz, BT2020 PQ renk alanını ve RGB10A2 takas zinciri biçimini desteklemelidir.</translation>
</message>
<message>
<source>Game Folders:\nThe list of folders to check for installed games.</source>
@ -1697,7 +2022,7 @@
</message>
<message>
<source>Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging &apos;Device lost&apos; errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work.</source>
<translation type="unfinished">Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging &apos;Device lost&apos; errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work.</translation>
<translation>Çökme Tanılamaları:\nÇökme anındaki Vulkan durumu hakkında bilgi içeren bir .yaml dosyası oluşturur.\n&apos;Cihaz kayıp&apos; hatalarını ayıklamak için kullanışlıdır. Bunu etkinleştirdiyseniz, Ana Bilgisayar ve Konuk Hata Ayıklama İşaretleyicileri'ni etkinleştirmelisiniz.\nIntel GPU'lar üzerinde çalışmaz.\nÇalışabilmesi için Vulkan Doğrulama Katmanları'nın etkinleştirilmesine ve Vulkan SDK'sine ihtiyacınız vardır.</translation>
</message>
<message>
<source>Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes.</source>
@ -1705,7 +2030,7 @@
</message>
<message>
<source>Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc.</source>
<translation type="unfinished">Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc.</translation>
<translation>Ana Bilgisayar Hata Ayıklama Göstergeleri:\nVulkan komutlarının etrafına belirli AMDGPU komutları için göstergeler gibi emülatör tarafı bilgileri ekler ve kaynaklara hata ayıklama adları verir.\nBunu etkinleştirdiyseniz, Çökme Tanılamaları'nı etkinleştirmelisiniz.\nRenderDoc gibi programlar için faydalıdır.</translation>
</message>
<message>
<source>Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc.</source>
@ -1765,15 +2090,15 @@
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
<translation>Görüntü</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
<translation>Görüntü Modu</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
<translation>Pencereli</translation>
</message>
<message>
<source>Fullscreen</source>
@ -1803,6 +2128,62 @@
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation>Ayrı Günlük Dosyaları:\nHer oyun için ayrı bir günlük dosyası yazar.</translation>
</message>
<message>
<source>Trophy Notification Position</source>
<translation>Kupa Bildirim Konumu</translation>
</message>
<message>
<source>Left</source>
<translation>Sol</translation>
</message>
<message>
<source>Right</source>
<translation>Sağ</translation>
</message>
<message>
<source>Top</source>
<translation>Üst</translation>
</message>
<message>
<source>Bottom</source>
<translation>Alt</translation>
</message>
<message>
<source>Notification Duration</source>
<translation>Bildirim Süresi</translation>
</message>
<message>
<source>Portable User Folder</source>
<translation>Taşınabilir Kullanıcı Klasörü</translation>
</message>
<message>
<source>Create Portable User Folder from Common User Folder</source>
<translation>Ortak Kullanıcı Klasöründen Taşınabilir Kullanıcı Klasörü Oluştur</translation>
</message>
<message>
<source>Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</source>
<translation>Taşınabilir kullanıcı klasörü:\nYalnızca geçerli klasörde bulunan shadPS4 derlemesine uygulanacak shadPS4 ayarlarını ve verilerini depolar. Kullanmaya başlamak için taşınabilir kullanıcı klasörünü oluşturduktan sonra uygulamayı yeniden başlatın.</translation>
</message>
<message>
<source>Cannot create portable user folder</source>
<translation>Taşınabilir kullanıcı klasörü oluşturulamıyor</translation>
</message>
<message>
<source>%1 already exists</source>
<translation>%1 zaten mevcut</translation>
</message>
<message>
<source>Portable user folder created</source>
<translation>Taşınabilir kullanıcı klasörü oluşturuldu</translation>
</message>
<message>
<source>%1 successfully created.</source>
<translation>%1 başarıyla oluşturuldu.</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</source>
<translation>Özel kupa görüntüleri/sesleri klasörünü :\nKupalara özel görüntüler ve sesler ekleyebilirsiniz.\nDosyaları aşağıdaki adlarla custom_trophy'ye ekleyin:\ntrophy.wav ya da trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNot: Ses yalnızca QT sürümlerinde çalışacaktır.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>
@ -1810,5 +2191,21 @@
<source>Trophy Viewer</source>
<translation>Kupa Görüntüleyici</translation>
</message>
<message>
<source>Progress</source>
<translation>İlerleme</translation>
</message>
<message>
<source>Show Earned Trophies</source>
<translation>Kazanılmış Kupaları Göster</translation>
</message>
<message>
<source>Show Not Earned Trophies</source>
<translation>Kazanılmamış Kupaları Göster</translation>
</message>
<message>
<source>Show Hidden Trophies</source>
<translation>Gizli Kupaları Göster</translation>
</message>
</context>
</TS>

View File

@ -407,139 +407,210 @@
<name>ControlSettings</name>
<message>
<source>Configure Controls</source>
<translation type="unfinished">Configure Controls</translation>
<translation>Налаштування елементів керування</translation>
</message>
<message>
<source>D-Pad</source>
<translation type="unfinished">D-Pad</translation>
<translation>Хрестовина</translation>
</message>
<message>
<source>Up</source>
<translation type="unfinished">Up</translation>
<translation>Вгору</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
<translation>Ліворуч</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
<translation>Праворуч</translation>
</message>
<message>
<source>Down</source>
<translation type="unfinished">Down</translation>
<translation>Вниз</translation>
</message>
<message>
<source>Left Stick Deadzone (def:2 max:127)</source>
<translation type="unfinished">Left Stick Deadzone (def:2 max:127)</translation>
<translation>Мертва зона лівого стику (за замов.: 2, максимум: 127)</translation>
</message>
<message>
<source>Left Deadzone</source>
<translation type="unfinished">Left Deadzone</translation>
<translation>Ліва мертва зона</translation>
</message>
<message>
<source>Left Stick</source>
<translation type="unfinished">Left Stick</translation>
<translation>Лівий стік</translation>
</message>
<message>
<source>Config Selection</source>
<translation type="unfinished">Config Selection</translation>
<translation>Вибір конфігурації</translation>
</message>
<message>
<source>Common Config</source>
<translation type="unfinished">Common Config</translation>
<translation>Загальна конфігурація</translation>
</message>
<message>
<source>Use per-game configs</source>
<translation type="unfinished">Use per-game configs</translation>
<translation>Використовувати ігрові конфігурації</translation>
</message>
<message>
<source>L1 / LB</source>
<translation type="unfinished">L1 / LB</translation>
<translation>L1 / Лівий Бампер</translation>
</message>
<message>
<source>L2 / LT</source>
<translation type="unfinished">L2 / LT</translation>
<translation>L2 / Лівий Тригер</translation>
</message>
<message>
<source>Back</source>
<translation type="unfinished">Back</translation>
<translation>Назад</translation>
</message>
<message>
<source>R1 / RB</source>
<translation type="unfinished">R1 / RB</translation>
<translation>R1 / Правий Бампер</translation>
</message>
<message>
<source>R2 / RT</source>
<translation type="unfinished">R2 / RT</translation>
<translation>R2 / Правий Тригер</translation>
</message>
<message>
<source>L3</source>
<translation type="unfinished">L3</translation>
<translation>Кнопка лівого стику</translation>
</message>
<message>
<source>Options / Start</source>
<translation type="unfinished">Options / Start</translation>
<translation>Опції / Старт</translation>
</message>
<message>
<source>R3</source>
<translation type="unfinished">R3</translation>
<translation>Кнопка правого стику</translation>
</message>
<message>
<source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation>
<translation>Лицьові кнопки</translation>
</message>
<message>
<source>Triangle / Y</source>
<translation type="unfinished">Triangle / Y</translation>
<translation>Трикутник / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation type="unfinished">Square / X</translation>
<translation>Квадрат / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation type="unfinished">Circle / B</translation>
<translation>Коло / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation type="unfinished">Cross / A</translation>
<translation>Хрест / A</translation>
</message>
<message>
<source>Right Stick Deadzone (def:2, max:127)</source>
<translation type="unfinished">Right Stick Deadzone (def:2, max:127)</translation>
<translation>Мертва зона правого стику (за замов.: 2, максимум: 127)</translation>
</message>
<message>
<source>Right Deadzone</source>
<translation type="unfinished">Right Deadzone</translation>
<translation>Права мертва зона</translation>
</message>
<message>
<source>Right Stick</source>
<translation type="unfinished">Right Stick</translation>
<translation>Правий стик</translation>
</message>
<message>
<source>Color Adjustment</source>
<translation type="unfinished">Color Adjustment</translation>
<translation>Налаштування Кольору</translation>
</message>
<message>
<source>R:</source>
<translation type="unfinished">R:</translation>
<translation>R:</translation>
</message>
<message>
<source>G:</source>
<translation type="unfinished">G:</translation>
<translation>G:</translation>
</message>
<message>
<source>B:</source>
<translation type="unfinished">B:</translation>
<translation>B:</translation>
</message>
<message>
<source>Override Lightbar Color</source>
<translation type="unfinished">Override Lightbar Color</translation>
<translation>Змінити колір підсвітки</translation>
</message>
<message>
<source>Override Color</source>
<translation type="unfinished">Override Color</translation>
<translation>Змінити колір</translation>
</message>
<message>
<source>Unable to Save</source>
<translation>Не вдалося зберегти</translation>
</message>
<message>
<source>Cannot bind axis values more than once</source>
<translation>Неможливо пере назначити кнопку більше одного разу</translation>
</message>
<message>
<source>Save</source>
<translation>Зберегти</translation>
</message>
<message>
<source>Apply</source>
<translation>Застосувати</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation>За замовчуванням</translation>
</message>
<message>
<source>Cancel</source>
<translation>Відмінити</translation>
</message>
</context>
<context>
<name>EditorDialog</name>
<message>
<source>Edit Keyboard + Mouse and Controller input bindings</source>
<translation>Налаштування клавіатури, миші та перевизначення кнопок контролеру</translation>
</message>
<message>
<source>Use Per-Game configs</source>
<translation>Використовувати ігрові конфігурації</translation>
</message>
<message>
<source>Error</source>
<translation>Помилка</translation>
</message>
<message>
<source>Could not open the file for reading</source>
<translation>Не вдалося відкрити файл для читання</translation>
</message>
<message>
<source>Could not open the file for writing</source>
<translation>Не вдалось відкрити файл для запису</translation>
</message>
<message>
<source>Save Changes</source>
<translation>Зберегти зміни</translation>
</message>
<message>
<source>Do you want to save changes?</source>
<translation>Бажаєте зберегти зміни?</translation>
</message>
<message>
<source>Help</source>
<translation>Допомога</translation>
</message>
<message>
<source>Do you want to reset your custom default config to the original default config?</source>
<translation>Ви бажаєте скинути ваші налаштування за замовчуванням до початкової конфігурації?</translation>
</message>
<message>
<source>Do you want to reset this config to your custom default config?</source>
<translation>Ви бажаєте скинути ці налаштування до вашої конфігурації за замовчуванням?</translation>
</message>
<message>
<source>Reset to Default</source>
<translation>Відновити налаштування за замовчанням</translation>
</message>
</context>
<context>
@ -584,7 +655,7 @@
</message>
<message>
<source>Directory to install DLC</source>
<translation type="unfinished">Directory to install DLC</translation>
<translation>Папка для встановлення DLC</translation>
</message>
</context>
<context>
@ -775,6 +846,10 @@
<source>Delete DLC</source>
<translation>Видалити DLC</translation>
</message>
<message>
<source>Delete Trophy</source>
<translation>Видалити трофей</translation>
</message>
<message>
<source>Compatibility...</source>
<translation>Сумісність...</translation>
@ -829,7 +904,7 @@
</message>
<message>
<source>DLC</source>
<translation type="unfinished">DLC</translation>
<translation>DLC</translation>
</message>
<message>
<source>Delete %1</source>
@ -851,21 +926,56 @@
<source>This game has no update folder to open!</source>
<translation>Ця гра не має папки оновленнь, щоб відкрити її!</translation>
</message>
<message>
<source>No log file found for this game!</source>
<translation>Файл звіту для цієї гри не знайдено!</translation>
</message>
<message>
<source>Failed to convert icon.</source>
<translation type="unfinished">Failed to convert icon.</translation>
<translation>Не вдалося конвертувати значок.</translation>
</message>
<message>
<source>This game has no save data to delete!</source>
<translation>Ця гра не містить збережень, які можна видалити!</translation>
</message>
<message>
<source>This game has no saved trophies to delete!</source>
<translation>Ця гра немає збережених трофеїв для видалення!</translation>
</message>
<message>
<source>Save Data</source>
<translation>Збереження</translation>
</message>
<message>
<source>Trophy</source>
<translation>Трофеї</translation>
</message>
<message>
<source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation>
<translation>Перегляд SFO </translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>Quickstart</source>
<translation>Швидкий старт</translation>
</message>
<message>
<source>FAQ</source>
<translation>ЧаПи</translation>
</message>
<message>
<source>Syntax</source>
<translation>Синтаксис</translation>
</message>
<message>
<source>Special Bindings</source>
<translation>Спеціальні прив'язки</translation>
</message>
<message>
<source>Keybindings</source>
<translation>Призначення клавіш</translation>
</message>
</context>
<context>
@ -887,6 +997,217 @@
<translation>Видалити файл PKG під час встановлення</translation>
</message>
</context>
<context>
<name>KBMSettings</name>
<message>
<source>Configure Controls</source>
<translation>Налаштування елементів керування</translation>
</message>
<message>
<source>D-Pad</source>
<translation>Хрестовина</translation>
</message>
<message>
<source>Up</source>
<translation>Вгору</translation>
</message>
<message>
<source>unmapped</source>
<translation>не назначено</translation>
</message>
<message>
<source>Left</source>
<translation>Ліворуч</translation>
</message>
<message>
<source>Right</source>
<translation>Праворуч</translation>
</message>
<message>
<source>Down</source>
<translation>Вниз</translation>
</message>
<message>
<source>Left Analog Halfmode</source>
<translation>Напіврежим лівого аналогового стику</translation>
</message>
<message>
<source>hold to move left stick at half-speed</source>
<translation>утримуйте щоб рухати лівий стик в половину швидкості</translation>
</message>
<message>
<source>Left Stick</source>
<translation>Лівий стик</translation>
</message>
<message>
<source>Config Selection</source>
<translation>Вибір конфігурації</translation>
</message>
<message>
<source>Common Config</source>
<translation>Загальна конфігурація</translation>
</message>
<message>
<source>Use per-game configs</source>
<translation>Використовувати ігрові конфігурації</translation>
</message>
<message>
<source>L1</source>
<translation>L1 / Лівий Бампер</translation>
</message>
<message>
<source>L2</source>
<translation>L2 / Лівий Тригер</translation>
</message>
<message>
<source>Text Editor</source>
<translation>Текстовий редактор</translation>
</message>
<message>
<source>Help</source>
<translation>Довідка</translation>
</message>
<message>
<source>R1</source>
<translation>R1 / Правий Бампер</translation>
</message>
<message>
<source>R2</source>
<translation>R2 / Правий Тригер</translation>
</message>
<message>
<source>L3</source>
<translation>Кнопка лівого стику</translation>
</message>
<message>
<source>Touchpad Click</source>
<translation>Натискання на сенсорну панель</translation>
</message>
<message>
<source>Mouse to Joystick</source>
<translation>Миша в джойстик</translation>
</message>
<message>
<source>*press F7 ingame to activate</source>
<translation>*натисніть F7 у грі для увімкнення</translation>
</message>
<message>
<source>R3</source>
<translation>Кнопка правого стику</translation>
</message>
<message>
<source>Options</source>
<translation>Опції</translation>
</message>
<message>
<source>Mouse Movement Parameters</source>
<translation>Параметри руху миші</translation>
</message>
<message>
<source>note: click Help Button/Special Keybindings for more information</source>
<translation>замітка: натисніть кнопку Довідки/Спеціального Призначення клавіш для отримання додаткової інформації</translation>
</message>
<message>
<source>Face Buttons</source>
<translation>Лицьові кнопки</translation>
</message>
<message>
<source>Triangle</source>
<translation>Трикутник</translation>
</message>
<message>
<source>Square</source>
<translation>Квадрат</translation>
</message>
<message>
<source>Circle</source>
<translation>Коло</translation>
</message>
<message>
<source>Cross</source>
<translation>Хрест</translation>
</message>
<message>
<source>Right Analog Halfmode</source>
<translation>Напіврежим правого аналогового стику</translation>
</message>
<message>
<source>hold to move right stick at half-speed</source>
<translation>утримуйте щоб рухати правий стик в половину швидкості</translation>
</message>
<message>
<source>Right Stick</source>
<translation>Правий стик</translation>
</message>
<message>
<source>Speed Offset (def 0.125):</source>
<translation>Зміщення швидкості (замовч 0,125):</translation>
</message>
<message>
<source>Copy from Common Config</source>
<translation>Копіювати з Загальної конфігурації</translation>
</message>
<message>
<source>Deadzone Offset (def 0.50):</source>
<translation>Зміщення мертвої зони (замовч 0,50):</translation>
</message>
<message>
<source>Speed Multiplier (def 1.0):</source>
<translation>Модифікатор швидкості (замовч 1,0):</translation>
</message>
<message>
<source>Common Config Selected</source>
<translation>Вибрані Загальні налаштування</translation>
</message>
<message>
<source>This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</source>
<translation>Ця кнопка копіює перепризначення кнопок із Загальної конфігурації до поточного вибраного профілю, і не може бути використана, якщо поточний вибраний профіль є загальною конфігурацією.</translation>
</message>
<message>
<source>Copy values from Common Config</source>
<translation>Копіювати значення з Загальної конфігурації</translation>
</message>
<message>
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
<translation>Ви бажаєте перезаписати наявні перепризначення кнопок з загальної конфігурації?</translation>
</message>
<message>
<source>Unable to Save</source>
<translation>Не вдалося зберегти</translation>
</message>
<message>
<source>Cannot bind any unique input more than once</source>
<translation>Не можна прив'язати кнопку вводу більш ніж один раз</translation>
</message>
<message>
<source>Press a key</source>
<translation>Натисніть клавішу</translation>
</message>
<message>
<source>Cannot set mapping</source>
<translation>Не вдалося встановити прив'язку</translation>
</message>
<message>
<source>Mousewheel cannot be mapped to stick outputs</source>
<translation>Коліщатко миші не можна прив'язати зі значенням стиків</translation>
</message>
<message>
<source>Save</source>
<translation>Зберегти</translation>
</message>
<message>
<source>Apply</source>
<translation>Застосувати</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation>За замовчуванням</translation>
</message>
<message>
<source>Cancel</source>
<translation>Відмінити</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
@ -1163,27 +1484,27 @@
</message>
<message>
<source>Run Game</source>
<translation type="unfinished">Run Game</translation>
<translation>Запустити гру</translation>
</message>
<message>
<source>Eboot.bin file not found</source>
<translation type="unfinished">Eboot.bin file not found</translation>
<translation>Файл Boot.bin не знайдено</translation>
</message>
<message>
<source>PKG File (*.PKG *.pkg)</source>
<translation type="unfinished">PKG File (*.PKG *.pkg)</translation>
<translation>Файл PKG (*.PKG *.pkg)</translation>
</message>
<message>
<source>PKG is a patch or DLC, please install the game first!</source>
<translation type="unfinished">PKG is a patch or DLC, please install the game first!</translation>
<translation>PKG - це патч або DLC, будь ласка, спочатку встановіть гру!</translation>
</message>
<message>
<source>Game is already running!</source>
<translation type="unfinished">Game is already running!</translation>
<translation>Гра вже запущена!</translation>
</message>
<message>
<source>shadPS4</source>
<translation type="unfinished">shadPS4</translation>
<translation>shadPS4</translation>
</message>
</context>
<context>
@ -1206,7 +1527,7 @@
</message>
<message>
<source>Installed</source>
<translation type="unfinished">Installed</translation>
<translation>Встановлені</translation>
</message>
<message>
<source>Size</source>
@ -1214,19 +1535,19 @@
</message>
<message>
<source>Category</source>
<translation type="unfinished">Category</translation>
<translation>Категорія</translation>
</message>
<message>
<source>Type</source>
<translation type="unfinished">Type</translation>
<translation>Тип</translation>
</message>
<message>
<source>App Ver</source>
<translation type="unfinished">App Ver</translation>
<translation>Версія додатку</translation>
</message>
<message>
<source>FW</source>
<translation type="unfinished">FW</translation>
<translation>ПЗ</translation>
</message>
<message>
<source>Region</source>
@ -1234,7 +1555,7 @@
</message>
<message>
<source>Flags</source>
<translation type="unfinished">Flags</translation>
<translation>Мітки</translation>
</message>
<message>
<source>Path</source>
@ -1250,7 +1571,7 @@
</message>
<message>
<source>Package</source>
<translation type="unfinished">Package</translation>
<translation>Пакет</translation>
</message>
</context>
<context>
@ -1311,6 +1632,10 @@
<source>Trophy</source>
<translation>Трофеї</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder</source>
<translation>Відкрити папку користувацьких зображень трофеїв/звуків</translation>
</message>
<message>
<source>Logger</source>
<translation>Логування</translation>
@ -1389,7 +1714,7 @@
</message>
<message>
<source>Enable HDR</source>
<translation type="unfinished">Enable HDR</translation>
<translation>Увімкнути HDR</translation>
</message>
<message>
<source>Paths</source>
@ -1476,8 +1801,8 @@
<translation>Титульна музика</translation>
</message>
<message>
<source>Disable Trophy Pop-ups</source>
<translation>Вимкнути спливаючі вікна трофеїв</translation>
<source>Disable Trophy Notification</source>
<translation>Вимкнути сповіщення про отримання трофею</translation>
</message>
<message>
<source>Background Image</source>
@ -1661,7 +1986,7 @@
</message>
<message>
<source>Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format.</source>
<translation type="unfinished">Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format.</translation>
<translation>Увімкнути HDR:\nУвімкнути HDR в іграх, які його підтримують.\nВаш монітор повинен мати колірний простір BT2020 PQ та формат swapchain RGB10A2.</translation>
</message>
<message>
<source>Game Folders:\nThe list of folders to check for installed games.</source>
@ -1729,7 +2054,7 @@
</message>
<message>
<source>Set the volume of the background music.</source>
<translation type="unfinished">Set the volume of the background music.</translation>
<translation>Налаштування гучності фонової музики.</translation>
</message>
<message>
<source>Enable Motion Controls</source>
@ -1761,47 +2086,103 @@
</message>
<message>
<source>Directory to save data</source>
<translation type="unfinished">Directory to save data</translation>
<translation>Папка для збереження даних</translation>
</message>
<message>
<source>Video</source>
<translation type="unfinished">Video</translation>
<translation>Відео</translation>
</message>
<message>
<source>Display Mode</source>
<translation type="unfinished">Display Mode</translation>
<translation>Режим відображення</translation>
</message>
<message>
<source>Windowed</source>
<translation type="unfinished">Windowed</translation>
<translation>У вікні</translation>
</message>
<message>
<source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation>
<translation>Повноекранний</translation>
</message>
<message>
<source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation>
<translation>Повний екран (без рамок)</translation>
</message>
<message>
<source>Window Size</source>
<translation type="unfinished">Window Size</translation>
<translation>Розмір вікна</translation>
</message>
<message>
<source>W:</source>
<translation type="unfinished">W:</translation>
<translation>Висота:</translation>
</message>
<message>
<source>H:</source>
<translation type="unfinished">H:</translation>
<translation>Ширина:</translation>
</message>
<message>
<source>Separate Log Files</source>
<translation type="unfinished">Separate Log Files</translation>
<translation>Окремі файли журналу</translation>
</message>
<message>
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
<translation>Окремі файли журналу:\nЗаписує окремий файл журналу для кожної гри.</translation>
</message>
<message>
<source>Trophy Notification Position</source>
<translation>Розміщення сповіщень про трофеї</translation>
</message>
<message>
<source>Left</source>
<translation>Ліворуч</translation>
</message>
<message>
<source>Right</source>
<translation>Праворуч</translation>
</message>
<message>
<source>Top</source>
<translation>Вгорі</translation>
</message>
<message>
<source>Bottom</source>
<translation>Внизу</translation>
</message>
<message>
<source>Notification Duration</source>
<translation>Тривалість сповіщення</translation>
</message>
<message>
<source>Portable User Folder</source>
<translation>Портативна папка користувача</translation>
</message>
<message>
<source>Create Portable User Folder from Common User Folder</source>
<translation>Створити портативну папку користувача з загальної папки</translation>
</message>
<message>
<source>Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</source>
<translation>Портативна папка користувача:\nЗберігає налаштування та дані shadPS4, які будуть застосовані лише до збірки shadPS4, розташованої у поточній теці. Перезапустіть програму після створення портативної теки користувача, щоб почати користуватися нею.</translation>
</message>
<message>
<source>Cannot create portable user folder</source>
<translation>Не вдалося створити портативну папку користувача</translation>
</message>
<message>
<source>%1 already exists</source>
<translation>%1 вже існує</translation>
</message>
<message>
<source>Portable user folder created</source>
<translation>Портативна папка користувача створена</translation>
</message>
<message>
<source>%1 successfully created.</source>
<translation>%1 успішно створено.</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</source>
<translation>Відкрити папку користувацьких зображень трофеїв/звуків:\nВи можете додати користувацькі зображення до трофеїв та звук.\одайте файли до теки custom_trophy з такими назвами:\ntrophy.wav АБО trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\римітка: Звук буде працювати лише у версіях ShadPS4 з графічним інтерфейсом.</translation>
</message>
</context>
<context>
@ -1810,5 +2191,21 @@
<source>Trophy Viewer</source>
<translation>Трофеї</translation>
</message>
<message>
<source>Progress</source>
<translation>Прогрес</translation>
</message>
<message>
<source>Show Earned Trophies</source>
<translation>Показати отримані трофеї</translation>
</message>
<message>
<source>Show Not Earned Trophies</source>
<translation>Показати не отримані трофеї</translation>
</message>
<message>
<source>Show Hidden Trophies</source>
<translation>Показати приховані трофеї</translation>
</message>
</context>
</TS>

View File

@ -541,6 +541,77 @@
<source>Override Color</source>
<translation type="unfinished">Override Color</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind axis values more than once</source>
<translation type="unfinished">Cannot bind axis values more than once</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>EditorDialog</name>
<message>
<source>Edit Keyboard + Mouse and Controller input bindings</source>
<translation type="unfinished">Edit Keyboard + Mouse and Controller input bindings</translation>
</message>
<message>
<source>Use Per-Game configs</source>
<translation type="unfinished">Use Per-Game configs</translation>
</message>
<message>
<source>Error</source>
<translation type="unfinished">Error</translation>
</message>
<message>
<source>Could not open the file for reading</source>
<translation type="unfinished">Could not open the file for reading</translation>
</message>
<message>
<source>Could not open the file for writing</source>
<translation type="unfinished">Could not open the file for writing</translation>
</message>
<message>
<source>Save Changes</source>
<translation type="unfinished">Save Changes</translation>
</message>
<message>
<source>Do you want to save changes?</source>
<translation type="unfinished">Do you want to save changes?</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>Do you want to reset your custom default config to the original default config?</source>
<translation type="unfinished">Do you want to reset your custom default config to the original default config?</translation>
</message>
<message>
<source>Do you want to reset this config to your custom default config?</source>
<translation type="unfinished">Do you want to reset this config to your custom default config?</translation>
</message>
<message>
<source>Reset to Default</source>
<translation type="unfinished">Reset to Default</translation>
</message>
</context>
<context>
<name>ElfViewer</name>
@ -775,6 +846,10 @@
<source>Delete DLC</source>
<translation type="unfinished">Delete DLC</translation>
</message>
<message>
<source>Delete Trophy</source>
<translation type="unfinished">Delete Trophy</translation>
</message>
<message>
<source>Compatibility...</source>
<translation type="unfinished">Compatibility...</translation>
@ -851,6 +926,10 @@
<source>This game has no update folder to open!</source>
<translation type="unfinished">This game has no update folder to open!</translation>
</message>
<message>
<source>No log file found for this game!</source>
<translation type="unfinished">No log file found for this game!</translation>
</message>
<message>
<source>Failed to convert icon.</source>
<translation type="unfinished">Failed to convert icon.</translation>
@ -859,15 +938,46 @@
<source>This game has no save data to delete!</source>
<translation type="unfinished">This game has no save data to delete!</translation>
</message>
<message>
<source>This game has no saved trophies to delete!</source>
<translation type="unfinished">This game has no saved trophies to delete!</translation>
</message>
<message>
<source>Save Data</source>
<translation type="unfinished">Save Data</translation>
</message>
<message>
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>Quickstart</source>
<translation type="unfinished">Quickstart</translation>
</message>
<message>
<source>FAQ</source>
<translation type="unfinished">FAQ</translation>
</message>
<message>
<source>Syntax</source>
<translation type="unfinished">Syntax</translation>
</message>
<message>
<source>Special Bindings</source>
<translation type="unfinished">Special Bindings</translation>
</message>
<message>
<source>Keybindings</source>
<translation type="unfinished">Keybindings</translation>
</message>
</context>
<context>
<name>InstallDirSelect</name>
<message>
@ -887,6 +997,217 @@
<translation type="unfinished">Delete PKG File on Install</translation>
</message>
</context>
<context>
<name>KBMSettings</name>
<message>
<source>Configure Controls</source>
<translation type="unfinished">Configure Controls</translation>
</message>
<message>
<source>D-Pad</source>
<translation type="unfinished">D-Pad</translation>
</message>
<message>
<source>Up</source>
<translation type="unfinished">Up</translation>
</message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Down</source>
<translation type="unfinished">Down</translation>
</message>
<message>
<source>Left Analog Halfmode</source>
<translation type="unfinished">Left Analog Halfmode</translation>
</message>
<message>
<source>hold to move left stick at half-speed</source>
<translation type="unfinished">hold to move left stick at half-speed</translation>
</message>
<message>
<source>Left Stick</source>
<translation type="unfinished">Left Stick</translation>
</message>
<message>
<source>Config Selection</source>
<translation type="unfinished">Config Selection</translation>
</message>
<message>
<source>Common Config</source>
<translation type="unfinished">Common Config</translation>
</message>
<message>
<source>Use per-game configs</source>
<translation type="unfinished">Use per-game configs</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Text Editor</source>
<translation type="unfinished">Text Editor</translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished">Help</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>L3</source>
<translation type="unfinished">L3</translation>
</message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished">Touchpad Click</translation>
</message>
<message>
<source>Mouse to Joystick</source>
<translation type="unfinished">Mouse to Joystick</translation>
</message>
<message>
<source>*press F7 ingame to activate</source>
<translation type="unfinished">*press F7 ingame to activate</translation>
</message>
<message>
<source>R3</source>
<translation type="unfinished">R3</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>Mouse Movement Parameters</source>
<translation type="unfinished">Mouse Movement Parameters</translation>
</message>
<message>
<source>note: click Help Button/Special Keybindings for more information</source>
<translation type="unfinished">note: click Help Button/Special Keybindings for more information</translation>
</message>
<message>
<source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation>
</message>
<message>
<source>Triangle</source>
<translation type="unfinished">Triangle</translation>
</message>
<message>
<source>Square</source>
<translation type="unfinished">Square</translation>
</message>
<message>
<source>Circle</source>
<translation type="unfinished">Circle</translation>
</message>
<message>
<source>Cross</source>
<translation type="unfinished">Cross</translation>
</message>
<message>
<source>Right Analog Halfmode</source>
<translation type="unfinished">Right Analog Halfmode</translation>
</message>
<message>
<source>hold to move right stick at half-speed</source>
<translation type="unfinished">hold to move right stick at half-speed</translation>
</message>
<message>
<source>Right Stick</source>
<translation type="unfinished">Right Stick</translation>
</message>
<message>
<source>Speed Offset (def 0.125):</source>
<translation type="unfinished">Speed Offset (def 0.125):</translation>
</message>
<message>
<source>Copy from Common Config</source>
<translation type="unfinished">Copy from Common Config</translation>
</message>
<message>
<source>Deadzone Offset (def 0.50):</source>
<translation type="unfinished">Deadzone Offset (def 0.50):</translation>
</message>
<message>
<source>Speed Multiplier (def 1.0):</source>
<translation type="unfinished">Speed Multiplier (def 1.0):</translation>
</message>
<message>
<source>Common Config Selected</source>
<translation type="unfinished">Common Config Selected</translation>
</message>
<message>
<source>This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</source>
<translation type="unfinished">This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</translation>
</message>
<message>
<source>Copy values from Common Config</source>
<translation type="unfinished">Copy values from Common Config</translation>
</message>
<message>
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
<translation type="unfinished">Do you want to overwrite existing mappings with the mappings from the Common Config?</translation>
</message>
<message>
<source>Unable to Save</source>
<translation type="unfinished">Unable to Save</translation>
</message>
<message>
<source>Cannot bind any unique input more than once</source>
<translation type="unfinished">Cannot bind any unique input more than once</translation>
</message>
<message>
<source>Press a key</source>
<translation type="unfinished">Press a key</translation>
</message>
<message>
<source>Cannot set mapping</source>
<translation type="unfinished">Cannot set mapping</translation>
</message>
<message>
<source>Mousewheel cannot be mapped to stick outputs</source>
<translation type="unfinished">Mousewheel cannot be mapped to stick outputs</translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished">Save</translation>
</message>
<message>
<source>Apply</source>
<translation type="unfinished">Apply</translation>
</message>
<message>
<source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancel</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
@ -1311,6 +1632,10 @@
<source>Trophy</source>
<translation type="unfinished">Trophy</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder</source>
<translation type="unfinished">Open the custom trophy images/sounds folder</translation>
</message>
<message>
<source>Logger</source>
<translation type="unfinished">Logger</translation>
@ -1476,8 +1801,8 @@
<translation type="unfinished">Title Music</translation>
</message>
<message>
<source>Disable Trophy Pop-ups</source>
<translation type="unfinished">Disable Trophy Pop-ups</translation>
<source>Disable Trophy Notification</source>
<translation type="unfinished">Disable Trophy Notification</translation>
</message>
<message>
<source>Background Image</source>
@ -1803,6 +2128,62 @@
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation type="unfinished">Separate Log Files:\nWrites a separate logfile for each game.</translation>
</message>
<message>
<source>Trophy Notification Position</source>
<translation type="unfinished">Trophy Notification Position</translation>
</message>
<message>
<source>Left</source>
<translation type="unfinished">Left</translation>
</message>
<message>
<source>Right</source>
<translation type="unfinished">Right</translation>
</message>
<message>
<source>Top</source>
<translation type="unfinished">Top</translation>
</message>
<message>
<source>Bottom</source>
<translation type="unfinished">Bottom</translation>
</message>
<message>
<source>Notification Duration</source>
<translation type="unfinished">Notification Duration</translation>
</message>
<message>
<source>Portable User Folder</source>
<translation type="unfinished">Portable User Folder</translation>
</message>
<message>
<source>Create Portable User Folder from Common User Folder</source>
<translation type="unfinished">Create Portable User Folder from Common User Folder</translation>
</message>
<message>
<source>Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</source>
<translation type="unfinished">Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</translation>
</message>
<message>
<source>Cannot create portable user folder</source>
<translation type="unfinished">Cannot create portable user folder</translation>
</message>
<message>
<source>%1 already exists</source>
<translation type="unfinished">%1 already exists</translation>
</message>
<message>
<source>Portable user folder created</source>
<translation type="unfinished">Portable user folder created</translation>
</message>
<message>
<source>%1 successfully created.</source>
<translation type="unfinished">%1 successfully created.</translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</source>
<translation type="unfinished">Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>
@ -1810,5 +2191,21 @@
<source>Trophy Viewer</source>
<translation>Trình xem chiến tích</translation>
</message>
<message>
<source>Progress</source>
<translation type="unfinished">Progress</translation>
</message>
<message>
<source>Show Earned Trophies</source>
<translation type="unfinished">Show Earned Trophies</translation>
</message>
<message>
<source>Show Not Earned Trophies</source>
<translation type="unfinished">Show Not Earned Trophies</translation>
</message>
<message>
<source>Show Hidden Trophies</source>
<translation type="unfinished">Show Hidden Trophies</translation>
</message>
</context>
</TS>

View File

@ -411,7 +411,7 @@
</message>
<message>
<source>D-Pad</source>
<translation>D-Pad</translation>
<translation></translation>
</message>
<message>
<source>Up</source>
@ -487,23 +487,23 @@
</message>
<message>
<source>Face Buttons</source>
<translation></translation>
<translation></translation>
</message>
<message>
<source>Triangle / Y</source>
<translation>Triangle / Y</translation>
<translation> / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation>Square / X</translation>
<translation> / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation>Circle / B</translation>
<translation> / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation>Cross / A</translation>
<translation> / A</translation>
</message>
<message>
<source>Right Stick Deadzone (def:2, max:127)</source>
@ -541,6 +541,77 @@
<source>Override Color</source>
<translation></translation>
</message>
<message>
<source>Unable to Save</source>
<translation></translation>
</message>
<message>
<source>Cannot bind axis values more than once</source>
<translation> X/Y 线</translation>
</message>
<message>
<source>Save</source>
<translation></translation>
</message>
<message>
<source>Apply</source>
<translation></translation>
</message>
<message>
<source>Restore Defaults</source>
<translation></translation>
</message>
<message>
<source>Cancel</source>
<translation></translation>
</message>
</context>
<context>
<name>EditorDialog</name>
<message>
<source>Edit Keyboard + Mouse and Controller input bindings</source>
<translation></translation>
</message>
<message>
<source>Use Per-Game configs</source>
<translation>使</translation>
</message>
<message>
<source>Error</source>
<translation></translation>
</message>
<message>
<source>Could not open the file for reading</source>
<translation></translation>
</message>
<message>
<source>Could not open the file for writing</source>
<translation></translation>
</message>
<message>
<source>Save Changes</source>
<translation></translation>
</message>
<message>
<source>Do you want to save changes?</source>
<translation></translation>
</message>
<message>
<source>Help</source>
<translation></translation>
</message>
<message>
<source>Do you want to reset your custom default config to the original default config?</source>
<translation></translation>
</message>
<message>
<source>Do you want to reset this config to your custom default config?</source>
<translation></translation>
</message>
<message>
<source>Reset to Default</source>
<translation></translation>
</message>
</context>
<context>
<name>ElfViewer</name>
@ -775,6 +846,10 @@
<source>Delete DLC</source>
<translation> DLC</translation>
</message>
<message>
<source>Delete Trophy</source>
<translation></translation>
</message>
<message>
<source>Compatibility...</source>
<translation>...</translation>
@ -851,6 +926,10 @@
<source>This game has no update folder to open!</source>
<translation></translation>
</message>
<message>
<source>No log file found for this game!</source>
<translation></translation>
</message>
<message>
<source>Failed to convert icon.</source>
<translation></translation>
@ -859,15 +938,46 @@
<source>This game has no save data to delete!</source>
<translation></translation>
</message>
<message>
<source>This game has no saved trophies to delete!</source>
<translation></translation>
</message>
<message>
<source>Save Data</source>
<translation></translation>
</message>
<message>
<source>Trophy</source>
<translation></translation>
</message>
<message>
<source>SFO Viewer for </source>
<translation>SFO - </translation>
</message>
</context>
<context>
<name>HelpDialog</name>
<message>
<source>Quickstart</source>
<translation></translation>
</message>
<message>
<source>FAQ</source>
<translation></translation>
</message>
<message>
<source>Syntax</source>
<translation></translation>
</message>
<message>
<source>Special Bindings</source>
<translation></translation>
</message>
<message>
<source>Keybindings</source>
<translation></translation>
</message>
</context>
<context>
<name>InstallDirSelect</name>
<message>
@ -887,6 +997,217 @@
<translation> PKG </translation>
</message>
</context>
<context>
<name>KBMSettings</name>
<message>
<source>Configure Controls</source>
<translation></translation>
</message>
<message>
<source>D-Pad</source>
<translation></translation>
</message>
<message>
<source>Up</source>
<translation></translation>
</message>
<message>
<source>unmapped</source>
<translation></translation>
</message>
<message>
<source>Left</source>
<translation></translation>
</message>
<message>
<source>Right</source>
<translation></translation>
</message>
<message>
<source>Down</source>
<translation></translation>
</message>
<message>
<source>Left Analog Halfmode</source>
<translation></translation>
</message>
<message>
<source>hold to move left stick at half-speed</source>
<translation></translation>
</message>
<message>
<source>Left Stick</source>
<translation></translation>
</message>
<message>
<source>Config Selection</source>
<translation></translation>
</message>
<message>
<source>Common Config</source>
<translation></translation>
</message>
<message>
<source>Use per-game configs</source>
<translation>使</translation>
</message>
<message>
<source>L1</source>
<translation>L1</translation>
</message>
<message>
<source>L2</source>
<translation>L2</translation>
</message>
<message>
<source>Text Editor</source>
<translation></translation>
</message>
<message>
<source>Help</source>
<translation></translation>
</message>
<message>
<source>R1</source>
<translation>R1</translation>
</message>
<message>
<source>R2</source>
<translation>R2</translation>
</message>
<message>
<source>L3</source>
<translation>L3</translation>
</message>
<message>
<source>Touchpad Click</source>
<translation></translation>
</message>
<message>
<source>Mouse to Joystick</source>
<translation></translation>
</message>
<message>
<source>*press F7 ingame to activate</source>
<translation>* F7 </translation>
</message>
<message>
<source>R3</source>
<translation>R3</translation>
</message>
<message>
<source>Options</source>
<translation></translation>
</message>
<message>
<source>Mouse Movement Parameters</source>
<translation></translation>
</message>
<message>
<source>note: click Help Button/Special Keybindings for more information</source>
<translation> -> </translation>
</message>
<message>
<source>Face Buttons</source>
<translation></translation>
</message>
<message>
<source>Triangle</source>
<translation></translation>
</message>
<message>
<source>Square</source>
<translation></translation>
</message>
<message>
<source>Circle</source>
<translation></translation>
</message>
<message>
<source>Cross</source>
<translation></translation>
</message>
<message>
<source>Right Analog Halfmode</source>
<translation></translation>
</message>
<message>
<source>hold to move right stick at half-speed</source>
<translation></translation>
</message>
<message>
<source>Right Stick</source>
<translation></translation>
</message>
<message>
<source>Speed Offset (def 0.125):</source>
<translation> 0.125</translation>
</message>
<message>
<source>Copy from Common Config</source>
<translation></translation>
</message>
<message>
<source>Deadzone Offset (def 0.50):</source>
<translation> 0.50</translation>
</message>
<message>
<source>Speed Multiplier (def 1.0):</source>
<translation> 1.0</translation>
</message>
<message>
<source>Common Config Selected</source>
<translation></translation>
</message>
<message>
<source>This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.</source>
<translation>使</translation>
</message>
<message>
<source>Copy values from Common Config</source>
<translation></translation>
</message>
<message>
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
<translation></translation>
</message>
<message>
<source>Unable to Save</source>
<translation></translation>
</message>
<message>
<source>Cannot bind any unique input more than once</source>
<translation></translation>
</message>
<message>
<source>Press a key</source>
<translation></translation>
</message>
<message>
<source>Cannot set mapping</source>
<translation></translation>
</message>
<message>
<source>Mousewheel cannot be mapped to stick outputs</source>
<translation></translation>
</message>
<message>
<source>Save</source>
<translation></translation>
</message>
<message>
<source>Apply</source>
<translation></translation>
</message>
<message>
<source>Restore Defaults</source>
<translation></translation>
</message>
<message>
<source>Cancel</source>
<translation></translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
@ -1311,6 +1632,10 @@
<source>Trophy</source>
<translation></translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder</source>
<translation>/</translation>
</message>
<message>
<source>Logger</source>
<translation></translation>
@ -1476,8 +1801,8 @@
<translation></translation>
</message>
<message>
<source>Disable Trophy Pop-ups</source>
<translation></translation>
<source>Disable Trophy Notification</source>
<translation></translation>
</message>
<message>
<source>Background Image</source>
@ -1803,6 +2128,62 @@
<source>Separate Log Files:\nWrites a separate logfile for each game.</source>
<translation>\n每个游戏使用单独的日志文件</translation>
</message>
<message>
<source>Trophy Notification Position</source>
<translation></translation>
</message>
<message>
<source>Left</source>
<translation></translation>
</message>
<message>
<source>Right</source>
<translation></translation>
</message>
<message>
<source>Top</source>
<translation></translation>
</message>
<message>
<source>Bottom</source>
<translation></translation>
</message>
<message>
<source>Notification Duration</source>
<translation></translation>
</message>
<message>
<source>Portable User Folder</source>
<translation></translation>
</message>
<message>
<source>Create Portable User Folder from Common User Folder</source>
<translation></translation>
</message>
<message>
<source>Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it.</source>
<translation>\n存储 shadPS4 shadPS4使</translation>
</message>
<message>
<source>Cannot create portable user folder</source>
<translation></translation>
</message>
<message>
<source>%1 already exists</source>
<translation>%1 </translation>
</message>
<message>
<source>Portable user folder created</source>
<translation></translation>
</message>
<message>
<source>%1 successfully created.</source>
<translation>%1 </translation>
</message>
<message>
<source>Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions.</source>
<translation>/\n您可以自定义奖杯图像和声音\n将文件添加到 custom_trophy \ntrophy.wav trophy.mp3bronze.pnggold.pngplatinum.pngsilver.png\n注意 QT </translation>
</message>
</context>
<context>
<name>TrophyViewer</name>
@ -1810,5 +2191,21 @@
<source>Trophy Viewer</source>
<translation></translation>
</message>
<message>
<source>Progress</source>
<translation></translation>
</message>
<message>
<source>Show Earned Trophies</source>
<translation></translation>
</message>
<message>
<source>Show Not Earned Trophies</source>
<translation></translation>
</message>
<message>
<source>Show Hidden Trophies</source>
<translation></translation>
</message>
</context>
</TS>

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