Merge branch 'main' into m4aac

This commit is contained in:
georgemoralis 2025-07-04 11:50:51 +03:00 committed by GitHub
commit fae9bab004
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
151 changed files with 8665 additions and 5206 deletions

View File

@ -35,7 +35,7 @@ body:
required: true required: true
- label: I have disabled all patches and cheats and the issue is still present. - label: I have disabled all patches and cheats and the issue is still present.
required: true required: true
- label: I have all the required [system modules](https://github.com/shadps4-emu/shadps4-game-compatibility?tab=readme-ov-file#informations) installed. - label: I have all the required [system modules](https://github.com/shadps4-emu/shadPS4/wiki/I.-Quick-start-%5BUsers%5D#4-adding-modules) installed.
required: true required: true
- type: textarea - type: textarea
id: desc id: desc

View File

@ -224,7 +224,10 @@ jobs:
arch: clang_64 arch: clang_64
archives: qtbase qttools archives: qtbase qttools
modules: qtmultimedia modules: qtmultimedia
- name: Workaround Qt <=6.9.1 issue
run: sed -i '' '/target_link_libraries(WrapOpenGL::WrapOpenGL INTERFACE ${__opengl_agl_fw_path})/d' ${{env.QT_ROOT_DIR}}/lib/cmake/Qt6/FindWrapOpenGL.cmake
- name: Cache CMake Configuration - name: Cache CMake Configuration
uses: actions/cache@v4 uses: actions/cache@v4
env: env:

21
CMakeLinuxPresets.json Normal file
View File

@ -0,0 +1,21 @@
{
"version": 9,
"cmakeMinimumRequired": {
"major": 3,
"minor": 30,
"patch": 0
},
"configurePresets": [
{
"name": "x64-Clang-Base",
"hidden": true,
"generator": "Ninja",
"binaryDir": "${sourceDir}/Build/${presetName}",
"cacheVariables": {
"CMAKE_C_COMPILER": "clang",
"CMAKE_CXX_COMPILER": "clang++",
"CMAKE_INSTALL_PREFIX": "${sourceDir}/Build/${presetName}"
}
}
]
}

View File

@ -214,6 +214,10 @@ configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/common/scm_rev.cpp.in" "${CMAKE_
message("end git things, remote: ${GIT_REMOTE_NAME}, branch: ${GIT_BRANCH}") message("end git things, remote: ${GIT_REMOTE_NAME}, branch: ${GIT_BRANCH}")
if(WIN32 AND ENABLE_QT_GUI AND NOT CMAKE_PREFIX_PATH)
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/DetectQtInstallation.cmake")
endif ()
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
find_package(Boost 1.84.0 CONFIG) find_package(Boost 1.84.0 CONFIG)
find_package(FFmpeg 5.1.2 MODULE) find_package(FFmpeg 5.1.2 MODULE)
@ -655,6 +659,7 @@ set(COMMON src/common/logging/backend.cpp
src/common/arch.h src/common/arch.h
src/common/assert.cpp src/common/assert.cpp
src/common/assert.h src/common/assert.h
src/common/bit_array.h
src/common/bit_field.h src/common/bit_field.h
src/common/bounded_threadsafe_queue.h src/common/bounded_threadsafe_queue.h
src/common/concepts.h src/common/concepts.h
@ -680,11 +685,13 @@ set(COMMON src/common/logging/backend.cpp
src/common/path_util.h src/common/path_util.h
src/common/object_pool.h src/common/object_pool.h
src/common/polyfill_thread.h src/common/polyfill_thread.h
src/common/range_lock.h
src/common/rdtsc.cpp src/common/rdtsc.cpp
src/common/rdtsc.h src/common/rdtsc.h
src/common/recursive_lock.cpp src/common/recursive_lock.cpp
src/common/recursive_lock.h src/common/recursive_lock.h
src/common/sha1.h src/common/sha1.h
src/common/shared_first_mutex.h
src/common/signal_context.h src/common/signal_context.h
src/common/signal_context.cpp src/common/signal_context.cpp
src/common/singleton.h src/common/singleton.h
@ -915,9 +922,10 @@ set(VIDEO_CORE src/video_core/amdgpu/liverpool.cpp
src/video_core/buffer_cache/buffer.h src/video_core/buffer_cache/buffer.h
src/video_core/buffer_cache/buffer_cache.cpp src/video_core/buffer_cache/buffer_cache.cpp
src/video_core/buffer_cache/buffer_cache.h src/video_core/buffer_cache/buffer_cache.h
src/video_core/buffer_cache/memory_tracker_base.h src/video_core/buffer_cache/memory_tracker.h
src/video_core/buffer_cache/range_set.h src/video_core/buffer_cache/range_set.h
src/video_core/buffer_cache/word_manager.h src/video_core/buffer_cache/region_definitions.h
src/video_core/buffer_cache/region_manager.h
src/video_core/renderer_vulkan/liverpool_to_vk.cpp src/video_core/renderer_vulkan/liverpool_to_vk.cpp
src/video_core/renderer_vulkan/liverpool_to_vk.h src/video_core/renderer_vulkan/liverpool_to_vk.h
src/video_core/renderer_vulkan/vk_common.cpp src/video_core/renderer_vulkan/vk_common.cpp
@ -954,6 +962,10 @@ set(VIDEO_CORE src/video_core/amdgpu/liverpool.cpp
src/video_core/renderer_vulkan/host_passes/fsr_pass.h 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.cpp
src/video_core/renderer_vulkan/host_passes/pp_pass.h src/video_core/renderer_vulkan/host_passes/pp_pass.h
src/video_core/texture_cache/blit_helper.cpp
src/video_core/texture_cache/blit_helper.h
src/video_core/texture_cache/host_compatibility.cpp
src/video_core/texture_cache/host_compatibility.h
src/video_core/texture_cache/image.cpp src/video_core/texture_cache/image.cpp
src/video_core/texture_cache/image.h src/video_core/texture_cache/image.h
src/video_core/texture_cache/image_info.cpp src/video_core/texture_cache/image_info.cpp
@ -967,8 +979,6 @@ set(VIDEO_CORE src/video_core/amdgpu/liverpool.cpp
src/video_core/texture_cache/tile_manager.cpp src/video_core/texture_cache/tile_manager.cpp
src/video_core/texture_cache/tile_manager.h src/video_core/texture_cache/tile_manager.h
src/video_core/texture_cache/types.h src/video_core/texture_cache/types.h
src/video_core/texture_cache/host_compatibility.cpp
src/video_core/texture_cache/host_compatibility.h
src/video_core/page_manager.cpp src/video_core/page_manager.cpp
src/video_core/page_manager.h src/video_core/page_manager.h
src/video_core/multi_level_page_table.h src/video_core/multi_level_page_table.h
@ -1061,6 +1071,8 @@ set(QT_GUI src/qt_gui/about_dialog.cpp
src/qt_gui/gui_settings.h src/qt_gui/gui_settings.h
src/qt_gui/settings.cpp src/qt_gui/settings.cpp
src/qt_gui/settings.h src/qt_gui/settings.h
src/qt_gui/sdl_event_wrapper.cpp
src/qt_gui/sdl_event_wrapper.h
${EMULATOR} ${EMULATOR}
${RESOURCE_FILES} ${RESOURCE_FILES}
${TRANSLATIONS} ${TRANSLATIONS}

62
CMakePresets.json Normal file
View File

@ -0,0 +1,62 @@
{
"version": 9,
"cmakeMinimumRequired": {
"major": 3,
"minor": 30,
"patch": 0
},
"include": ["CMake${hostSystemName}Presets.json"],
"configurePresets": [
{
"name": "x64-Clang-Debug",
"displayName": "Clang x64 Debug",
"inherits": ["x64-Clang-Base"],
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug"
}
},
{
"name": "x64-Clang-Debug-Qt",
"displayName": "Clang x64 Debug with Qt",
"inherits": ["x64-Clang-Base"],
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"ENABLE_QT_GUI": "ON"
}
},
{
"name": "x64-Clang-Release",
"displayName": "Clang x64 Release",
"inherits": ["x64-Clang-Base"],
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release"
}
},
{
"name": "x64-Clang-Release-Qt",
"displayName": "Clang x64 Release with Qt",
"inherits": ["x64-Clang-Base"],
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release",
"ENABLE_QT_GUI": "ON"
}
},
{
"name": "x64-Clang-RelWithDebInfo",
"displayName": "Clang x64 RelWithDebInfo",
"inherits": ["x64-Clang-Base"],
"cacheVariables": {
"CMAKE_BUILD_TYPE": "RelWithDebInfo"
}
},
{
"name": "x64-Clang-RelWithDebInfo-Qt",
"displayName": "Clang x64 RelWithDebInfo with Qt",
"inherits": ["x64-Clang-Base"],
"cacheVariables": {
"CMAKE_BUILD_TYPE": "RelWithDebInfo",
"ENABLE_QT_GUI": "ON"
}
}
]
}

View File

@ -12,6 +12,18 @@
"inheritEnvironments": [ "clang_cl_x64_x64" ], "inheritEnvironments": [ "clang_cl_x64_x64" ],
"intelliSenseMode": "windows-clang-x64" "intelliSenseMode": "windows-clang-x64"
}, },
{
"name": "x64-Clang-Release-Qt",
"generator": "Ninja",
"configurationType": "Release",
"buildRoot": "${projectDir}\\Build\\${name}",
"installRoot": "${projectDir}\\Install\\${name}",
"cmakeCommandArgs": "-DENABLE_QT_GUI=ON",
"buildCommandArgs": "",
"ctestCommandArgs": "",
"inheritEnvironments": [ "clang_cl_x64_x64" ],
"intelliSenseMode": "windows-clang-x64"
},
{ {
"name": "x64-Clang-Debug", "name": "x64-Clang-Debug",
"generator": "Ninja", "generator": "Ninja",
@ -24,6 +36,18 @@
"inheritEnvironments": [ "clang_cl_x64_x64" ], "inheritEnvironments": [ "clang_cl_x64_x64" ],
"intelliSenseMode": "windows-clang-x64" "intelliSenseMode": "windows-clang-x64"
}, },
{
"name": "x64-Clang-Debug-Qt",
"generator": "Ninja",
"configurationType": "Debug",
"buildRoot": "${projectDir}\\Build\\${name}",
"installRoot": "${projectDir}\\Install\\${name}",
"cmakeCommandArgs": "-DENABLE_QT_GUI=ON",
"buildCommandArgs": "",
"ctestCommandArgs": "",
"inheritEnvironments": [ "clang_cl_x64_x64" ],
"intelliSenseMode": "windows-clang-x64"
},
{ {
"name": "x64-Clang-RelWithDebInfo", "name": "x64-Clang-RelWithDebInfo",
"generator": "Ninja", "generator": "Ninja",
@ -35,6 +59,18 @@
"ctestCommandArgs": "", "ctestCommandArgs": "",
"inheritEnvironments": [ "clang_cl_x64_x64" ], "inheritEnvironments": [ "clang_cl_x64_x64" ],
"intelliSenseMode": "windows-clang-x64" "intelliSenseMode": "windows-clang-x64"
},
{
"name": "x64-Clang-RelWithDebInfo-Qt",
"generator": "Ninja",
"configurationType": "RelWithDebInfo",
"buildRoot": "${projectDir}\\Build\\${name}",
"installRoot": "${projectDir}\\Install\\${name}",
"cmakeCommandArgs": "-DENABLE_QT_GUI=ON",
"buildCommandArgs": "",
"ctestCommandArgs": "",
"inheritEnvironments": [ "clang_cl_x64_x64" ],
"intelliSenseMode": "windows-clang-x64"
} }
] ]
} }

26
CMakeWindowsPresets.json Normal file
View File

@ -0,0 +1,26 @@
{
"version": 9,
"cmakeMinimumRequired": {
"major": 3,
"minor": 30,
"patch": 0
},
"configurePresets": [
{
"name": "x64-Clang-Base",
"hidden": true,
"generator": "Ninja",
"binaryDir": "${sourceDir}/Build/${presetName}",
"cacheVariables": {
"CMAKE_C_COMPILER": "clang-cl",
"CMAKE_CXX_COMPILER": "clang-cl",
"CMAKE_INSTALL_PREFIX": "${sourceDir}/Build/${presetName}"
},
"vendor": {
"microsoft.com/VisualStudioSettings/CMake/1.0": {
"intelliSenseMode": "windows-clang-x64"
}
}
}
]
}

View File

@ -5,10 +5,13 @@ path = [
"REUSE.toml", "REUSE.toml",
"crowdin.yml", "crowdin.yml",
"CMakeSettings.json", "CMakeSettings.json",
"CMakeLinuxPresets.json",
"CMakeWindowsPresets.json",
"CMakePresets.json",
".github/FUNDING.yml", ".github/FUNDING.yml",
".github/shadps4.png", ".github/shadps4.png",
".github/workflows/scripts/update_translation.sh", ".github/workflows/scripts/update_translation.sh",
".github/workflows/update_translation.yml", ".github/workflows/update_translation.yml",
".gitmodules", ".gitmodules",
"dist/MacOSBundleInfo.plist.in", "dist/MacOSBundleInfo.plist.in",
"dist/net.shadps4.shadPS4.desktop", "dist/net.shadps4.shadPS4.desktop",
@ -29,6 +32,7 @@ path = [
"src/images/discord.png", "src/images/discord.png",
"src/images/dump_icon.png", "src/images/dump_icon.png",
"src/images/exit_icon.png", "src/images/exit_icon.png",
"src/images/favorite_icon.png",
"src/images/file_icon.png", "src/images/file_icon.png",
"src/images/trophy_icon.png", "src/images/trophy_icon.png",
"src/images/flag_china.png", "src/images/flag_china.png",
@ -71,7 +75,7 @@ path = [
"src/images/youtube.svg", "src/images/youtube.svg",
"src/shadps4.qrc", "src/shadps4.qrc",
"src/shadps4.rc", "src/shadps4.rc",
"src/qt_gui/translations/update_translation.sh", "src/qt_gui/translations/update_translation.sh",
] ]
precedence = "aggregate" precedence = "aggregate"
SPDX-FileCopyrightText = "shadPS4 Emulator Project" SPDX-FileCopyrightText = "shadPS4 Emulator Project"

View File

@ -0,0 +1,14 @@
# SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
# SPDX-License-Identifier: GPL-2.0-or-later
file(GLOB QT_KITS LIST_DIRECTORIES true "C:/Qt/*/msvc*_64")
list(SORT QT_KITS COMPARE NATURAL)
list(REVERSE QT_KITS)
if(QT_KITS)
list(GET QT_KITS 0 QT_PREFIX)
set(CMAKE_PREFIX_PATH "${QT_PREFIX}" CACHE PATH "Qt prefix autodetected" FORCE)
message(STATUS "Auto-detected Qt prefix: ${QT_PREFIX}")
else()
message(STATUS "findQt.cmake: no QtDirectory found in C:/Qt please set CMAKE_PREFIX_PATH manually")
endif()

View File

@ -74,6 +74,7 @@ and install the dependencies on that container as cited above.
This option is **highly recommended** for distributions with immutable/atomic filesystems (example: Fedora Kinoite, SteamOS). This option is **highly recommended** for distributions with immutable/atomic filesystems (example: Fedora Kinoite, SteamOS).
### Cloning ### Cloning
The project uses submodules to manage dependencies, and they need to be initialized before you can build the project. To achieve this, make sure you've cloned the repository with the --recursive flag
```bash ```bash
git clone --recursive https://github.com/shadps4-emu/shadPS4.git git clone --recursive https://github.com/shadps4-emu/shadPS4.git

View File

@ -18,6 +18,9 @@ public:
void unlock() { void unlock() {
pthread_mutex_unlock(&mutex); pthread_mutex_unlock(&mutex);
} }
[[nodiscard]] bool try_lock() {
return pthread_mutex_trylock(&mutex) == 0;
}
private: private:
pthread_mutex_t mutex = PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP; pthread_mutex_t mutex = PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP;

406
src/common/bit_array.h Normal file
View File

@ -0,0 +1,406 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <array>
#include <cstddef>
#include "common/types.h"
#ifdef __AVX2__
#define BIT_ARRAY_USE_AVX
#include <immintrin.h>
#endif
namespace Common {
template <size_t N>
class BitArray {
static_assert(N % 64 == 0, "BitArray size must be a multiple of 64 bits.");
static constexpr size_t BITS_PER_WORD = 64;
static constexpr size_t WORD_COUNT = N / BITS_PER_WORD;
static constexpr size_t WORDS_PER_AVX = 4;
static constexpr size_t AVX_WORD_COUNT = WORD_COUNT / WORDS_PER_AVX;
public:
using Range = std::pair<size_t, size_t>;
class Iterator {
public:
explicit Iterator(const BitArray& bit_array_, u64 start) : bit_array(bit_array_) {
range = bit_array.FirstRangeFrom(start);
}
Iterator& operator++() {
range = bit_array.FirstRangeFrom(range.second);
return *this;
}
bool operator==(const Iterator& other) const {
return range == other.range;
}
bool operator!=(const Iterator& other) const {
return !(*this == other);
}
const Range& operator*() const {
return range;
}
const Range* operator->() const {
return &range;
}
private:
const BitArray& bit_array;
Range range;
};
using const_iterator = Iterator;
using iterator_category = std::forward_iterator_tag;
using value_type = Range;
using difference_type = std::ptrdiff_t;
using pointer = const Range*;
using reference = const Range&;
BitArray() = default;
BitArray(const BitArray& other) = default;
BitArray& operator=(const BitArray& other) = default;
BitArray(BitArray&& other) noexcept = default;
BitArray& operator=(BitArray&& other) noexcept = default;
~BitArray() = default;
BitArray(const BitArray& other, size_t start, size_t end) {
if (start >= end || end > N) {
return;
}
const size_t first_word = start / BITS_PER_WORD;
const size_t last_word = (end - 1) / BITS_PER_WORD;
const size_t start_bit = start % BITS_PER_WORD;
const size_t end_bit = (end - 1) % BITS_PER_WORD;
const u64 start_mask = ~((1ULL << start_bit) - 1);
const u64 end_mask = end_bit == BITS_PER_WORD - 1 ? ~0ULL : (1ULL << (end_bit + 1)) - 1;
if (first_word == last_word) {
data[first_word] = other.data[first_word] & (start_mask & end_mask);
} else {
data[first_word] = other.data[first_word] & start_mask;
size_t i = first_word + 1;
#ifdef BIT_ARRAY_USE_AVX
for (; i + WORDS_PER_AVX <= last_word; i += WORDS_PER_AVX) {
const __m256i current =
_mm256_loadu_si256(reinterpret_cast<const __m256i*>(&other.data[i]));
_mm256_storeu_si256(reinterpret_cast<__m256i*>(&data[i]), current);
}
#endif
for (; i < last_word; ++i) {
data[i] = other.data[i];
}
data[last_word] = other.data[last_word] & end_mask;
}
}
BitArray(const BitArray& other, const Range& range)
: BitArray(other, range.first, range.second) {}
const_iterator begin() const {
return Iterator(*this, 0);
}
const_iterator end() const {
return Iterator(*this, N);
}
inline constexpr void Set(size_t idx) {
data[idx / BITS_PER_WORD] |= (1ULL << (idx % BITS_PER_WORD));
}
inline constexpr void Unset(size_t idx) {
data[idx / BITS_PER_WORD] &= ~(1ULL << (idx % BITS_PER_WORD));
}
inline constexpr bool Get(size_t idx) const {
return (data[idx / BITS_PER_WORD] & (1ULL << (idx % BITS_PER_WORD))) != 0;
}
inline void SetRange(size_t start, size_t end) {
if (start >= end || end > N) {
return;
}
const size_t first_word = start / BITS_PER_WORD;
const size_t last_word = (end - 1) / BITS_PER_WORD;
const size_t start_bit = start % BITS_PER_WORD;
const size_t end_bit = (end - 1) % BITS_PER_WORD;
const u64 start_mask = ~((1ULL << start_bit) - 1);
const u64 end_mask = end_bit == BITS_PER_WORD - 1 ? ~0ULL : (1ULL << (end_bit + 1)) - 1;
if (first_word == last_word) {
data[first_word] |= start_mask & end_mask;
} else {
data[first_word] |= start_mask;
size_t i = first_word + 1;
#ifdef BIT_ARRAY_USE_AVX
const __m256i value = _mm256_set1_epi64x(-1);
for (; i + WORDS_PER_AVX <= last_word; i += WORDS_PER_AVX) {
_mm256_storeu_si256(reinterpret_cast<__m256i*>(&data[i]), value);
}
#endif
for (; i < last_word; ++i) {
data[i] = ~0ULL;
}
data[last_word] |= end_mask;
}
}
inline void UnsetRange(size_t start, size_t end) {
if (start >= end || end > N) {
return;
}
size_t first_word = start / BITS_PER_WORD;
const size_t last_word = (end - 1) / BITS_PER_WORD;
const size_t start_bit = start % BITS_PER_WORD;
const size_t end_bit = (end - 1) % BITS_PER_WORD;
const u64 start_mask = (1ULL << start_bit) - 1;
const u64 end_mask = end_bit == BITS_PER_WORD - 1 ? 0ULL : ~((1ULL << (end_bit + 1)) - 1);
if (first_word == last_word) {
data[first_word] &= start_mask | end_mask;
} else {
data[first_word] &= start_mask;
size_t i = first_word + 1;
#ifdef BIT_ARRAY_USE_AVX
const __m256i value = _mm256_setzero_si256();
for (; i + WORDS_PER_AVX <= last_word; i += WORDS_PER_AVX) {
_mm256_storeu_si256(reinterpret_cast<__m256i*>(&data[i]), value);
}
#endif
for (; i < last_word; ++i) {
data[i] = 0ULL;
}
data[last_word] &= end_mask;
}
}
inline constexpr void SetRange(const Range& range) {
SetRange(range.first, range.second);
}
inline constexpr void UnsetRange(const Range& range) {
UnsetRange(range.first, range.second);
}
inline constexpr void Clear() {
data.fill(0);
}
inline constexpr void Fill() {
data.fill(~0ULL);
}
inline constexpr bool None() const {
u64 result = 0;
for (const auto& word : data) {
result |= word;
}
return result == 0;
}
inline constexpr bool Any() const {
return !None();
}
Range FirstRangeFrom(size_t start) const {
if (start >= N) {
return {N, N};
}
const auto find_end_bit = [&](size_t word) {
#ifdef BIT_ARRAY_USE_AVX
const __m256i all_one = _mm256_set1_epi64x(-1);
for (; word + WORDS_PER_AVX <= WORD_COUNT; word += WORDS_PER_AVX) {
const __m256i current =
_mm256_loadu_si256(reinterpret_cast<const __m256i*>(&data[word]));
const __m256i cmp = _mm256_cmpeq_epi64(current, all_one);
if (_mm256_movemask_epi8(cmp) != 0xFFFFFFFF) {
break;
}
}
#endif
for (; word < WORD_COUNT; ++word) {
if (data[word] != ~0ULL) {
return (word * BITS_PER_WORD) + std::countr_one(data[word]);
}
}
return N;
};
const auto word_bits = [&](size_t index, u64 word) {
const int empty_bits = std::countr_zero(word);
const int ones_count = std::countr_one(word >> empty_bits);
const size_t start_bit = index * BITS_PER_WORD + empty_bits;
if (ones_count + empty_bits < BITS_PER_WORD) {
return Range{start_bit, start_bit + ones_count};
}
return Range{start_bit, find_end_bit(index + 1)};
};
const size_t start_word = start / BITS_PER_WORD;
const size_t start_bit = start % BITS_PER_WORD;
const u64 masked_first = data[start_word] & (~((1ULL << start_bit) - 1));
if (masked_first) {
return word_bits(start_word, masked_first);
}
size_t word = start_word + 1;
#ifdef BIT_ARRAY_USE_AVX
for (; word + WORDS_PER_AVX <= WORD_COUNT; word += WORDS_PER_AVX) {
const __m256i current =
_mm256_loadu_si256(reinterpret_cast<const __m256i*>(&data[word]));
if (!_mm256_testz_si256(current, current)) {
break;
}
}
#endif
for (; word < WORD_COUNT; ++word) {
if (data[word] != 0) {
return word_bits(word, data[word]);
}
}
return {N, N};
}
inline constexpr Range FirstRange() const {
return FirstRangeFrom(0);
}
Range LastRangeFrom(size_t end) const {
if (end == 0) {
return {0, 0};
}
if (end > N) {
end = N;
}
const auto find_start_bit = [&](size_t word) {
#ifdef BIT_ARRAY_USE_AVX
const __m256i all_zero = _mm256_setzero_si256();
for (; word >= WORDS_PER_AVX; word -= WORDS_PER_AVX) {
const __m256i current = _mm256_loadu_si256(
reinterpret_cast<const __m256i*>(&data[word - WORDS_PER_AVX]));
const __m256i cmp = _mm256_cmpeq_epi64(current, all_zero);
if (_mm256_movemask_epi8(cmp) != 0xFFFFFFFF) {
break;
}
}
#endif
for (; word > 0; --word) {
if (data[word - 1] != ~0ULL) {
return word * BITS_PER_WORD - std::countl_one(data[word - 1]);
}
}
return size_t(0);
};
const auto word_bits = [&](size_t index, u64 word) {
const int empty_bits = std::countl_zero(word);
const int ones_count = std::countl_one(word << empty_bits);
const size_t end_bit = index * BITS_PER_WORD - empty_bits;
if (empty_bits + ones_count < BITS_PER_WORD) {
return Range{end_bit - ones_count, end_bit};
}
return Range{find_start_bit(index - 1), end_bit};
};
const size_t end_word = ((end - 1) / BITS_PER_WORD) + 1;
const size_t end_bit = (end - 1) % BITS_PER_WORD;
u64 masked_last = data[end_word - 1];
if (end_bit < BITS_PER_WORD - 1) {
masked_last &= (1ULL << (end_bit + 1)) - 1;
}
if (masked_last) {
return word_bits(end_word, masked_last);
}
size_t word = end_word - 1;
#ifdef BIT_ARRAY_USE_AVX
for (; word >= WORDS_PER_AVX; word -= WORDS_PER_AVX) {
const __m256i current =
_mm256_loadu_si256(reinterpret_cast<const __m256i*>(&data[word - WORDS_PER_AVX]));
if (!_mm256_testz_si256(current, current)) {
break;
}
}
#endif
for (; word > 0; --word) {
if (data[word - 1] != 0) {
return word_bits(word, data[word - 1]);
}
}
return {0, 0};
}
inline constexpr Range LastRange() const {
return LastRangeFrom(N);
}
inline constexpr size_t Size() const {
return N;
}
inline constexpr BitArray& operator|=(const BitArray& other) {
for (size_t i = 0; i < WORD_COUNT; ++i) {
data[i] |= other.data[i];
}
return *this;
}
inline constexpr BitArray& operator&=(const BitArray& other) {
for (size_t i = 0; i < WORD_COUNT; ++i) {
data[i] &= other.data[i];
}
return *this;
}
inline constexpr BitArray& operator^=(const BitArray& other) {
for (size_t i = 0; i < WORD_COUNT; ++i) {
data[i] ^= other.data[i];
}
return *this;
}
inline constexpr BitArray operator|(const BitArray& other) const {
BitArray result = *this;
result |= other;
return result;
}
inline constexpr BitArray operator&(const BitArray& other) const {
BitArray result = *this;
result &= other;
return result;
}
inline constexpr BitArray operator^(const BitArray& other) const {
BitArray result = *this;
result ^= other;
return result;
}
inline constexpr BitArray operator~() const {
BitArray result = *this;
for (size_t i = 0; i < WORD_COUNT; ++i) {
result.data[i] = ~result.data[i];
}
return result;
}
inline constexpr bool operator==(const BitArray& other) const {
u64 result = 0;
for (size_t i = 0; i < WORD_COUNT; ++i) {
result |= data[i] ^ other.data[i];
}
return result == 0;
}
inline constexpr bool operator!=(const BitArray& other) const {
return !(*this == other);
}
private:
std::array<u64, WORD_COUNT> data{};
};
} // namespace Common

View File

@ -42,7 +42,6 @@ static std::string logFilter;
static std::string logType = "sync"; static std::string logType = "sync";
static std::string userName = "shadPS4"; static std::string userName = "shadPS4";
static std::string chooseHomeTab; static std::string chooseHomeTab;
static std::string backButtonBehavior = "left";
static bool useSpecialPad = false; static bool useSpecialPad = false;
static int specialPadClass = 1; static int specialPadClass = 1;
static bool isMotionControlsEnabled = true; static bool isMotionControlsEnabled = true;
@ -52,6 +51,8 @@ static bool isShowSplash = false;
static std::string isSideTrophy = "right"; static std::string isSideTrophy = "right";
static bool isNullGpu = false; static bool isNullGpu = false;
static bool shouldCopyGPUBuffers = false; static bool shouldCopyGPUBuffers = false;
static bool readbacksEnabled = false;
static bool directMemoryAccessEnabled = false;
static bool shouldDumpShaders = false; static bool shouldDumpShaders = false;
static bool shouldPatchShaders = true; static bool shouldPatchShaders = true;
static u32 vblankDivider = 1; static u32 vblankDivider = 1;
@ -81,10 +82,6 @@ static std::vector<GameInstallDir> settings_install_dirs = {};
std::vector<bool> install_dirs_enabled = {}; std::vector<bool> install_dirs_enabled = {};
std::filesystem::path settings_addon_install_dir = {}; std::filesystem::path settings_addon_install_dir = {};
std::filesystem::path save_data_path = {}; std::filesystem::path save_data_path = {};
u32 mw_themes = 0;
std::vector<std::string> m_elf_viewer;
std::vector<std::string> m_recent_files;
std::string emulator_language = "en_US";
static bool isFullscreen = false; static bool isFullscreen = false;
static std::string fullscreenMode = "Windowed"; static std::string fullscreenMode = "Windowed";
static bool isHDRAllowed = false; static bool isHDRAllowed = false;
@ -209,10 +206,6 @@ std::string getChooseHomeTab() {
return chooseHomeTab; return chooseHomeTab;
} }
std::string getBackButtonBehavior() {
return backButtonBehavior;
}
bool getUseSpecialPad() { bool getUseSpecialPad() {
return useSpecialPad; return useSpecialPad;
} }
@ -249,6 +242,14 @@ bool copyGPUCmdBuffers() {
return shouldCopyGPUBuffers; return shouldCopyGPUBuffers;
} }
bool readbacks() {
return readbacksEnabled;
}
bool directMemoryAccess() {
return directMemoryAccessEnabled;
}
bool dumpShaders() { bool dumpShaders() {
return shouldDumpShaders; return shouldDumpShaders;
} }
@ -353,6 +354,14 @@ void setCopyGPUCmdBuffers(bool enable) {
shouldCopyGPUBuffers = enable; shouldCopyGPUBuffers = enable;
} }
void setReadbacks(bool enable) {
readbacksEnabled = enable;
}
void setDirectMemoryAccess(bool enable) {
directMemoryAccessEnabled = enable;
}
void setDumpShaders(bool enable) { void setDumpShaders(bool enable) {
shouldDumpShaders = enable; shouldDumpShaders = enable;
} }
@ -428,10 +437,6 @@ void setChooseHomeTab(const std::string& type) {
chooseHomeTab = type; chooseHomeTab = type;
} }
void setBackButtonBehavior(const std::string& type) {
backButtonBehavior = type;
}
void setUseSpecialPad(bool use) { void setUseSpecialPad(bool use) {
useSpecialPad = use; useSpecialPad = use;
} }
@ -484,24 +489,6 @@ void setAddonInstallDir(const std::filesystem::path& dir) {
settings_addon_install_dir = dir; settings_addon_install_dir = dir;
} }
void setMainWindowTheme(u32 theme) {
mw_themes = theme;
}
void setElfViewer(const std::vector<std::string>& elfList) {
m_elf_viewer.resize(elfList.size());
m_elf_viewer = elfList;
}
void setRecentFiles(const std::vector<std::string>& recentFiles) {
m_recent_files.resize(recentFiles.size());
m_recent_files = recentFiles;
}
void setEmulatorLanguage(std::string language) {
emulator_language = language;
}
void setGameInstallDirs(const std::vector<std::filesystem::path>& dirs_config) { void setGameInstallDirs(const std::vector<std::filesystem::path>& dirs_config) {
settings_install_dirs.clear(); settings_install_dirs.clear();
for (const auto& dir : dirs_config) { for (const auto& dir : dirs_config) {
@ -543,22 +530,6 @@ std::filesystem::path getAddonInstallDir() {
return settings_addon_install_dir; return settings_addon_install_dir;
} }
u32 getMainWindowTheme() {
return mw_themes;
}
std::vector<std::string> getElfViewer() {
return m_elf_viewer;
}
std::vector<std::string> getRecentFiles() {
return m_recent_files;
}
std::string getEmulatorLanguage() {
return emulator_language;
}
u32 GetLanguage() { u32 GetLanguage() {
return m_language; return m_language;
} }
@ -620,7 +591,6 @@ void load(const std::filesystem::path& path) {
cursorState = toml::find_or<int>(input, "cursorState", HideCursorState::Idle); cursorState = toml::find_or<int>(input, "cursorState", HideCursorState::Idle);
cursorHideTimeout = toml::find_or<int>(input, "cursorHideTimeout", 5); cursorHideTimeout = toml::find_or<int>(input, "cursorHideTimeout", 5);
backButtonBehavior = toml::find_or<std::string>(input, "backButtonBehavior", "left");
useSpecialPad = toml::find_or<bool>(input, "useSpecialPad", false); useSpecialPad = toml::find_or<bool>(input, "useSpecialPad", false);
specialPadClass = toml::find_or<int>(input, "specialPadClass", 1); specialPadClass = toml::find_or<int>(input, "specialPadClass", 1);
isMotionControlsEnabled = toml::find_or<bool>(input, "isMotionControlsEnabled", true); isMotionControlsEnabled = toml::find_or<bool>(input, "isMotionControlsEnabled", true);
@ -634,6 +604,8 @@ void load(const std::filesystem::path& path) {
screenHeight = toml::find_or<int>(gpu, "screenHeight", screenHeight); screenHeight = toml::find_or<int>(gpu, "screenHeight", screenHeight);
isNullGpu = toml::find_or<bool>(gpu, "nullGpu", false); isNullGpu = toml::find_or<bool>(gpu, "nullGpu", false);
shouldCopyGPUBuffers = toml::find_or<bool>(gpu, "copyGPUBuffers", false); shouldCopyGPUBuffers = toml::find_or<bool>(gpu, "copyGPUBuffers", false);
readbacksEnabled = toml::find_or<bool>(gpu, "readbacks", false);
directMemoryAccessEnabled = toml::find_or<bool>(gpu, "directMemoryAccess", false);
shouldDumpShaders = toml::find_or<bool>(gpu, "dumpShaders", false); shouldDumpShaders = toml::find_or<bool>(gpu, "dumpShaders", false);
shouldPatchShaders = toml::find_or<bool>(gpu, "patchShaders", true); shouldPatchShaders = toml::find_or<bool>(gpu, "patchShaders", true);
vblankDivider = toml::find_or<int>(gpu, "vblankDivider", 1); vblankDivider = toml::find_or<int>(gpu, "vblankDivider", 1);
@ -668,7 +640,6 @@ void load(const std::filesystem::path& path) {
const toml::value& gui = data.at("GUI"); const toml::value& gui = data.at("GUI");
load_game_size = toml::find_or<bool>(gui, "loadGameSizeEnabled", true); load_game_size = toml::find_or<bool>(gui, "loadGameSizeEnabled", true);
mw_themes = toml::find_or<int>(gui, "theme", 0);
const auto install_dir_array = const auto install_dir_array =
toml::find_or<std::vector<std::u8string>>(gui, "installDirs", {}); toml::find_or<std::vector<std::u8string>>(gui, "installDirs", {});
@ -693,9 +664,6 @@ void load(const std::filesystem::path& path) {
save_data_path = toml::find_fs_path_or(gui, "saveDataPath", {}); save_data_path = toml::find_fs_path_or(gui, "saveDataPath", {});
settings_addon_install_dir = toml::find_fs_path_or(gui, "addonInstallDir", {}); settings_addon_install_dir = toml::find_fs_path_or(gui, "addonInstallDir", {});
m_elf_viewer = toml::find_or<std::vector<std::string>>(gui, "elfDirs", {});
m_recent_files = toml::find_or<std::vector<std::string>>(gui, "recentFiles", {});
emulator_language = toml::find_or<std::string>(gui, "emulatorLanguage", "en_US");
} }
if (data.contains("Settings")) { if (data.contains("Settings")) {
@ -708,19 +676,6 @@ void load(const std::filesystem::path& path) {
const toml::value& keys = data.at("Keys"); const toml::value& keys = data.at("Keys");
trophyKey = toml::find_or<std::string>(keys, "TrophyKey", ""); trophyKey = toml::find_or<std::string>(keys, "TrophyKey", "");
} }
// Check if the loaded language is in the allowed list
const std::vector<std::string> allowed_languages = {
"ar_SA", "da_DK", "de_DE", "el_GR", "en_US", "es_ES", "fa_IR", "fi_FI",
"fr_FR", "hu_HU", "id_ID", "it_IT", "ja_JP", "ko_KR", "lt_LT", "nb_NO",
"nl_NL", "pl_PL", "pt_BR", "pt_PT", "ro_RO", "ru_RU", "sq_AL", "sv_SE",
"tr_TR", "uk_UA", "vi_VN", "zh_CN", "zh_TW", "ca_ES", "sr_CS"};
if (std::find(allowed_languages.begin(), allowed_languages.end(), emulator_language) ==
allowed_languages.end()) {
emulator_language = "en_US"; // Default to en_US if not in the list
save(path);
}
} }
void sortTomlSections(toml::ordered_value& data) { void sortTomlSections(toml::ordered_value& data) {
@ -792,7 +747,6 @@ void save(const std::filesystem::path& path) {
data["General"]["checkCompatibilityOnStartup"] = checkCompatibilityOnStartup; data["General"]["checkCompatibilityOnStartup"] = checkCompatibilityOnStartup;
data["Input"]["cursorState"] = cursorState; data["Input"]["cursorState"] = cursorState;
data["Input"]["cursorHideTimeout"] = cursorHideTimeout; data["Input"]["cursorHideTimeout"] = cursorHideTimeout;
data["Input"]["backButtonBehavior"] = backButtonBehavior;
data["Input"]["useSpecialPad"] = useSpecialPad; data["Input"]["useSpecialPad"] = useSpecialPad;
data["Input"]["specialPadClass"] = specialPadClass; data["Input"]["specialPadClass"] = specialPadClass;
data["Input"]["isMotionControlsEnabled"] = isMotionControlsEnabled; data["Input"]["isMotionControlsEnabled"] = isMotionControlsEnabled;
@ -801,6 +755,8 @@ void save(const std::filesystem::path& path) {
data["GPU"]["screenHeight"] = screenHeight; data["GPU"]["screenHeight"] = screenHeight;
data["GPU"]["nullGpu"] = isNullGpu; data["GPU"]["nullGpu"] = isNullGpu;
data["GPU"]["copyGPUBuffers"] = shouldCopyGPUBuffers; data["GPU"]["copyGPUBuffers"] = shouldCopyGPUBuffers;
data["GPU"]["readbacks"] = readbacksEnabled;
data["GPU"]["directMemoryAccess"] = directMemoryAccessEnabled;
data["GPU"]["dumpShaders"] = shouldDumpShaders; data["GPU"]["dumpShaders"] = shouldDumpShaders;
data["GPU"]["patchShaders"] = shouldPatchShaders; data["GPU"]["patchShaders"] = shouldPatchShaders;
data["GPU"]["vblankDivider"] = vblankDivider; data["GPU"]["vblankDivider"] = vblankDivider;
@ -855,7 +811,6 @@ void save(const std::filesystem::path& path) {
data["GUI"]["addonInstallDir"] = data["GUI"]["addonInstallDir"] =
std::string{fmt::UTF(settings_addon_install_dir.u8string()).data}; std::string{fmt::UTF(settings_addon_install_dir.u8string()).data};
data["GUI"]["emulatorLanguage"] = emulator_language;
data["Settings"]["consoleLanguage"] = m_language; data["Settings"]["consoleLanguage"] = m_language;
// Sorting of TOML sections // Sorting of TOML sections
@ -864,42 +819,6 @@ void save(const std::filesystem::path& path) {
std::ofstream file(path, std::ios::binary); std::ofstream file(path, std::ios::binary);
file << data; file << data;
file.close(); file.close();
saveMainWindow(path);
}
void saveMainWindow(const std::filesystem::path& path) {
toml::ordered_value data;
std::error_code error;
if (std::filesystem::exists(path, error)) {
try {
std::ifstream ifs;
ifs.exceptions(std::ifstream::failbit | std::ifstream::badbit);
ifs.open(path, std::ios_base::binary);
data = toml::parse<toml::ordered_type_config>(
ifs, std::string{fmt::UTF(path.filename().u8string()).data});
} catch (const std::exception& ex) {
fmt::print("Exception trying to parse config file. Exception: {}\n", ex.what());
return;
}
} else {
if (error) {
fmt::print("Filesystem error: {}\n", error.message());
}
fmt::print("Saving new configuration file {}\n", fmt::UTF(path.u8string()));
}
data["GUI"]["theme"] = mw_themes;
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();
} }
void setDefaultValues() { void setDefaultValues() {
@ -920,7 +839,6 @@ void setDefaultValues() {
cursorState = HideCursorState::Idle; cursorState = HideCursorState::Idle;
cursorHideTimeout = 5; cursorHideTimeout = 5;
trophyNotificationDuration = 6.0; trophyNotificationDuration = 6.0;
backButtonBehavior = "left";
useSpecialPad = false; useSpecialPad = false;
specialPadClass = 1; specialPadClass = 1;
isDebugDump = false; isDebugDump = false;
@ -937,7 +855,6 @@ void setDefaultValues() {
vkHostMarkers = false; vkHostMarkers = false;
vkGuestMarkers = false; vkGuestMarkers = false;
rdocEnable = false; rdocEnable = false;
emulator_language = "en_US";
m_language = 1; m_language = 1;
gpuId = -1; gpuId = -1;
compatibilityData = false; compatibilityData = false;
@ -967,7 +884,7 @@ l3 = x
r3 = m r3 = m
options = enter options = enter
touchpad = space touchpad_center = space
pad_up = up pad_up = up
pad_down = down pad_down = down
@ -999,7 +916,7 @@ r2 = r2
r3 = r3 r3 = r3
options = options options = options
touchpad = back touchpad_center = back
pad_up = pad_up pad_up = pad_up
pad_down = pad_down pad_down = pad_down

View File

@ -18,77 +18,100 @@ enum HideCursorState : int { Never, Idle, Always };
void load(const std::filesystem::path& path); void load(const std::filesystem::path& path);
void save(const std::filesystem::path& path); void save(const std::filesystem::path& path);
void saveMainWindow(const std::filesystem::path& path);
std::string getTrophyKey(); std::string getTrophyKey();
void setTrophyKey(std::string key); void setTrophyKey(std::string key);
bool getIsFullscreen();
void setIsFullscreen(bool enable);
std::string getFullscreenMode();
void setFullscreenMode(std::string mode);
u32 getScreenWidth();
u32 getScreenHeight();
void setScreenWidth(u32 width);
void setScreenHeight(u32 height);
bool debugDump();
void setDebugDump(bool enable);
s32 getGpuId();
void setGpuId(s32 selectedGpuId);
bool allowHDR();
void setAllowHDR(bool enable);
bool collectShadersForDebug();
void setCollectShaderForDebug(bool enable);
bool showSplash();
void setShowSplash(bool enable);
std::string sideTrophy();
void setSideTrophy(std::string side);
bool nullGpu();
void setNullGpu(bool enable);
bool copyGPUCmdBuffers();
void setCopyGPUCmdBuffers(bool enable);
bool readbacks();
void setReadbacks(bool enable);
bool directMemoryAccess();
void setDirectMemoryAccess(bool enable);
bool dumpShaders();
void setDumpShaders(bool enable);
u32 vblankDiv();
void setVblankDiv(u32 value);
bool getisTrophyPopupDisabled();
void setisTrophyPopupDisabled(bool disable);
s16 getCursorState();
void setCursorState(s16 cursorState);
bool vkValidationEnabled();
void setVkValidation(bool enable);
bool vkValidationSyncEnabled();
void setVkSyncValidation(bool enable);
bool getVkCrashDiagnosticEnabled();
void setVkCrashDiagnosticEnabled(bool enable);
bool getVkHostMarkersEnabled();
void setVkHostMarkersEnabled(bool enable);
bool getVkGuestMarkersEnabled();
void setVkGuestMarkersEnabled(bool enable);
bool getEnableDiscordRPC();
void setEnableDiscordRPC(bool enable);
bool isRdocEnabled();
void setRdocEnabled(bool enable);
std::string getLogType();
void setLogType(const std::string& type);
std::string getLogFilter();
void setLogFilter(const std::string& type);
double getTrophyNotificationDuration();
void setTrophyNotificationDuration(double newTrophyNotificationDuration);
int getCursorHideTimeout();
void setCursorHideTimeout(int newcursorHideTimeout);
void setSeparateLogFilesEnabled(bool enabled);
bool getSeparateLogFilesEnabled();
u32 GetLanguage();
void setLanguage(u32 language);
void setUseSpecialPad(bool use);
bool getUseSpecialPad();
void setSpecialPadClass(int type);
int getSpecialPadClass();
bool getPSNSignedIn();
void setPSNSignedIn(bool sign); // no ui setting
bool patchShaders(); // no set
bool fpsColor(); // no set
bool isNeoModeConsole();
void setNeoMode(bool enable); // no ui setting
bool isDevKitConsole(); // no set
bool vkValidationGpuEnabled(); // no set
bool getIsMotionControlsEnabled();
void setIsMotionControlsEnabled(bool use);
// TODO
bool GetLoadGameSizeEnabled(); bool GetLoadGameSizeEnabled();
std::filesystem::path GetSaveDataPath(); std::filesystem::path GetSaveDataPath();
void setLoadGameSizeEnabled(bool enable); void setLoadGameSizeEnabled(bool enable);
bool getIsFullscreen();
std::string getFullscreenMode();
bool isNeoModeConsole();
bool isDevKitConsole();
bool getisTrophyPopupDisabled();
bool getEnableDiscordRPC();
bool getCompatibilityEnabled(); bool getCompatibilityEnabled();
bool getCheckCompatibilityOnStartup(); bool getCheckCompatibilityOnStartup();
bool getPSNSignedIn();
std::string getLogFilter();
std::string getLogType();
std::string getUserName(); std::string getUserName();
std::string getChooseHomeTab(); std::string getChooseHomeTab();
s16 getCursorState();
int getCursorHideTimeout();
double getTrophyNotificationDuration();
std::string getBackButtonBehavior();
bool getUseSpecialPad();
int getSpecialPadClass();
bool getIsMotionControlsEnabled();
bool GetUseUnifiedInputConfig(); bool GetUseUnifiedInputConfig();
void SetUseUnifiedInputConfig(bool use); void SetUseUnifiedInputConfig(bool use);
bool GetOverrideControllerColor(); bool GetOverrideControllerColor();
void SetOverrideControllerColor(bool enable); void SetOverrideControllerColor(bool enable);
int* GetControllerCustomColor(); int* GetControllerCustomColor();
void SetControllerCustomColor(int r, int b, int g); void SetControllerCustomColor(int r, int b, int g);
u32 getScreenWidth();
u32 getScreenHeight();
s32 getGpuId();
bool allowHDR();
bool debugDump();
bool collectShadersForDebug();
bool showSplash();
std::string sideTrophy();
bool nullGpu();
bool copyGPUCmdBuffers();
bool dumpShaders();
bool patchShaders();
bool isRdocEnabled();
bool fpsColor();
u32 vblankDiv();
void setDebugDump(bool enable);
void setCollectShaderForDebug(bool enable);
void setShowSplash(bool enable);
void setSideTrophy(std::string side);
void setNullGpu(bool enable);
void setAllowHDR(bool enable);
void setCopyGPUCmdBuffers(bool enable);
void setDumpShaders(bool enable);
void setVblankDiv(u32 value);
void setGpuId(s32 selectedGpuId);
void setScreenWidth(u32 width);
void setScreenHeight(u32 height);
void setIsFullscreen(bool enable);
void setFullscreenMode(std::string mode);
void setisTrophyPopupDisabled(bool disable);
void setEnableDiscordRPC(bool enable);
void setLanguage(u32 language);
void setNeoMode(bool enable);
void setUserName(const std::string& type); void setUserName(const std::string& type);
void setChooseHomeTab(const std::string& type); void setChooseHomeTab(const std::string& type);
void setGameInstallDirs(const std::vector<std::filesystem::path>& dirs_config); void setGameInstallDirs(const std::vector<std::filesystem::path>& dirs_config);
@ -96,57 +119,19 @@ void setAllGameInstallDirs(const std::vector<GameInstallDir>& dirs_config);
void setSaveDataPath(const std::filesystem::path& path); void setSaveDataPath(const std::filesystem::path& path);
void setCompatibilityEnabled(bool use); void setCompatibilityEnabled(bool use);
void setCheckCompatibilityOnStartup(bool use); void setCheckCompatibilityOnStartup(bool use);
void setPSNSignedIn(bool sign);
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);
void setIsMotionControlsEnabled(bool use);
void setLogType(const std::string& type);
void setLogFilter(const std::string& type);
void setSeparateLogFilesEnabled(bool enabled);
bool getSeparateLogFilesEnabled();
void setVkValidation(bool enable);
void setVkSyncValidation(bool enable);
void setRdocEnabled(bool enable);
bool vkValidationEnabled();
bool vkValidationSyncEnabled();
bool vkValidationGpuEnabled();
bool getVkCrashDiagnosticEnabled();
bool getVkHostMarkersEnabled();
bool getVkGuestMarkersEnabled();
void setVkCrashDiagnosticEnabled(bool enable);
void setVkHostMarkersEnabled(bool enable);
void setVkGuestMarkersEnabled(bool enable);
// Gui // Gui
bool addGameInstallDir(const std::filesystem::path& dir, bool enabled = true); bool addGameInstallDir(const std::filesystem::path& dir, bool enabled = true);
void removeGameInstallDir(const std::filesystem::path& dir); void removeGameInstallDir(const std::filesystem::path& dir);
void setGameInstallDirEnabled(const std::filesystem::path& dir, bool enabled); void setGameInstallDirEnabled(const std::filesystem::path& dir, bool enabled);
void setAddonInstallDir(const std::filesystem::path& dir); void setAddonInstallDir(const std::filesystem::path& dir);
void setMainWindowTheme(u32 theme);
void setElfViewer(const std::vector<std::string>& elfList);
void setRecentFiles(const std::vector<std::string>& recentFiles);
void setEmulatorLanguage(std::string language);
const std::vector<std::filesystem::path> getGameInstallDirs(); const std::vector<std::filesystem::path> getGameInstallDirs();
const std::vector<bool> getGameInstallDirsEnabled(); const std::vector<bool> getGameInstallDirsEnabled();
std::filesystem::path getAddonInstallDir(); std::filesystem::path getAddonInstallDir();
u32 getMainWindowTheme();
std::vector<std::string> getElfViewer();
std::vector<std::string> getRecentFiles();
std::string getEmulatorLanguage();
void setDefaultValues(); void setDefaultValues();
// todo: name and function location pending // todo: name and function location pending
std::filesystem::path GetFoolproofKbmConfigFile(const std::string& game_id = ""); std::filesystem::path GetFoolproofKbmConfigFile(const std::string& game_id = "");
// settings
u32 GetLanguage();
}; // namespace Config }; // namespace Config

101
src/common/range_lock.h Normal file
View File

@ -0,0 +1,101 @@
// SPDX-FileCopyrightText: Copyright 2025 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <iterator>
#include <mutex>
namespace Common {
// From boost thread locking
template <typename Iterator>
struct RangeLockGuard {
Iterator begin;
Iterator end;
RangeLockGuard(Iterator begin_, Iterator end_) : begin(begin_), end(end_) {
LockRange(begin, end);
}
void release() {
begin = end;
}
~RangeLockGuard() {
for (; begin != end; ++begin) {
begin->unlock();
}
}
};
template <typename Iterator>
Iterator TryLockRange(Iterator begin, Iterator end) {
using LockType = typename std::iterator_traits<Iterator>::value_type;
if (begin == end) {
return end;
}
std::unique_lock<LockType> guard(*begin, std::try_to_lock);
if (!guard.owns_lock()) {
return begin;
}
Iterator failed = TryLockRange(++begin, end);
if (failed == end) {
guard.release();
}
return failed;
}
template <typename Iterator>
void LockRange(Iterator begin, Iterator end) {
using LockType = typename std::iterator_traits<Iterator>::value_type;
if (begin == end) {
return;
}
bool start_with_begin = true;
Iterator second = begin;
++second;
Iterator next = second;
while (true) {
std::unique_lock<LockType> begin_lock(*begin, std::defer_lock);
if (start_with_begin) {
begin_lock.lock();
const Iterator failed_lock = TryLockRange(next, end);
if (failed_lock == end) {
begin_lock.release();
return;
}
start_with_begin = false;
next = failed_lock;
} else {
RangeLockGuard<Iterator> guard(next, end);
if (begin_lock.try_lock()) {
const Iterator failed_lock = TryLockRange(second, next);
if (failed_lock == next) {
begin_lock.release();
guard.release();
return;
}
start_with_begin = false;
next = failed_lock;
} else {
start_with_begin = true;
next = second;
}
}
}
}
} // namespace Common

View File

@ -0,0 +1,46 @@
// SPDX-FileCopyrightText: Copyright 2025 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <condition_variable>
#include <mutex>
namespace Common {
// Like std::shared_mutex, but reader has priority over writer.
class SharedFirstMutex {
public:
void lock() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [this]() { return !writer_active && readers == 0; });
writer_active = true;
}
void unlock() {
std::lock_guard<std::mutex> lock(mtx);
writer_active = false;
cv.notify_all();
}
void lock_shared() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [this]() { return !writer_active; });
++readers;
}
void unlock_shared() {
std::lock_guard<std::mutex> lock(mtx);
if (--readers == 0) {
cv.notify_all();
}
}
private:
std::mutex mtx;
std::condition_variable cv;
int readers = 0;
bool writer_active = false;
};
} // namespace Common

View File

@ -302,14 +302,15 @@ struct AddressSpace::Impl {
new_flags = PAGE_READWRITE; new_flags = PAGE_READWRITE;
} else if (read && !write) { } else if (read && !write) {
new_flags = PAGE_READONLY; new_flags = PAGE_READONLY;
} else if (execute && !read && not write) { } else if (execute && !read && !write) {
new_flags = PAGE_EXECUTE; new_flags = PAGE_EXECUTE;
} else if (!read && !write && !execute) { } else if (!read && !write && !execute) {
new_flags = PAGE_NOACCESS; new_flags = PAGE_NOACCESS;
} else { } else {
LOG_CRITICAL(Common_Memory, LOG_CRITICAL(Common_Memory,
"Unsupported protection flag combination for address {:#x}, size {}", "Unsupported protection flag combination for address {:#x}, size {}, "
virtual_addr, size); "read={}, write={}, execute={}",
virtual_addr, size, read, write, execute);
return; return;
} }

View File

@ -11,6 +11,7 @@
namespace Core { namespace Core {
enum class MemoryPermission : u32 { enum class MemoryPermission : u32 {
None = 0,
Read = 1 << 0, Read = 1 << 0,
Write = 1 << 1, Write = 1 << 1,
ReadWrite = Read | Write, ReadWrite = Read | Write,

View File

@ -2834,7 +2834,7 @@ void RegisterlibSceGnmDriver(Core::Loader::SymbolsResolver* sym) {
} }
if (Config::copyGPUCmdBuffers()) { if (Config::copyGPUCmdBuffers()) {
liverpool->reserveCopyBufferSpace(); liverpool->ReserveCopyBufferSpace();
} }
Platform::IrqC::Instance()->Register(Platform::InterruptId::GpuIdle, ResetSubmissionLock, Platform::IrqC::Instance()->Register(Platform::InterruptId::GpuIdle, ResetSubmissionLock,

View File

@ -76,21 +76,21 @@ static PS4_SYSV_ABI void stack_chk_fail() {
UNREACHABLE(); UNREACHABLE();
} }
static thread_local int g_posix_errno = 0; static thread_local s32 g_posix_errno = 0;
int* PS4_SYSV_ABI __Error() { s32* PS4_SYSV_ABI __Error() {
return &g_posix_errno; return &g_posix_errno;
} }
void ErrSceToPosix(int error) { void ErrSceToPosix(s32 error) {
g_posix_errno = error - ORBIS_KERNEL_ERROR_UNKNOWN; g_posix_errno = error - ORBIS_KERNEL_ERROR_UNKNOWN;
} }
int ErrnoToSceKernelError(int error) { s32 ErrnoToSceKernelError(s32 error) {
return error + ORBIS_KERNEL_ERROR_UNKNOWN; return error + ORBIS_KERNEL_ERROR_UNKNOWN;
} }
void SetPosixErrno(int e) { void SetPosixErrno(s32 e) {
// Some error numbers are different between supported OSes // Some error numbers are different between supported OSes
switch (e) { switch (e) {
case EPERM: case EPERM:
@ -132,15 +132,15 @@ void SetPosixErrno(int e) {
} }
} }
static uint64_t g_mspace_atomic_id_mask = 0; static u64 g_mspace_atomic_id_mask = 0;
static uint64_t g_mstate_table[64] = {0}; static u64 g_mstate_table[64] = {0};
struct HeapInfoInfo { struct HeapInfoInfo {
uint64_t size = sizeof(HeapInfoInfo); u64 size = sizeof(HeapInfoInfo);
uint32_t flag; u32 flag;
uint32_t getSegmentInfo; u32 getSegmentInfo;
uint64_t* mspace_atomic_id_mask; u64* mspace_atomic_id_mask;
uint64_t* mstate_table; u64* mstate_table;
}; };
void PS4_SYSV_ABI sceLibcHeapGetTraceInfo(HeapInfoInfo* info) { void PS4_SYSV_ABI sceLibcHeapGetTraceInfo(HeapInfoInfo* info) {
@ -159,7 +159,7 @@ struct OrbisKernelUuid {
}; };
static_assert(sizeof(OrbisKernelUuid) == 0x10); static_assert(sizeof(OrbisKernelUuid) == 0x10);
int PS4_SYSV_ABI sceKernelUuidCreate(OrbisKernelUuid* orbisUuid) { s32 PS4_SYSV_ABI sceKernelUuidCreate(OrbisKernelUuid* orbisUuid) {
if (!orbisUuid) { if (!orbisUuid) {
return ORBIS_KERNEL_ERROR_EINVAL; return ORBIS_KERNEL_ERROR_EINVAL;
} }
@ -176,7 +176,7 @@ int PS4_SYSV_ABI sceKernelUuidCreate(OrbisKernelUuid* orbisUuid) {
return ORBIS_OK; return ORBIS_OK;
} }
int PS4_SYSV_ABI kernel_ioctl(int fd, u64 cmd, VA_ARGS) { s32 PS4_SYSV_ABI kernel_ioctl(s32 fd, u64 cmd, VA_ARGS) {
auto* h = Common::Singleton<Core::FileSys::HandleTable>::Instance(); auto* h = Common::Singleton<Core::FileSys::HandleTable>::Instance();
auto* file = h->GetFile(fd); auto* file = h->GetFile(fd);
if (file == nullptr) { if (file == nullptr) {
@ -190,7 +190,7 @@ int PS4_SYSV_ABI kernel_ioctl(int fd, u64 cmd, VA_ARGS) {
return -1; return -1;
} }
VA_CTX(ctx); VA_CTX(ctx);
int result = file->device->ioctl(cmd, &ctx); s32 result = file->device->ioctl(cmd, &ctx);
LOG_TRACE(Lib_Kernel, "ioctl: fd = {:X} cmd = {:X} result = {}", fd, cmd, result); LOG_TRACE(Lib_Kernel, "ioctl: fd = {:X} cmd = {:X} result = {}", fd, cmd, result);
if (result < 0) { if (result < 0) {
ErrSceToPosix(result); ErrSceToPosix(result);
@ -204,15 +204,15 @@ const char* PS4_SYSV_ABI sceKernelGetFsSandboxRandomWord() {
return path; return path;
} }
int PS4_SYSV_ABI _sigprocmask() { s32 PS4_SYSV_ABI _sigprocmask() {
return ORBIS_OK; return ORBIS_OK;
} }
int PS4_SYSV_ABI posix_getpagesize() { s32 PS4_SYSV_ABI posix_getpagesize() {
return 16_KB; return 16_KB;
} }
int PS4_SYSV_ABI posix_getsockname(Libraries::Net::OrbisNetId s, s32 PS4_SYSV_ABI posix_getsockname(Libraries::Net::OrbisNetId s,
Libraries::Net::OrbisNetSockaddr* addr, u32* paddrlen) { Libraries::Net::OrbisNetSockaddr* addr, u32* paddrlen) {
auto* netcall = Common::Singleton<Libraries::Net::NetInternal>::Instance(); auto* netcall = Common::Singleton<Libraries::Net::NetInternal>::Instance();
auto sock = netcall->FindSocket(s); auto sock = netcall->FindSocket(s);
@ -221,7 +221,7 @@ int PS4_SYSV_ABI posix_getsockname(Libraries::Net::OrbisNetId s,
LOG_ERROR(Lib_Net, "socket id is invalid = {}", s); LOG_ERROR(Lib_Net, "socket id is invalid = {}", s);
return -1; return -1;
} }
int returncode = sock->GetSocketAddress(addr, paddrlen); s32 returncode = sock->GetSocketAddress(addr, paddrlen);
if (returncode >= 0) { if (returncode >= 0) {
LOG_ERROR(Lib_Net, "return code : {:#x}", (u32)returncode); LOG_ERROR(Lib_Net, "return code : {:#x}", (u32)returncode);
return 0; return 0;
@ -230,6 +230,19 @@ int PS4_SYSV_ABI posix_getsockname(Libraries::Net::OrbisNetId s,
LOG_ERROR(Lib_Net, "error code returned : {:#x}", (u32)returncode); LOG_ERROR(Lib_Net, "error code returned : {:#x}", (u32)returncode);
return -1; return -1;
} }
// stubbed on non-devkit consoles
s32 PS4_SYSV_ABI sceKernelGetGPI() {
LOG_DEBUG(Kernel, "called");
return ORBIS_OK;
}
// stubbed on non-devkit consoles
s32 PS4_SYSV_ABI sceKernelSetGPO() {
LOG_DEBUG(Kernel, "called");
return ORBIS_OK;
}
void RegisterKernel(Core::Loader::SymbolsResolver* sym) { void RegisterKernel(Core::Loader::SymbolsResolver* sym) {
service_thread = std::jthread{KernelServiceThread}; service_thread = std::jthread{KernelServiceThread};
@ -277,6 +290,9 @@ void RegisterKernel(Core::Loader::SymbolsResolver* sym) {
LIB_FUNCTION("3e+4Iv7IJ8U", "libScePosix", 1, "libkernel", 1, 1, Libraries::Net::sys_accept); LIB_FUNCTION("3e+4Iv7IJ8U", "libScePosix", 1, "libkernel", 1, 1, Libraries::Net::sys_accept);
LIB_FUNCTION("aNeavPDNKzA", "libScePosix", 1, "libkernel", 1, 1, Libraries::Net::sys_sendmsg); LIB_FUNCTION("aNeavPDNKzA", "libScePosix", 1, "libkernel", 1, 1, Libraries::Net::sys_sendmsg);
LIB_FUNCTION("pxnCmagrtao", "libScePosix", 1, "libkernel", 1, 1, Libraries::Net::sys_listen); LIB_FUNCTION("pxnCmagrtao", "libScePosix", 1, "libkernel", 1, 1, Libraries::Net::sys_listen);
LIB_FUNCTION("4oXYe9Xmk0Q", "libkernel", 1, "libkernel", 1, 1, sceKernelGetGPI);
LIB_FUNCTION("ca7v6Cxulzs", "libkernel", 1, "libkernel", 1, 1, sceKernelSetGPO);
} }
} // namespace Libraries::Kernel } // namespace Libraries::Kernel

View File

@ -12,10 +12,10 @@ class SymbolsResolver;
namespace Libraries::Kernel { namespace Libraries::Kernel {
void ErrSceToPosix(int result); void ErrSceToPosix(s32 result);
int ErrnoToSceKernelError(int e); s32 ErrnoToSceKernelError(s32 e);
void SetPosixErrno(int e); void SetPosixErrno(s32 e);
int* PS4_SYSV_ABI __Error(); s32* PS4_SYSV_ABI __Error();
template <class F, F f> template <class F, F f>
struct OrbisWrapperImpl; struct OrbisWrapperImpl;
@ -33,7 +33,7 @@ struct OrbisWrapperImpl<PS4_SYSV_ABI R (*)(Args...), f> {
#define ORBIS(func) (Libraries::Kernel::OrbisWrapperImpl<decltype(&(func)), func>::wrap) #define ORBIS(func) (Libraries::Kernel::OrbisWrapperImpl<decltype(&(func)), func>::wrap)
int* PS4_SYSV_ABI __Error(); s32* PS4_SYSV_ABI __Error();
void RegisterKernel(Core::Loader::SymbolsResolver* sym); void RegisterKernel(Core::Loader::SymbolsResolver* sym);

View File

@ -23,8 +23,8 @@ u64 PS4_SYSV_ABI sceKernelGetDirectMemorySize() {
return memory->GetTotalDirectSize(); return memory->GetTotalDirectSize();
} }
int PS4_SYSV_ABI sceKernelAllocateDirectMemory(s64 searchStart, s64 searchEnd, u64 len, s32 PS4_SYSV_ABI sceKernelAllocateDirectMemory(s64 searchStart, s64 searchEnd, u64 len,
u64 alignment, int memoryType, s64* physAddrOut) { u64 alignment, s32 memoryType, s64* physAddrOut) {
if (searchStart < 0 || searchEnd < 0) { if (searchStart < 0 || searchEnd < 0) {
LOG_ERROR(Kernel_Vmm, "Invalid parameters!"); LOG_ERROR(Kernel_Vmm, "Invalid parameters!");
return ORBIS_KERNEL_ERROR_EINVAL; return ORBIS_KERNEL_ERROR_EINVAL;
@ -71,13 +71,13 @@ int PS4_SYSV_ABI sceKernelAllocateDirectMemory(s64 searchStart, s64 searchEnd, u
return ORBIS_OK; return ORBIS_OK;
} }
s32 PS4_SYSV_ABI sceKernelAllocateMainDirectMemory(size_t len, size_t alignment, int memoryType, s32 PS4_SYSV_ABI sceKernelAllocateMainDirectMemory(u64 len, u64 alignment, s32 memoryType,
s64* physAddrOut) { s64* physAddrOut) {
const auto searchEnd = static_cast<s64>(sceKernelGetDirectMemorySize()); const auto searchEnd = static_cast<s64>(sceKernelGetDirectMemorySize());
return sceKernelAllocateDirectMemory(0, searchEnd, len, alignment, memoryType, physAddrOut); return sceKernelAllocateDirectMemory(0, searchEnd, len, alignment, memoryType, physAddrOut);
} }
s32 PS4_SYSV_ABI sceKernelCheckedReleaseDirectMemory(u64 start, size_t len) { s32 PS4_SYSV_ABI sceKernelCheckedReleaseDirectMemory(u64 start, u64 len) {
if (len == 0) { if (len == 0) {
return ORBIS_OK; return ORBIS_OK;
} }
@ -87,7 +87,7 @@ s32 PS4_SYSV_ABI sceKernelCheckedReleaseDirectMemory(u64 start, size_t len) {
return ORBIS_OK; return ORBIS_OK;
} }
s32 PS4_SYSV_ABI sceKernelReleaseDirectMemory(u64 start, size_t len) { s32 PS4_SYSV_ABI sceKernelReleaseDirectMemory(u64 start, u64 len) {
if (len == 0) { if (len == 0) {
return ORBIS_OK; return ORBIS_OK;
} }
@ -96,9 +96,8 @@ s32 PS4_SYSV_ABI sceKernelReleaseDirectMemory(u64 start, size_t len) {
return ORBIS_OK; return ORBIS_OK;
} }
s32 PS4_SYSV_ABI sceKernelAvailableDirectMemorySize(u64 searchStart, u64 searchEnd, s32 PS4_SYSV_ABI sceKernelAvailableDirectMemorySize(u64 searchStart, u64 searchEnd, u64 alignment,
size_t alignment, u64* physAddrOut, u64* physAddrOut, u64* sizeOut) {
size_t* sizeOut) {
LOG_INFO(Kernel_Vmm, "called searchStart = {:#x}, searchEnd = {:#x}, alignment = {:#x}", LOG_INFO(Kernel_Vmm, "called searchStart = {:#x}, searchEnd = {:#x}, alignment = {:#x}",
searchStart, searchEnd, alignment); searchStart, searchEnd, alignment);
@ -109,7 +108,7 @@ s32 PS4_SYSV_ABI sceKernelAvailableDirectMemorySize(u64 searchStart, u64 searchE
auto* memory = Core::Memory::Instance(); auto* memory = Core::Memory::Instance();
PAddr physAddr{}; PAddr physAddr{};
size_t size{}; u64 size{};
s32 result = memory->DirectQueryAvailable(searchStart, searchEnd, alignment, &physAddr, &size); s32 result = memory->DirectQueryAvailable(searchStart, searchEnd, alignment, &physAddr, &size);
if (size == 0) { if (size == 0) {
@ -122,14 +121,14 @@ s32 PS4_SYSV_ABI sceKernelAvailableDirectMemorySize(u64 searchStart, u64 searchE
return result; return result;
} }
s32 PS4_SYSV_ABI sceKernelVirtualQuery(const void* addr, int flags, OrbisVirtualQueryInfo* info, s32 PS4_SYSV_ABI sceKernelVirtualQuery(const void* addr, s32 flags, OrbisVirtualQueryInfo* info,
size_t infoSize) { u64 infoSize) {
LOG_INFO(Kernel_Vmm, "called addr = {}, flags = {:#x}", fmt::ptr(addr), flags); LOG_INFO(Kernel_Vmm, "called addr = {}, flags = {:#x}", fmt::ptr(addr), flags);
auto* memory = Core::Memory::Instance(); auto* memory = Core::Memory::Instance();
return memory->VirtualQuery(std::bit_cast<VAddr>(addr), flags, info); return memory->VirtualQuery(std::bit_cast<VAddr>(addr), flags, info);
} }
s32 PS4_SYSV_ABI sceKernelReserveVirtualRange(void** addr, u64 len, int flags, u64 alignment) { s32 PS4_SYSV_ABI sceKernelReserveVirtualRange(void** addr, u64 len, s32 flags, u64 alignment) {
LOG_INFO(Kernel_Vmm, "addr = {}, len = {:#x}, flags = {:#x}, alignment = {:#x}", LOG_INFO(Kernel_Vmm, "addr = {}, len = {:#x}, flags = {:#x}, alignment = {:#x}",
fmt::ptr(*addr), len, flags, alignment); fmt::ptr(*addr), len, flags, alignment);
if (addr == nullptr) { if (addr == nullptr) {
@ -159,7 +158,7 @@ s32 PS4_SYSV_ABI sceKernelReserveVirtualRange(void** addr, u64 len, int flags, u
return result; return result;
} }
int PS4_SYSV_ABI sceKernelMapNamedDirectMemory(void** addr, u64 len, int prot, int flags, s32 PS4_SYSV_ABI sceKernelMapNamedDirectMemory(void** addr, u64 len, s32 prot, s32 flags,
s64 directMemoryStart, u64 alignment, s64 directMemoryStart, u64 alignment,
const char* name) { const char* name) {
LOG_INFO(Kernel_Vmm, LOG_INFO(Kernel_Vmm,
@ -202,7 +201,7 @@ int PS4_SYSV_ABI sceKernelMapNamedDirectMemory(void** addr, u64 len, int prot, i
return ret; return ret;
} }
int PS4_SYSV_ABI sceKernelMapDirectMemory(void** addr, u64 len, int prot, int flags, s32 PS4_SYSV_ABI sceKernelMapDirectMemory(void** addr, u64 len, s32 prot, s32 flags,
s64 directMemoryStart, u64 alignment) { s64 directMemoryStart, u64 alignment) {
LOG_INFO(Kernel_Vmm, "called, redirected to sceKernelMapNamedDirectMemory"); LOG_INFO(Kernel_Vmm, "called, redirected to sceKernelMapNamedDirectMemory");
return sceKernelMapNamedDirectMemory(addr, len, prot, flags, directMemoryStart, alignment, return sceKernelMapNamedDirectMemory(addr, len, prot, flags, directMemoryStart, alignment,
@ -255,7 +254,7 @@ s32 PS4_SYSV_ABI sceKernelMapFlexibleMemory(void** addr_in_out, u64 len, s32 pro
return sceKernelMapNamedFlexibleMemory(addr_in_out, len, prot, flags, "anon"); return sceKernelMapNamedFlexibleMemory(addr_in_out, len, prot, flags, "anon");
} }
int PS4_SYSV_ABI sceKernelQueryMemoryProtection(void* addr, void** start, void** end, u32* prot) { s32 PS4_SYSV_ABI sceKernelQueryMemoryProtection(void* addr, void** start, void** end, u32* prot) {
auto* memory = Core::Memory::Instance(); auto* memory = Core::Memory::Instance();
return memory->QueryProtection(std::bit_cast<VAddr>(addr), start, end, prot); return memory->QueryProtection(std::bit_cast<VAddr>(addr), start, end, prot);
} }
@ -285,14 +284,14 @@ s32 PS4_SYSV_ABI sceKernelMtypeprotect(const void* addr, u64 size, s32 mtype, s3
return memory_manager->Protect(std::bit_cast<VAddr>(addr), size, protection_flags); return memory_manager->Protect(std::bit_cast<VAddr>(addr), size, protection_flags);
} }
int PS4_SYSV_ABI sceKernelDirectMemoryQuery(u64 offset, int flags, OrbisQueryInfo* query_info, s32 PS4_SYSV_ABI sceKernelDirectMemoryQuery(u64 offset, s32 flags, OrbisQueryInfo* query_info,
size_t infoSize) { u64 infoSize) {
LOG_INFO(Kernel_Vmm, "called offset = {:#x}, flags = {:#x}", offset, flags); LOG_INFO(Kernel_Vmm, "called offset = {:#x}, flags = {:#x}", offset, flags);
auto* memory = Core::Memory::Instance(); auto* memory = Core::Memory::Instance();
return memory->DirectMemoryQuery(offset, flags == 1, query_info); return memory->DirectMemoryQuery(offset, flags == 1, query_info);
} }
s32 PS4_SYSV_ABI sceKernelAvailableFlexibleMemorySize(size_t* out_size) { s32 PS4_SYSV_ABI sceKernelAvailableFlexibleMemorySize(u64* out_size) {
auto* memory = Core::Memory::Instance(); auto* memory = Core::Memory::Instance();
*out_size = memory->GetAvailableFlexibleSize(); *out_size = memory->GetAvailableFlexibleSize();
LOG_INFO(Kernel_Vmm, "called size = {:#x}", *out_size); LOG_INFO(Kernel_Vmm, "called size = {:#x}", *out_size);
@ -304,7 +303,7 @@ void PS4_SYSV_ABI _sceKernelRtldSetApplicationHeapAPI(void* func[]) {
linker->SetHeapAPI(func); linker->SetHeapAPI(func);
} }
int PS4_SYSV_ABI sceKernelGetDirectMemoryType(u64 addr, int* directMemoryTypeOut, s32 PS4_SYSV_ABI sceKernelGetDirectMemoryType(u64 addr, s32* directMemoryTypeOut,
void** directMemoryStartOut, void** directMemoryStartOut,
void** directMemoryEndOut) { void** directMemoryEndOut) {
LOG_WARNING(Kernel_Vmm, "called, direct memory addr = {:#x}", addr); LOG_WARNING(Kernel_Vmm, "called, direct memory addr = {:#x}", addr);
@ -313,23 +312,23 @@ int PS4_SYSV_ABI sceKernelGetDirectMemoryType(u64 addr, int* directMemoryTypeOut
directMemoryEndOut); directMemoryEndOut);
} }
int PS4_SYSV_ABI sceKernelIsStack(void* addr, void** start, void** end) { s32 PS4_SYSV_ABI sceKernelIsStack(void* addr, void** start, void** end) {
LOG_DEBUG(Kernel_Vmm, "called, addr = {}", fmt::ptr(addr)); LOG_DEBUG(Kernel_Vmm, "called, addr = {}", fmt::ptr(addr));
auto* memory = Core::Memory::Instance(); auto* memory = Core::Memory::Instance();
return memory->IsStack(std::bit_cast<VAddr>(addr), start, end); return memory->IsStack(std::bit_cast<VAddr>(addr), start, end);
} }
s32 PS4_SYSV_ABI sceKernelBatchMap(OrbisKernelBatchMapEntry* entries, int numEntries, s32 PS4_SYSV_ABI sceKernelBatchMap(OrbisKernelBatchMapEntry* entries, s32 numEntries,
int* numEntriesOut) { s32* numEntriesOut) {
return sceKernelBatchMap2(entries, numEntries, numEntriesOut, return sceKernelBatchMap2(entries, numEntries, numEntriesOut,
MemoryFlags::SCE_KERNEL_MAP_FIXED); // 0x10, 0x410? MemoryFlags::SCE_KERNEL_MAP_FIXED); // 0x10, 0x410?
} }
s32 PS4_SYSV_ABI sceKernelBatchMap2(OrbisKernelBatchMapEntry* entries, int numEntries, s32 PS4_SYSV_ABI sceKernelBatchMap2(OrbisKernelBatchMapEntry* entries, s32 numEntries,
int* numEntriesOut, int flags) { s32* numEntriesOut, s32 flags) {
int result = ORBIS_OK; s32 result = ORBIS_OK;
int processed = 0; s32 processed = 0;
for (int i = 0; i < numEntries; i++, processed++) { for (s32 i = 0; i < numEntries; i++, processed++) {
if (entries == nullptr || entries[i].length == 0 || entries[i].operation > 4) { if (entries == nullptr || entries[i].length == 0 || entries[i].operation > 4) {
result = ORBIS_KERNEL_ERROR_EINVAL; result = ORBIS_KERNEL_ERROR_EINVAL;
break; // break and assign a value to numEntriesOut. break; // break and assign a value to numEntriesOut.
@ -619,7 +618,7 @@ s32 PS4_SYSV_ABI sceKernelConfiguredFlexibleMemorySize(u64* sizeOut) {
return ORBIS_OK; return ORBIS_OK;
} }
int PS4_SYSV_ABI sceKernelMunmap(void* addr, size_t len) { s32 PS4_SYSV_ABI sceKernelMunmap(void* addr, u64 len) {
LOG_INFO(Kernel_Vmm, "addr = {}, len = {:#x}", fmt::ptr(addr), len); LOG_INFO(Kernel_Vmm, "addr = {}, len = {:#x}", fmt::ptr(addr), len);
if (len == 0) { if (len == 0) {
return ORBIS_KERNEL_ERROR_EINVAL; return ORBIS_KERNEL_ERROR_EINVAL;
@ -628,8 +627,8 @@ int PS4_SYSV_ABI sceKernelMunmap(void* addr, size_t len) {
return memory->UnmapMemory(std::bit_cast<VAddr>(addr), len); return memory->UnmapMemory(std::bit_cast<VAddr>(addr), len);
} }
int PS4_SYSV_ABI posix_munmap(void* addr, size_t len) { s32 PS4_SYSV_ABI posix_munmap(void* addr, u64 len) {
int result = sceKernelMunmap(addr, len); s32 result = sceKernelMunmap(addr, len);
if (result < 0) { if (result < 0) {
LOG_ERROR(Kernel_Pthread, "posix_munmap: error = {}", result); LOG_ERROR(Kernel_Pthread, "posix_munmap: error = {}", result);
ErrSceToPosix(result); ErrSceToPosix(result);
@ -638,12 +637,12 @@ int PS4_SYSV_ABI posix_munmap(void* addr, size_t len) {
return result; return result;
} }
static constexpr int MAX_PRT_APERTURES = 3; static constexpr s32 MAX_PRT_APERTURES = 3;
static constexpr VAddr PRT_AREA_START_ADDR = 0x1000000000; static constexpr VAddr PRT_AREA_START_ADDR = 0x1000000000;
static constexpr size_t PRT_AREA_SIZE = 0xec00000000; static constexpr u64 PRT_AREA_SIZE = 0xec00000000;
static std::array<std::pair<VAddr, size_t>, MAX_PRT_APERTURES> PrtApertures{}; static std::array<std::pair<VAddr, u64>, MAX_PRT_APERTURES> PrtApertures{};
int PS4_SYSV_ABI sceKernelSetPrtAperture(int id, VAddr address, size_t size) { s32 PS4_SYSV_ABI sceKernelSetPrtAperture(s32 id, VAddr address, u64 size) {
if (id < 0 || id >= MAX_PRT_APERTURES) { if (id < 0 || id >= MAX_PRT_APERTURES) {
return ORBIS_KERNEL_ERROR_EINVAL; return ORBIS_KERNEL_ERROR_EINVAL;
} }
@ -667,7 +666,7 @@ int PS4_SYSV_ABI sceKernelSetPrtAperture(int id, VAddr address, size_t size) {
return ORBIS_OK; return ORBIS_OK;
} }
int PS4_SYSV_ABI sceKernelGetPrtAperture(int id, VAddr* address, size_t* size) { s32 PS4_SYSV_ABI sceKernelGetPrtAperture(s32 id, VAddr* address, u64* size) {
if (id < 0 || id >= MAX_PRT_APERTURES) { if (id < 0 || id >= MAX_PRT_APERTURES) {
return ORBIS_KERNEL_ERROR_EINVAL; return ORBIS_KERNEL_ERROR_EINVAL;
} }

View File

@ -52,13 +52,13 @@ constexpr u32 ORBIS_KERNEL_MAXIMUM_NAME_LENGTH = 32;
struct OrbisQueryInfo { struct OrbisQueryInfo {
uintptr_t start; uintptr_t start;
uintptr_t end; uintptr_t end;
int memoryType; s32 memoryType;
}; };
struct OrbisVirtualQueryInfo { struct OrbisVirtualQueryInfo {
uintptr_t start; uintptr_t start;
uintptr_t end; uintptr_t end;
size_t offset; u64 offset;
s32 protection; s32 protection;
s32 memory_type; s32 memory_type;
u8 is_flexible : 1; u8 is_flexible : 1;
@ -73,12 +73,12 @@ static_assert(sizeof(OrbisVirtualQueryInfo) == 72,
struct OrbisKernelBatchMapEntry { struct OrbisKernelBatchMapEntry {
void* start; void* start;
size_t offset; u64 offset;
size_t length; u64 length;
char protection; char protection;
char type; char type;
short reserved; s16 reserved;
int operation; s32 operation;
}; };
enum class OrbisKernelMemoryPoolOpcode : u32 { enum class OrbisKernelMemoryPoolOpcode : u32 {
@ -124,45 +124,44 @@ struct OrbisKernelMemoryPoolBatchEntry {
}; };
u64 PS4_SYSV_ABI sceKernelGetDirectMemorySize(); u64 PS4_SYSV_ABI sceKernelGetDirectMemorySize();
int PS4_SYSV_ABI sceKernelAllocateDirectMemory(s64 searchStart, s64 searchEnd, u64 len, s32 PS4_SYSV_ABI sceKernelAllocateDirectMemory(s64 searchStart, s64 searchEnd, u64 len,
u64 alignment, int memoryType, s64* physAddrOut); u64 alignment, s32 memoryType, s64* physAddrOut);
int PS4_SYSV_ABI sceKernelMapNamedDirectMemory(void** addr, u64 len, int prot, int flags, s32 PS4_SYSV_ABI sceKernelMapNamedDirectMemory(void** addr, u64 len, s32 prot, s32 flags,
s64 directMemoryStart, u64 alignment, s64 directMemoryStart, u64 alignment,
const char* name); const char* name);
int PS4_SYSV_ABI sceKernelMapDirectMemory(void** addr, u64 len, int prot, int flags, s32 PS4_SYSV_ABI sceKernelMapDirectMemory(void** addr, u64 len, s32 prot, s32 flags,
s64 directMemoryStart, u64 alignment); s64 directMemoryStart, u64 alignment);
s32 PS4_SYSV_ABI sceKernelAllocateMainDirectMemory(size_t len, size_t alignment, int memoryType, s32 PS4_SYSV_ABI sceKernelAllocateMainDirectMemory(u64 len, u64 alignment, s32 memoryType,
s64* physAddrOut); s64* physAddrOut);
s32 PS4_SYSV_ABI sceKernelReleaseDirectMemory(u64 start, size_t len); s32 PS4_SYSV_ABI sceKernelReleaseDirectMemory(u64 start, u64 len);
s32 PS4_SYSV_ABI sceKernelCheckedReleaseDirectMemory(u64 start, size_t len); s32 PS4_SYSV_ABI sceKernelCheckedReleaseDirectMemory(u64 start, u64 len);
s32 PS4_SYSV_ABI sceKernelAvailableDirectMemorySize(u64 searchStart, u64 searchEnd, s32 PS4_SYSV_ABI sceKernelAvailableDirectMemorySize(u64 searchStart, u64 searchEnd, u64 alignment,
size_t alignment, u64* physAddrOut, u64* physAddrOut, u64* sizeOut);
size_t* sizeOut); s32 PS4_SYSV_ABI sceKernelVirtualQuery(const void* addr, s32 flags, OrbisVirtualQueryInfo* info,
s32 PS4_SYSV_ABI sceKernelVirtualQuery(const void* addr, int flags, OrbisVirtualQueryInfo* info, u64 infoSize);
size_t infoSize); s32 PS4_SYSV_ABI sceKernelReserveVirtualRange(void** addr, u64 len, s32 flags, u64 alignment);
s32 PS4_SYSV_ABI sceKernelReserveVirtualRange(void** addr, u64 len, int flags, u64 alignment);
s32 PS4_SYSV_ABI sceKernelMapNamedFlexibleMemory(void** addr_in_out, u64 len, s32 prot, s32 flags, s32 PS4_SYSV_ABI sceKernelMapNamedFlexibleMemory(void** addr_in_out, u64 len, s32 prot, s32 flags,
const char* name); const char* name);
s32 PS4_SYSV_ABI sceKernelMapFlexibleMemory(void** addr_in_out, u64 len, s32 prot, s32 flags); s32 PS4_SYSV_ABI sceKernelMapFlexibleMemory(void** addr_in_out, u64 len, s32 prot, s32 flags);
int PS4_SYSV_ABI sceKernelQueryMemoryProtection(void* addr, void** start, void** end, u32* prot); s32 PS4_SYSV_ABI sceKernelQueryMemoryProtection(void* addr, void** start, void** end, u32* prot);
s32 PS4_SYSV_ABI sceKernelMprotect(const void* addr, u64 size, s32 prot); s32 PS4_SYSV_ABI sceKernelMprotect(const void* addr, u64 size, s32 prot);
s32 PS4_SYSV_ABI sceKernelMtypeprotect(const void* addr, u64 size, s32 mtype, s32 prot); s32 PS4_SYSV_ABI sceKernelMtypeprotect(const void* addr, u64 size, s32 mtype, s32 prot);
int PS4_SYSV_ABI sceKernelDirectMemoryQuery(u64 offset, int flags, OrbisQueryInfo* query_info, s32 PS4_SYSV_ABI sceKernelDirectMemoryQuery(u64 offset, s32 flags, OrbisQueryInfo* query_info,
size_t infoSize); u64 infoSize);
s32 PS4_SYSV_ABI sceKernelAvailableFlexibleMemorySize(size_t* sizeOut); s32 PS4_SYSV_ABI sceKernelAvailableFlexibleMemorySize(u64* sizeOut);
void PS4_SYSV_ABI _sceKernelRtldSetApplicationHeapAPI(void* func[]); void PS4_SYSV_ABI _sceKernelRtldSetApplicationHeapAPI(void* func[]);
int PS4_SYSV_ABI sceKernelGetDirectMemoryType(u64 addr, int* directMemoryTypeOut, s32 PS4_SYSV_ABI sceKernelGetDirectMemoryType(u64 addr, s32* directMemoryTypeOut,
void** directMemoryStartOut, void** directMemoryStartOut,
void** directMemoryEndOut); void** directMemoryEndOut);
int PS4_SYSV_ABI sceKernelIsStack(void* addr, void** start, void** end); s32 PS4_SYSV_ABI sceKernelIsStack(void* addr, void** start, void** end);
s32 PS4_SYSV_ABI sceKernelBatchMap(OrbisKernelBatchMapEntry* entries, int numEntries, s32 PS4_SYSV_ABI sceKernelBatchMap(OrbisKernelBatchMapEntry* entries, s32 numEntries,
int* numEntriesOut); s32* numEntriesOut);
s32 PS4_SYSV_ABI sceKernelBatchMap2(OrbisKernelBatchMapEntry* entries, int numEntries, s32 PS4_SYSV_ABI sceKernelBatchMap2(OrbisKernelBatchMapEntry* entries, s32 numEntries,
int* numEntriesOut, int flags); s32* numEntriesOut, s32 flags);
s32 PS4_SYSV_ABI sceKernelSetVirtualRangeName(const void* addr, u64 len, const char* name); s32 PS4_SYSV_ABI sceKernelSetVirtualRangeName(const void* addr, u64 len, const char* name);
@ -175,7 +174,7 @@ s32 PS4_SYSV_ABI sceKernelMemoryPoolDecommit(void* addr, u64 len, s32 flags);
s32 PS4_SYSV_ABI sceKernelMemoryPoolBatch(const OrbisKernelMemoryPoolBatchEntry* entries, s32 count, s32 PS4_SYSV_ABI sceKernelMemoryPoolBatch(const OrbisKernelMemoryPoolBatchEntry* entries, s32 count,
s32* num_processed, s32 flags); s32* num_processed, s32 flags);
int PS4_SYSV_ABI sceKernelMunmap(void* addr, size_t len); s32 PS4_SYSV_ABI sceKernelMunmap(void* addr, u64 len);
void RegisterMemory(Core::Loader::SymbolsResolver* sym); void RegisterMemory(Core::Loader::SymbolsResolver* sym);

View File

@ -103,7 +103,7 @@ s32 PS4_SYSV_ABI sceKernelGetModuleInfoForUnwind(VAddr addr, s32 flags,
auto* linker = Common::Singleton<Core::Linker>::Instance(); auto* linker = Common::Singleton<Core::Linker>::Instance();
auto* module = linker->FindByAddress(addr); auto* module = linker->FindByAddress(addr);
if (!module) { if (!module) {
return ORBIS_KERNEL_ERROR_EFAULT; return ORBIS_KERNEL_ERROR_ESRCH;
} }
const auto mod_info = module->GetModuleInfoEx(); const auto mod_info = module->GetModuleInfoEx();
@ -118,11 +118,23 @@ s32 PS4_SYSV_ABI sceKernelGetModuleInfoForUnwind(VAddr addr, s32 flags,
return ORBIS_OK; return ORBIS_OK;
} }
int PS4_SYSV_ABI sceKernelGetModuleInfoFromAddr(VAddr addr, int flags, s32 PS4_SYSV_ABI sceKernelGetModuleInfoFromAddr(VAddr addr, s32 flags,
Core::OrbisKernelModuleInfoEx* info) { Core::OrbisKernelModuleInfoEx* info) {
if (flags >= 3) {
std::memset(info, 0, sizeof(Core::OrbisKernelModuleInfoEx));
return ORBIS_KERNEL_ERROR_EINVAL;
}
if (info == nullptr) {
return ORBIS_KERNEL_ERROR_EFAULT;
}
LOG_INFO(Lib_Kernel, "called addr = {:#x}, flags = {:#x}", addr, flags); LOG_INFO(Lib_Kernel, "called addr = {:#x}, flags = {:#x}", addr, flags);
auto* linker = Common::Singleton<Core::Linker>::Instance(); auto* linker = Common::Singleton<Core::Linker>::Instance();
auto* module = linker->FindByAddress(addr); auto* module = linker->FindByAddress(addr);
if (!module) {
return ORBIS_KERNEL_ERROR_ESRCH;
}
*info = module->GetModuleInfoEx(); *info = module->GetModuleInfoEx();
return ORBIS_OK; return ORBIS_OK;
} }

View File

@ -100,6 +100,11 @@ s32 SystemSetupCore(StackBuffer* stackBuffer, const OrbisNgs2SystemOption* optio
return ORBIS_NGS2_ERROR_INVALID_SAMPLE_RATE; return ORBIS_NGS2_ERROR_INVALID_SAMPLE_RATE;
} }
if (outSystem) {
// dummy handle
outSystem->systemHandle = 1;
}
return ORBIS_OK; return ORBIS_OK;
} }

View File

@ -199,6 +199,10 @@ int PS4_SYSV_ABI sceNpTrophyDestroyContext(OrbisNpTrophyContext context) {
Common::SlotId contextId; Common::SlotId contextId;
contextId.index = context - 1; contextId.index = context - 1;
if (contextId.index >= trophy_contexts.size()) {
return ORBIS_NP_TROPHY_ERROR_INVALID_CONTEXT;
}
ContextKey contextkey = trophy_contexts[contextId]; ContextKey contextkey = trophy_contexts[contextId];
trophy_contexts.erase(contextId); trophy_contexts.erase(contextId);
contexts_internal.erase(contextkey); contexts_internal.erase(contextkey);

View File

@ -447,21 +447,18 @@ int PS4_SYSV_ABI scePadReadState(s32 handle, OrbisPadData* pData) {
// Only do this on handle 1 for now // Only do this on handle 1 for now
if (engine && handle == 1) { if (engine && handle == 1) {
const auto gyro_poll_rate = engine->GetAccelPollRate(); auto now = std::chrono::steady_clock::now();
if (gyro_poll_rate != 0.0f) { float deltaTime =
auto now = std::chrono::steady_clock::now(); std::chrono::duration_cast<std::chrono::microseconds>(now - controller->GetLastUpdate())
float deltaTime = std::chrono::duration_cast<std::chrono::microseconds>( .count() /
now - controller->GetLastUpdate()) 1000000.0f;
.count() / controller->SetLastUpdate(now);
1000000.0f; Libraries::Pad::OrbisFQuaternion lastOrientation = controller->GetLastOrientation();
controller->SetLastUpdate(now); Libraries::Pad::OrbisFQuaternion outputOrientation = {0.0f, 0.0f, 0.0f, 1.0f};
Libraries::Pad::OrbisFQuaternion lastOrientation = controller->GetLastOrientation(); GameController::CalculateOrientation(pData->acceleration, pData->angularVelocity, deltaTime,
Libraries::Pad::OrbisFQuaternion outputOrientation = {0.0f, 0.0f, 0.0f, 1.0f}; lastOrientation, outputOrientation);
GameController::CalculateOrientation(pData->acceleration, pData->angularVelocity, pData->orientation = outputOrientation;
deltaTime, lastOrientation, outputOrientation); controller->SetLastOrientation(outputOrientation);
pData->orientation = outputOrientation;
controller->SetLastOrientation(outputOrientation);
}
} }
pData->touchData.touchNum = pData->touchData.touchNum =
(state.touchpad[0].state ? 1 : 0) + (state.touchpad[1].state ? 1 : 0); (state.touchpad[0].state ? 1 : 0) + (state.touchpad[1].state ? 1 : 0);

View File

@ -22,25 +22,25 @@ static Core::FileSys::MntPoints* g_mnt = Common::Singleton<Core::FileSys::MntPoi
namespace fs = std::filesystem; namespace fs = std::filesystem;
// clang-format off // clang-format off
static const std::unordered_map<std::string, std::string> default_title = { static const std::unordered_map<int, std::string> default_title = {
{"ja_JP", "セーブデータ"}, {0/*"ja_JP"*/, "セーブデータ"},
{"en_US", "Saved Data"}, {1/*"en_US"*/, "Saved Data"},
{"fr_FR", "Données sauvegardées"}, {2/*"fr_FR"*/, "Données sauvegardées"},
{"es_ES", "Datos guardados"}, {3/*"es_ES"*/, "Datos guardados"},
{"de_DE", "Gespeicherte Daten"}, {4/*"de_DE"*/, "Gespeicherte Daten"},
{"it_IT", "Dati salvati"}, {5/*"it_IT"*/, "Dati salvati"},
{"nl_NL", "Opgeslagen data"}, {6/*"nl_NL"*/, "Opgeslagen data"},
{"pt_PT", "Dados guardados"}, {7/*"pt_PT"*/, "Dados guardados"},
{"ru_RU", "Сохраненные данные"}, {8/*"ru_RU"*/, "Сохраненные данные"},
{"ko_KR", "저장 데이터"}, {9/*"ko_KR"*/, "저장 데이터"},
{"zh_CN", "保存数据"}, {10/*"zh_CN"*/, "保存数据"},
{"fi_FI", "Tallennetut tiedot"}, {12/*"fi_FI"*/, "Tallennetut tiedot"},
{"sv_SE", "Sparade data"}, {13/*"sv_SE"*/, "Sparade data"},
{"da_DK", "Gemte data"}, {14/*"da_DK"*/, "Gemte data"},
{"no_NO", "Lagrede data"}, {15/*"no_NO"*/, "Lagrede data"},
{"pl_PL", "Zapisane dane"}, {16/*"pl_PL"*/, "Zapisane dane"},
{"pt_BR", "Dados salvos"}, {17/*"pt_BR"*/, "Dados salvos"},
{"tr_TR", "Kayıtlı Veriler"}, {19/*"tr_TR"*/, "Kayıtlı Veriler"},
}; };
// clang-format on // clang-format on
@ -71,9 +71,9 @@ fs::path SaveInstance::GetParamSFOPath(const fs::path& dir_path) {
void SaveInstance::SetupDefaultParamSFO(PSF& param_sfo, std::string dir_name, void SaveInstance::SetupDefaultParamSFO(PSF& param_sfo, std::string dir_name,
std::string game_serial) { std::string game_serial) {
std::string locale = Config::getEmulatorLanguage(); int locale = Config::GetLanguage();
if (!default_title.contains(locale)) { if (!default_title.contains(locale)) {
locale = "en_US"; locale = 1; // default to en_US if not found
} }
#define P(type, key, ...) param_sfo.Add##type(std::string{key}, __VA_ARGS__) #define P(type, key, ...) param_sfo.Add##type(std::string{key}, __VA_ARGS__)

View File

@ -171,19 +171,40 @@ s32 PS4_SYSV_ABI sceVideodec2GetPictureInfo(const OrbisVideodec2OutputInfo* outp
LOG_ERROR(Lib_Vdec2, "Invalid struct size"); LOG_ERROR(Lib_Vdec2, "Invalid struct size");
return ORBIS_VIDEODEC2_ERROR_STRUCT_SIZE; return ORBIS_VIDEODEC2_ERROR_STRUCT_SIZE;
} }
if (outputInfo->pictureCount == 0 || gPictureInfos.empty()) { if (outputInfo->pictureCount == 0) {
LOG_ERROR(Lib_Vdec2, "No picture info available"); LOG_ERROR(Lib_Vdec2, "No picture info available");
return ORBIS_OK; return ORBIS_OK;
} }
if (p1stPictureInfoOut) { // If the game uses the older Videodec2 structs, we need to accomodate that.
OrbisVideodec2AvcPictureInfo* picInfo = if (outputInfo->thisSize != sizeof(OrbisVideodec2OutputInfo)) {
static_cast<OrbisVideodec2AvcPictureInfo*>(p1stPictureInfoOut); if (gLegacyPictureInfos.empty()) {
if ((picInfo->thisSize | 16) != sizeof(OrbisVideodec2AvcPictureInfo)) { LOG_ERROR(Lib_Vdec2, "No picture info available");
LOG_ERROR(Lib_Vdec2, "Invalid struct size"); return ORBIS_OK;
return ORBIS_VIDEODEC2_ERROR_STRUCT_SIZE; }
if (p1stPictureInfoOut) {
OrbisVideodec2LegacyAvcPictureInfo* picInfo =
static_cast<OrbisVideodec2LegacyAvcPictureInfo*>(p1stPictureInfoOut);
if (picInfo->thisSize != sizeof(OrbisVideodec2LegacyAvcPictureInfo)) {
LOG_ERROR(Lib_Vdec2, "Invalid struct size");
return ORBIS_VIDEODEC2_ERROR_STRUCT_SIZE;
}
*picInfo = gLegacyPictureInfos.back();
}
} else {
if (gPictureInfos.empty()) {
LOG_ERROR(Lib_Vdec2, "No picture info available");
return ORBIS_OK;
}
if (p1stPictureInfoOut) {
OrbisVideodec2AvcPictureInfo* picInfo =
static_cast<OrbisVideodec2AvcPictureInfo*>(p1stPictureInfoOut);
if (picInfo->thisSize != sizeof(OrbisVideodec2AvcPictureInfo)) {
LOG_ERROR(Lib_Vdec2, "Invalid struct size");
return ORBIS_VIDEODEC2_ERROR_STRUCT_SIZE;
}
*picInfo = gPictureInfos.back();
} }
*picInfo = gPictureInfos.back();
} }
if (outputInfo->pictureCount > 1) { if (outputInfo->pictureCount > 1) {

View File

@ -74,4 +74,57 @@ struct OrbisVideodec2AvcPictureInfo {
}; };
static_assert(sizeof(OrbisVideodec2AvcPictureInfo) == 0x78); static_assert(sizeof(OrbisVideodec2AvcPictureInfo) == 0x78);
// An older version of the OrbisVideodec2AvcPictureInfo struct
// Keeping this is needed for compatiblity with older games.
struct OrbisVideodec2LegacyAvcPictureInfo {
u64 thisSize;
bool isValid;
u64 ptsData;
u64 dtsData;
u64 attachedData;
u8 idrPictureflag;
u8 profile_idc;
u8 level_idc;
u32 pic_width_in_mbs_minus1;
u32 pic_height_in_map_units_minus1;
u8 frame_mbs_only_flag;
u8 frame_cropping_flag;
u32 frameCropLeftOffset;
u32 frameCropRightOffset;
u32 frameCropTopOffset;
u32 frameCropBottomOffset;
u8 aspect_ratio_info_present_flag;
u8 aspect_ratio_idc;
u16 sar_width;
u16 sar_height;
u8 video_signal_type_present_flag;
u8 video_format;
u8 video_full_range_flag;
u8 colour_description_present_flag;
u8 colour_primaries;
u8 transfer_characteristics;
u8 matrix_coefficients;
u8 timing_info_present_flag;
u32 num_units_in_tick;
u32 time_scale;
u8 fixed_frame_rate_flag;
u8 bitstream_restriction_flag;
u8 max_dec_frame_buffering;
u8 pic_struct_present_flag;
u8 pic_struct;
u8 field_pic_flag;
u8 bottom_field_flag;
};
static_assert(sizeof(OrbisVideodec2LegacyAvcPictureInfo) == 0x68);
} // namespace Libraries::Vdec2 } // namespace Libraries::Vdec2

View File

@ -12,6 +12,7 @@
namespace Libraries::Vdec2 { namespace Libraries::Vdec2 {
std::vector<OrbisVideodec2AvcPictureInfo> gPictureInfos; std::vector<OrbisVideodec2AvcPictureInfo> gPictureInfos;
std::vector<OrbisVideodec2LegacyAvcPictureInfo> gLegacyPictureInfos;
static inline void CopyNV12Data(u8* dst, const AVFrame& src) { static inline void CopyNV12Data(u8* dst, const AVFrame& src) {
std::memcpy(dst, src.data[0], src.width * src.height); std::memcpy(dst, src.data[0], src.width * src.height);
@ -117,27 +118,46 @@ s32 VdecDecoder::Decode(const OrbisVideodec2InputData& inputData,
outputInfo.isErrorFrame = false; outputInfo.isErrorFrame = false;
outputInfo.pictureCount = 1; // TODO: 2 pictures for interlaced video outputInfo.pictureCount = 1; // TODO: 2 pictures for interlaced video
// Only set framePitchInBytes if the game uses the newer struct version. // For proper compatibility with older games, check the inputted OutputInfo struct size.
if (outputInfo.thisSize == sizeof(OrbisVideodec2OutputInfo)) { if (outputInfo.thisSize == sizeof(OrbisVideodec2OutputInfo)) {
// framePitchInBytes only exists in the newer struct.
outputInfo.framePitchInBytes = frame->linesize[0]; outputInfo.framePitchInBytes = frame->linesize[0];
} if (outputInfo.isValid) {
OrbisVideodec2AvcPictureInfo pictureInfo = {};
if (outputInfo.isValid) { pictureInfo.thisSize = sizeof(OrbisVideodec2AvcPictureInfo);
OrbisVideodec2AvcPictureInfo pictureInfo = {}; pictureInfo.isValid = true;
pictureInfo.thisSize = sizeof(OrbisVideodec2AvcPictureInfo); pictureInfo.ptsData = inputData.ptsData;
pictureInfo.isValid = true; pictureInfo.dtsData = inputData.dtsData;
pictureInfo.attachedData = inputData.attachedData;
pictureInfo.ptsData = inputData.ptsData; pictureInfo.frameCropLeftOffset = frame->crop_left;
pictureInfo.dtsData = inputData.dtsData; pictureInfo.frameCropRightOffset = frame->crop_right;
pictureInfo.attachedData = inputData.attachedData; pictureInfo.frameCropTopOffset = frame->crop_top;
pictureInfo.frameCropBottomOffset = frame->crop_bottom;
pictureInfo.frameCropLeftOffset = frame->crop_left; gPictureInfos.push_back(pictureInfo);
pictureInfo.frameCropRightOffset = frame->crop_right; }
pictureInfo.frameCropTopOffset = frame->crop_top; } else {
pictureInfo.frameCropBottomOffset = frame->crop_bottom; if (outputInfo.isValid) {
// If the game uses the older struct versions, we need to use it too.
OrbisVideodec2LegacyAvcPictureInfo pictureInfo = {};
gPictureInfos.push_back(pictureInfo); pictureInfo.thisSize = sizeof(OrbisVideodec2LegacyAvcPictureInfo);
pictureInfo.isValid = true;
pictureInfo.ptsData = inputData.ptsData;
pictureInfo.dtsData = inputData.dtsData;
pictureInfo.attachedData = inputData.attachedData;
pictureInfo.frameCropLeftOffset = frame->crop_left;
pictureInfo.frameCropRightOffset = frame->crop_right;
pictureInfo.frameCropTopOffset = frame->crop_top;
pictureInfo.frameCropBottomOffset = frame->crop_bottom;
gLegacyPictureInfos.push_back(pictureInfo);
}
} }
} }

View File

@ -16,6 +16,7 @@ extern "C" {
namespace Libraries::Vdec2 { namespace Libraries::Vdec2 {
extern std::vector<OrbisVideodec2AvcPictureInfo> gPictureInfos; extern std::vector<OrbisVideodec2AvcPictureInfo> gPictureInfos;
extern std::vector<OrbisVideodec2LegacyAvcPictureInfo> gLegacyPictureInfos;
class VdecDecoder { class VdecDecoder {
public: public:

View File

@ -17,11 +17,11 @@ namespace Core {
MemoryManager::MemoryManager() { MemoryManager::MemoryManager() {
// Insert a virtual memory area that covers the entire area we manage. // Insert a virtual memory area that covers the entire area we manage.
const VAddr system_managed_base = impl.SystemManagedVirtualBase(); const VAddr system_managed_base = impl.SystemManagedVirtualBase();
const size_t system_managed_size = impl.SystemManagedVirtualSize(); const u64 system_managed_size = impl.SystemManagedVirtualSize();
const VAddr system_reserved_base = impl.SystemReservedVirtualBase(); const VAddr system_reserved_base = impl.SystemReservedVirtualBase();
const size_t system_reserved_size = impl.SystemReservedVirtualSize(); const u64 system_reserved_size = impl.SystemReservedVirtualSize();
const VAddr user_base = impl.UserVirtualBase(); const VAddr user_base = impl.UserVirtualBase();
const size_t user_size = impl.UserVirtualSize(); const u64 user_size = impl.UserVirtualSize();
vma_map.emplace(system_managed_base, vma_map.emplace(system_managed_base,
VirtualMemoryArea{system_managed_base, system_managed_size}); VirtualMemoryArea{system_managed_base, system_managed_size});
vma_map.emplace(system_reserved_base, vma_map.emplace(system_reserved_base,
@ -148,7 +148,7 @@ bool MemoryManager::TryWriteBacking(void* address, const void* data, u32 num_byt
return true; return true;
} }
PAddr MemoryManager::PoolExpand(PAddr search_start, PAddr search_end, size_t size, u64 alignment) { PAddr MemoryManager::PoolExpand(PAddr search_start, PAddr search_end, u64 size, u64 alignment) {
std::scoped_lock lk{mutex}; std::scoped_lock lk{mutex};
alignment = alignment > 0 ? alignment : 64_KB; alignment = alignment > 0 ? alignment : 64_KB;
@ -188,8 +188,8 @@ PAddr MemoryManager::PoolExpand(PAddr search_start, PAddr search_end, size_t siz
return mapping_start; return mapping_start;
} }
PAddr MemoryManager::Allocate(PAddr search_start, PAddr search_end, size_t size, u64 alignment, PAddr MemoryManager::Allocate(PAddr search_start, PAddr search_end, u64 size, u64 alignment,
int memory_type) { s32 memory_type) {
std::scoped_lock lk{mutex}; std::scoped_lock lk{mutex};
alignment = alignment > 0 ? alignment : 16_KB; alignment = alignment > 0 ? alignment : 16_KB;
@ -226,7 +226,7 @@ PAddr MemoryManager::Allocate(PAddr search_start, PAddr search_end, size_t size,
return mapping_start; return mapping_start;
} }
void MemoryManager::Free(PAddr phys_addr, size_t size) { void MemoryManager::Free(PAddr phys_addr, u64 size) {
std::scoped_lock lk{mutex}; std::scoped_lock lk{mutex};
auto dmem_area = CarveDmemArea(phys_addr, size); auto dmem_area = CarveDmemArea(phys_addr, size);
@ -256,7 +256,7 @@ void MemoryManager::Free(PAddr phys_addr, size_t size) {
MergeAdjacent(dmem_map, dmem_area); MergeAdjacent(dmem_map, dmem_area);
} }
int MemoryManager::PoolCommit(VAddr virtual_addr, size_t size, MemoryProt prot) { s32 MemoryManager::PoolCommit(VAddr virtual_addr, u64 size, MemoryProt prot) {
std::scoped_lock lk{mutex}; std::scoped_lock lk{mutex};
const u64 alignment = 64_KB; const u64 alignment = 64_KB;
@ -320,6 +320,28 @@ s32 MemoryManager::MapMemory(void** out_addr, VAddr virtual_addr, u64 size, Memo
return ORBIS_KERNEL_ERROR_ENOMEM; return ORBIS_KERNEL_ERROR_ENOMEM;
} }
// Validate the requested physical address range
if (phys_addr != -1) {
u64 validated_size = 0;
do {
auto dmem_area = FindDmemArea(phys_addr + validated_size)->second;
// If any requested dmem area is not allocated, return an error.
if (dmem_area.is_free) {
LOG_ERROR(Kernel_Vmm, "Unable to map {:#x} bytes at physical address {:#x}", size,
phys_addr);
return ORBIS_KERNEL_ERROR_ENOMEM;
}
// Track how much we've validated.
validated_size += dmem_area.size - (phys_addr + validated_size - dmem_area.base);
} while (validated_size < size && phys_addr + validated_size < GetTotalDirectSize());
// If the requested range goes outside the dmem map, return an error.
if (validated_size < size) {
LOG_ERROR(Kernel_Vmm, "Unable to map {:#x} bytes at physical address {:#x}", size,
phys_addr);
return ORBIS_KERNEL_ERROR_ENOMEM;
}
}
// Limit the minumum address to SystemManagedVirtualBase to prevent hardware-specific issues. // Limit the minumum address to SystemManagedVirtualBase to prevent hardware-specific issues.
VAddr mapped_addr = (virtual_addr == 0) ? impl.SystemManagedVirtualBase() : virtual_addr; VAddr mapped_addr = (virtual_addr == 0) ? impl.SystemManagedVirtualBase() : virtual_addr;
@ -392,9 +414,10 @@ s32 MemoryManager::MapMemory(void** out_addr, VAddr virtual_addr, u64 size, Memo
rasterizer->MapMemory(mapped_addr, size); rasterizer->MapMemory(mapped_addr, size);
} }
*out_addr = impl.Map(mapped_addr, size, alignment, phys_addr, is_exec); *out_addr = impl.Map(mapped_addr, size, alignment, phys_addr, is_exec);
TRACK_ALLOC(*out_addr, size, "VMEM");
} }
TRACK_ALLOC(*out_addr, size, "VMEM");
return ORBIS_OK; return ORBIS_OK;
} }
@ -403,7 +426,7 @@ s32 MemoryManager::MapFile(void** out_addr, VAddr virtual_addr, u64 size, Memory
auto* h = Common::Singleton<Core::FileSys::HandleTable>::Instance(); auto* h = Common::Singleton<Core::FileSys::HandleTable>::Instance();
VAddr mapped_addr = (virtual_addr == 0) ? impl.SystemManagedVirtualBase() : virtual_addr; VAddr mapped_addr = (virtual_addr == 0) ? impl.SystemManagedVirtualBase() : virtual_addr;
const size_t size_aligned = Common::AlignUp(size, 16_KB); const u64 size_aligned = Common::AlignUp(size, 16_KB);
// Find first free area to map the file. // Find first free area to map the file.
if (False(flags & MemoryMapFlags::Fixed)) { if (False(flags & MemoryMapFlags::Fixed)) {
@ -416,7 +439,7 @@ s32 MemoryManager::MapFile(void** out_addr, VAddr virtual_addr, u64 size, Memory
if (True(flags & MemoryMapFlags::Fixed)) { if (True(flags & MemoryMapFlags::Fixed)) {
const auto& vma = FindVMA(virtual_addr)->second; const auto& vma = FindVMA(virtual_addr)->second;
const size_t remaining_size = vma.base + vma.size - virtual_addr; const u64 remaining_size = vma.base + vma.size - virtual_addr;
ASSERT_MSG(!vma.IsMapped() && remaining_size >= size, ASSERT_MSG(!vma.IsMapped() && remaining_size >= size,
"Memory region {:#x} to {:#x} isn't free enough to map region {:#x} to {:#x}", "Memory region {:#x} to {:#x} isn't free enough to map region {:#x} to {:#x}",
vma.base, vma.base + vma.size, virtual_addr, virtual_addr + size); vma.base, vma.base + vma.size, virtual_addr, virtual_addr + size);
@ -448,7 +471,7 @@ s32 MemoryManager::MapFile(void** out_addr, VAddr virtual_addr, u64 size, Memory
return ORBIS_OK; return ORBIS_OK;
} }
s32 MemoryManager::PoolDecommit(VAddr virtual_addr, size_t size) { s32 MemoryManager::PoolDecommit(VAddr virtual_addr, u64 size) {
std::scoped_lock lk{mutex}; std::scoped_lock lk{mutex};
const auto it = FindVMA(virtual_addr); const auto it = FindVMA(virtual_addr);
@ -498,7 +521,7 @@ s32 MemoryManager::PoolDecommit(VAddr virtual_addr, size_t size) {
return ORBIS_OK; return ORBIS_OK;
} }
s32 MemoryManager::UnmapMemory(VAddr virtual_addr, size_t size) { s32 MemoryManager::UnmapMemory(VAddr virtual_addr, u64 size) {
std::scoped_lock lk{mutex}; std::scoped_lock lk{mutex};
return UnmapMemoryImpl(virtual_addr, size); return UnmapMemoryImpl(virtual_addr, size);
} }
@ -564,7 +587,7 @@ s32 MemoryManager::UnmapMemoryImpl(VAddr virtual_addr, u64 size) {
return ORBIS_OK; return ORBIS_OK;
} }
int MemoryManager::QueryProtection(VAddr addr, void** start, void** end, u32* prot) { s32 MemoryManager::QueryProtection(VAddr addr, void** start, void** end, u32* prot) {
std::scoped_lock lk{mutex}; std::scoped_lock lk{mutex};
const auto it = FindVMA(addr); const auto it = FindVMA(addr);
@ -586,8 +609,7 @@ int MemoryManager::QueryProtection(VAddr addr, void** start, void** end, u32* pr
return ORBIS_OK; return ORBIS_OK;
} }
s64 MemoryManager::ProtectBytes(VAddr addr, VirtualMemoryArea vma_base, size_t size, s64 MemoryManager::ProtectBytes(VAddr addr, VirtualMemoryArea vma_base, u64 size, MemoryProt prot) {
MemoryProt prot) {
const auto start_in_vma = addr - vma_base.base; const auto start_in_vma = addr - vma_base.base;
const auto adjusted_size = const auto adjusted_size =
vma_base.size - start_in_vma < size ? vma_base.size - start_in_vma : size; vma_base.size - start_in_vma < size ? vma_base.size - start_in_vma : size;
@ -624,7 +646,7 @@ s64 MemoryManager::ProtectBytes(VAddr addr, VirtualMemoryArea vma_base, size_t s
return adjusted_size; return adjusted_size;
} }
s32 MemoryManager::Protect(VAddr addr, size_t size, MemoryProt prot) { s32 MemoryManager::Protect(VAddr addr, u64 size, MemoryProt prot) {
std::scoped_lock lk{mutex}; std::scoped_lock lk{mutex};
// Validate protection flags // Validate protection flags
@ -649,9 +671,8 @@ s32 MemoryManager::Protect(VAddr addr, size_t size, MemoryProt prot) {
auto& vma_base = it->second; auto& vma_base = it->second;
ASSERT_MSG(vma_base.Contains(addr + protected_bytes, 0), "Address {:#x} is out of bounds", ASSERT_MSG(vma_base.Contains(addr + protected_bytes, 0), "Address {:#x} is out of bounds",
addr + protected_bytes); addr + protected_bytes);
auto result = 0; auto result = ProtectBytes(aligned_addr + protected_bytes, vma_base,
result = ProtectBytes(aligned_addr + protected_bytes, vma_base, aligned_size - protected_bytes, prot);
aligned_size - protected_bytes, prot);
if (result < 0) { if (result < 0) {
// ProtectBytes returned an error, return it // ProtectBytes returned an error, return it
return result; return result;
@ -662,7 +683,7 @@ s32 MemoryManager::Protect(VAddr addr, size_t size, MemoryProt prot) {
return ORBIS_OK; return ORBIS_OK;
} }
int MemoryManager::VirtualQuery(VAddr addr, int flags, s32 MemoryManager::VirtualQuery(VAddr addr, s32 flags,
::Libraries::Kernel::OrbisVirtualQueryInfo* info) { ::Libraries::Kernel::OrbisVirtualQueryInfo* info) {
std::scoped_lock lk{mutex}; std::scoped_lock lk{mutex};
@ -707,7 +728,7 @@ int MemoryManager::VirtualQuery(VAddr addr, int flags,
return ORBIS_OK; return ORBIS_OK;
} }
int MemoryManager::DirectMemoryQuery(PAddr addr, bool find_next, s32 MemoryManager::DirectMemoryQuery(PAddr addr, bool find_next,
::Libraries::Kernel::OrbisQueryInfo* out_info) { ::Libraries::Kernel::OrbisQueryInfo* out_info) {
std::scoped_lock lk{mutex}; std::scoped_lock lk{mutex};
@ -728,13 +749,13 @@ int MemoryManager::DirectMemoryQuery(PAddr addr, bool find_next,
return ORBIS_OK; return ORBIS_OK;
} }
int MemoryManager::DirectQueryAvailable(PAddr search_start, PAddr search_end, size_t alignment, s32 MemoryManager::DirectQueryAvailable(PAddr search_start, PAddr search_end, u64 alignment,
PAddr* phys_addr_out, size_t* size_out) { PAddr* phys_addr_out, u64* size_out) {
std::scoped_lock lk{mutex}; std::scoped_lock lk{mutex};
auto dmem_area = FindDmemArea(search_start); auto dmem_area = FindDmemArea(search_start);
PAddr paddr{}; PAddr paddr{};
size_t max_size{}; u64 max_size{};
while (dmem_area != dmem_map.end()) { while (dmem_area != dmem_map.end()) {
if (!dmem_area->second.is_free) { if (!dmem_area->second.is_free) {
@ -815,13 +836,60 @@ void MemoryManager::NameVirtualRange(VAddr virtual_addr, u64 size, std::string_v
} }
} }
s32 MemoryManager::GetDirectMemoryType(PAddr addr, s32* directMemoryTypeOut,
void** directMemoryStartOut, void** directMemoryEndOut) {
std::scoped_lock lk{mutex};
auto dmem_area = FindDmemArea(addr);
if (addr > dmem_area->second.GetEnd() || dmem_area->second.is_free) {
LOG_ERROR(Core, "Unable to find allocated direct memory region to check type!");
return ORBIS_KERNEL_ERROR_ENOENT;
}
const auto& area = dmem_area->second;
*directMemoryStartOut = reinterpret_cast<void*>(area.base);
*directMemoryEndOut = reinterpret_cast<void*>(area.GetEnd());
*directMemoryTypeOut = area.memory_type;
return ORBIS_OK;
}
s32 MemoryManager::IsStack(VAddr addr, void** start, void** end) {
auto vma_handle = FindVMA(addr);
if (vma_handle == vma_map.end()) {
return ORBIS_KERNEL_ERROR_EINVAL;
}
const VirtualMemoryArea& vma = vma_handle->second;
if (!vma.Contains(addr, 0) || vma.IsFree()) {
return ORBIS_KERNEL_ERROR_EACCES;
}
u64 stack_start = 0;
u64 stack_end = 0;
if (vma.type == VMAType::Stack) {
stack_start = vma.base;
stack_end = vma.base + vma.size;
}
if (start != nullptr) {
*start = reinterpret_cast<void*>(stack_start);
}
if (end != nullptr) {
*end = reinterpret_cast<void*>(stack_end);
}
return ORBIS_OK;
}
void MemoryManager::InvalidateMemory(const VAddr addr, const u64 size) const { void MemoryManager::InvalidateMemory(const VAddr addr, const u64 size) const {
if (rasterizer) { if (rasterizer) {
rasterizer->InvalidateMemory(addr, size); rasterizer->InvalidateMemory(addr, size);
} }
} }
VAddr MemoryManager::SearchFree(VAddr virtual_addr, size_t size, u32 alignment) { VAddr MemoryManager::SearchFree(VAddr virtual_addr, u64 size, u32 alignment) {
// If the requested address is below the mapped range, start search from the lowest address // If the requested address is below the mapped range, start search from the lowest address
auto min_search_address = impl.SystemManagedVirtualBase(); auto min_search_address = impl.SystemManagedVirtualBase();
if (virtual_addr < min_search_address) { if (virtual_addr < min_search_address) {
@ -864,7 +932,7 @@ VAddr MemoryManager::SearchFree(VAddr virtual_addr, size_t size, u32 alignment)
} }
// If there's enough space in the VMA, return the address. // If there's enough space in the VMA, return the address.
const size_t remaining_size = vma.base + vma.size - virtual_addr; const u64 remaining_size = vma.base + vma.size - virtual_addr;
if (remaining_size >= size) { if (remaining_size >= size) {
return virtual_addr; return virtual_addr;
} }
@ -877,7 +945,7 @@ VAddr MemoryManager::SearchFree(VAddr virtual_addr, size_t size, u32 alignment)
return -1; return -1;
} }
MemoryManager::VMAHandle MemoryManager::CarveVMA(VAddr virtual_addr, size_t size) { MemoryManager::VMAHandle MemoryManager::CarveVMA(VAddr virtual_addr, u64 size) {
auto vma_handle = FindVMA(virtual_addr); auto vma_handle = FindVMA(virtual_addr);
ASSERT_MSG(vma_handle->second.Contains(virtual_addr, 0), "Virtual address not in vm_map"); ASSERT_MSG(vma_handle->second.Contains(virtual_addr, 0), "Virtual address not in vm_map");
@ -906,7 +974,7 @@ MemoryManager::VMAHandle MemoryManager::CarveVMA(VAddr virtual_addr, size_t size
return vma_handle; return vma_handle;
} }
MemoryManager::DMemHandle MemoryManager::CarveDmemArea(PAddr addr, size_t size) { MemoryManager::DMemHandle MemoryManager::CarveDmemArea(PAddr addr, u64 size) {
auto dmem_handle = FindDmemArea(addr); auto dmem_handle = FindDmemArea(addr);
ASSERT_MSG(addr <= dmem_handle->second.GetEnd(), "Physical address not in dmem_map"); ASSERT_MSG(addr <= dmem_handle->second.GetEnd(), "Physical address not in dmem_map");
@ -930,7 +998,7 @@ MemoryManager::DMemHandle MemoryManager::CarveDmemArea(PAddr addr, size_t size)
return dmem_handle; return dmem_handle;
} }
MemoryManager::VMAHandle MemoryManager::Split(VMAHandle vma_handle, size_t offset_in_vma) { MemoryManager::VMAHandle MemoryManager::Split(VMAHandle vma_handle, u64 offset_in_vma) {
auto& old_vma = vma_handle->second; auto& old_vma = vma_handle->second;
ASSERT(offset_in_vma < old_vma.size && offset_in_vma > 0); ASSERT(offset_in_vma < old_vma.size && offset_in_vma > 0);
@ -945,7 +1013,7 @@ MemoryManager::VMAHandle MemoryManager::Split(VMAHandle vma_handle, size_t offse
return vma_map.emplace_hint(std::next(vma_handle), new_vma.base, new_vma); return vma_map.emplace_hint(std::next(vma_handle), new_vma.base, new_vma);
} }
MemoryManager::DMemHandle MemoryManager::Split(DMemHandle dmem_handle, size_t offset_in_area) { MemoryManager::DMemHandle MemoryManager::Split(DMemHandle dmem_handle, u64 offset_in_area) {
auto& old_area = dmem_handle->second; auto& old_area = dmem_handle->second;
ASSERT(offset_in_area < old_area.size && offset_in_area > 0); ASSERT(offset_in_area < old_area.size && offset_in_area > 0);
@ -957,51 +1025,4 @@ MemoryManager::DMemHandle MemoryManager::Split(DMemHandle dmem_handle, size_t of
return dmem_map.emplace_hint(std::next(dmem_handle), new_area.base, new_area); return dmem_map.emplace_hint(std::next(dmem_handle), new_area.base, new_area);
} }
int MemoryManager::GetDirectMemoryType(PAddr addr, int* directMemoryTypeOut,
void** directMemoryStartOut, void** directMemoryEndOut) {
std::scoped_lock lk{mutex};
auto dmem_area = FindDmemArea(addr);
if (addr > dmem_area->second.GetEnd() || dmem_area->second.is_free) {
LOG_ERROR(Core, "Unable to find allocated direct memory region to check type!");
return ORBIS_KERNEL_ERROR_ENOENT;
}
const auto& area = dmem_area->second;
*directMemoryStartOut = reinterpret_cast<void*>(area.base);
*directMemoryEndOut = reinterpret_cast<void*>(area.GetEnd());
*directMemoryTypeOut = area.memory_type;
return ORBIS_OK;
}
int MemoryManager::IsStack(VAddr addr, void** start, void** end) {
auto vma_handle = FindVMA(addr);
if (vma_handle == vma_map.end()) {
return ORBIS_KERNEL_ERROR_EINVAL;
}
const VirtualMemoryArea& vma = vma_handle->second;
if (!vma.Contains(addr, 0) || vma.IsFree()) {
return ORBIS_KERNEL_ERROR_EACCES;
}
auto stack_start = 0ul;
auto stack_end = 0ul;
if (vma.type == VMAType::Stack) {
stack_start = vma.base;
stack_end = vma.base + vma.size;
}
if (start != nullptr) {
*start = reinterpret_cast<void*>(stack_start);
}
if (end != nullptr) {
*end = reinterpret_cast<void*>(stack_end);
}
return ORBIS_OK;
}
} // namespace Core } // namespace Core

View File

@ -5,6 +5,7 @@
#include <map> #include <map>
#include <mutex> #include <mutex>
#include <string>
#include <string_view> #include <string_view>
#include "common/enum.h" #include "common/enum.h"
#include "common/singleton.h" #include "common/singleton.h"
@ -62,8 +63,8 @@ enum class VMAType : u32 {
struct DirectMemoryArea { struct DirectMemoryArea {
PAddr base = 0; PAddr base = 0;
size_t size = 0; u64 size = 0;
int memory_type = 0; s32 memory_type = 0;
bool is_pooled = false; bool is_pooled = false;
bool is_free = true; bool is_free = true;
@ -87,7 +88,7 @@ struct DirectMemoryArea {
struct VirtualMemoryArea { struct VirtualMemoryArea {
VAddr base = 0; VAddr base = 0;
size_t size = 0; u64 size = 0;
PAddr phys_base = 0; PAddr phys_base = 0;
VMAType type = VMAType::Free; VMAType type = VMAType::Free;
MemoryProt prot = MemoryProt::NoAccess; MemoryProt prot = MemoryProt::NoAccess;
@ -96,7 +97,7 @@ struct VirtualMemoryArea {
uintptr_t fd = 0; uintptr_t fd = 0;
bool is_exec = false; bool is_exec = false;
bool Contains(VAddr addr, size_t size) const { bool Contains(VAddr addr, u64 size) const {
return addr >= base && (addr + size) <= (base + this->size); return addr >= base && (addr + size) <= (base + this->size);
} }
@ -183,14 +184,13 @@ public:
void SetupMemoryRegions(u64 flexible_size, bool use_extended_mem1, bool use_extended_mem2); void SetupMemoryRegions(u64 flexible_size, bool use_extended_mem1, bool use_extended_mem2);
PAddr PoolExpand(PAddr search_start, PAddr search_end, size_t size, u64 alignment); PAddr PoolExpand(PAddr search_start, PAddr search_end, u64 size, u64 alignment);
PAddr Allocate(PAddr search_start, PAddr search_end, size_t size, u64 alignment, PAddr Allocate(PAddr search_start, PAddr search_end, u64 size, u64 alignment, s32 memory_type);
int memory_type);
void Free(PAddr phys_addr, size_t size); void Free(PAddr phys_addr, u64 size);
int PoolCommit(VAddr virtual_addr, size_t size, MemoryProt prot); s32 PoolCommit(VAddr virtual_addr, u64 size, MemoryProt prot);
s32 MapMemory(void** out_addr, VAddr virtual_addr, u64 size, MemoryProt prot, s32 MapMemory(void** out_addr, VAddr virtual_addr, u64 size, MemoryProt prot,
MemoryMapFlags flags, VMAType type, std::string_view name = "anon", MemoryMapFlags flags, VMAType type, std::string_view name = "anon",
@ -199,35 +199,35 @@ public:
s32 MapFile(void** out_addr, VAddr virtual_addr, u64 size, MemoryProt prot, s32 MapFile(void** out_addr, VAddr virtual_addr, u64 size, MemoryProt prot,
MemoryMapFlags flags, s32 fd, s64 phys_addr); MemoryMapFlags flags, s32 fd, s64 phys_addr);
s32 PoolDecommit(VAddr virtual_addr, size_t size); s32 PoolDecommit(VAddr virtual_addr, u64 size);
s32 UnmapMemory(VAddr virtual_addr, size_t size); s32 UnmapMemory(VAddr virtual_addr, u64 size);
int QueryProtection(VAddr addr, void** start, void** end, u32* prot); s32 QueryProtection(VAddr addr, void** start, void** end, u32* prot);
s32 Protect(VAddr addr, size_t size, MemoryProt prot); s32 Protect(VAddr addr, u64 size, MemoryProt prot);
s64 ProtectBytes(VAddr addr, VirtualMemoryArea vma_base, size_t size, MemoryProt prot); s64 ProtectBytes(VAddr addr, VirtualMemoryArea vma_base, u64 size, MemoryProt prot);
int VirtualQuery(VAddr addr, int flags, ::Libraries::Kernel::OrbisVirtualQueryInfo* info); s32 VirtualQuery(VAddr addr, s32 flags, ::Libraries::Kernel::OrbisVirtualQueryInfo* info);
int DirectMemoryQuery(PAddr addr, bool find_next, s32 DirectMemoryQuery(PAddr addr, bool find_next,
::Libraries::Kernel::OrbisQueryInfo* out_info); ::Libraries::Kernel::OrbisQueryInfo* out_info);
int DirectQueryAvailable(PAddr search_start, PAddr search_end, size_t alignment, s32 DirectQueryAvailable(PAddr search_start, PAddr search_end, u64 alignment,
PAddr* phys_addr_out, size_t* size_out); PAddr* phys_addr_out, u64* size_out);
int GetDirectMemoryType(PAddr addr, int* directMemoryTypeOut, void** directMemoryStartOut, s32 GetDirectMemoryType(PAddr addr, s32* directMemoryTypeOut, void** directMemoryStartOut,
void** directMemoryEndOut); void** directMemoryEndOut);
s32 IsStack(VAddr addr, void** start, void** end);
s32 SetDirectMemoryType(s64 phys_addr, s32 memory_type); s32 SetDirectMemoryType(s64 phys_addr, s32 memory_type);
void NameVirtualRange(VAddr virtual_addr, u64 size, std::string_view name); void NameVirtualRange(VAddr virtual_addr, u64 size, std::string_view name);
void InvalidateMemory(VAddr addr, u64 size) const; void InvalidateMemory(VAddr addr, u64 size) const;
int IsStack(VAddr addr, void** start, void** end);
private: private:
VMAHandle FindVMA(VAddr target) { VMAHandle FindVMA(VAddr target) {
return std::prev(vma_map.upper_bound(target)); return std::prev(vma_map.upper_bound(target));
@ -257,15 +257,15 @@ private:
return iter; return iter;
} }
VAddr SearchFree(VAddr virtual_addr, size_t size, u32 alignment = 0); VAddr SearchFree(VAddr virtual_addr, u64 size, u32 alignment = 0);
VMAHandle CarveVMA(VAddr virtual_addr, size_t size); VMAHandle CarveVMA(VAddr virtual_addr, u64 size);
DMemHandle CarveDmemArea(PAddr addr, size_t size); DMemHandle CarveDmemArea(PAddr addr, u64 size);
VMAHandle Split(VMAHandle vma_handle, size_t offset_in_vma); VMAHandle Split(VMAHandle vma_handle, u64 offset_in_vma);
DMemHandle Split(DMemHandle dmem_handle, size_t offset_in_area); DMemHandle Split(DMemHandle dmem_handle, u64 offset_in_area);
u64 UnmapBytesFromEntry(VAddr virtual_addr, VirtualMemoryArea vma_base, u64 size); u64 UnmapBytesFromEntry(VAddr virtual_addr, VirtualMemoryArea vma_base, u64 size);
@ -276,10 +276,10 @@ private:
DMemMap dmem_map; DMemMap dmem_map;
VMAMap vma_map; VMAMap vma_map;
std::mutex mutex; std::mutex mutex;
size_t total_direct_size{}; u64 total_direct_size{};
size_t total_flexible_size{}; u64 total_flexible_size{};
size_t flexible_usage{}; u64 flexible_usage{};
size_t pool_budget{}; u64 pool_budget{};
Vulkan::Rasterizer* rasterizer{}; Vulkan::Rasterizer* rasterizer{};
struct PrtArea { struct PrtArea {

View File

@ -58,10 +58,7 @@ Emulator::Emulator() {
#endif #endif
} }
Emulator::~Emulator() { Emulator::~Emulator() {}
const auto config_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir);
Config::saveMainWindow(config_dir / "config.toml");
}
void Emulator::Run(std::filesystem::path file, const std::vector<std::string> args) { void Emulator::Run(std::filesystem::path file, const std::vector<std::string> args) {
if (std::filesystem::is_directory(file)) { if (std::filesystem::is_directory(file)) {
@ -135,6 +132,8 @@ void Emulator::Run(std::filesystem::path file, const std::vector<std::string> ar
LOG_INFO(Config, "General LogType: {}", Config::getLogType()); LOG_INFO(Config, "General LogType: {}", Config::getLogType());
LOG_INFO(Config, "General isNeo: {}", Config::isNeoModeConsole()); LOG_INFO(Config, "General isNeo: {}", Config::isNeoModeConsole());
LOG_INFO(Config, "GPU isNullGpu: {}", Config::nullGpu()); LOG_INFO(Config, "GPU isNullGpu: {}", Config::nullGpu());
LOG_INFO(Config, "GPU readbacks: {}", Config::readbacks());
LOG_INFO(Config, "GPU directMemoryAccess: {}", Config::directMemoryAccess());
LOG_INFO(Config, "GPU shouldDumpShaders: {}", Config::dumpShaders()); LOG_INFO(Config, "GPU shouldDumpShaders: {}", Config::dumpShaders());
LOG_INFO(Config, "GPU vblankDivider: {}", Config::vblankDiv()); LOG_INFO(Config, "GPU vblankDivider: {}", Config::vblankDiv());
LOG_INFO(Config, "Vulkan gpuId: {}", Config::getGpuId()); LOG_INFO(Config, "Vulkan gpuId: {}", Config::getGpuId());

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -66,22 +66,25 @@ auto output_array = std::array{
ControllerOutput(LEFTJOYSTICK_HALFMODE), ControllerOutput(LEFTJOYSTICK_HALFMODE),
ControllerOutput(RIGHTJOYSTICK_HALFMODE), ControllerOutput(RIGHTJOYSTICK_HALFMODE),
ControllerOutput(KEY_TOGGLE), ControllerOutput(KEY_TOGGLE),
ControllerOutput(MOUSE_GYRO_ROLL_MODE),
// Button mappings // Button mappings
ControllerOutput(SDL_GAMEPAD_BUTTON_NORTH), // Triangle ControllerOutput(SDL_GAMEPAD_BUTTON_NORTH), // Triangle
ControllerOutput(SDL_GAMEPAD_BUTTON_EAST), // Circle ControllerOutput(SDL_GAMEPAD_BUTTON_EAST), // Circle
ControllerOutput(SDL_GAMEPAD_BUTTON_SOUTH), // Cross ControllerOutput(SDL_GAMEPAD_BUTTON_SOUTH), // Cross
ControllerOutput(SDL_GAMEPAD_BUTTON_WEST), // Square ControllerOutput(SDL_GAMEPAD_BUTTON_WEST), // Square
ControllerOutput(SDL_GAMEPAD_BUTTON_LEFT_SHOULDER), // L1 ControllerOutput(SDL_GAMEPAD_BUTTON_LEFT_SHOULDER), // L1
ControllerOutput(SDL_GAMEPAD_BUTTON_LEFT_STICK), // L3 ControllerOutput(SDL_GAMEPAD_BUTTON_LEFT_STICK), // L3
ControllerOutput(SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER), // R1 ControllerOutput(SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER), // R1
ControllerOutput(SDL_GAMEPAD_BUTTON_RIGHT_STICK), // R3 ControllerOutput(SDL_GAMEPAD_BUTTON_RIGHT_STICK), // R3
ControllerOutput(SDL_GAMEPAD_BUTTON_START), // Options ControllerOutput(SDL_GAMEPAD_BUTTON_START), // Options
ControllerOutput(SDL_GAMEPAD_BUTTON_TOUCHPAD), // TouchPad ControllerOutput(SDL_GAMEPAD_BUTTON_TOUCHPAD_LEFT), // TouchPad
ControllerOutput(SDL_GAMEPAD_BUTTON_DPAD_UP), // Up ControllerOutput(SDL_GAMEPAD_BUTTON_TOUCHPAD_CENTER), // TouchPad
ControllerOutput(SDL_GAMEPAD_BUTTON_DPAD_DOWN), // Down ControllerOutput(SDL_GAMEPAD_BUTTON_TOUCHPAD_RIGHT), // TouchPad
ControllerOutput(SDL_GAMEPAD_BUTTON_DPAD_LEFT), // Left ControllerOutput(SDL_GAMEPAD_BUTTON_DPAD_UP), // Up
ControllerOutput(SDL_GAMEPAD_BUTTON_DPAD_RIGHT), // Right ControllerOutput(SDL_GAMEPAD_BUTTON_DPAD_DOWN), // Down
ControllerOutput(SDL_GAMEPAD_BUTTON_DPAD_LEFT), // Left
ControllerOutput(SDL_GAMEPAD_BUTTON_DPAD_RIGHT), // Right
// Axis mappings // Axis mappings
// ControllerOutput(SDL_GAMEPAD_BUTTON_INVALID, SDL_GAMEPAD_AXIS_LEFTX, false), // ControllerOutput(SDL_GAMEPAD_BUTTON_INVALID, SDL_GAMEPAD_AXIS_LEFTX, false),
@ -130,6 +133,12 @@ static OrbisPadButtonDataOffset SDLGamepadToOrbisButton(u8 button) {
return OPBDO::Options; return OPBDO::Options;
case SDL_GAMEPAD_BUTTON_TOUCHPAD: case SDL_GAMEPAD_BUTTON_TOUCHPAD:
return OPBDO::TouchPad; return OPBDO::TouchPad;
case SDL_GAMEPAD_BUTTON_TOUCHPAD_LEFT:
return OPBDO::TouchPad;
case SDL_GAMEPAD_BUTTON_TOUCHPAD_CENTER:
return OPBDO::TouchPad;
case SDL_GAMEPAD_BUTTON_TOUCHPAD_RIGHT:
return OPBDO::TouchPad;
case SDL_GAMEPAD_BUTTON_BACK: case SDL_GAMEPAD_BUTTON_BACK:
return OPBDO::TouchPad; return OPBDO::TouchPad;
case SDL_GAMEPAD_BUTTON_LEFT_SHOULDER: case SDL_GAMEPAD_BUTTON_LEFT_SHOULDER:
@ -176,7 +185,7 @@ InputBinding GetBindingFromString(std::string& line) {
if (string_to_keyboard_key_map.find(t) != string_to_keyboard_key_map.end()) { if (string_to_keyboard_key_map.find(t) != string_to_keyboard_key_map.end()) {
input = InputID(InputType::KeyboardMouse, string_to_keyboard_key_map.at(t)); input = InputID(InputType::KeyboardMouse, string_to_keyboard_key_map.at(t));
} else if (string_to_axis_map.find(t) != string_to_axis_map.end()) { } else if (string_to_axis_map.find(t) != string_to_axis_map.end()) {
input = InputID(InputType::Axis, (u32)string_to_axis_map.at(t).axis); input = InputID(InputType::Axis, string_to_axis_map.at(t).axis);
} else if (string_to_cbutton_map.find(t) != string_to_cbutton_map.end()) { } else if (string_to_cbutton_map.find(t) != string_to_cbutton_map.end()) {
input = InputID(InputType::Controller, string_to_cbutton_map.at(t)); input = InputID(InputType::Controller, string_to_cbutton_map.at(t));
} else { } else {
@ -227,19 +236,15 @@ void ParseInputConfig(const std::string game_id = "") {
line.erase(std::remove_if(line.begin(), line.end(), line.erase(std::remove_if(line.begin(), line.end(),
[](unsigned char c) { return std::isspace(c); }), [](unsigned char c) { return std::isspace(c); }),
line.end()); line.end());
if (line.empty()) { if (line.empty()) {
continue; continue;
} }
// Truncate lines starting at # // Truncate lines starting at #
std::size_t comment_pos = line.find('#'); std::size_t comment_pos = line.find('#');
if (comment_pos != std::string::npos) { if (comment_pos != std::string::npos) {
line = line.substr(0, comment_pos); line = line.substr(0, comment_pos);
} }
// Remove trailing semicolon
if (!line.empty() && line[line.length() - 1] == ';') {
line = line.substr(0, line.length() - 1);
}
if (line.empty()) { if (line.empty()) {
continue; continue;
} }
@ -254,8 +259,13 @@ void ParseInputConfig(const std::string game_id = "") {
std::string output_string = line.substr(0, equal_pos); std::string output_string = line.substr(0, equal_pos);
std::string input_string = line.substr(equal_pos + 1); std::string input_string = line.substr(equal_pos + 1);
std::size_t comma_pos = input_string.find(','); // Remove trailing semicolon from input_string
if (!input_string.empty() && input_string[input_string.length() - 1] == ';' &&
input_string != ";") {
line = line.substr(0, line.length() - 1);
}
std::size_t comma_pos = input_string.find(',');
auto parseInt = [](const std::string& s) -> std::optional<int> { auto parseInt = [](const std::string& s) -> std::optional<int> {
try { try {
return std::stoi(s); return std::stoi(s);
@ -373,7 +383,6 @@ void ParseInputConfig(const std::string game_id = "") {
BindingConnection connection(InputID(), nullptr); BindingConnection connection(InputID(), nullptr);
auto button_it = string_to_cbutton_map.find(output_string); auto button_it = string_to_cbutton_map.find(output_string);
auto axis_it = string_to_axis_map.find(output_string); auto axis_it = string_to_axis_map.find(output_string);
if (binding.IsEmpty()) { if (binding.IsEmpty()) {
LOG_WARNING(Input, "Invalid format at line: {}, data: \"{}\", skipping line.", LOG_WARNING(Input, "Invalid format at line: {}, data: \"{}\", skipping line.",
lineCount, line); lineCount, line);
@ -411,7 +420,7 @@ void ParseInputConfig(const std::string game_id = "") {
u32 GetMouseWheelEvent(const SDL_Event& event) { u32 GetMouseWheelEvent(const SDL_Event& event) {
if (event.type != SDL_EVENT_MOUSE_WHEEL && event.type != SDL_EVENT_MOUSE_WHEEL_OFF) { if (event.type != SDL_EVENT_MOUSE_WHEEL && event.type != SDL_EVENT_MOUSE_WHEEL_OFF) {
LOG_WARNING(Input, "Something went wrong with wheel input parsing!"); LOG_WARNING(Input, "Something went wrong with wheel input parsing!");
return (u32)-1; return SDL_UNMAPPED;
} }
if (event.wheel.y > 0) { if (event.wheel.y > 0) {
return SDL_MOUSE_WHEEL_UP; return SDL_MOUSE_WHEEL_UP;
@ -422,7 +431,7 @@ u32 GetMouseWheelEvent(const SDL_Event& event) {
} else if (event.wheel.x < 0) { } else if (event.wheel.x < 0) {
return SDL_MOUSE_WHEEL_LEFT; return SDL_MOUSE_WHEEL_LEFT;
} }
return (u32)-1; return SDL_UNMAPPED;
} }
InputEvent InputBinding::GetInputEventFromSDLEvent(const SDL_Event& e) { InputEvent InputBinding::GetInputEventFromSDLEvent(const SDL_Event& e) {
@ -432,16 +441,19 @@ InputEvent InputBinding::GetInputEventFromSDLEvent(const SDL_Event& e) {
return InputEvent(InputType::KeyboardMouse, e.key.key, e.key.down, 0); return InputEvent(InputType::KeyboardMouse, e.key.key, e.key.down, 0);
case SDL_EVENT_MOUSE_BUTTON_DOWN: case SDL_EVENT_MOUSE_BUTTON_DOWN:
case SDL_EVENT_MOUSE_BUTTON_UP: case SDL_EVENT_MOUSE_BUTTON_UP:
return InputEvent(InputType::KeyboardMouse, (u32)e.button.button, e.button.down, 0); return InputEvent(InputType::KeyboardMouse, static_cast<u32>(e.button.button),
e.button.down, 0);
case SDL_EVENT_MOUSE_WHEEL: case SDL_EVENT_MOUSE_WHEEL:
case SDL_EVENT_MOUSE_WHEEL_OFF: case SDL_EVENT_MOUSE_WHEEL_OFF:
return InputEvent(InputType::KeyboardMouse, GetMouseWheelEvent(e), return InputEvent(InputType::KeyboardMouse, GetMouseWheelEvent(e),
e.type == SDL_EVENT_MOUSE_WHEEL, 0); e.type == SDL_EVENT_MOUSE_WHEEL, 0);
case SDL_EVENT_GAMEPAD_BUTTON_DOWN: case SDL_EVENT_GAMEPAD_BUTTON_DOWN:
case SDL_EVENT_GAMEPAD_BUTTON_UP: case SDL_EVENT_GAMEPAD_BUTTON_UP:
return InputEvent(InputType::Controller, (u32)e.gbutton.button, e.gbutton.down, 0); return InputEvent(InputType::Controller, static_cast<u32>(e.gbutton.button), e.gbutton.down,
0); // clang made me do it
case SDL_EVENT_GAMEPAD_AXIS_MOTION: case SDL_EVENT_GAMEPAD_AXIS_MOTION:
return InputEvent(InputType::Axis, (u32)e.gaxis.axis, true, e.gaxis.value / 256); return InputEvent(InputType::Axis, static_cast<u32>(e.gaxis.axis), true,
e.gaxis.value / 256); // this too
default: default:
return InputEvent(); return InputEvent();
} }
@ -499,14 +511,18 @@ void ControllerOutput::FinalizeUpdate() {
} }
old_button_state = new_button_state; old_button_state = new_button_state;
old_param = *new_param; old_param = *new_param;
float touchpad_x = 0;
if (button != SDL_GAMEPAD_BUTTON_INVALID) { if (button != SDL_GAMEPAD_BUTTON_INVALID) {
switch (button) { switch (button) {
case SDL_GAMEPAD_BUTTON_TOUCHPAD: case SDL_GAMEPAD_BUTTON_TOUCHPAD_LEFT:
touchpad_x = Config::getBackButtonBehavior() == "left" ? 0.25f controller->SetTouchpadState(0, new_button_state, 0.25f, 0.5f);
: Config::getBackButtonBehavior() == "right" ? 0.75f controller->CheckButton(0, SDLGamepadToOrbisButton(button), new_button_state);
: 0.5f; break;
controller->SetTouchpadState(0, new_button_state, touchpad_x, 0.5f); case SDL_GAMEPAD_BUTTON_TOUCHPAD_CENTER:
controller->SetTouchpadState(0, new_button_state, 0.50f, 0.5f);
controller->CheckButton(0, SDLGamepadToOrbisButton(button), new_button_state);
break;
case SDL_GAMEPAD_BUTTON_TOUCHPAD_RIGHT:
controller->SetTouchpadState(0, new_button_state, 0.75f, 0.5f);
controller->CheckButton(0, SDLGamepadToOrbisButton(button), new_button_state); controller->CheckButton(0, SDLGamepadToOrbisButton(button), new_button_state);
break; break;
case LEFTJOYSTICK_HALFMODE: case LEFTJOYSTICK_HALFMODE:
@ -519,6 +535,9 @@ void ControllerOutput::FinalizeUpdate() {
// to do it, and it would be inconvenient to force it here, when AddUpdate does the job just // to do it, and it would be inconvenient to force it here, when AddUpdate does the job just
// fine, and a toggle doesn't have to checked against every input that's bound to it, it's // fine, and a toggle doesn't have to checked against every input that's bound to it, it's
// enough that one is pressed // enough that one is pressed
case MOUSE_GYRO_ROLL_MODE:
SetMouseGyroRollMode(new_button_state);
break;
default: // is a normal key (hopefully) default: // is a normal key (hopefully)
controller->CheckButton(0, SDLGamepadToOrbisButton(button), new_button_state); controller->CheckButton(0, SDLGamepadToOrbisButton(button), new_button_state);
break; break;
@ -570,7 +589,7 @@ void ControllerOutput::FinalizeUpdate() {
bool UpdatePressedKeys(InputEvent event) { bool UpdatePressedKeys(InputEvent event) {
// Skip invalid inputs // Skip invalid inputs
InputID input = event.input; InputID input = event.input;
if (input.sdl_id == (u32)-1) { if (input.sdl_id == SDL_UNMAPPED) {
return false; return false;
} }
if (input.type == InputType::Axis) { if (input.type == InputType::Axis) {

View File

@ -23,6 +23,10 @@
#define SDL_MOUSE_WHEEL_LEFT SDL_EVENT_MOUSE_WHEEL + 5 #define SDL_MOUSE_WHEEL_LEFT SDL_EVENT_MOUSE_WHEEL + 5
#define SDL_MOUSE_WHEEL_RIGHT SDL_EVENT_MOUSE_WHEEL + 7 #define SDL_MOUSE_WHEEL_RIGHT SDL_EVENT_MOUSE_WHEEL + 7
#define SDL_GAMEPAD_BUTTON_TOUCHPAD_LEFT SDL_GAMEPAD_BUTTON_COUNT + 1
#define SDL_GAMEPAD_BUTTON_TOUCHPAD_CENTER SDL_GAMEPAD_BUTTON_COUNT + 2
#define SDL_GAMEPAD_BUTTON_TOUCHPAD_RIGHT SDL_GAMEPAD_BUTTON_COUNT + 3
// idk who already used what where so I just chose a big number // idk who already used what where so I just chose a big number
#define SDL_EVENT_MOUSE_WHEEL_OFF SDL_EVENT_USER + 10 #define SDL_EVENT_MOUSE_WHEEL_OFF SDL_EVENT_USER + 10
@ -31,6 +35,9 @@
#define BACK_BUTTON 0x00040000 #define BACK_BUTTON 0x00040000
#define KEY_TOGGLE 0x00200000 #define KEY_TOGGLE 0x00200000
#define MOUSE_GYRO_ROLL_MODE 0x00400000
#define SDL_UNMAPPED UINT32_MAX - 1
namespace Input { namespace Input {
using Input::Axis; using Input::Axis;
@ -49,7 +56,7 @@ class InputID {
public: public:
InputType type; InputType type;
u32 sdl_id; u32 sdl_id;
InputID(InputType d = InputType::Count, u32 i = (u32)-1) : type(d), sdl_id(i) {} InputID(InputType d = InputType::Count, u32 i = SDL_UNMAPPED) : type(d), sdl_id(i) {}
bool operator==(const InputID& o) const { bool operator==(const InputID& o) const {
return type == o.type && sdl_id == o.sdl_id; return type == o.type && sdl_id == o.sdl_id;
} }
@ -63,7 +70,7 @@ public:
return *this != InputID(); return *this != InputID();
} }
std::string ToString() { std::string ToString() {
return fmt::format("({}: {:x})", input_type_names[(u8)type], sdl_id); return fmt::format("({}: {:x})", input_type_names[static_cast<u8>(type)], sdl_id);
} }
}; };
@ -96,12 +103,19 @@ const std::map<std::string, u32> string_to_cbutton_map = {
{"options", SDL_GAMEPAD_BUTTON_START}, {"options", SDL_GAMEPAD_BUTTON_START},
// these are outputs only (touchpad can only be bound to itself) // these are outputs only (touchpad can only be bound to itself)
{"touchpad", SDL_GAMEPAD_BUTTON_TOUCHPAD}, {"touchpad_left", SDL_GAMEPAD_BUTTON_TOUCHPAD_LEFT},
{"touchpad_center", SDL_GAMEPAD_BUTTON_TOUCHPAD_CENTER},
{"touchpad_right", SDL_GAMEPAD_BUTTON_TOUCHPAD_RIGHT},
{"leftjoystick_halfmode", LEFTJOYSTICK_HALFMODE}, {"leftjoystick_halfmode", LEFTJOYSTICK_HALFMODE},
{"rightjoystick_halfmode", RIGHTJOYSTICK_HALFMODE}, {"rightjoystick_halfmode", RIGHTJOYSTICK_HALFMODE},
// this is only for input // this is only for input
{"back", SDL_GAMEPAD_BUTTON_BACK}, {"back", SDL_GAMEPAD_BUTTON_BACK},
{"lpaddle_high", SDL_GAMEPAD_BUTTON_LEFT_PADDLE1},
{"lpaddle_low", SDL_GAMEPAD_BUTTON_LEFT_PADDLE2},
{"rpaddle_high", SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1},
{"rpaddle_low", SDL_GAMEPAD_BUTTON_RIGHT_PADDLE2},
{"mouse_gyro_roll_mode", MOUSE_GYRO_ROLL_MODE},
}; };
const std::map<std::string, AxisMapping> string_to_axis_map = { const std::map<std::string, AxisMapping> string_to_axis_map = {
@ -124,6 +138,7 @@ const std::map<std::string, AxisMapping> string_to_axis_map = {
{"axis_right_y", {SDL_GAMEPAD_AXIS_RIGHTY, 127}}, {"axis_right_y", {SDL_GAMEPAD_AXIS_RIGHTY, 127}},
}; };
const std::map<std::string, u32> string_to_keyboard_key_map = { const std::map<std::string, u32> string_to_keyboard_key_map = {
// alphanumeric
{"a", SDLK_A}, {"a", SDLK_A},
{"b", SDLK_B}, {"b", SDLK_B},
{"c", SDLK_C}, {"c", SDLK_C},
@ -160,6 +175,73 @@ const std::map<std::string, u32> string_to_keyboard_key_map = {
{"7", SDLK_7}, {"7", SDLK_7},
{"8", SDLK_8}, {"8", SDLK_8},
{"9", SDLK_9}, {"9", SDLK_9},
// symbols
{"grave", SDLK_GRAVE},
{"tilde", SDLK_TILDE},
{"exclamation", SDLK_EXCLAIM},
{"at", SDLK_AT},
{"hash", SDLK_HASH},
{"dollar", SDLK_DOLLAR},
{"percent", SDLK_PERCENT},
{"caret", SDLK_CARET},
{"ampersand", SDLK_AMPERSAND},
{"asterisk", SDLK_ASTERISK},
{"lparen", SDLK_LEFTPAREN},
{"rparen", SDLK_RIGHTPAREN},
{"minus", SDLK_MINUS},
{"underscore", SDLK_UNDERSCORE},
{"equals", SDLK_EQUALS},
{"plus", SDLK_PLUS},
{"lbracket", SDLK_LEFTBRACKET},
{"rbracket", SDLK_RIGHTBRACKET},
{"lbrace", SDLK_LEFTBRACE},
{"rbrace", SDLK_RIGHTBRACE},
{"backslash", SDLK_BACKSLASH},
{"pipe", SDLK_PIPE},
{"semicolon", SDLK_SEMICOLON},
{"colon", SDLK_COLON},
{"apostrophe", SDLK_APOSTROPHE},
{"quote", SDLK_DBLAPOSTROPHE},
{"comma", SDLK_COMMA},
{"less", SDLK_LESS},
{"period", SDLK_PERIOD},
{"greater", SDLK_GREATER},
{"slash", SDLK_SLASH},
{"question", SDLK_QUESTION},
// special keys
{"escape", SDLK_ESCAPE},
{"printscreen", SDLK_PRINTSCREEN},
{"scrolllock", SDLK_SCROLLLOCK},
{"pausebreak", SDLK_PAUSE},
{"backspace", SDLK_BACKSPACE},
{"delete", SDLK_DELETE},
{"insert", SDLK_INSERT},
{"home", SDLK_HOME},
{"end", SDLK_END},
{"pgup", SDLK_PAGEUP},
{"pgdown", SDLK_PAGEDOWN},
{"tab", SDLK_TAB},
{"capslock", SDLK_CAPSLOCK},
{"enter", SDLK_RETURN},
{"lshift", SDLK_LSHIFT},
{"rshift", SDLK_RSHIFT},
{"lctrl", SDLK_LCTRL},
{"rctrl", SDLK_RCTRL},
{"lalt", SDLK_LALT},
{"ralt", SDLK_RALT},
{"lmeta", SDLK_LGUI},
{"rmeta", SDLK_RGUI},
{"lwin", SDLK_LGUI},
{"rwin", SDLK_RGUI},
{"space", SDLK_SPACE},
{"up", SDLK_UP},
{"down", SDLK_DOWN},
{"left", SDLK_LEFT},
{"right", SDLK_RIGHT},
// keypad
{"kp0", SDLK_KP_0}, {"kp0", SDLK_KP_0},
{"kp1", SDLK_KP_1}, {"kp1", SDLK_KP_1},
{"kp2", SDLK_KP_2}, {"kp2", SDLK_KP_2},
@ -170,43 +252,16 @@ const std::map<std::string, u32> string_to_keyboard_key_map = {
{"kp7", SDLK_KP_7}, {"kp7", SDLK_KP_7},
{"kp8", SDLK_KP_8}, {"kp8", SDLK_KP_8},
{"kp9", SDLK_KP_9}, {"kp9", SDLK_KP_9},
{"comma", SDLK_COMMA}, {"kpperiod", SDLK_KP_PERIOD},
{"period", SDLK_PERIOD}, {"kpcomma", SDLK_KP_COMMA},
{"question", SDLK_QUESTION}, {"kpslash", SDLK_KP_DIVIDE},
{"semicolon", SDLK_SEMICOLON}, {"kpasterisk", SDLK_KP_MULTIPLY},
{"minus", SDLK_MINUS}, {"kpminus", SDLK_KP_MINUS},
{"underscore", SDLK_UNDERSCORE}, {"kpplus", SDLK_KP_PLUS},
{"lparenthesis", SDLK_LEFTPAREN}, {"kpequals", SDLK_KP_EQUALS},
{"rparenthesis", SDLK_RIGHTPAREN}, {"kpenter", SDLK_KP_ENTER},
{"lbracket", SDLK_LEFTBRACKET},
{"rbracket", SDLK_RIGHTBRACKET}, // mouse
{"lbrace", SDLK_LEFTBRACE},
{"rbrace", SDLK_RIGHTBRACE},
{"backslash", SDLK_BACKSLASH},
{"dash", SDLK_SLASH},
{"enter", SDLK_RETURN},
{"space", SDLK_SPACE},
{"tab", SDLK_TAB},
{"backspace", SDLK_BACKSPACE},
{"escape", SDLK_ESCAPE},
{"left", SDLK_LEFT},
{"right", SDLK_RIGHT},
{"up", SDLK_UP},
{"down", SDLK_DOWN},
{"lctrl", SDLK_LCTRL},
{"rctrl", SDLK_RCTRL},
{"lshift", SDLK_LSHIFT},
{"rshift", SDLK_RSHIFT},
{"lalt", SDLK_LALT},
{"ralt", SDLK_RALT},
{"lmeta", SDLK_LGUI},
{"rmeta", SDLK_RGUI},
{"lwin", SDLK_LGUI},
{"rwin", SDLK_RGUI},
{"home", SDLK_HOME},
{"end", SDLK_END},
{"pgup", SDLK_PAGEUP},
{"pgdown", SDLK_PAGEDOWN},
{"leftbutton", SDL_BUTTON_LEFT}, {"leftbutton", SDL_BUTTON_LEFT},
{"rightbutton", SDL_BUTTON_RIGHT}, {"rightbutton", SDL_BUTTON_RIGHT},
{"middlebutton", SDL_BUTTON_MIDDLE}, {"middlebutton", SDL_BUTTON_MIDDLE},
@ -216,15 +271,9 @@ const std::map<std::string, u32> string_to_keyboard_key_map = {
{"mousewheeldown", SDL_MOUSE_WHEEL_DOWN}, {"mousewheeldown", SDL_MOUSE_WHEEL_DOWN},
{"mousewheelleft", SDL_MOUSE_WHEEL_LEFT}, {"mousewheelleft", SDL_MOUSE_WHEEL_LEFT},
{"mousewheelright", SDL_MOUSE_WHEEL_RIGHT}, {"mousewheelright", SDL_MOUSE_WHEEL_RIGHT},
{"kpperiod", SDLK_KP_PERIOD},
{"kpcomma", SDLK_KP_COMMA}, // no binding
{"kpdivide", SDLK_KP_DIVIDE}, {"unmapped", SDL_UNMAPPED},
{"kpmultiply", SDLK_KP_MULTIPLY},
{"kpminus", SDLK_KP_MINUS},
{"kpplus", SDLK_KP_PLUS},
{"kpenter", SDLK_KP_ENTER},
{"kpequals", SDLK_KP_EQUALS},
{"capslock", SDLK_CAPSLOCK},
}; };
void ParseInputConfig(const std::string game_id); void ParseInputConfig(const std::string game_id);
@ -320,6 +369,7 @@ public:
// returns an InputEvent based on the event type (keyboard, mouse buttons/wheel, or controller) // returns an InputEvent based on the event type (keyboard, mouse buttons/wheel, or controller)
static InputEvent GetInputEventFromSDLEvent(const SDL_Event& e); static InputEvent GetInputEventFromSDLEvent(const SDL_Event& e);
}; };
class ControllerOutput { class ControllerOutput {
static GameController* controller; static GameController* controller;

View File

@ -3,6 +3,7 @@
#include <cmath> #include <cmath>
#include "common/assert.h"
#include "common/types.h" #include "common/types.h"
#include "input/controller.h" #include "input/controller.h"
#include "input_mouse.h" #include "input_mouse.h"
@ -13,12 +14,19 @@ namespace Input {
int mouse_joystick_binding = 0; int mouse_joystick_binding = 0;
float mouse_deadzone_offset = 0.5, mouse_speed = 1, mouse_speed_offset = 0.1250; float mouse_deadzone_offset = 0.5, mouse_speed = 1, mouse_speed_offset = 0.1250;
bool mouse_gyro_roll_mode = false;
Uint32 mouse_polling_id = 0; Uint32 mouse_polling_id = 0;
bool mouse_enabled = false; MouseMode mouse_mode = MouseMode::Off;
// We had to go through 3 files of indirection just to update a flag // Switches mouse to a set mode or turns mouse emulation off if it was already in that mode.
void ToggleMouseEnabled() { // Returns whether the mode is turned on.
mouse_enabled = !mouse_enabled; bool ToggleMouseModeTo(MouseMode m) {
if (mouse_mode == m) {
mouse_mode = MouseMode::Off;
} else {
mouse_mode = m;
}
return mouse_mode == m;
} }
void SetMouseToJoystick(int joystick) { void SetMouseToJoystick(int joystick) {
@ -31,10 +39,11 @@ void SetMouseParams(float mdo, float ms, float mso) {
mouse_speed_offset = mso; mouse_speed_offset = mso;
} }
Uint32 MousePolling(void* param, Uint32 id, Uint32 interval) { void SetMouseGyroRollMode(bool mode) {
auto* controller = (GameController*)param; mouse_gyro_roll_mode = mode;
if (!mouse_enabled) }
return interval;
void EmulateJoystick(GameController* controller, u32 interval) {
Axis axis_x, axis_y; Axis axis_x, axis_y;
switch (mouse_joystick_binding) { switch (mouse_joystick_binding) {
@ -47,7 +56,7 @@ Uint32 MousePolling(void* param, Uint32 id, Uint32 interval) {
axis_y = Axis::RightY; axis_y = Axis::RightY;
break; break;
default: default:
return interval; // no update needed return; // no update needed
} }
float d_x = 0, d_y = 0; float d_x = 0, d_y = 0;
@ -67,7 +76,35 @@ Uint32 MousePolling(void* param, Uint32 id, Uint32 interval) {
controller->Axis(0, axis_x, GetAxis(-0x80, 0x7f, 0)); controller->Axis(0, axis_x, GetAxis(-0x80, 0x7f, 0));
controller->Axis(0, axis_y, GetAxis(-0x80, 0x7f, 0)); controller->Axis(0, axis_y, GetAxis(-0x80, 0x7f, 0));
} }
}
constexpr float constant_down_accel[3] = {0.0f, 10.0f, 0.0f};
void EmulateGyro(GameController* controller, u32 interval) {
// LOG_INFO(Input, "todo gyro");
float d_x = 0, d_y = 0;
SDL_GetRelativeMouseState(&d_x, &d_y);
controller->Acceleration(1, constant_down_accel);
float gyro_from_mouse[3] = {-d_y / 100, -d_x / 100, 0.0f};
if (mouse_gyro_roll_mode) {
gyro_from_mouse[1] = 0.0f;
gyro_from_mouse[2] = -d_x / 100;
}
controller->Gyro(1, gyro_from_mouse);
}
Uint32 MousePolling(void* param, Uint32 id, Uint32 interval) {
auto* controller = (GameController*)param;
switch (mouse_mode) {
case MouseMode::Joystick:
EmulateJoystick(controller, interval);
break;
case MouseMode::Gyro:
EmulateGyro(controller, interval);
break;
default:
break;
}
return interval; return interval;
} }

View File

@ -8,11 +8,21 @@
namespace Input { namespace Input {
void ToggleMouseEnabled(); enum MouseMode {
Off = 0,
Joystick,
Gyro,
};
bool ToggleMouseModeTo(MouseMode m);
void SetMouseToJoystick(int joystick); void SetMouseToJoystick(int joystick);
void SetMouseParams(float mouse_deadzone_offset, float mouse_speed, float mouse_speed_offset); void SetMouseParams(float mouse_deadzone_offset, float mouse_speed, float mouse_speed_offset);
void SetMouseGyroRollMode(bool mode);
// Polls the mouse for changes, and simulates joystick movement from it. void EmulateJoystick(GameController* controller, u32 interval);
void EmulateGyro(GameController* controller, u32 interval);
// Polls the mouse for changes
Uint32 MousePolling(void* param, Uint32 id, Uint32 interval); Uint32 MousePolling(void* param, Uint32 id, Uint32 interval);
} // namespace Input } // namespace Input

View File

@ -12,7 +12,8 @@
#include "main_window_themes.h" #include "main_window_themes.h"
#include "ui_about_dialog.h" #include "ui_about_dialog.h"
AboutDialog::AboutDialog(QWidget* parent) : QDialog(parent), ui(new Ui::AboutDialog) { AboutDialog::AboutDialog(std::shared_ptr<gui_settings> gui_settings, QWidget* parent)
: QDialog(parent), ui(new Ui::AboutDialog), m_gui_settings(std::move(gui_settings)) {
ui->setupUi(this); ui->setupUi(this);
preloadImages(); preloadImages();
@ -57,7 +58,7 @@ void AboutDialog::preloadImages() {
} }
void AboutDialog::updateImagesForCurrentTheme() { void AboutDialog::updateImagesForCurrentTheme() {
Theme currentTheme = static_cast<Theme>(Config::getMainWindowTheme()); Theme currentTheme = static_cast<Theme>(m_gui_settings->GetValue(gui::gen_theme).toInt());
bool isDarkTheme = (currentTheme == Theme::Dark || currentTheme == Theme::Green || bool isDarkTheme = (currentTheme == Theme::Dark || currentTheme == Theme::Green ||
currentTheme == Theme::Blue || currentTheme == Theme::Violet); currentTheme == Theme::Blue || currentTheme == Theme::Violet);
if (isDarkTheme) { if (isDarkTheme) {
@ -188,7 +189,7 @@ void AboutDialog::removeHoverEffect(QLabel* label) {
} }
bool AboutDialog::isDarkTheme() const { bool AboutDialog::isDarkTheme() const {
Theme currentTheme = static_cast<Theme>(Config::getMainWindowTheme()); Theme currentTheme = static_cast<Theme>(m_gui_settings->GetValue(gui::gen_theme).toInt());
return currentTheme == Theme::Dark || currentTheme == Theme::Green || return currentTheme == Theme::Dark || currentTheme == Theme::Green ||
currentTheme == Theme::Blue || currentTheme == Theme::Violet; currentTheme == Theme::Blue || currentTheme == Theme::Violet;
} }

View File

@ -8,6 +8,7 @@
#include <QLabel> #include <QLabel>
#include <QPixmap> #include <QPixmap>
#include <QUrl> #include <QUrl>
#include "gui_settings.h"
namespace Ui { namespace Ui {
class AboutDialog; class AboutDialog;
@ -17,7 +18,7 @@ class AboutDialog : public QDialog {
Q_OBJECT Q_OBJECT
public: public:
explicit AboutDialog(QWidget* parent = nullptr); explicit AboutDialog(std::shared_ptr<gui_settings> gui_settings, QWidget* parent = nullptr);
~AboutDialog(); ~AboutDialog();
bool eventFilter(QObject* obj, QEvent* event); bool eventFilter(QObject* obj, QEvent* event);
@ -33,4 +34,5 @@ private:
QPixmap originalImages[5]; QPixmap originalImages[5];
QPixmap invertedImages[5]; QPixmap invertedImages[5];
std::shared_ptr<gui_settings> m_gui_settings;
}; };

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,10 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <QDialog> #include <QDialog>
#include <SDL3/SDL.h>
#include <SDL3/SDL_gamepad.h>
#include "game_info.h" #include "game_info.h"
#include "sdl_event_wrapper.h"
namespace Ui { namespace Ui {
class ControlSettings; class ControlSettings;
@ -11,22 +14,56 @@ class ControlSettings;
class ControlSettings : public QDialog { class ControlSettings : public QDialog {
Q_OBJECT Q_OBJECT
public: public:
explicit ControlSettings(std::shared_ptr<GameInfoClass> game_info_get, explicit ControlSettings(std::shared_ptr<GameInfoClass> game_info_get, bool GameRunning,
QWidget* parent = nullptr); std::string GameRunningSerial, QWidget* parent = nullptr);
~ControlSettings(); ~ControlSettings();
signals:
void PushGamepadEvent();
void AxisChanged();
private Q_SLOTS: private Q_SLOTS:
void SaveControllerConfig(bool CloseOnSave); void SaveControllerConfig(bool CloseOnSave);
void SetDefault(); void SetDefault();
void UpdateLightbarColor(); void UpdateLightbarColor();
void CheckMapping(QPushButton*& button);
void StartTimer(QPushButton*& button, bool isButton);
void ConnectAxisInputs(QPushButton*& button);
private: private:
std::unique_ptr<Ui::ControlSettings> ui; std::unique_ptr<Ui::ControlSettings> ui;
std::shared_ptr<GameInfoClass> m_game_info; std::shared_ptr<GameInfoClass> m_game_info;
bool eventFilter(QObject* obj, QEvent* event) override;
void AddBoxItems(); void AddBoxItems();
void SetUIValuestoMappings(); void SetUIValuestoMappings();
void GetGameTitle(); void GetGameTitle();
void CheckGamePad();
void processSDLEvents(int Type, int Input, int Value);
void pollSDLEvents();
void SetMapping(QString input);
void DisableMappingButtons();
void EnableMappingButtons();
void Cleanup();
QList<QPushButton*> ButtonsList;
QList<QPushButton*> AxisList;
QSet<QString> pressedButtons;
std::string RunningGameSerial;
bool GameRunning;
bool L2Pressed = false;
bool R2Pressed = false;
bool EnableButtonMapping = false;
bool EnableAxisMapping = false;
bool MappingCompleted = false;
QString mapping;
int MappingTimer;
QTimer* timer;
QPushButton* MappingButton;
SDL_Gamepad* gamepad = nullptr;
SdlEventWrapper::Wrapper* RemapWrapper;
QFuture<void> Polling;
const std::vector<std::string> ControllerInputs = { const std::vector<std::string> ControllerInputs = {
"cross", "circle", "square", "triangle", "l1", "cross", "circle", "square", "triangle", "l1",
@ -39,15 +76,8 @@ private:
"pad_left", "pad_right", "axis_left_x", "axis_left_y", "axis_right_x", "pad_left", "pad_right", "axis_left_x", "axis_left_y", "axis_right_x",
"axis_right_y", "back"}; "axis_right_y", "back"};
const QStringList ButtonOutputs = {"cross", "circle", "square", "triangle", "l1", protected:
"r1", "l2", "r2", "l3", void closeEvent(QCloseEvent* event) override {
Cleanup();
"r3", "options", "pad_up", }
"pad_down",
"pad_left", "pad_right", "touchpad", "unmapped"};
const QStringList StickOutputs = {"axis_left_x", "axis_left_y", "axis_right_x", "axis_right_y",
"unmapped"};
}; };

View File

@ -11,8 +11,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1043</width> <width>1114</width>
<height>792</height> <height>794</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -33,8 +33,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1019</width> <width>1094</width>
<height>732</height> <height>744</height>
</rect> </rect>
</property> </property>
<widget class="QWidget" name="layoutWidget"> <widget class="QWidget" name="layoutWidget">
@ -42,8 +42,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1021</width> <width>1091</width>
<height>731</height> <height>741</height>
</rect> </rect>
</property> </property>
<layout class="QHBoxLayout" name="RemapLayout"> <layout class="QHBoxLayout" name="RemapLayout">
@ -110,7 +110,7 @@
<widget class="QGroupBox" name="gb_dpad_up"> <widget class="QGroupBox" name="gb_dpad_up">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>124</width> <width>152</width>
<height>0</height> <height>0</height>
</size> </size>
</property> </property>
@ -125,12 +125,9 @@
</property> </property>
<layout class="QHBoxLayout" name="horizontalLayout_4"> <layout class="QHBoxLayout" name="horizontalLayout_4">
<item> <item>
<widget class="QComboBox" name="DpadUpBox"> <widget class="QPushButton" name="DpadUpButton">
<property name="editable"> <property name="text">
<bool>false</bool> <string>unmapped</string>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::SizeAdjustPolicy::AdjustToContents</enum>
</property> </property>
</widget> </widget>
</item> </item>
@ -161,7 +158,11 @@
<number>5</number> <number>5</number>
</property> </property>
<item> <item>
<widget class="QComboBox" name="DpadLeftBox"/> <widget class="QPushButton" name="DpadLeftButton">
<property name="text">
<string>unmapped</string>
</property>
</widget>
</item> </item>
</layout> </layout>
</widget> </widget>
@ -185,9 +186,9 @@
<number>5</number> <number>5</number>
</property> </property>
<item> <item>
<widget class="QComboBox" name="DpadRightBox"> <widget class="QPushButton" name="DpadRightButton">
<property name="editable"> <property name="text">
<bool>false</bool> <string>unmapped</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -213,6 +214,12 @@
</property> </property>
<item> <item>
<widget class="QGroupBox" name="gb_dpad_down"> <widget class="QGroupBox" name="gb_dpad_down">
<property name="minimumSize">
<size>
<width>152</width>
<height>0</height>
</size>
</property>
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>124</width> <width>124</width>
@ -224,21 +231,9 @@
</property> </property>
<layout class="QHBoxLayout" name="horizontalLayout_3"> <layout class="QHBoxLayout" name="horizontalLayout_3">
<item> <item>
<widget class="QComboBox" name="DpadDownBox"> <widget class="QPushButton" name="DpadDownButton">
<property name="enabled"> <property name="text">
<bool>true</bool> <string>unmapped</string>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property> </property>
</widget> </widget>
</item> </item>
@ -378,7 +373,7 @@
</property> </property>
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>124</width> <width>152</width>
<height>16777215</height> <height>16777215</height>
</size> </size>
</property> </property>
@ -387,9 +382,9 @@
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_10"> <layout class="QVBoxLayout" name="verticalLayout_10">
<item> <item>
<widget class="QComboBox" name="LStickUpBox"> <widget class="QPushButton" name="LStickUpButton">
<property name="enabled"> <property name="text">
<bool>true</bool> <string>unmapped</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -420,9 +415,9 @@
<number>5</number> <number>5</number>
</property> </property>
<item> <item>
<widget class="QComboBox" name="LStickLeftBox"> <widget class="QPushButton" name="LStickLeftButton">
<property name="enabled"> <property name="text">
<bool>true</bool> <string>unmapped</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -454,9 +449,9 @@
<number>5</number> <number>5</number>
</property> </property>
<item> <item>
<widget class="QComboBox" name="LStickRightBox"> <widget class="QPushButton" name="LStickRightButton">
<property name="enabled"> <property name="text">
<bool>true</bool> <string>unmapped</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -484,7 +479,7 @@
<widget class="QGroupBox" name="gb_left_stick_down"> <widget class="QGroupBox" name="gb_left_stick_down">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>124</width> <width>152</width>
<height>0</height> <height>0</height>
</size> </size>
</property> </property>
@ -499,15 +494,9 @@
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_8"> <layout class="QVBoxLayout" name="verticalLayout_8">
<item> <item>
<widget class="QComboBox" name="LStickDownBox"> <widget class="QPushButton" name="LStickDownButton">
<property name="enabled"> <property name="text">
<bool>true</bool> <string>unmapped</string>
</property>
<property name="editable">
<bool>false</bool>
</property>
<property name="frame">
<bool>false</bool>
</property> </property>
</widget> </widget>
</item> </item>
@ -617,149 +606,190 @@
<property name="spacing"> <property name="spacing">
<number>0</number> <number>0</number>
</property> </property>
<item>
<layout class="QVBoxLayout" name="layout_l1_l2">
<item>
<widget class="QGroupBox" name="gb_l1">
<property name="title">
<string>L1 / LB</string>
</property>
<layout class="QVBoxLayout" name="gb_l1_layout">
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item>
<widget class="QComboBox" name="LBBox"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gb_l2">
<property name="title">
<string>L2 / LT</string>
</property>
<layout class="QVBoxLayout" name="gb_l2_layout">
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item>
<widget class="QComboBox" name="LTBox"/>
</item>
</layout>
</widget>
</item>
</layout>
</item>
<item> <item>
<layout class="QVBoxLayout" name="layout_system_buttons"> <layout class="QVBoxLayout" name="layout_system_buttons">
<item>
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Policy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item> <item>
<layout class="QVBoxLayout" name="verticalLayout_4"> <layout class="QVBoxLayout" name="verticalLayout_4">
<property name="spacing">
<number>10</number>
</property>
<item> <item>
<widget class="QGroupBox" name="groupBox_2"> <layout class="QHBoxLayout" name="horizontalLayout_13">
<property name="title"> <item>
<string>Back</string> <widget class="QGroupBox" name="gb_l1">
</property> <property name="sizePolicy">
<layout class="QVBoxLayout" name="verticalLayout_9"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<item> <horstretch>0</horstretch>
<widget class="QComboBox" name="BackBox"/> <verstretch>0</verstretch>
</item> </sizepolicy>
</layout> </property>
</widget> <property name="title">
<string>L1</string>
</property>
<layout class="QVBoxLayout" name="gb_l1_layout">
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="L1Button">
<property name="text">
<string>unmapped</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Policy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>133</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QGroupBox" name="gb_r1">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>R1</string>
</property>
<layout class="QVBoxLayout" name="gb_r1_layout">
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="R1Button">
<property name="text">
<string>unmapped</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_14">
<item>
<widget class="QGroupBox" name="gb_l2">
<property name="title">
<string>L2</string>
</property>
<layout class="QVBoxLayout" name="gb_l2_layout">
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="L2Button">
<property name="text">
<string>unmapped</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gb_start">
<property name="title">
<string>Options</string>
</property>
<layout class="QVBoxLayout" name="gb_start_layout">
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="OptionsButton">
<property name="text">
<string>unmapped</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gb_r2">
<property name="title">
<string>R2</string>
</property>
<layout class="QVBoxLayout" name="gb_r2_layout">
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="R2Button">
<property name="text">
<string>unmapped</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</item> </item>
</layout> </layout>
</item> </item>
</layout> </layout>
</item> </item>
<item>
<layout class="QVBoxLayout" name="layout_r1_r2">
<item>
<widget class="QGroupBox" name="gb_r1">
<property name="title">
<string>R1 / RB</string>
</property>
<layout class="QVBoxLayout" name="gb_r1_layout">
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item>
<widget class="QComboBox" name="RBBox"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gb_r2">
<property name="title">
<string>R2 / RT</string>
</property>
<layout class="QVBoxLayout" name="gb_r2_layout">
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item>
<widget class="QComboBox" name="RTBox"/>
</item>
</layout>
</widget>
</item>
</layout>
</item>
</layout> </layout>
</item> </item>
<item> <item>
@ -806,7 +836,7 @@
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="layout_middle_bottom"> <layout class="QVBoxLayout" name="verticalLayout_9">
<property name="spacing"> <property name="spacing">
<number>10</number> <number>10</number>
</property> </property>
@ -814,76 +844,144 @@
<enum>QLayout::SizeConstraint::SetDefaultConstraint</enum> <enum>QLayout::SizeConstraint::SetDefaultConstraint</enum>
</property> </property>
<item> <item>
<widget class="QGroupBox" name="gb_l3"> <layout class="QHBoxLayout" name="horizontalLayout">
<property name="title"> <item>
<string>L3</string> <widget class="QGroupBox" name="gb_l3">
</property> <property name="sizePolicy">
<layout class="QVBoxLayout" name="gb_l3_layout"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<property name="leftMargin"> <horstretch>0</horstretch>
<number>5</number> <verstretch>0</verstretch>
</property> </sizepolicy>
<property name="topMargin"> </property>
<number>5</number> <property name="title">
</property> <string>L3</string>
<property name="rightMargin"> </property>
<number>5</number> <layout class="QVBoxLayout" name="gb_l3_layout">
</property> <property name="leftMargin">
<property name="bottomMargin"> <number>5</number>
<number>5</number> </property>
</property> <property name="topMargin">
<item> <number>5</number>
<widget class="QComboBox" name="LClickBox"/> </property>
</item> <property name="rightMargin">
</layout> <number>5</number>
</widget> </property>
<property name="bottomMargin">
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="L3Button">
<property name="text">
<string>unmapped</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Policy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>133</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QGroupBox" name="gb_r3">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>R3</string>
</property>
<layout class="QVBoxLayout" name="gb_r3_layout">
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="R3Button">
<property name="text">
<string>unmapped</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="gb_start"> <layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="title"> <item>
<string>Options / Start</string> <widget class="QGroupBox" name="gb_touchleft">
</property> <property name="title">
<layout class="QVBoxLayout" name="gb_start_layout"> <string>Touchpad Left</string>
<property name="leftMargin"> </property>
<number>5</number> <layout class="QHBoxLayout" name="horizontalLayout_5">
</property> <item>
<property name="topMargin"> <widget class="QPushButton" name="TouchpadLeftButton">
<number>5</number> <property name="text">
</property> <string>unmapped</string>
<property name="rightMargin"> </property>
<number>5</number> </widget>
</property> </item>
<property name="bottomMargin"> </layout>
<number>5</number> </widget>
</property> </item>
<item> <item>
<widget class="QComboBox" name="StartBox"/> <widget class="QGroupBox" name="gb_touchcenter">
</item> <property name="title">
</layout> <string>Touchpad Center</string>
</widget> </property>
</item> <layout class="QVBoxLayout" name="verticalLayout_11">
<item> <item>
<widget class="QGroupBox" name="gb_r3"> <widget class="QPushButton" name="TouchpadCenterButton">
<property name="title"> <property name="text">
<string>R3</string> <string>unmapped</string>
</property> </property>
<layout class="QVBoxLayout" name="gb_r3_layout"> </widget>
<property name="leftMargin"> </item>
<number>5</number> </layout>
</property> </widget>
<property name="topMargin"> </item>
<number>5</number> <item>
</property> <widget class="QGroupBox" name="gb_touchright">
<property name="rightMargin"> <property name="title">
<number>5</number> <string>Touchpad Right</string>
</property> </property>
<property name="bottomMargin"> <layout class="QVBoxLayout" name="verticalLayout_12">
<number>5</number> <item>
</property> <widget class="QPushButton" name="TouchpadRightButton">
<item> <property name="text">
<widget class="QComboBox" name="RClickBox"/> <string>unmapped</string>
</item> </property>
</layout> </widget>
</widget> </item>
</layout>
</widget>
</item>
</layout>
</item> </item>
</layout> </layout>
</item> </item>
@ -1104,7 +1202,7 @@
</property> </property>
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>124</width> <width>152</width>
<height>0</height> <height>0</height>
</size> </size>
</property> </property>
@ -1115,19 +1213,13 @@
</size> </size>
</property> </property>
<property name="title"> <property name="title">
<string>Triangle / Y</string> <string>Triangle</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_3"> <layout class="QVBoxLayout" name="verticalLayout_3">
<item> <item>
<widget class="QComboBox" name="YBox"> <widget class="QPushButton" name="TriangleButton">
<property name="enabled"> <property name="text">
<bool>true</bool> <string>unmapped</string>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property> </property>
</widget> </widget>
</item> </item>
@ -1142,7 +1234,7 @@
<item> <item>
<widget class="QGroupBox" name="gb_square"> <widget class="QGroupBox" name="gb_square">
<property name="title"> <property name="title">
<string>Square / X</string> <string>Square</string>
</property> </property>
<layout class="QVBoxLayout" name="gb_square_layout"> <layout class="QVBoxLayout" name="gb_square_layout">
<property name="leftMargin"> <property name="leftMargin">
@ -1158,7 +1250,11 @@
<number>5</number> <number>5</number>
</property> </property>
<item> <item>
<widget class="QComboBox" name="XBox"/> <widget class="QPushButton" name="SquareButton">
<property name="text">
<string>unmapped</string>
</property>
</widget>
</item> </item>
</layout> </layout>
</widget> </widget>
@ -1166,7 +1262,7 @@
<item> <item>
<widget class="QGroupBox" name="gb_circle"> <widget class="QGroupBox" name="gb_circle">
<property name="title"> <property name="title">
<string>Circle / B</string> <string>Circle</string>
</property> </property>
<layout class="QVBoxLayout" name="gb_circle_layout"> <layout class="QVBoxLayout" name="gb_circle_layout">
<property name="leftMargin"> <property name="leftMargin">
@ -1182,7 +1278,11 @@
<number>5</number> <number>5</number>
</property> </property>
<item> <item>
<widget class="QComboBox" name="BBox"/> <widget class="QPushButton" name="CircleButton">
<property name="text">
<string>unmapped</string>
</property>
</widget>
</item> </item>
</layout> </layout>
</widget> </widget>
@ -1208,7 +1308,7 @@
<widget class="QGroupBox" name="gb_cross"> <widget class="QGroupBox" name="gb_cross">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>124</width> <width>152</width>
<height>0</height> <height>0</height>
</size> </size>
</property> </property>
@ -1219,11 +1319,15 @@
</size> </size>
</property> </property>
<property name="title"> <property name="title">
<string>Cross / A</string> <string>Cross</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_5"> <layout class="QVBoxLayout" name="verticalLayout_5">
<item> <item>
<widget class="QComboBox" name="ABox"/> <widget class="QPushButton" name="CrossButton">
<property name="text">
<string>unmapped</string>
</property>
</widget>
</item> </item>
</layout> </layout>
</widget> </widget>
@ -1361,7 +1465,7 @@
</property> </property>
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>124</width> <width>152</width>
<height>1231321</height> <height>1231321</height>
</size> </size>
</property> </property>
@ -1370,9 +1474,9 @@
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_7"> <layout class="QVBoxLayout" name="verticalLayout_7">
<item> <item>
<widget class="QComboBox" name="RStickUpBox"> <widget class="QPushButton" name="RStickUpButton">
<property name="enabled"> <property name="text">
<bool>true</bool> <string>unmapped</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -1403,9 +1507,9 @@
<number>5</number> <number>5</number>
</property> </property>
<item> <item>
<widget class="QComboBox" name="RStickLeftBox"> <widget class="QPushButton" name="RStickLeftButton">
<property name="enabled"> <property name="text">
<bool>true</bool> <string>unmapped</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -1431,7 +1535,11 @@
<number>5</number> <number>5</number>
</property> </property>
<item> <item>
<widget class="QComboBox" name="RStickRightBox"/> <widget class="QPushButton" name="RStickRightButton">
<property name="text">
<string>unmapped</string>
</property>
</widget>
</item> </item>
</layout> </layout>
</widget> </widget>
@ -1457,7 +1565,7 @@
<widget class="QGroupBox" name="gb_right_stick_down"> <widget class="QGroupBox" name="gb_right_stick_down">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>124</width> <width>152</width>
<height>0</height> <height>0</height>
</size> </size>
</property> </property>
@ -1472,9 +1580,9 @@
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_6"> <layout class="QVBoxLayout" name="verticalLayout_6">
<item> <item>
<widget class="QComboBox" name="RStickDownBox"> <widget class="QPushButton" name="RStickDownButton">
<property name="enabled"> <property name="text">
<bool>true</bool> <string>unmapped</string>
</property> </property>
</widget> </widget>
</item> </item>

View File

@ -3,10 +3,12 @@
#include "elf_viewer.h" #include "elf_viewer.h"
ElfViewer::ElfViewer(QWidget* parent) : QTableWidget(parent) { ElfViewer::ElfViewer(std::shared_ptr<gui_settings> gui_settings, QWidget* parent)
dir_list_std = Config::getElfViewer(); : QTableWidget(parent), m_gui_settings(std::move(gui_settings)) {
for (const auto& str : dir_list_std) {
dir_list.append(QString::fromStdString(str)); list = gui_settings::Var2List(m_gui_settings->GetValue(gui::gen_elfDirs));
for (const auto& str : list) {
dir_list.append(str);
} }
CheckElfFolders(); CheckElfFolders();
@ -55,11 +57,11 @@ void ElfViewer::OpenElfFolder() {
} }
std::ranges::sort(m_elf_list); std::ranges::sort(m_elf_list);
OpenElfFiles(); OpenElfFiles();
dir_list_std.clear(); list.clear();
for (auto dir : dir_list) { for (auto dir : dir_list) {
dir_list_std.push_back(dir.toStdString()); list.push_back(dir);
} }
Config::setElfViewer(dir_list_std); m_gui_settings->SetValue(gui::gen_elfDirs, gui_settings::List2Var(list));
} else { } else {
// qDebug() << "Folder selection canceled."; // qDebug() << "Folder selection canceled.";
} }

View File

@ -11,7 +11,7 @@
class ElfViewer : public QTableWidget { class ElfViewer : public QTableWidget {
Q_OBJECT Q_OBJECT
public: public:
explicit ElfViewer(QWidget* parent = nullptr); explicit ElfViewer(std::shared_ptr<gui_settings> gui_settings, QWidget* parent = nullptr);
QStringList m_elf_list; QStringList m_elf_list;
private: private:
@ -21,7 +21,8 @@ private:
Core::Loader::Elf m_elf_file; Core::Loader::Elf m_elf_file;
QStringList dir_list; QStringList dir_list;
QStringList elf_headers_list; QStringList elf_headers_list;
std::vector<std::string> dir_list_std; QList<QString> list;
std::shared_ptr<gui_settings> m_gui_settings;
void SetTableItem(QTableWidget* game_list, int row, int column, QString itemStr) { void SetTableItem(QTableWidget* game_list, int row, int column, QString itemStr) {
QTableWidgetItem* item = new QTableWidgetItem(); QTableWidgetItem* item = new QTableWidgetItem();

View File

@ -34,7 +34,9 @@ GameGridFrame::GameGridFrame(std::shared_ptr<gui_settings> gui_settings,
connect(this->horizontalScrollBar(), &QScrollBar::valueChanged, this, connect(this->horizontalScrollBar(), &QScrollBar::valueChanged, this,
&GameGridFrame::RefreshGridBackgroundImage); &GameGridFrame::RefreshGridBackgroundImage);
connect(this, &QTableWidget::customContextMenuRequested, this, [=, this](const QPoint& pos) { connect(this, &QTableWidget::customContextMenuRequested, this, [=, this](const QPoint& pos) {
m_gui_context_menus.RequestGameMenu(pos, m_game_info->m_games, m_compat_info, this, false); m_gui_context_menus.RequestGameMenu(pos, m_game_info->m_games, m_compat_info,
m_gui_settings, this, false);
PopulateGameGrid(m_game_info->m_games, false);
}); });
} }
@ -88,10 +90,13 @@ void GameGridFrame::PopulateGameGrid(QVector<GameInfo> m_games_search, bool from
this->crtColumn = -1; this->crtColumn = -1;
QVector<GameInfo> m_games_; QVector<GameInfo> m_games_;
this->clearContents(); this->clearContents();
if (fromSearch) if (fromSearch) {
SortByFavorite(&m_games_search);
m_games_ = m_games_search; m_games_ = m_games_search;
else } else {
SortByFavorite(&(m_game_info->m_games));
m_games_ = m_game_info->m_games; m_games_ = m_game_info->m_games;
}
m_games_shared = std::make_shared<QVector<GameInfo>>(m_games_); m_games_shared = std::make_shared<QVector<GameInfo>>(m_games_);
icon_size = icon_size =
m_gui_settings->GetValue(gui::gg_icon_size).toInt(); // update icon size for resize event. m_gui_settings->GetValue(gui::gg_icon_size).toInt(); // update icon size for resize event.
@ -110,14 +115,21 @@ void GameGridFrame::PopulateGameGrid(QVector<GameInfo> m_games_search, bool from
for (int i = 0; i < m_games_.size(); i++) { for (int i = 0; i < m_games_.size(); i++) {
QWidget* widget = new QWidget(); QWidget* widget = new QWidget();
QVBoxLayout* layout = new QVBoxLayout(); QVBoxLayout* layout = new QVBoxLayout();
QLabel* image_label = new QLabel();
QWidget* image_container = new QWidget();
image_container->setFixedSize(icon_size, icon_size);
QLabel* image_label = new QLabel(image_container);
QImage icon = m_games_[gameCounter].icon.scaled( QImage icon = m_games_[gameCounter].icon.scaled(
QSize(icon_size, icon_size), Qt::IgnoreAspectRatio, Qt::SmoothTransformation); QSize(icon_size, icon_size), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
image_label->setFixedSize(icon.width(), icon.height()); image_label->setFixedSize(icon.width(), icon.height());
image_label->setPixmap(QPixmap::fromImage(icon)); image_label->setPixmap(QPixmap::fromImage(icon));
image_label->move(0, 0);
SetFavoriteIcon(image_container, m_games_, gameCounter);
QLabel* name_label = new QLabel(QString::fromStdString(m_games_[gameCounter].serial)); QLabel* name_label = new QLabel(QString::fromStdString(m_games_[gameCounter].serial));
name_label->setAlignment(Qt::AlignHCenter); name_label->setAlignment(Qt::AlignHCenter);
layout->addWidget(image_label); layout->addWidget(image_container);
layout->addWidget(name_label); layout->addWidget(name_label);
// Resizing of font-size. // Resizing of font-size.
@ -225,3 +237,43 @@ void GameGridFrame::resizeEvent(QResizeEvent* event) {
bool GameGridFrame::IsValidCellSelected() { bool GameGridFrame::IsValidCellSelected() {
return validCellSelected; return validCellSelected;
} }
void GameGridFrame::SetFavoriteIcon(QWidget* parentWidget, QVector<GameInfo> m_games_,
int gameCounter) {
QString serialStr = QString::fromStdString(m_games_[gameCounter].serial);
QList<QString> list = gui_settings::Var2List(m_gui_settings->GetValue(gui::favorites_list));
bool isFavorite = list.contains(serialStr);
QLabel* label = new QLabel(parentWidget);
label->setPixmap(QPixmap(":images/favorite_icon.png")
.scaled(icon_size / 3.8, icon_size / 3.8, Qt::KeepAspectRatio,
Qt::SmoothTransformation));
label->move(icon_size - icon_size / 4, 2);
label->raise();
label->setVisible(isFavorite);
label->setObjectName("favoriteIcon");
}
void GameGridFrame::SortByFavorite(QVector<GameInfo>* game_list) {
std::sort(game_list->begin(), game_list->end(), [this](const GameInfo& a, const GameInfo& b) {
return this->CompareWithFavorite(a, b);
});
}
bool GameGridFrame::CompareWithFavorite(GameInfo a, GameInfo b) {
std::string serial_a = a.serial;
std::string serial_b = b.serial;
QString serialStr_a = QString::fromStdString(a.serial);
QString serialStr_b = QString::fromStdString(b.serial);
QList<QString> list = gui_settings::Var2List(m_gui_settings->GetValue(gui::favorites_list));
bool isFavorite_a = list.contains(serialStr_a);
bool isFavorite_b = list.contains(serialStr_b);
if (isFavorite_a != isFavorite_b) {
return isFavorite_a;
} else {
std::string name_a = a.name, name_b = b.name;
std::transform(name_a.begin(), name_a.end(), name_a.begin(), ::tolower);
std::transform(name_b.begin(), name_b.end(), name_b.begin(), ::tolower);
return name_a < name_b;
}
}

View File

@ -39,6 +39,8 @@ private:
int m_last_opacity = -1; // Track last opacity to avoid unnecessary recomputation int m_last_opacity = -1; // Track last opacity to avoid unnecessary recomputation
std::filesystem::path m_current_game_path; // Track current game path to detect changes std::filesystem::path m_current_game_path; // Track current game path to detect changes
std::shared_ptr<gui_settings> m_gui_settings; std::shared_ptr<gui_settings> m_gui_settings;
void SetFavoriteIcon(QWidget* parentWidget, QVector<GameInfo> m_games_, int gameCounter);
bool CompareWithFavorite(GameInfo a, GameInfo b);
public: public:
explicit GameGridFrame(std::shared_ptr<gui_settings> gui_settings, explicit GameGridFrame(std::shared_ptr<gui_settings> gui_settings,
@ -47,6 +49,7 @@ public:
QWidget* parent = nullptr); QWidget* parent = nullptr);
void PopulateGameGrid(QVector<GameInfo> m_games, bool fromSearch); void PopulateGameGrid(QVector<GameInfo> m_games, bool fromSearch);
bool IsValidCellSelected(); bool IsValidCellSelected();
void SortByFavorite(QVector<GameInfo>* game_list);
bool cellClicked = false; bool cellClicked = false;
int icon_size; int icon_size;

View File

@ -16,6 +16,7 @@ GameListFrame::GameListFrame(std::shared_ptr<gui_settings> gui_settings,
: QTableWidget(parent), m_gui_settings(std::move(gui_settings)), m_game_info(game_info_get), : QTableWidget(parent), m_gui_settings(std::move(gui_settings)), m_game_info(game_info_get),
m_compat_info(compat_info_get) { m_compat_info(compat_info_get) {
icon_size = m_gui_settings->GetValue(gui::gl_icon_size).toInt(); icon_size = m_gui_settings->GetValue(gui::gl_icon_size).toInt();
last_favorite = "";
this->setShowGrid(false); this->setShowGrid(false);
this->setEditTriggers(QAbstractItemView::NoEditTriggers); this->setEditTriggers(QAbstractItemView::NoEditTriggers);
this->setSelectionBehavior(QAbstractItemView::SelectRows); this->setSelectionBehavior(QAbstractItemView::SelectRows);
@ -30,9 +31,8 @@ GameListFrame::GameListFrame(std::shared_ptr<gui_settings> gui_settings,
this->horizontalHeader()->setContextMenuPolicy(Qt::CustomContextMenu); this->horizontalHeader()->setContextMenuPolicy(Qt::CustomContextMenu);
this->horizontalHeader()->setHighlightSections(false); this->horizontalHeader()->setHighlightSections(false);
this->horizontalHeader()->setSortIndicatorShown(true); this->horizontalHeader()->setSortIndicatorShown(true);
this->horizontalHeader()->setStretchLastSection(true);
this->setContextMenuPolicy(Qt::CustomContextMenu); this->setContextMenuPolicy(Qt::CustomContextMenu);
this->setColumnCount(10); this->setColumnCount(11);
this->setColumnWidth(1, 300); // Name this->setColumnWidth(1, 300); // Name
this->setColumnWidth(2, 140); // Compatibility this->setColumnWidth(2, 140); // Compatibility
this->setColumnWidth(3, 120); // Serial this->setColumnWidth(3, 120); // Serial
@ -41,14 +41,18 @@ GameListFrame::GameListFrame(std::shared_ptr<gui_settings> gui_settings,
this->setColumnWidth(6, 90); // Size this->setColumnWidth(6, 90); // Size
this->setColumnWidth(7, 90); // Version this->setColumnWidth(7, 90); // Version
this->setColumnWidth(8, 120); // Play Time this->setColumnWidth(8, 120); // Play Time
this->setColumnWidth(10, 90); // Favorite
QStringList headers; QStringList headers;
headers << tr("Icon") << tr("Name") << tr("Compatibility") << tr("Serial") << tr("Region") headers << tr("Icon") << tr("Name") << tr("Compatibility") << tr("Serial") << tr("Region")
<< tr("Firmware") << tr("Size") << tr("Version") << tr("Play Time") << tr("Path"); << tr("Firmware") << tr("Size") << tr("Version") << tr("Play Time") << tr("Path")
<< tr("Favorite");
this->setHorizontalHeaderLabels(headers); this->setHorizontalHeaderLabels(headers);
this->horizontalHeader()->setSortIndicatorShown(true); this->horizontalHeader()->setSortIndicatorShown(true);
this->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents); this->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
this->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Fixed); this->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Fixed);
this->horizontalHeader()->setSectionResizeMode(4, QHeaderView::Fixed); this->horizontalHeader()->setSectionResizeMode(4, QHeaderView::Fixed);
this->horizontalHeader()->setSectionResizeMode(9, QHeaderView::Stretch);
this->horizontalHeader()->setSectionResizeMode(10, QHeaderView::Fixed);
PopulateGameList(); PopulateGameList();
connect(this, &QTableWidget::currentCellChanged, this, &GameListFrame::onCurrentCellChanged); connect(this, &QTableWidget::currentCellChanged, this, &GameListFrame::onCurrentCellChanged);
@ -65,17 +69,24 @@ GameListFrame::GameListFrame(std::shared_ptr<gui_settings> gui_settings,
SortNameDescending(columnIndex); SortNameDescending(columnIndex);
this->horizontalHeader()->setSortIndicator(columnIndex, Qt::DescendingOrder); this->horizontalHeader()->setSortIndicator(columnIndex, Qt::DescendingOrder);
ListSortedAsc = false; ListSortedAsc = false;
sortColumn = columnIndex;
} else { } else {
SortNameAscending(columnIndex); SortNameAscending(columnIndex);
this->horizontalHeader()->setSortIndicator(columnIndex, Qt::AscendingOrder); this->horizontalHeader()->setSortIndicator(columnIndex, Qt::AscendingOrder);
ListSortedAsc = true; ListSortedAsc = true;
sortColumn = columnIndex;
} }
this->clearContents(); this->clearContents();
PopulateGameList(false); PopulateGameList(false);
}); });
connect(this, &QTableWidget::customContextMenuRequested, this, [=, this](const QPoint& pos) { connect(this, &QTableWidget::customContextMenuRequested, this, [=, this](const QPoint& pos) {
m_gui_context_menus.RequestGameMenu(pos, m_game_info->m_games, m_compat_info, this, true); int changedFavorite = m_gui_context_menus.RequestGameMenu(
pos, m_game_info->m_games, m_compat_info, m_gui_settings, this, true);
if (changedFavorite) {
last_favorite = m_game_info->m_games[this->currentRow()].serial;
PopulateGameList(false);
}
}); });
connect(this, &QTableWidget::cellClicked, this, [=, this](int row, int column) { connect(this, &QTableWidget::cellClicked, this, [=, this](int row, int column) {
@ -83,6 +94,19 @@ GameListFrame::GameListFrame(std::shared_ptr<gui_settings> gui_settings,
auto url_issues = "https://github.com/shadps4-emu/shadps4-game-compatibility/issues/"; auto url_issues = "https://github.com/shadps4-emu/shadps4-game-compatibility/issues/";
QDesktopServices::openUrl( QDesktopServices::openUrl(
QUrl(url_issues + m_game_info->m_games[row].compatibility.issue_number)); QUrl(url_issues + m_game_info->m_games[row].compatibility.issue_number));
} else if (column == 10) {
last_favorite = m_game_info->m_games[row].serial;
QString serialStr = QString::fromStdString(last_favorite);
QList<QString> list =
gui_settings::Var2List(m_gui_settings->GetValue(gui::favorites_list));
bool isFavorite = list.contains(serialStr);
if (isFavorite) {
list.removeOne(serialStr);
} else {
list.append(serialStr);
}
m_gui_settings->SetValue(gui::favorites_list, gui_settings::List2Var(list));
PopulateGameList(false);
} }
}); });
} }
@ -117,10 +141,7 @@ void GameListFrame::PopulateGameList(bool isInitialPopulation) {
this->setRowCount(m_game_info->m_games.size()); this->setRowCount(m_game_info->m_games.size());
ResizeIcons(icon_size); ResizeIcons(icon_size);
if (isInitialPopulation) { ApplyLastSorting(isInitialPopulation);
SortNameAscending(1); // Column 1 = Name
ResizeIcons(icon_size);
}
for (int i = 0; i < m_game_info->m_games.size(); i++) { for (int i = 0; i < m_game_info->m_games.size(); i++) {
SetTableItem(i, 1, QString::fromStdString(m_game_info->m_games[i].name)); SetTableItem(i, 1, QString::fromStdString(m_game_info->m_games[i].name));
@ -129,6 +150,11 @@ void GameListFrame::PopulateGameList(bool isInitialPopulation) {
SetTableItem(i, 5, QString::fromStdString(m_game_info->m_games[i].fw)); SetTableItem(i, 5, QString::fromStdString(m_game_info->m_games[i].fw));
SetTableItem(i, 6, QString::fromStdString(m_game_info->m_games[i].size)); SetTableItem(i, 6, QString::fromStdString(m_game_info->m_games[i].size));
SetTableItem(i, 7, QString::fromStdString(m_game_info->m_games[i].version)); SetTableItem(i, 7, QString::fromStdString(m_game_info->m_games[i].version));
SetFavoriteIcon(i, 10);
if (m_game_info->m_games[i].serial == last_favorite && !isInitialPopulation) {
this->setCurrentCell(i, 10);
}
m_game_info->m_games[i].compatibility = m_game_info->m_games[i].compatibility =
m_compat_info->GetCompatibilityInfo(m_game_info->m_games[i].serial); m_compat_info->GetCompatibilityInfo(m_game_info->m_games[i].serial);
@ -226,20 +252,50 @@ void GameListFrame::resizeEvent(QResizeEvent* event) {
RefreshListBackgroundImage(); RefreshListBackgroundImage();
} }
bool GameListFrame::CompareWithFavorite(GameInfo a, GameInfo b, int columnIndex, bool ascending) {
std::string serial_a = a.serial;
std::string serial_b = b.serial;
QString serialStr_a = QString::fromStdString(a.serial);
QString serialStr_b = QString::fromStdString(b.serial);
QList<QString> list = gui_settings::Var2List(m_gui_settings->GetValue(gui::favorites_list));
bool isFavorite_a = list.contains(serialStr_a);
bool isFavorite_b = list.contains(serialStr_b);
if (isFavorite_a != isFavorite_b) {
return isFavorite_a;
} else if (ascending) {
return CompareStringsAscending(a, b, columnIndex);
} else {
return CompareStringsDescending(a, b, columnIndex);
}
}
void GameListFrame::SortNameAscending(int columnIndex) { void GameListFrame::SortNameAscending(int columnIndex) {
std::sort(m_game_info->m_games.begin(), m_game_info->m_games.end(), std::sort(m_game_info->m_games.begin(), m_game_info->m_games.end(),
[columnIndex](const GameInfo& a, const GameInfo& b) { [this, columnIndex](const GameInfo& a, const GameInfo& b) {
return CompareStringsAscending(a, b, columnIndex); return this->CompareWithFavorite(a, b, columnIndex, true);
}); });
} }
void GameListFrame::SortNameDescending(int columnIndex) { void GameListFrame::SortNameDescending(int columnIndex) {
std::sort(m_game_info->m_games.begin(), m_game_info->m_games.end(), std::sort(m_game_info->m_games.begin(), m_game_info->m_games.end(),
[columnIndex](const GameInfo& a, const GameInfo& b) { [this, columnIndex](const GameInfo& a, const GameInfo& b) {
return CompareStringsDescending(a, b, columnIndex); return this->CompareWithFavorite(a, b, columnIndex, false);
}); });
} }
void GameListFrame::ApplyLastSorting(bool isInitialPopulation) {
if (isInitialPopulation) {
SortNameAscending(1); // Column 1 = Name
ResizeIcons(icon_size);
} else if (ListSortedAsc) {
SortNameAscending(sortColumn);
ResizeIcons(icon_size);
} else {
SortNameDescending(sortColumn);
ResizeIcons(icon_size);
}
}
void GameListFrame::ResizeIcons(int iconSize) { void GameListFrame::ResizeIcons(int iconSize) {
for (int index = 0; auto& game : m_game_info->m_games) { for (int index = 0; auto& game : m_game_info->m_games) {
QImage scaledPixmap = game.icon.scaled(QSize(iconSize, iconSize), Qt::KeepAspectRatio, QImage scaledPixmap = game.icon.scaled(QSize(iconSize, iconSize), Qt::KeepAspectRatio,
@ -390,6 +446,35 @@ void GameListFrame::SetRegionFlag(int row, int column, QString itemStr) {
this->setCellWidget(row, column, widget); this->setCellWidget(row, column, widget);
} }
void GameListFrame::SetFavoriteIcon(int row, int column) {
QString serialStr = QString::fromStdString(m_game_info->m_games[row].serial);
QList<QString> list = gui_settings::Var2List(m_gui_settings->GetValue(gui::favorites_list));
bool isFavorite = list.contains(serialStr);
QTableWidgetItem* item = new QTableWidgetItem();
QImage scaledPixmap = QImage(":images/favorite_icon.png");
scaledPixmap = scaledPixmap.scaledToHeight(this->columnWidth(column) / 2.5);
scaledPixmap = scaledPixmap.scaledToWidth(this->columnWidth(column) / 2.5);
QWidget* widget = new QWidget(this);
QVBoxLayout* layout = new QVBoxLayout(widget);
QLabel* label = new QLabel(widget);
label->setPixmap(QPixmap::fromImage(scaledPixmap));
label->setObjectName("favoriteIcon");
label->setVisible(isFavorite);
layout->setAlignment(Qt::AlignCenter);
layout->addWidget(label);
widget->setLayout(layout);
this->setItem(row, column, item);
this->setCellWidget(row, column, widget);
if (column > 0) {
this->horizontalHeader()->setSectionResizeMode(column - 1, QHeaderView::Stretch);
}
}
QString GameListFrame::GetPlayTime(const std::string& serial) { QString GameListFrame::GetPlayTime(const std::string& serial) {
QString playTime; QString playTime;
const auto user_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir); const auto user_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir);
@ -422,4 +507,4 @@ QString GameListFrame::GetPlayTime(const std::string& serial) {
QTableWidgetItem* GameListFrame::GetCurrentItem() { QTableWidgetItem* GameListFrame::GetCurrentItem() {
return m_current_item; return m_current_item;
} }

View File

@ -42,11 +42,13 @@ public Q_SLOTS:
private: private:
void SetTableItem(int row, int column, QString itemStr); void SetTableItem(int row, int column, QString itemStr);
void SetRegionFlag(int row, int column, QString itemStr); void SetRegionFlag(int row, int column, QString itemStr);
void SetFavoriteIcon(int row, int column);
void SetCompatibilityItem(int row, int column, CompatibilityEntry entry); void SetCompatibilityItem(int row, int column, CompatibilityEntry entry);
QString GetPlayTime(const std::string& serial); QString GetPlayTime(const std::string& serial);
QList<QAction*> m_columnActs; QList<QAction*> m_columnActs;
GameInfoClass* game_inf_get = nullptr; GameInfoClass* game_inf_get = nullptr;
bool ListSortedAsc = true; bool ListSortedAsc = true;
int sortColumn = 1;
QTableWidgetItem* m_current_item = nullptr; QTableWidgetItem* m_current_item = nullptr;
int m_last_opacity = -1; // Track last opacity to avoid unnecessary recomputation int m_last_opacity = -1; // Track last opacity to avoid unnecessary recomputation
std::filesystem::path m_current_game_path; // Track current game path to detect changes std::filesystem::path m_current_game_path; // Track current game path to detect changes
@ -55,6 +57,7 @@ private:
public: public:
void PopulateGameList(bool isInitialPopulation = true); void PopulateGameList(bool isInitialPopulation = true);
void ResizeIcons(int iconSize); void ResizeIcons(int iconSize);
void ApplyLastSorting(bool isInitialPopulation);
QTableWidgetItem* GetCurrentItem(); QTableWidgetItem* GetCurrentItem();
QImage backgroundImage; QImage backgroundImage;
GameListUtils m_game_list_utils; GameListUtils m_game_list_utils;
@ -63,6 +66,7 @@ public:
std::shared_ptr<CompatibilityInfoClass> m_compat_info; std::shared_ptr<CompatibilityInfoClass> m_compat_info;
int icon_size; int icon_size;
std::string last_favorite;
static float parseAsFloat(const std::string& str, const int& offset) { static float parseAsFloat(const std::string& str, const int& offset) {
return std::stof(str.substr(0, str.size() - offset)); return std::stof(str.substr(0, str.size() - offset));
@ -130,4 +134,6 @@ public:
return false; return false;
} }
} }
bool CompareWithFavorite(GameInfo a, GameInfo b, int columnIndex, bool ascending);
}; };

View File

@ -16,6 +16,7 @@
#include "common/scm_rev.h" #include "common/scm_rev.h"
#include "compatibility_info.h" #include "compatibility_info.h"
#include "game_info.h" #include "game_info.h"
#include "gui_settings.h"
#include "trophy_viewer.h" #include "trophy_viewer.h"
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
@ -30,11 +31,13 @@
class GuiContextMenus : public QObject { class GuiContextMenus : public QObject {
Q_OBJECT Q_OBJECT
public: public:
void RequestGameMenu(const QPoint& pos, QVector<GameInfo>& m_games, int RequestGameMenu(const QPoint& pos, QVector<GameInfo>& m_games,
std::shared_ptr<CompatibilityInfoClass> m_compat_info, std::shared_ptr<CompatibilityInfoClass> m_compat_info,
QTableWidget* widget, bool isList) { std::shared_ptr<gui_settings> settings, QTableWidget* widget, bool isList) {
QPoint global_pos = widget->viewport()->mapToGlobal(pos); QPoint global_pos = widget->viewport()->mapToGlobal(pos);
std::shared_ptr<gui_settings> m_gui_settings = std::move(settings);
int itemID = 0; int itemID = 0;
int changedFavorite = 0;
if (isList) { if (isList) {
itemID = widget->currentRow(); itemID = widget->currentRow();
} else { } else {
@ -43,7 +46,7 @@ public:
// Do not show the menu if no item is selected // Do not show the menu if no item is selected
if (itemID < 0 || itemID >= m_games.size()) { if (itemID < 0 || itemID >= m_games.size()) {
return; return changedFavorite;
} }
// Setup menu. // Setup menu.
@ -63,11 +66,22 @@ public:
menu.addMenu(openFolderMenu); menu.addMenu(openFolderMenu);
QString serialStr = QString::fromStdString(m_games[itemID].serial);
QList<QString> list = gui_settings::Var2List(m_gui_settings->GetValue(gui::favorites_list));
bool isFavorite = list.contains(serialStr);
QAction* toggleFavorite;
if (isFavorite) {
toggleFavorite = new QAction(tr("Remove from Favorites"), widget);
} else {
toggleFavorite = new QAction(tr("Add to Favorites"), widget);
}
QAction createShortcut(tr("Create Shortcut"), widget); QAction createShortcut(tr("Create Shortcut"), widget);
QAction openCheats(tr("Cheats / Patches"), widget); QAction openCheats(tr("Cheats / Patches"), widget);
QAction openSfoViewer(tr("SFO Viewer"), widget); QAction openSfoViewer(tr("SFO Viewer"), widget);
QAction openTrophyViewer(tr("Trophy Viewer"), widget); QAction openTrophyViewer(tr("Trophy Viewer"), widget);
menu.addAction(toggleFavorite);
menu.addAction(&createShortcut); menu.addAction(&createShortcut);
menu.addAction(&openCheats); menu.addAction(&openCheats);
menu.addAction(&openSfoViewer); menu.addAction(&openSfoViewer);
@ -128,7 +142,7 @@ public:
// Show menu. // Show menu.
auto selected = menu.exec(global_pos); auto selected = menu.exec(global_pos);
if (!selected) { if (!selected) {
return; return changedFavorite;
} }
if (selected == openGameFolder) { if (selected == openGameFolder) {
@ -301,6 +315,16 @@ public:
} }
} }
if (selected == toggleFavorite) {
if (isFavorite) {
list.removeOne(serialStr);
} else {
list.append(serialStr);
}
m_gui_settings->SetValue(gui::favorites_list, gui_settings::List2Var(list));
changedFavorite = 1;
}
if (selected == &openCheats) { if (selected == &openCheats) {
QString gameName = QString::fromStdString(m_games[itemID].name); QString gameName = QString::fromStdString(m_games[itemID].name);
QString gameSerial = QString::fromStdString(m_games[itemID].serial); QString gameSerial = QString::fromStdString(m_games[itemID].serial);
@ -357,7 +381,7 @@ public:
QString gameName = QString::fromStdString(m_games[itemID].name); QString gameName = QString::fromStdString(m_games[itemID].name);
TrophyViewer* trophyViewer = TrophyViewer* trophyViewer =
new TrophyViewer(trophyPath, gameTrpPath, gameName, allTrophyGames); new TrophyViewer(m_gui_settings, trophyPath, gameTrpPath, gameName, allTrophyGames);
trophyViewer->show(); trophyViewer->show();
connect(widget->parent(), &QWidget::destroyed, trophyViewer, connect(widget->parent(), &QWidget::destroyed, trophyViewer,
[trophyViewer]() { trophyViewer->deleteLater(); }); [trophyViewer]() { trophyViewer->deleteLater(); });
@ -586,6 +610,7 @@ public:
QUrl(url_issues + m_games[itemID].compatibility.issue_number)); QUrl(url_issues + m_games[itemID].compatibility.issue_number));
} }
} }
return changedFavorite;
} }
int GetRowIndex(QTreeWidget* treeWidget, QTreeWidgetItem* item) { int GetRowIndex(QTreeWidget* treeWidget, QTreeWidgetItem* item) {

View File

@ -12,11 +12,18 @@ const QString general_settings = "general_settings";
const QString main_window = "main_window"; const QString main_window = "main_window";
const QString game_list = "game_list"; const QString game_list = "game_list";
const QString game_grid = "game_grid"; const QString game_grid = "game_grid";
const QString favorites = "favorites";
// general // general
const gui_value gen_checkForUpdates = gui_value(general_settings, "checkForUpdates", false); const gui_value gen_checkForUpdates = gui_value(general_settings, "checkForUpdates", false);
const gui_value gen_showChangeLog = gui_value(general_settings, "showChangeLog", false); const gui_value gen_showChangeLog = gui_value(general_settings, "showChangeLog", false);
const gui_value gen_updateChannel = gui_value(general_settings, "updateChannel", "Release"); const gui_value gen_updateChannel = gui_value(general_settings, "updateChannel", "Release");
const gui_value gen_recentFiles =
gui_value(main_window, "recentFiles", QVariant::fromValue(QList<QString>()));
const gui_value gen_guiLanguage = gui_value(general_settings, "guiLanguage", "en_US");
const gui_value gen_elfDirs =
gui_value(main_window, "elfDirs", QVariant::fromValue(QList<QString>()));
const gui_value gen_theme = gui_value(general_settings, "theme", 0);
// main window settings // main window settings
const gui_value mw_geometry = gui_value(main_window, "geometry", QByteArray()); const gui_value mw_geometry = gui_value(main_window, "geometry", QByteArray());
@ -35,6 +42,10 @@ const gui_value gl_backgroundMusicVolume = gui_value(game_list, "backgroundMusic
const gui_value gg_icon_size = gui_value(game_grid, "icon_size", 69); const gui_value gg_icon_size = gui_value(game_grid, "icon_size", 69);
const gui_value gg_slider_pos = gui_value(game_grid, "slider_pos", 0); const gui_value gg_slider_pos = gui_value(game_grid, "slider_pos", 0);
// favorites list
const gui_value favorites_list =
gui_value(favorites, "favoritesList", QVariant::fromValue(QList<QString>()));
} // namespace gui } // namespace gui
class gui_settings : public settings { class gui_settings : public settings {

File diff suppressed because it is too large Load Diff

View File

@ -4,6 +4,18 @@
#include <QDialog> #include <QDialog>
#include "game_info.h" #include "game_info.h"
// macros > declaring constants
// also, we were only using one counterpart
#ifdef _WIN32
#define LCTRL_KEY 29
#define LALT_KEY 56
#define LSHIFT_KEY 42
#else
#define LCTRL_KEY 37
#define LALT_KEY 64
#define LSHIFT_KEY 50
#endif
namespace Ui { namespace Ui {
class KBMSettings; class KBMSettings;
} }
@ -11,9 +23,13 @@ class KBMSettings;
class KBMSettings : public QDialog { class KBMSettings : public QDialog {
Q_OBJECT Q_OBJECT
public: public:
explicit KBMSettings(std::shared_ptr<GameInfoClass> game_info_get, QWidget* parent = nullptr); explicit KBMSettings(std::shared_ptr<GameInfoClass> game_info_get, bool GameRunning,
std::string GameRunningSerial, QWidget* parent = nullptr);
~KBMSettings(); ~KBMSettings();
signals:
void PushKBMEvent();
private Q_SLOTS: private Q_SLOTS:
void SaveKBMConfig(bool CloseOnSave); void SaveKBMConfig(bool CloseOnSave);
void SetDefault(); void SetDefault();
@ -25,22 +41,6 @@ private:
std::unique_ptr<Ui::KBMSettings> ui; std::unique_ptr<Ui::KBMSettings> ui;
std::shared_ptr<GameInfoClass> m_game_info; std::shared_ptr<GameInfoClass> m_game_info;
#ifdef _WIN32
const int lctrl = 29;
const int rctrl = 57373;
const int lalt = 56;
const int ralt = 57400;
const int lshift = 42;
const int rshift = 54;
#else
const int lctrl = 37;
const int rctrl = 105;
const int lalt = 64;
const int ralt = 108;
const int lshift = 50;
const int rshift = 62;
#endif
bool eventFilter(QObject* obj, QEvent* event) override; bool eventFilter(QObject* obj, QEvent* event) override;
void ButtonConnects(); void ButtonConnects();
void SetUIValuestoMappings(std::string config_id); void SetUIValuestoMappings(std::string config_id);
@ -48,13 +48,15 @@ private:
void DisableMappingButtons(); void DisableMappingButtons();
void EnableMappingButtons(); void EnableMappingButtons();
void SetMapping(QString input); void SetMapping(QString input);
void Cleanup();
std::string RunningGameSerial;
QSet<QString> pressedKeys; QSet<QString> pressedKeys;
bool GameRunning;
bool EnableMapping = false; bool EnableMapping = false;
bool MappingCompleted = false; bool MappingCompleted = false;
bool HelpWindowOpen = false; bool HelpWindowOpen = false;
QString mapping; QString mapping;
QString modifier;
int MappingTimer; int MappingTimer;
QTimer* timer; QTimer* timer;
QPushButton* MappingButton; QPushButton* MappingButton;

View File

@ -11,8 +11,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1234</width> <width>1235</width>
<height>796</height> <height>842</height>
</rect> </rect>
</property> </property>
<property name="sizePolicy"> <property name="sizePolicy">
@ -44,8 +44,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1214</width> <width>1215</width>
<height>746</height> <height>792</height>
</rect> </rect>
</property> </property>
<widget class="QWidget" name="layoutWidget"> <widget class="QWidget" name="layoutWidget">
@ -54,7 +54,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1211</width> <width>1211</width>
<height>741</height> <height>791</height>
</rect> </rect>
</property> </property>
<layout class="QHBoxLayout" name="RemapLayout"> <layout class="QHBoxLayout" name="RemapLayout">
@ -793,7 +793,7 @@
</layout> </layout>
</item> </item>
<item> <item>
<layout class="QVBoxLayout" name="layout_system_buttons" stretch="0"> <layout class="QVBoxLayout" name="layout_system_buttons" stretch="0,0">
<item> <item>
<widget class="QGroupBox" name="groupBox_4"> <widget class="QGroupBox" name="groupBox_4">
<property name="sizePolicy"> <property name="sizePolicy">
@ -825,8 +825,11 @@
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="minimumHeight"> <property name="minimumSize">
<number>48</number> <size>
<width>0</width>
<height>24</height>
</size>
</property> </property>
<property name="focusPolicy"> <property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum> <enum>Qt::FocusPolicy::NoFocus</enum>
@ -844,8 +847,11 @@
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="minimumHeight"> <property name="minimumSize">
<number>48</number> <size>
<width>0</width>
<height>24</height>
</size>
</property> </property>
<property name="focusPolicy"> <property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum> <enum>Qt::FocusPolicy::NoFocus</enum>
@ -858,6 +864,55 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item>
<widget class="QGroupBox" name="gb_options">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>160</width>
<height>0</height>
</size>
</property>
<property name="title">
<string>Options</string>
</property>
<layout class="QVBoxLayout" name="gb_start_layout">
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="OptionsButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
<property name="text">
<string>unmapped</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout> </layout>
</item> </item>
<item> <item>
@ -1067,34 +1122,13 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="gb_touchpad"> <widget class="QGroupBox" name="gb_touchpadleft">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>160</width>
<height>0</height>
</size>
</property>
<property name="title"> <property name="title">
<string>Touchpad Click</string> <string>Touchpad Left</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_9"> <layout class="QVBoxLayout" name="verticalLayout_17">
<item> <item>
<widget class="QPushButton" name="TouchpadButton"> <widget class="QPushButton" name="TouchpadLeftButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
<property name="text"> <property name="text">
<string>unmapped</string> <string>unmapped</string>
</property> </property>
@ -1150,6 +1184,22 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item>
<widget class="QGroupBox" name="gb_touchpadcenter">
<property name="title">
<string>Touchpad Center</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_11">
<item>
<widget class="QPushButton" name="TouchpadCenterButton">
<property name="text">
<string>unmapped</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout> </layout>
</item> </item>
<item> <item>
@ -1204,7 +1254,7 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="gb_options"> <widget class="QGroupBox" name="gb_touchpadright">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred"> <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
@ -1218,23 +1268,11 @@
</size> </size>
</property> </property>
<property name="title"> <property name="title">
<string>Options</string> <string>Touchpad Right</string>
</property> </property>
<layout class="QVBoxLayout" name="gb_start_layout"> <layout class="QVBoxLayout" name="verticalLayout_9">
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item> <item>
<widget class="QPushButton" name="OptionsButton"> <widget class="QPushButton" name="TouchpadRightButton">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch> <horstretch>0</horstretch>

View File

@ -78,16 +78,16 @@ HelpDialog::HelpDialog(bool* open_flag, QWidget* parent) : QDialog(parent) {
// Add expandable sections to container layout // Add expandable sections to container layout
auto* quickstartSection = new ExpandableSection(tr("Quickstart"), quickstart()); auto* quickstartSection = new ExpandableSection(tr("Quickstart"), quickstart());
auto* faqSection = new ExpandableSection(tr("FAQ"), faq());
auto* syntaxSection = new ExpandableSection(tr("Syntax"), syntax()); auto* syntaxSection = new ExpandableSection(tr("Syntax"), syntax());
auto* specialSection = new ExpandableSection(tr("Special Bindings"), special());
auto* bindingsSection = new ExpandableSection(tr("Keybindings"), bindings()); auto* bindingsSection = new ExpandableSection(tr("Keybindings"), bindings());
auto* specialSection = new ExpandableSection(tr("Special Bindings"), special());
auto* faqSection = new ExpandableSection(tr("FAQ"), faq());
containerLayout->addWidget(quickstartSection); containerLayout->addWidget(quickstartSection);
containerLayout->addWidget(faqSection);
containerLayout->addWidget(syntaxSection); containerLayout->addWidget(syntaxSection);
containerLayout->addWidget(specialSection);
containerLayout->addWidget(bindingsSection); containerLayout->addWidget(bindingsSection);
containerLayout->addWidget(specialSection);
containerLayout->addWidget(faqSection);
containerLayout->addStretch(1); containerLayout->addStretch(1);
// Scroll area wrapping the container // Scroll area wrapping the container
@ -110,3 +110,193 @@ HelpDialog::HelpDialog(bool* open_flag, QWidget* parent) : QDialog(parent) {
connect(specialSection, &ExpandableSection::expandedChanged, this, &HelpDialog::adjustSize); connect(specialSection, &ExpandableSection::expandedChanged, this, &HelpDialog::adjustSize);
connect(bindingsSection, &ExpandableSection::expandedChanged, this, &HelpDialog::adjustSize); connect(bindingsSection, &ExpandableSection::expandedChanged, this, &HelpDialog::adjustSize);
} }
// Helper functions that store the text contents for each tab inb the HelpDialog menu
QString HelpDialog::quickstart() {
return R"(
The keyboard and controller remapping backend, GUI, and documentation have been written by kalaposfos.
In this section, you will find information about the project and its features, as well as help setting up your ideal setup.
To view the config file's syntax, check out the Syntax tab, for keybind names, visit Normal Keybinds and Special Bindings, and if you are here to view emulator-wide keybinds, you can find it in the FAQ section.
This project began because I disliked the original, unchangeable keybinds. Rather than waiting for someone else to do it, I implemented this myself. From the default keybinds, you can clearly tell this was a project built for Bloodborne, but obviously, you can make adjustments however you like.)";
}
QString HelpDialog::syntax() {
return R"(
Below is the file format for mouse, keyboard, and controller inputs:
Rules:
- You can bind up to 3 inputs to one button.
- Adding '#' at the beginning of a line creates a comment.
- Extra whitespace doesn't affect input.
<output>=<input>; is just as valid as <output> = <input>;
- ';' at the end of a line is also optional.
Syntax (aka how a line can look like):
#Comment line
<controller_button> = <input>, <input>, <input>;
<controller_button> = <input>, <input>;
<controller_button> = <input>;
Examples:
#Interact
cross = e;
#Heavy attack (in BB)
r2 = leftbutton, lshift;
#Move forward
axis_left_y_minus = w;)";
}
QString HelpDialog::bindings() {
return R"(
The following names should be interpreted without the '' around them. For inputs that have left and right versions, only the left one is shown, but the right version also works.
(Example: 'lshift', 'rshift')
Keyboard:
Alphabet:
'a', 'b', ..., 'z'
Numbers:
'0', '1', ..., '9'
Keypad:
'kp0', 'kp1', ..., 'kp9',
'kpperiod', 'kpcomma', 'kpslash', 'kpasterisk', 'kpminus', 'kpplus', 'kpequals', 'kpenter'
Symbols:
(See below)
Special keys:
'escape' (text editor only), 'printscreen', 'scrolllock', 'pausebreak',
'backspace', 'insert', 'delete', 'home', 'end', 'pgup', 'pgdown', 'tab',
'capslock', 'enter', 'space'
Arrow keys:
'up', 'down', 'left', 'right'
Modifier keys:
'lctrl', 'lshift', 'lalt', 'lwin' = 'lmeta' (same input, different names, so if you are not on Windows and don't like calling this the Windows key, there is an alternative)
Mouse:
'leftbutton', 'rightbutton', 'middlebutton', 'sidebuttonforward',
'sidebuttonback'
The following wheel inputs cannot be bound to axis input, only button:
'mousewheelup', 'mousewheeldown', 'mousewheelleft',
'mousewheelright'
Controller:
The touchpad currently can't be rebound to anything else, but you can bind buttons to it.
If you have a controller that has different names for buttons, it will still work. Just look up the equivalent names for that controller.
The same left-right rule still applies here.
Buttons:
'triangle', 'circle', 'cross', 'square', 'l1', 'l3',
'options', touchpad', 'up', 'down', 'left', 'right'
Input-only:
'lpaddle_low', 'lpaddle_high'
Output-only:
'touchpad_left', 'touchpad_center', 'touchpad_right'
Axes if you bind them to a button input:
'axis_left_x_plus', 'axis_left_x_minus', 'axis_left_y_plus', 'axis_left_y_minus',
'axis_right_x_plus', ..., 'axis_right_y_minus',
'l2'
Axes if you bind them to another axis input:
'axis_left_x', 'axis_left_y', 'axis_right_x', 'axis_right_y',
'l2'
Invalid Inputs:
'F1-F12' are reserved for emulator-wide keybinds, and cannot be bound to controller inputs.
Symbols (expanded):
` 'grave'
~ 'tilde'
! 'exclamation'
@ 'at'
# 'hash'
$ 'dollar'
% 'percent'
^ 'caret'
& 'ampersand'
* 'asterisk'
( 'lparen'
- 'minus'
_ 'underscore'
= 'equals'
+ 'plus'
[ 'lbracket'
{ 'lbrace'
\ 'backslash'
| 'pipe'
; 'semicolon'
: 'colon'
' 'apostrophe'
" 'quote'
, 'comma'
< 'less'
. 'period'
> 'greater'
/ 'slash'
? 'question')";
}
QString HelpDialog::special() {
return R"(
There are some extra bindings you can put in the config file that don't correspond to a controller input but something else.
You can find these here, with detailed comments, examples, and suggestions for most of them.
'leftjoystick_halfmode' and 'rightjoystick_halfmode' = <key>;
These are a pair of input modifiers that change the way keyboard button-bound axes work. By default, those push the joystick to the max in their respective direction, but if their respective 'joystick_halfmode' modifier value is true, they only push it... halfway. With this, you can change from run to walk in games like Bloodborne.
'mouse_to_joystick' = 'none', 'left' or 'right';
This binds the mouse movement to either joystick. If it receives a value that is not 'left' or 'right', it defaults to 'none'.
'mouse_movement_params' = float, float, float;
(If you don't know what a float is, it is a data type that stores decimal numbers.)
Default values: 0.5, 1, 0.125
Let's break each parameter down:
1st: 'mouse_deadzone_offset' should have a value between 0 and 1 (it gets clamped to that range anyway), with 0 being no offset and 1 being pushing the joystick to the max in the direction the mouse moved.
This controls the minimum distance the joystick gets moved when moving the mouse. If set to 0, it will emulate raw mouse input, which doesn't work very well due to deadzones preventing input if the movement is not large enough.
2nd: 'mouse_speed' is just a standard multiplier to the mouse input speed.
If you input a negative number, the axis directions get reversed. Keep in mind that the offset can still push it back to positive if it's big enough.
3rd: 'mouse_speed_offset' should be in the 0 to 1 range, with 0 being no offset and 1 being offsetting to the max possible value.
Let's set 'mouse_deadzone_offset' to 0.5, and 'mouse_speed_offset' to 0: This means that if we move the mouse very slowly, it still inputs a half-strength joystick input, and if we increase the speed, it would stay that way until we move faster than half the max speed. If we instead set this to 0.25, we now only need to move the mouse faster than the 0.5-0.25=0.25=quarter of the max speed, to get an increase in joystick speed. If we set it to 0.5, then even moving the mouse at 1 pixel per frame will result in a faster-than-minimum speed.
'key_toggle' = <key>, <key_to_toggle>;
This assigns a key to another key, and if pressed, toggles that key's virtual value. If it's on, then it doesn't matter if the key is pressed or not, the input handler will treat it as if it's pressed.
Let's say we want to be able to toggle 'l1' with 't'. You can then bind 'l1' to a key you won't use, like 'kpenter'. Then bind 't' to toggle that. You will end up with this:
l1 = kpenter;
key_toggle = t, kpenter;
'analog_deadzone' = <device>, <value>, <value>;
This sets the deadzone range for various inputs. The first value is the minimum deadzone while the second is the maximum. Values go from 1 to 127 (no deadzone to max deadzone).
If you only want a minimum or maximum deadzone, set the other value to 1 or 127 respectively.
Valid devices: 'leftjoystick', 'rightjoystick', 'l2', 'r2'
'mouse_gyro_roll_mode':
Controls whether moving the mouse sideways causes a panning or a rolling motion while mouse-to-gyro emulation is active.)";
}
QString HelpDialog::faq() {
return R"(
Q: What are the emulator-wide keybinds?
A:
-F12: Triggers Renderdoc capture
-F11: Toggles fullscreen
-F10: Toggles FPS counter
-Ctrl+F10: Open the debug menu
-F9: Pauses the emulator if the debug menu is open
-F8: Reparses the config file while in-game
-F7: Toggles mouse capture and mouse input
-F6: Toggles mouse-to-gyro emulation
Q: How do I switch between mouse and controller joystick input? Why is it even required?
A: Pressing F7 toggles between mouse and controller joystick input. It is required because the program polls the mouse input, which means it checks mouse movement every frame. If it didn't move, the code would manually set the emulator's virtual controller to 0 (to the center), even if other input devices would update it.
Q: What in the world is a 'grave' key?
A: (`). It represents one of the many symbols you can bind to a key. You can find the various symbols and their names in the Bindings tab.
Q: What happens if I accidentally make a typo in the config?
A: The code recognises the line as wrong and skips it, so the rest of the file will get parsed, but that line in question will be treated like a comment line. You can find these lines in the log if you search for 'input_handler'.
Q: I want to bind <input> to <output>, but your code doesn't support <input>!
A: Some keys are intentionally omitted, but if you read the bindings through, and you're sure it is not there and isn't one of the intentionally disabled ones, open an issue on https://github.com/shadps4-emu/shadPS4.
Q: What does default.ini do?
A: If you're using per-game configs, it's the base from which all new games generate their config file. If you use the unified config, then default.ini is used for every game directly instead.
Q: What does the use Per-game Config checkbox do?
A: It controls whether the config is loaded from CUSAXXXXX.ini for a game or from default.ini. This way, if you only want to manage one set of bindings, you can do so, but if you want to use a different setup for every game, that's possible as well.)";
}

View File

@ -42,135 +42,9 @@ protected:
private: private:
bool* help_open_ptr; bool* help_open_ptr;
QString quickstart() { QString quickstart();
return QString faq();
R"(The keyboard and controller remapping backend, GUI and documentation have been written by kalaposfos QString syntax();
QString bindings();
In this section, you will find information about the project, its features and help on setting up your ideal setup. QString special();
To view the config file's syntax, check out the Syntax tab, for keybind names, visit Normal Keybinds and Special Bindings, and if you are here to view emulator-wide keybinds, you can find it in the FAQ section.
This project started out because I didn't like the original unchangeable keybinds, but rather than waiting for someone else to do it, I implemented this myself. From the default keybinds, you can clearly tell this was a project built for Bloodborne, but ovbiously you can make adjustments however you like.
)";
}
QString faq() {
return
R"(Q: What are the emulator-wide keybinds?
A: -F12: Triggers Renderdoc capture
-F11: Toggles fullscreen
-F10: Toggles FPS counter
-Ctrl F10: Open the debug menu
-F9: Pauses emultor, if the debug menu is open
-F8: Reparses the config file while in-game
-F7: Toggles mouse capture and mouse input
Q: How do I change between mouse and controller joystick input, and why is it even required?
A: You can switch between them with F7, and it is required, because mouse input is done with polling, which means mouse movement is checked every frame, and if it didn't move, the code manually sets the emulator's virtual controller to 0 (back to the center), even if other input devices would update it.
Q: What happens if I accidentally make a typo in the config?
A: The code recognises the line as wrong, and skip it, so the rest of the file will get parsed, but that line in question will be treated like a comment line. You can find these lines in the log, if you search for 'input_handler'.
Q: I want to bind <input> to <output>, but your code doesn't support <input>!
A: Some keys are intentionally omitted, but if you read the bindings through, and you're sure it is not there and isn't one of the intentionally disabled ones, open an issue on https://github.com/shadps4-emu/shadPS4.
Q: What does default.ini do?
A: If you're using per-game configs, it's the base from which all new games generate their config file. If you use the unified config, then this is used for every game directly instead.
Q: What does the use Per-game Config checkbox do?
A: It controls whether the config is loaded from CUSAXXXXX.ini for a game, or from default.ini. This way, if you only want to manage one set of bindings, you can do so, but if you want to use a different setup for every game, that's possible as well.
)";
}
QString syntax() {
return
R"(This is the full list of currently supported mouse, keyboard and controller inputs, and how to use them.
Emulator-reserved keys: F1 through F12
Syntax (aka how a line can look like):
#Comment line
<controller_button> = <input>, <input>, <input>;
<controller_button> = <input>, <input>;
<controller_button> = <input>;
Examples:
#Interact
cross = e;
#Heavy attack (in BB)
r2 = leftbutton, lshift;
#Move forward
axis_left_y_minus = w;
You can make a comment line by putting # as the first character.
Whitespace doesn't matter, <output>=<input>; is just as valid as <output> = <input>;
';' at the ends of lines is also optional.
)";
}
QString bindings() {
return
R"(The following names should be interpreted without the '' around them, and for inputs that have left and right versions, only the left one is shown, but the right can be inferred from that.
Example: 'lshift', 'rshift'
Keyboard:
Alphabet: 'a', 'b', ..., 'z'
Numbers: '0', '1', ..., '9'
Keypad: 'kp0', kp1', ..., 'kp9', 'kpperiod', 'kpcomma',
'kpdivide', 'kpmultiply', 'kpdivide', 'kpplus', 'kpminus', 'kpenter'
Punctuation and misc:
'space', 'comma', 'period', 'question', 'semicolon', 'minus', 'plus', 'lparenthesis', 'lbracket', 'lbrace', 'backslash', 'dash',
'enter', 'tab', backspace', 'escape'
Arrow keys: 'up', 'down', 'left', 'right'
Modifier keys:
'lctrl', 'lshift', 'lalt', 'lwin' = 'lmeta' (same input, different names, so if you are not on Windows and don't like calling this the Windows key, there is an alternative)
Mouse:
'leftbutton', 'rightbutton', 'middlebutton', 'sidebuttonforward', 'sidebuttonback'
The following wheel inputs cannot be bound to axis input, only button:
'mousewheelup', 'mousewheeldown', 'mousewheelleft', 'mousewheelright'
Controller:
The touchpad currently can't be rebound to anything else, but you can bind buttons to it.
If you have a controller that has different names for buttons, it will still work, just look up what are the equivalent names for that controller
The same left-right rule still applies here.
Buttons:
'triangle', 'circle', 'cross', 'square', 'l1', 'l3',
'options', touchpad', 'up', 'down', 'left', 'right'
Axes if you bind them to a button input:
'axis_left_x_plus', 'axis_left_x_minus', 'axis_left_y_plus', 'axis_left_y_minus',
'axis_right_x_plus', ..., 'axis_right_y_minus',
'l2'
Axes if you bind them to another axis input:
'axis_left_x' 'axis_left_y' 'axis_right_x' 'axis_right_y',
'l2'
)";
}
QString special() {
return
R"(There are some extra bindings you can put into the config file, that don't correspond to a controller input, but rather something else.
You can find these here, with detailed comments, examples and suggestions for most of them.
'leftjoystick_halfmode' and 'rightjoystick_halfmode' = <key>;
These are a pair of input modifiers, that change the way keyboard button bound axes work. By default, those push the joystick to the max in their respective direction, but if their respective joystick_halfmode modifier value is true, they only push it... halfway. With this, you can change from run to walk in games like Bloodborne.
'mouse_to_joystick' = 'none', 'left' or 'right';
This binds the mouse movement to either joystick. If it recieves a value that is not 'left' or 'right', it defaults to 'none'.
'mouse_movement_params' = float, float, float;
(If you don't know what a float is, it is a data type that stores non-whole numbers.)
Default values: 0.5, 1, 0.125
Let's break each parameter down:
1st: mouse_deadzone_offset: this value should have a value between 0 and 1 (It gets clamped to that range anyway), with 0 being no offset and 1 being pushing the joystick to the max in the direction the mouse moved.
This controls the minimum distance the joystick gets moved, when moving the mouse. If set to 0, it will emulate raw mouse input, which doesn't work very well due to deadzones preventing input if the movement is not large enough.
2nd: mouse_speed: It's just a standard multiplier to the mouse input speed.
If you input a negative number, the axis directions get reversed (Keep in mind that the offset can still push it back to positive, if it's big enough)
3rd: mouse_speed_offset: This also should be in the 0 to 1 range, with 0 being no offset and 1 being offsetting to the max possible value.
This is best explained through an example: Let's set mouse_deadzone to 0.5, and this to 0: This means that if we move the mousevery slowly, it still inputs a half-strength joystick input, and if we increase the speed, it would stay that way until we move faster than half the max speed. If we instead set this to 0.25, we now only need to move the mouse faster than the 0.5-0.25=0.25=quarter of the max speed, to get an increase in joystick speed. If we set it to 0.5, then even moving the mouse at 1 pixel per frame will result in a faster-than-minimum speed.
'key_toggle' = <key>, <key_to_toggle>;
This assigns a key to another key, and if pressed, toggles that key's virtual value. If it's on, then it doesn't matter if the key is pressed or not, the input handler will treat it as if it's pressed.
You can make an input toggleable with this, for example: Let's say we want to be able to toggle l1 with t. You can then bind l1 to a key you won't use, like kpenter, then bind t to toggle that, so you will end up with this:
l1 = kpenter;
key_toggle = t, kpenter;
'analog_deadzone' = <device>, <value>, <value>;
Values go from 1 to 127 (no deadzone to max deadzone), first is the inner, second is the outer deadzone
If you only want inner or outer deadzone, set the other to 1 or 127, respectively
Devices: leftjoystick, rightjoystick, l2, r2
)";
}
}; };

View File

@ -39,8 +39,6 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWi
MainWindow::~MainWindow() { MainWindow::~MainWindow() {
SaveWindowState(); SaveWindowState();
const auto config_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir);
Config::saveMainWindow(config_dir / "config.toml");
} }
bool MainWindow::Init() { bool MainWindow::Init() {
@ -297,7 +295,7 @@ void MainWindow::CreateDockWindows() {
m_game_list_frame->setObjectName("gamelist"); m_game_list_frame->setObjectName("gamelist");
m_game_grid_frame.reset(new GameGridFrame(m_gui_settings, m_game_info, m_compat_info, this)); m_game_grid_frame.reset(new GameGridFrame(m_gui_settings, m_game_info, m_compat_info, this));
m_game_grid_frame->setObjectName("gamegridlist"); m_game_grid_frame->setObjectName("gamegridlist");
m_elf_viewer.reset(new ElfViewer(this)); m_elf_viewer.reset(new ElfViewer(m_gui_settings, this));
m_elf_viewer->setObjectName("elflist"); m_elf_viewer->setObjectName("elflist");
int table_mode = m_gui_settings->GetValue(gui::gl_mode).toInt(); int table_mode = m_gui_settings->GetValue(gui::gl_mode).toInt();
@ -475,12 +473,13 @@ void MainWindow::CreateConnects() {
}); });
connect(ui->controllerButton, &QPushButton::clicked, this, [this]() { connect(ui->controllerButton, &QPushButton::clicked, this, [this]() {
auto configWindow = new ControlSettings(m_game_info, this); ControlSettings* remapWindow =
configWindow->exec(); new ControlSettings(m_game_info, isGameRunning, runningGameSerial, this);
remapWindow->exec();
}); });
connect(ui->keyboardButton, &QPushButton::clicked, this, [this]() { connect(ui->keyboardButton, &QPushButton::clicked, this, [this]() {
auto kbmWindow = new KBMSettings(m_game_info, this); auto kbmWindow = new KBMSettings(m_game_info, isGameRunning, runningGameSerial, this);
kbmWindow->exec(); kbmWindow->exec();
}); });
@ -492,7 +491,7 @@ void MainWindow::CreateConnects() {
#endif #endif
connect(ui->aboutAct, &QAction::triggered, this, [this]() { connect(ui->aboutAct, &QAction::triggered, this, [this]() {
auto aboutDialog = new AboutDialog(this); auto aboutDialog = new AboutDialog(m_gui_settings, this);
aboutDialog->exec(); aboutDialog->exec();
}); });
@ -563,10 +562,8 @@ void MainWindow::CreateConnects() {
m_game_grid_frame->hide(); m_game_grid_frame->hide();
m_elf_viewer->hide(); m_elf_viewer->hide();
m_game_list_frame->show(); m_game_list_frame->show();
if (m_game_list_frame->item(0, 0) == nullptr) { m_game_list_frame->clearContents();
m_game_list_frame->clearContents(); m_game_list_frame->PopulateGameList();
m_game_list_frame->PopulateGameList();
}
isTableList = true; isTableList = true;
m_gui_settings->SetValue(gui::gl_mode, 0); m_gui_settings->SetValue(gui::gl_mode, 0);
int slider_pos = m_gui_settings->GetValue(gui::gl_slider_pos).toInt(); int slider_pos = m_gui_settings->GetValue(gui::gl_slider_pos).toInt();
@ -771,14 +768,14 @@ void MainWindow::CreateConnects() {
QString gameName = QString::fromStdString(firstGame.name); QString gameName = QString::fromStdString(firstGame.name);
TrophyViewer* trophyViewer = TrophyViewer* trophyViewer =
new TrophyViewer(trophyPath, gameTrpPath, gameName, allTrophyGames); new TrophyViewer(m_gui_settings, trophyPath, gameTrpPath, gameName, allTrophyGames);
trophyViewer->show(); trophyViewer->show();
}); });
// Themes // Themes
connect(ui->setThemeDark, &QAction::triggered, &m_window_themes, [this]() { connect(ui->setThemeDark, &QAction::triggered, &m_window_themes, [this]() {
m_window_themes.SetWindowTheme(Theme::Dark, ui->mw_searchbar); m_window_themes.SetWindowTheme(Theme::Dark, ui->mw_searchbar);
Config::setMainWindowTheme(static_cast<int>(Theme::Dark)); m_gui_settings->SetValue(gui::gen_theme, static_cast<int>(Theme::Dark));
if (isIconBlack) { if (isIconBlack) {
SetUiIcons(false); SetUiIcons(false);
isIconBlack = false; isIconBlack = false;
@ -786,7 +783,7 @@ void MainWindow::CreateConnects() {
}); });
connect(ui->setThemeLight, &QAction::triggered, &m_window_themes, [this]() { connect(ui->setThemeLight, &QAction::triggered, &m_window_themes, [this]() {
m_window_themes.SetWindowTheme(Theme::Light, ui->mw_searchbar); m_window_themes.SetWindowTheme(Theme::Light, ui->mw_searchbar);
Config::setMainWindowTheme(static_cast<int>(Theme::Light)); m_gui_settings->SetValue(gui::gen_theme, static_cast<int>(Theme::Light));
if (!isIconBlack) { if (!isIconBlack) {
SetUiIcons(true); SetUiIcons(true);
isIconBlack = true; isIconBlack = true;
@ -794,7 +791,7 @@ void MainWindow::CreateConnects() {
}); });
connect(ui->setThemeGreen, &QAction::triggered, &m_window_themes, [this]() { connect(ui->setThemeGreen, &QAction::triggered, &m_window_themes, [this]() {
m_window_themes.SetWindowTheme(Theme::Green, ui->mw_searchbar); m_window_themes.SetWindowTheme(Theme::Green, ui->mw_searchbar);
Config::setMainWindowTheme(static_cast<int>(Theme::Green)); m_gui_settings->SetValue(gui::gen_theme, static_cast<int>(Theme::Green));
if (isIconBlack) { if (isIconBlack) {
SetUiIcons(false); SetUiIcons(false);
isIconBlack = false; isIconBlack = false;
@ -802,7 +799,7 @@ void MainWindow::CreateConnects() {
}); });
connect(ui->setThemeBlue, &QAction::triggered, &m_window_themes, [this]() { connect(ui->setThemeBlue, &QAction::triggered, &m_window_themes, [this]() {
m_window_themes.SetWindowTheme(Theme::Blue, ui->mw_searchbar); m_window_themes.SetWindowTheme(Theme::Blue, ui->mw_searchbar);
Config::setMainWindowTheme(static_cast<int>(Theme::Blue)); m_gui_settings->SetValue(gui::gen_theme, static_cast<int>(Theme::Blue));
if (isIconBlack) { if (isIconBlack) {
SetUiIcons(false); SetUiIcons(false);
isIconBlack = false; isIconBlack = false;
@ -810,7 +807,7 @@ void MainWindow::CreateConnects() {
}); });
connect(ui->setThemeViolet, &QAction::triggered, &m_window_themes, [this]() { connect(ui->setThemeViolet, &QAction::triggered, &m_window_themes, [this]() {
m_window_themes.SetWindowTheme(Theme::Violet, ui->mw_searchbar); m_window_themes.SetWindowTheme(Theme::Violet, ui->mw_searchbar);
Config::setMainWindowTheme(static_cast<int>(Theme::Violet)); m_gui_settings->SetValue(gui::gen_theme, static_cast<int>(Theme::Violet));
if (isIconBlack) { if (isIconBlack) {
SetUiIcons(false); SetUiIcons(false);
isIconBlack = false; isIconBlack = false;
@ -818,7 +815,7 @@ void MainWindow::CreateConnects() {
}); });
connect(ui->setThemeGruvbox, &QAction::triggered, &m_window_themes, [this]() { connect(ui->setThemeGruvbox, &QAction::triggered, &m_window_themes, [this]() {
m_window_themes.SetWindowTheme(Theme::Gruvbox, ui->mw_searchbar); m_window_themes.SetWindowTheme(Theme::Gruvbox, ui->mw_searchbar);
Config::setMainWindowTheme(static_cast<int>(Theme::Gruvbox)); m_gui_settings->SetValue(gui::gen_theme, static_cast<int>(Theme::Gruvbox));
if (isIconBlack) { if (isIconBlack) {
SetUiIcons(false); SetUiIcons(false);
isIconBlack = false; isIconBlack = false;
@ -826,7 +823,7 @@ void MainWindow::CreateConnects() {
}); });
connect(ui->setThemeTokyoNight, &QAction::triggered, &m_window_themes, [this]() { connect(ui->setThemeTokyoNight, &QAction::triggered, &m_window_themes, [this]() {
m_window_themes.SetWindowTheme(Theme::TokyoNight, ui->mw_searchbar); m_window_themes.SetWindowTheme(Theme::TokyoNight, ui->mw_searchbar);
Config::setMainWindowTheme(static_cast<int>(Theme::TokyoNight)); m_gui_settings->SetValue(gui::gen_theme, static_cast<int>(Theme::TokyoNight));
if (isIconBlack) { if (isIconBlack) {
SetUiIcons(false); SetUiIcons(false);
isIconBlack = false; isIconBlack = false;
@ -834,7 +831,7 @@ void MainWindow::CreateConnects() {
}); });
connect(ui->setThemeOled, &QAction::triggered, &m_window_themes, [this]() { connect(ui->setThemeOled, &QAction::triggered, &m_window_themes, [this]() {
m_window_themes.SetWindowTheme(Theme::Oled, ui->mw_searchbar); m_window_themes.SetWindowTheme(Theme::Oled, ui->mw_searchbar);
Config::setMainWindowTheme(static_cast<int>(Theme::Oled)); m_gui_settings->SetValue(gui::gen_theme, static_cast<int>(Theme::Oled));
if (isIconBlack) { if (isIconBlack) {
SetUiIcons(false); SetUiIcons(false);
isIconBlack = false; isIconBlack = false;
@ -850,12 +847,14 @@ void MainWindow::StartGame() {
if (m_game_list_frame->currentItem()) { if (m_game_list_frame->currentItem()) {
int itemID = m_game_list_frame->currentItem()->row(); int itemID = m_game_list_frame->currentItem()->row();
Common::FS::PathToQString(gamePath, m_game_info->m_games[itemID].path / "eboot.bin"); Common::FS::PathToQString(gamePath, m_game_info->m_games[itemID].path / "eboot.bin");
runningGameSerial = m_game_info->m_games[itemID].serial;
} }
} else if (table_mode == 1) { } else if (table_mode == 1) {
if (m_game_grid_frame->cellClicked) { if (m_game_grid_frame->cellClicked) {
int itemID = (m_game_grid_frame->crtRow * m_game_grid_frame->columnCnt) + int itemID = (m_game_grid_frame->crtRow * m_game_grid_frame->columnCnt) +
m_game_grid_frame->crtColumn; m_game_grid_frame->crtColumn;
Common::FS::PathToQString(gamePath, m_game_info->m_games[itemID].path / "eboot.bin"); Common::FS::PathToQString(gamePath, m_game_info->m_games[itemID].path / "eboot.bin");
runningGameSerial = m_game_info->m_games[itemID].serial;
} }
} else { } else {
if (m_elf_viewer->currentItem()) { if (m_elf_viewer->currentItem()) {
@ -981,7 +980,7 @@ void MainWindow::InstallDirectory() {
} }
void MainWindow::SetLastUsedTheme() { void MainWindow::SetLastUsedTheme() {
Theme lastTheme = static_cast<Theme>(Config::getMainWindowTheme()); Theme lastTheme = static_cast<Theme>(m_gui_settings->GetValue(gui::gen_theme).toInt());
m_window_themes.SetWindowTheme(lastTheme, ui->mw_searchbar); m_window_themes.SetWindowTheme(lastTheme, ui->mw_searchbar);
switch (lastTheme) { switch (lastTheme) {
@ -1122,33 +1121,32 @@ void MainWindow::HandleResize(QResizeEvent* event) {
} }
void MainWindow::AddRecentFiles(QString filePath) { void MainWindow::AddRecentFiles(QString filePath) {
std::vector<std::string> vec = Config::getRecentFiles(); QList<QString> list = gui_settings::Var2List(m_gui_settings->GetValue(gui::gen_recentFiles));
if (!vec.empty()) { if (!list.empty()) {
if (filePath.toStdString() == vec.at(0)) { if (filePath == list.at(0)) {
return; return;
} }
auto it = std::find(vec.begin(), vec.end(), filePath.toStdString()); auto it = std::find(list.begin(), list.end(), filePath);
if (it != vec.end()) { if (it != list.end()) {
vec.erase(it); list.erase(it);
} }
} }
vec.insert(vec.begin(), filePath.toStdString()); list.insert(list.begin(), filePath);
if (vec.size() > 6) { if (list.size() > 6) {
vec.pop_back(); list.pop_back();
} }
Config::setRecentFiles(vec); m_gui_settings->SetValue(gui::gen_recentFiles, gui_settings::List2Var(list));
const auto config_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir);
Config::saveMainWindow(config_dir / "config.toml");
CreateRecentGameActions(); // Refresh the QActions. CreateRecentGameActions(); // Refresh the QActions.
} }
void MainWindow::CreateRecentGameActions() { void MainWindow::CreateRecentGameActions() {
m_recent_files_group = new QActionGroup(this); m_recent_files_group = new QActionGroup(this);
ui->menuRecent->clear(); ui->menuRecent->clear();
std::vector<std::string> vec = Config::getRecentFiles(); QList<QString> list = gui_settings::Var2List(m_gui_settings->GetValue(gui::gen_recentFiles));
for (int i = 0; i < vec.size(); i++) {
for (int i = 0; i < list.size(); i++) {
QAction* recentFileAct = new QAction(this); QAction* recentFileAct = new QAction(this);
recentFileAct->setText(QString::fromStdString(vec.at(i))); recentFileAct->setText(list.at(i));
ui->menuRecent->addAction(recentFileAct); ui->menuRecent->addAction(recentFileAct);
m_recent_files_group->addAction(recentFileAct); m_recent_files_group->addAction(recentFileAct);
} }
@ -1165,7 +1163,7 @@ void MainWindow::CreateRecentGameActions() {
} }
void MainWindow::LoadTranslation() { void MainWindow::LoadTranslation() {
auto language = QString::fromStdString(Config::getEmulatorLanguage()); auto language = m_gui_settings->GetValue(gui::gen_guiLanguage).toString();
const QString base_dir = QStringLiteral(":/translations"); const QString base_dir = QStringLiteral(":/translations");
QString base_path = QStringLiteral("%1/%2.qm").arg(base_dir).arg(language); QString base_path = QStringLiteral("%1/%2.qm").arg(base_dir).arg(language);
@ -1190,8 +1188,8 @@ void MainWindow::LoadTranslation() {
} }
} }
void MainWindow::OnLanguageChanged(const std::string& locale) { void MainWindow::OnLanguageChanged(const QString& locale) {
Config::setEmulatorLanguage(locale); m_gui_settings->SetValue(gui::gen_guiLanguage, locale);
LoadTranslation(); LoadTranslation();
} }

View File

@ -47,7 +47,7 @@ private Q_SLOTS:
void ShowGameList(); void ShowGameList();
void RefreshGameTable(); void RefreshGameTable();
void HandleResize(QResizeEvent* event); void HandleResize(QResizeEvent* event);
void OnLanguageChanged(const std::string& locale); void OnLanguageChanged(const QString& locale);
void toggleLabelsUnderIcons(); void toggleLabelsUnderIcons();
private: private:
@ -75,11 +75,13 @@ private:
void PlayBackgroundMusic(); void PlayBackgroundMusic();
QIcon RecolorIcon(const QIcon& icon, bool isWhite); QIcon RecolorIcon(const QIcon& icon, bool isWhite);
void StartEmulator(std::filesystem::path); void StartEmulator(std::filesystem::path);
bool isIconBlack = false; bool isIconBlack = false;
bool isTableList = true; bool isTableList = true;
bool isGameRunning = false; bool isGameRunning = false;
bool isWhite = false; bool isWhite = false;
bool is_paused = false; bool is_paused = false;
std::string runningGameSerial = "";
QActionGroup* m_icon_size_act_group = nullptr; QActionGroup* m_icon_size_act_group = nullptr;
QActionGroup* m_list_mode_act_group = nullptr; QActionGroup* m_list_mode_act_group = nullptr;

View File

@ -0,0 +1,47 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include "sdl_event_wrapper.h"
using namespace SdlEventWrapper;
Wrapper* Wrapper::WrapperInstance = nullptr;
bool Wrapper::wrapperActive = false;
Wrapper::Wrapper(QObject* parent) : QObject(parent) {}
Wrapper* Wrapper::GetInstance() {
if (WrapperInstance == nullptr) {
WrapperInstance = new Wrapper();
}
return WrapperInstance;
}
bool Wrapper::ProcessEvent(SDL_Event* event) {
switch (event->type) {
case SDL_EVENT_WINDOW_RESTORED:
return false;
case SDL_EVENT_WINDOW_EXPOSED:
return false;
case SDL_EVENT_GAMEPAD_ADDED:
return false;
case SDL_EVENT_GAMEPAD_REMOVED:
return false;
case SDL_EVENT_QUIT:
emit SDLEvent(SDL_EVENT_QUIT, 0, 0);
return true;
case SDL_EVENT_GAMEPAD_BUTTON_DOWN:
emit SDLEvent(SDL_EVENT_GAMEPAD_BUTTON_DOWN, event->gbutton.button, 0);
return true;
case SDL_EVENT_GAMEPAD_BUTTON_UP:
emit SDLEvent(SDL_EVENT_GAMEPAD_BUTTON_UP, event->gbutton.button, 0);
return true;
case SDL_EVENT_GAMEPAD_AXIS_MOTION:
emit SDLEvent(SDL_EVENT_GAMEPAD_AXIS_MOTION, event->gaxis.axis, event->gaxis.value);
return true;
// block all other SDL events while wrapper is active
default:
return true;
}
}
Wrapper::~Wrapper() {}

View File

@ -0,0 +1,25 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <QObject>
#include <SDL3/SDL_events.h>
namespace SdlEventWrapper {
class Wrapper : public QObject {
Q_OBJECT
public:
explicit Wrapper(QObject* parent = nullptr);
~Wrapper();
bool ProcessEvent(SDL_Event* event);
static Wrapper* GetInstance();
static bool wrapperActive;
static Wrapper* WrapperInstance;
signals:
void SDLEvent(int Type, int Input, int Value);
};
} // namespace SdlEventWrapper

View File

@ -75,3 +75,17 @@ void settings::SetValue(const QString& key, const QString& name, const QVariant&
} }
} }
} }
QVariant settings::List2Var(const QList<QString>& list) {
QByteArray ba;
QDataStream stream(&ba, QIODevice::WriteOnly);
stream << list;
return QVariant(ba);
}
QList<QString> settings::Var2List(const QVariant& var) {
QList<QString> list;
QByteArray ba = var.toByteArray();
QDataStream stream(&ba, QIODevice::ReadOnly);
stream >> list;
return list;
}

View File

@ -35,6 +35,8 @@ public:
QVariant GetValue(const QString& key, const QString& name, const QVariant& def) const; QVariant GetValue(const QString& key, const QString& name, const QVariant& def) const;
QVariant GetValue(const gui_value& entry) const; QVariant GetValue(const gui_value& entry) const;
static QVariant List2Var(const QList<QString>& list);
static QList<QString> Var2List(const QVariant& var);
public Q_SLOTS: public Q_SLOTS:
/** Remove entry */ /** Remove entry */

View File

@ -123,11 +123,6 @@ SettingsDialog::SettingsDialog(std::shared_ptr<gui_settings> gui_settings,
ui->hideCursorComboBox->addItem(tr("Idle")); ui->hideCursorComboBox->addItem(tr("Idle"));
ui->hideCursorComboBox->addItem(tr("Always")); ui->hideCursorComboBox->addItem(tr("Always"));
ui->backButtonBehaviorComboBox->addItem(tr("Touchpad Left"), "left");
ui->backButtonBehaviorComboBox->addItem(tr("Touchpad Center"), "center");
ui->backButtonBehaviorComboBox->addItem(tr("Touchpad Right"), "right");
ui->backButtonBehaviorComboBox->addItem(tr("None"), "none");
InitializeEmulatorLanguages(); InitializeEmulatorLanguages();
LoadValuesFromConfig(); LoadValuesFromConfig();
@ -366,7 +361,6 @@ SettingsDialog::SettingsDialog(std::shared_ptr<gui_settings> gui_settings,
// Input // Input
ui->hideCursorGroupBox->installEventFilter(this); ui->hideCursorGroupBox->installEventFilter(this);
ui->idleTimeoutGroupBox->installEventFilter(this); ui->idleTimeoutGroupBox->installEventFilter(this);
ui->backButtonBehaviorGroupBox->installEventFilter(this);
// Graphics // Graphics
ui->graphicsAdapterGroupBox->installEventFilter(this); ui->graphicsAdapterGroupBox->installEventFilter(this);
@ -534,10 +528,6 @@ void SettingsDialog::LoadValuesFromConfig() {
indexTab = 0; indexTab = 0;
ui->tabWidgetSettings->setCurrentIndex(indexTab); ui->tabWidgetSettings->setCurrentIndex(indexTab);
QString backButtonBehavior = QString::fromStdString(
toml::find_or<std::string>(data, "Input", "backButtonBehavior", "left"));
int index = ui->backButtonBehaviorComboBox->findData(backButtonBehavior);
ui->backButtonBehaviorComboBox->setCurrentIndex(index != -1 ? index : 0);
ui->motionControlsCheckBox->setChecked( ui->motionControlsCheckBox->setChecked(
toml::find_or<bool>(data, "Input", "isMotionControlsEnabled", true)); toml::find_or<bool>(data, "Input", "isMotionControlsEnabled", true));
@ -594,7 +584,7 @@ void SettingsDialog::OnLanguageChanged(int index) {
ui->retranslateUi(this); ui->retranslateUi(this);
emit LanguageChanged(ui->emulatorLanguageComboBox->itemData(index).toString().toStdString()); emit LanguageChanged(ui->emulatorLanguageComboBox->itemData(index).toString());
} }
void SettingsDialog::OnCursorStateChanged(s16 index) { void SettingsDialog::OnCursorStateChanged(s16 index) {
@ -666,8 +656,6 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) {
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."); 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.");
} else if (elementName == "idleTimeoutGroupBox") { } else if (elementName == "idleTimeoutGroupBox") {
text = tr("Hide Idle Cursor Timeout:\\nThe duration (seconds) after which the cursor that has been idle hides itself."); text = tr("Hide Idle Cursor Timeout:\\nThe duration (seconds) after which the cursor that has been idle hides itself.");
} else if (elementName == "backButtonBehaviorGroupBox") {
text = tr("Back Button Behavior:\\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad.");
} }
// Graphics // Graphics
@ -745,8 +733,6 @@ bool SettingsDialog::eventFilter(QObject* obj, QEvent* event) {
void SettingsDialog::UpdateSettings() { void SettingsDialog::UpdateSettings() {
const QVector<std::string> TouchPadIndex = {"left", "center", "right", "none"};
Config::setBackButtonBehavior(TouchPadIndex[ui->backButtonBehaviorComboBox->currentIndex()]);
Config::setIsFullscreen(screenModeMap.value(ui->displayModeComboBox->currentText()) != Config::setIsFullscreen(screenModeMap.value(ui->displayModeComboBox->currentText()) !=
"Windowed"); "Windowed");
Config::setFullscreenMode( Config::setFullscreenMode(
@ -886,4 +872,5 @@ void SettingsDialog::setDefaultValues() {
} else { } else {
m_gui_settings->SetValue(gui::gen_updateChannel, "Nightly"); m_gui_settings->SetValue(gui::gen_updateChannel, "Nightly");
} }
m_gui_settings->SetValue(gui::gen_guiLanguage, "en_US");
} }

View File

@ -32,7 +32,7 @@ public:
int exec() override; int exec() override;
signals: signals:
void LanguageChanged(const std::string& locale); void LanguageChanged(const QString& locale);
void CompatibilityChanged(); void CompatibilityChanged();
void BackgroundOpacityChanged(int opacity); void BackgroundOpacityChanged(int opacity);

View File

@ -1613,36 +1613,6 @@
<property name="bottomMargin"> <property name="bottomMargin">
<number>11</number> <number>11</number>
</property> </property>
<item>
<widget class="QGroupBox" name="backButtonBehaviorGroupBox">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="title">
<string>Back Button Behavior</string>
</property>
<layout class="QVBoxLayout" name="BackButtonLayout">
<property name="leftMargin">
<number>11</number>
</property>
<item>
<widget class="QComboBox" name="backButtonBehaviorComboBox"/>
</item>
</layout>
</widget>
</item>
<item> <item>
<widget class="QCheckBox" name="motionControlsCheckBox"> <widget class="QCheckBox" name="motionControlsCheckBox">
<property name="text"> <property name="text">

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation>استخدام إعدادات كل لُعْبَة</translation> <translation>استخدام إعدادات كل لُعْبَة</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation>L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation>L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation>رجوع</translation>
</message>
<message>
<source>R1 / RB</source>
<translation>R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation>R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation>الخيارات / البَدْء</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation>R3</translation> <translation>R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation>الأزرار</translation> <translation>الأزرار</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation>مثلث / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation>مربع / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation>دائرة / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation>إكس / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation>النقطة العمياء للعصا اليمنى (الافتراضي: 2، الحد الأقصى: 127)</translation> <translation>النقطة العمياء للعصا اليمنى (الافتراضي: 2، الحد الأقصى: 127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation>إلغاء</translation> <translation>إلغاء</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>آخر تحديث</translation> <translation>آخر تحديث</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation type="unfinished">Favorite</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation>عارض SFO لـ </translation> <translation>عارض SFO لـ </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation type="unfinished">Remove from Favorites</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation type="unfinished">Add to Favorites</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation>زر لوحة اللمس</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation>تحويل الماوس إلى عصا التحكم</translation> <translation>تحويل الماوس إلى عصا التحكم</translation>
@ -1188,6 +1224,18 @@
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation>التحكم</translation> <translation>التحكم</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>سلوك زر العودة</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation>الرسوميات</translation> <translation>الرسوميات</translation>
@ -1787,10 +1831,6 @@ Nightly: نُسخ تحتوي على أحدث الميزات، لكنها أقل
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>مدة إخفاء المؤشر عند الخمول:\nالوقت (بالثواني) الذي ينتظره المؤشر قبل أن يختفي تلقائيًا عند عدم استخدامه.</translation> <translation>مدة إخفاء المؤشر عند الخمول:\nالوقت (بالثواني) الذي ينتظره المؤشر قبل أن يختفي تلقائيًا عند عدم استخدامه.</translation>
</message> </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>سلوك زر الرجوع:\nيحدد وظيفة زر&apos; الرجوع في وحدة التحكم لمحاكاة اللمس في موقع معيّن على لوحة اللمس الخاصة بـ PS4.</translation>
</message>
<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> <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>
<translation>عرض بيانات التوافق:\nيعرض معلومات توافق الألعاب في عرض جدولي. فعّل &quot;"تحديث التوافق عند بدء التشغيل&quot;" للحصول على أحدث المعلومات.</translation> <translation>عرض بيانات التوافق:\nيعرض معلومات توافق الألعاب في عرض جدولي. فعّل &quot;"تحديث التوافق عند بدء التشغيل&quot;" للحصول على أحدث المعلومات.</translation>
@ -1815,22 +1855,6 @@ Nightly: نُسخ تحتوي على أحدث الميزات، لكنها أقل
<source>Always</source> <source>Always</source>
<translation>دائماً</translation> <translation>دائماً</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>الجانب الأيسر من لوحة اللمس</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>الجانب الأيمن من لوحة اللمس</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>مركز لوحة اللمس</translation>
</message>
<message>
<source>None</source>
<translation>لا شيء</translation>
</message>
<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> <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>جهاز الرسوميات:\nفي الأنظمة التي تحتوي على أكثر من معالج رسومي، اختر وحدة المعالجة الرسومية GPU التي سيستخدمها المحاكي من القائمة المنسدلة،\nأو اختر "&quot;تحديد تلقائي&quot;" ليتم اختيارها تلقائيًا.</translation> <translation>جهاز الرسوميات:\nفي الأنظمة التي تحتوي على أكثر من معالج رسومي، اختر وحدة المعالجة الرسومية GPU التي سيستخدمها المحاكي من القائمة المنسدلة،\nأو اختر "&quot;تحديد تلقائي&quot;" ليتم اختيارها تلقائيًا.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation>Fes servir configuracions per cada joc</translation> <translation>Fes servir configuracions per cada joc</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation>L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation>L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation>Torna</translation>
</message>
<message>
<source>R1 / RB</source>
<translation>R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation>R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation>Opcions / Executa</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation>R3</translation> <translation>R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation>Botons d'acció</translation> <translation>Botons d'acció</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation>Triangle / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation>Quadrat / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation>Cercle / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation>Creu / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation>Zona morta de la palanca dreta (per defecte:2 màxim:127)</translation> <translation>Zona morta de la palanca dreta (per defecte:2 màxim:127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation>Cancel·la</translation> <translation>Cancel·la</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>Darrera actualització</translation> <translation>Darrera actualització</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation>Preferit</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation>Visualitzador SFO per </translation> <translation>Visualitzador SFO per </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation>Esborra dels preferits</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation>Afegeix a preferits</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation>Click al touchpad</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation>Ratolí a palanca</translation> <translation>Ratolí a palanca</translation>
@ -1184,10 +1220,22 @@
<source>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons: <source>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source> %1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons: <translation>No es pot assignar una entrada més d'una vegada. S'han assignat de manera duplicada pels següents botons:
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Touchpad esquerra</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Touchpad centre</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Touchpad dreta</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation>Controlador</translation> <translation>Controlador</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>Comportament del botó de retrocés</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation>Gràfics</translation> <translation>Gràfics</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>Temps d'espera per ocultar el ratolí:\nLa duració (en segons) després de la qual el ratolí s'amaga si es troba inactiu.</translation> <translation>Temps d'espera per ocultar el ratolí:\nLa duració (en segons) després de la qual el ratolí s'amaga si es troba inactiu.</translation>
</message> </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>Comportament del botó posterior:\nEstableix el botó posterior del controlador per simular el toc en una posició especificada del touchpad de PS4.</translation>
</message>
<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> <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>
<translation>Mostra les dades de compatibilitat:\nMostra informació sobre la compatibilitat a la vista de graella. Pots activar l'actualització de compatibilitat a l'inici per obtenir més informació actualitzada.</translation> <translation>Mostra les dades de compatibilitat:\nMostra informació sobre la compatibilitat a la vista de graella. Pots activar l'actualització de compatibilitat a l'inici per obtenir més informació actualitzada.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation>Sempre</translation> <translation>Sempre</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Touchpad esquerra</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Touchpad dret</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Centre del Touchpad</translation>
</message>
<message>
<source>None</source>
<translation>Cap</translation>
</message>
<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> <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>Dispositiu de gràfics:\nEn sistemes amb múltiples targetes gràfiques, selecciona la targeta gràfica que farà servir l'emulador de la llista,\n o clica a "Selecció automàtica" per determinar-la automàticament.</translation> <translation>Dispositiu de gràfics:\nEn sistemes amb múltiples targetes gràfiques, selecciona la targeta gràfica que farà servir l'emulador de la llista,\n o clica a "Selecció automàtica" per determinar-la automàticament.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation type="unfinished">Use per-game configs</translation> <translation type="unfinished">Use per-game configs</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation type="unfinished">L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation type="unfinished">L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation type="unfinished">Back</translation>
</message>
<message>
<source>R1 / RB</source>
<translation type="unfinished">R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation type="unfinished">R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation type="unfinished">L3</translation> <translation type="unfinished">L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation type="unfinished">Options / Start</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation type="unfinished">R3</translation> <translation type="unfinished">R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation> <translation type="unfinished">Face Buttons</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation type="unfinished">Triangle / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation type="unfinished">Square / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation type="unfinished">Circle / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation type="unfinished">Cross / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation type="unfinished">Right Stick Deadzone (def:2, max:127)</translation> <translation type="unfinished">Right Stick Deadzone (def:2, max:127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation type="unfinished">Cancel</translation> <translation type="unfinished">Cancel</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>Sidst opdateret</translation> <translation>Sidst opdateret</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation type="unfinished">Favorite</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation> <translation type="unfinished">SFO Viewer for </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation type="unfinished">Remove from Favorites</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation type="unfinished">Add to Favorites</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation type="unfinished">L3</translation> <translation type="unfinished">L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished">Touchpad Click</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation type="unfinished">Mouse to Joystick</translation> <translation type="unfinished">Mouse to Joystick</translation>
@ -1188,6 +1224,18 @@
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation type="unfinished">Controller</translation> <translation type="unfinished">Controller</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>Tilbageknap adfærd</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation type="unfinished">Graphics</translation> <translation type="unfinished">Graphics</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>Indstil en tid for, at musen skal forsvinde efter at være inaktiv.</translation> <translation>Indstil en tid for, at musen skal forsvinde efter at være inaktiv.</translation>
</message> </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>Tilbageknap Adfærd:\nIndstiller controllerens tilbageknap til at efterligne tryk den angivne position PS4 berøringsflade.</translation>
</message>
<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> <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>
<translation type="unfinished">Display Compatibility Data:\nDisplays game compatibility information in table view. Enable &quot;Update Compatibility On Startup&quot; to get up-to-date information.</translation> <translation type="unfinished">Display Compatibility Data:\nDisplays game compatibility information in table view. Enable &quot;Update Compatibility On Startup&quot; to get up-to-date information.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation>Altid</translation> <translation>Altid</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Berøringsplade Venstre</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Berøringsplade Højre</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Berøringsplade Center</translation>
</message>
<message>
<source>None</source>
<translation>Ingen</translation>
</message>
<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> <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>Grafikadapter:\nPå systemer med flere GPU&apos;er skal du vælge den GPU, emulatoren vil bruge fra en rullemenu,\neller vælge &quot;Auto Select&quot; for at vælge den automatisk.</translation> <translation>Grafikadapter:\nPå systemer med flere GPU&apos;er skal du vælge den GPU, emulatoren vil bruge fra en rullemenu,\neller vælge &quot;Auto Select&quot; for at vælge den automatisk.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation>Benutze Per-Game Einstellungen</translation> <translation>Benutze Per-Game Einstellungen</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation>L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation>L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation>Zurück</translation>
</message>
<message>
<source>R1 / RB</source>
<translation>R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation>R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation>Options / Start</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation>R3</translation> <translation>R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation>Aktionstasten</translation> <translation>Aktionstasten</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation>Dreieck / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation>Quadrat / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation>Kreis / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation>Kreuz / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation>Rechter Stick tote Zone (def:2, max:127)</translation> <translation>Rechter Stick tote Zone (def:2, max:127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation>Abbrechen</translation> <translation>Abbrechen</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>Zuletzt aktualisiert</translation> <translation>Zuletzt aktualisiert</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation type="unfinished">Favorite</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation>SFO-Betrachter für </translation> <translation>SFO-Betrachter für </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation type="unfinished">Remove from Favorites</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation type="unfinished">Add to Favorites</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation>Touchpad-Klick</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation>Maus zu Joystick</translation> <translation>Maus zu Joystick</translation>
@ -1188,6 +1224,18 @@
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation>Kontroller</translation> <translation>Kontroller</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>Verhalten der Zurück-Taste</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation>Grafik</translation> <translation>Grafik</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>Stellen Sie eine Zeit ein, nach der die Maus nach Inaktivität verschwinden soll.</translation> <translation>Stellen Sie eine Zeit ein, nach der die Maus nach Inaktivität verschwinden soll.</translation>
</message> </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>Zurück-Button Verhalten:\nStellt die Zurück-Taste des Controllers so ein, dass sie das Antippen der angegebenen Position auf dem PS4-Touchpad emuliert.</translation>
</message>
<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> <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>
<translation>Kompatibilitätsdaten anzeigen:\nZeigt Spielkompatibilitätsinformationen in Tabellenansicht an. Aktivieren Sie Aktualisiere Kompatibilitätsdatenbank beim Start, um aktuelle Informationen zu erhalten.</translation> <translation>Kompatibilitätsdaten anzeigen:\nZeigt Spielkompatibilitätsinformationen in Tabellenansicht an. Aktivieren Sie Aktualisiere Kompatibilitätsdatenbank beim Start, um aktuelle Informationen zu erhalten.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation>Immer</translation> <translation>Immer</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Touchpad Links</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Touchpad Rechts</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Touchpad Mitte</translation>
</message>
<message>
<source>None</source>
<translation>Keine</translation>
</message>
<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> <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>Grafikkarte:\nAuf Systemen mit mehreren GPUs wählen Sie aus einem Dropdown-Menü die GPU aus, die der Emulator verwenden wird,\noder wählen Sie &quot;Auto Select&quot;, um sie automatisch auszuwählen.</translation> <translation>Grafikkarte:\nAuf Systemen mit mehreren GPUs wählen Sie aus einem Dropdown-Menü die GPU aus, die der Emulator verwenden wird,\noder wählen Sie &quot;Auto Select&quot;, um sie automatisch auszuwählen.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation type="unfinished">Use per-game configs</translation> <translation type="unfinished">Use per-game configs</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation type="unfinished">L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation type="unfinished">L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation type="unfinished">Back</translation>
</message>
<message>
<source>R1 / RB</source>
<translation type="unfinished">R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation type="unfinished">R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation type="unfinished">L3</translation> <translation type="unfinished">L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation type="unfinished">Options / Start</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation type="unfinished">R3</translation> <translation type="unfinished">R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation> <translation type="unfinished">Face Buttons</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation type="unfinished">Triangle / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation type="unfinished">Square / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation type="unfinished">Circle / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation type="unfinished">Cross / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation type="unfinished">Right Stick Deadzone (def:2, max:127)</translation> <translation type="unfinished">Right Stick Deadzone (def:2, max:127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation type="unfinished">Cancel</translation> <translation type="unfinished">Cancel</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>Τελευταία ενημέρωση</translation> <translation>Τελευταία ενημέρωση</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation type="unfinished">Favorite</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation> <translation type="unfinished">SFO Viewer for </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation type="unfinished">Remove from Favorites</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation type="unfinished">Add to Favorites</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation type="unfinished">L3</translation> <translation type="unfinished">L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished">Touchpad Click</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation type="unfinished">Mouse to Joystick</translation> <translation type="unfinished">Mouse to Joystick</translation>
@ -1188,6 +1224,18 @@
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation type="unfinished">Controller</translation> <translation type="unfinished">Controller</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>Συμπεριφορά κουμπιού επιστροφής</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation type="unfinished">Graphics</translation> <translation type="unfinished">Graphics</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>Ορίστε έναν χρόνο για να εξαφανιστεί το ποντίκι μετά από αδράνεια.</translation> <translation>Ορίστε έναν χρόνο για να εξαφανιστεί το ποντίκι μετά από αδράνεια.</translation>
</message> </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>Συμπεριφορά Κουμπιού Επιστροφής:\nΟρίζει το κουμπί επιστροφής του ελεγκτή να προσομοιώνει το πάτημα της καθορισμένης θέσης στην οθόνη αφής PS4.</translation>
</message>
<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> <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>
<translation type="unfinished">Display Compatibility Data:\nDisplays game compatibility information in table view. Enable &quot;Update Compatibility On Startup&quot; to get up-to-date information.</translation> <translation type="unfinished">Display Compatibility Data:\nDisplays game compatibility information in table view. Enable &quot;Update Compatibility On Startup&quot; to get up-to-date information.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation>Πάντα</translation> <translation>Πάντα</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Touchpad Αριστερά</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Touchpad Δεξιά</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Κέντρο Touchpad</translation>
</message>
<message>
<source>None</source>
<translation>Κανένα</translation>
</message>
<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> <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>Προσαρμογέας Γραφικών:\nΣε συστήματα με πολλές GPU, επιλέξτε από το μενού την GPU που θα χρησιμοποιήσει ο εξομοιωτής,\ επιλέξτε &quot;Auto Select&quot; για αυτόματη επιλογή.</translation> <translation>Προσαρμογέας Γραφικών:\nΣε συστήματα με πολλές GPU, επιλέξτε από το μενού την GPU που θα χρησιμοποιήσει ο εξομοιωτής,\ επιλέξτε &quot;Auto Select&quot; για αυτόματη επιλογή.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>L2 / LT</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>R1 / RB</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>R2 / RT</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Square / X</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Circle / B</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cross / A</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -565,6 +525,72 @@
<source>Cancel</source> <source>Cancel</source>
<translation type="unfinished">Cancel</translation> <translation type="unfinished">Cancel</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +774,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>Last updated</translation> <translation>Last updated</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +980,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Add to Favorites</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1094,6 @@
<source>L3</source> <source>L3</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -1186,6 +1220,18 @@
%1</source> %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1544,10 +1590,6 @@
<source>Controller</source> <source>Controller</source>
<translation>Controller</translation> <translation>Controller</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>Back Button Behavior</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation>Graphics</translation> <translation>Graphics</translation>
@ -1784,10 +1826,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</translation> <translation>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</translation>
</message> </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>Back Button Behavior:\nSets the controller&apos;s back button to emulate tapping the specified position on the PS4 touchpad.</translation>
</message>
<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> <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>
<translation>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable &quot;Update Compatibility On Startup&quot; to get up-to-date information.</translation> <translation>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable &quot;Update Compatibility On Startup&quot; to get up-to-date information.</translation>
@ -1812,22 +1850,6 @@
<source>Always</source> <source>Always</source>
<translation>Always</translation> <translation>Always</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Touchpad Left</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Touchpad Right</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Touchpad Center</translation>
</message>
<message>
<source>None</source>
<translation>None</translation>
</message>
<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> <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>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.</translation> <translation>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.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation>Usar configuraciones por juego</translation> <translation>Usar configuraciones por juego</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation>L1/LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation>L2/LT</translation>
</message>
<message>
<source>Back</source>
<translation>Back</translation>
</message>
<message>
<source>R1 / RB</source>
<translation>R1/RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation>R2/RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation>Options/Start</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation>R3</translation> <translation>R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation>Botones de acción</translation> <translation>Botones de acción</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation>Triángulo/Y</translation>
</message>
<message>
<source>Square / X</source>
<translation>Cuadrado/X</translation>
</message>
<message>
<source>Circle / B</source>
<translation>Círculo/B</translation>
</message>
<message>
<source>Cross / A</source>
<translation>Cruz / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation>Zona muerta del stick derecho (defecto: 2, máx.: 127)</translation> <translation>Zona muerta del stick derecho (defecto: 2, máx.: 127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation>Cancelar</translation> <translation>Cancelar</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>Última actualización</translation> <translation>Última actualización</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation type="unfinished">Favorite</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation>Visualizador de SFO para </translation> <translation>Visualizador de SFO para </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation type="unfinished">Remove from Favorites</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation type="unfinished">Add to Favorites</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation>Clic de pantalla táctil</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation>Ratón a Joystick</translation> <translation>Ratón a Joystick</translation>
@ -1188,6 +1224,18 @@
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation>Controlador</translation> <translation>Controlador</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>Comportamiento del Botón de Retroceso</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation>Gráficos</translation> <translation>Gráficos</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>Establezca un tiempo para que el ratón desaparezca después de estar inactivo.</translation> <translation>Establezca un tiempo para que el ratón desaparezca después de estar inactivo.</translation>
</message> </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>Comportamiento del Botón Atrás:\nEstablece el botón atrás del controlador para emular el toque en la posición especificada en el touchpad del PS4.</translation>
</message>
<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> <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>
<translation>Mostrar Datos de Compatibilidad:\nMuestra información de compatibilidad de juegos en vista de tabla. Habilite &quot;Actualizar Compatibilidad al Iniciar&quot; para obtener información actualizada.</translation> <translation>Mostrar Datos de Compatibilidad:\nMuestra información de compatibilidad de juegos en vista de tabla. Habilite &quot;Actualizar Compatibilidad al Iniciar&quot; para obtener información actualizada.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation>Siempre</translation> <translation>Siempre</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Touchpad Izquierda</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Touchpad Derecha</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Centro del Touchpad</translation>
</message>
<message>
<source>None</source>
<translation>Ninguno</translation>
</message>
<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> <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>Dispositivo Gráfico:\nEn sistemas con múltiples GPU, selecciona la GPU que el emulador utilizará de la lista desplegable,\o selecciona &quot;Auto Select&quot; para determinarla automáticamente.</translation> <translation>Dispositivo Gráfico:\nEn sistemas con múltiples GPU, selecciona la GPU que el emulador utilizará de la lista desplegable,\o selecciona &quot;Auto Select&quot; para determinarla automáticamente.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation>از پیکربندیهای مخصوص هر بازی استفاده کنید</translation> <translation>از پیکربندیهای مخصوص هر بازی استفاده کنید</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation type="unfinished">L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation type="unfinished">L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation type="unfinished">Back</translation>
</message>
<message>
<source>R1 / RB</source>
<translation type="unfinished">R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation type="unfinished">R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation type="unfinished">L3</translation> <translation type="unfinished">L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation type="unfinished">Options / Start</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation>R3</translation> <translation>R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation> <translation type="unfinished">Face Buttons</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation>مثلث / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation type="unfinished">Square / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation type="unfinished">Circle / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation type="unfinished">Cross / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation type="unfinished">Right Stick Deadzone (def:2, max:127)</translation> <translation type="unfinished">Right Stick Deadzone (def:2, max:127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation type="unfinished">Cancel</translation> <translation type="unfinished">Cancel</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>آخرین بهروزرسانی</translation> <translation>آخرین بهروزرسانی</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation type="unfinished">Favorite</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation>SFO مشاهده </translation> <translation>SFO مشاهده </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation type="unfinished">Remove from Favorites</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation type="unfinished">Add to Favorites</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation type="unfinished">L3</translation> <translation type="unfinished">L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation>کلیک روی تاچپد</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation type="unfinished">Mouse to Joystick</translation> <translation type="unfinished">Mouse to Joystick</translation>
@ -1188,6 +1224,18 @@
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation>دسته بازی</translation> <translation>دسته بازی</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>رفتار دکمه بازگشت</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation>گرافیک</translation> <translation>گرافیک</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>زمانی را برای ناپدید شدن ماوس بعد از غیرفعالی تعیین کنید.</translation> <translation>زمانی را برای ناپدید شدن ماوس بعد از غیرفعالی تعیین کنید.</translation>
</message> </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>رفتار دکمه برگشت:\nدکمه برگشت کنترلر را طوری تنظیم می کند که ضربه زدن روی موقعیت مشخص شده روی صفحه لمسی PS4 را شبیه سازی کند.</translation>
</message>
<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> <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>
<translation>نمایش دادههای سازگاری:\nاطلاعات سازگاری بازی را به صورت جدول نمایش میدهد. برای دریافت اطلاعات بهروز، گزینه &quot;بهروزرسانی سازگاری هنگام راهاندازی&quot; را فعال کنید.</translation> <translation>نمایش دادههای سازگاری:\nاطلاعات سازگاری بازی را به صورت جدول نمایش میدهد. برای دریافت اطلاعات بهروز، گزینه &quot;بهروزرسانی سازگاری هنگام راهاندازی&quot; را فعال کنید.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation>همیشه</translation> <translation>همیشه</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>صفحه لمسی سمت چپ</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>صفحه لمسی سمت راست</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>مرکز صفحه لمسی</translation>
</message>
<message>
<source>None</source>
<translation>هیچ کدام</translation>
</message>
<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> <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>دستگاه گرافیکی:\nدر سیستمهای با چندین پردازنده گرافیکی، از فهرست کشویی، پردازنده گرافیکی که شبیهساز از آن استفاده میکند را انتخاب کنید، یا گزینه &quot;انتخاب خودکار&quot; را انتخاب کنید تا به طور خودکار تعیین شود.</translation> <translation>دستگاه گرافیکی:\nدر سیستمهای با چندین پردازنده گرافیکی، از فهرست کشویی، پردازنده گرافیکی که شبیهساز از آن استفاده میکند را انتخاب کنید، یا گزینه &quot;انتخاب خودکار&quot; را انتخاب کنید تا به طور خودکار تعیین شود.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation>Käytä pelikohtaisia asetuksia</translation> <translation>Käytä pelikohtaisia asetuksia</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation>L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation>L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation>Back</translation>
</message>
<message>
<source>R1 / RB</source>
<translation>R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation>R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation>Options / Start</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation>R3</translation> <translation>R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation>Etunäppäimet</translation> <translation>Etunäppäimet</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation>Kolmio / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation>Neliö / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation>Ympyrä / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation>Rasti / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation>Oikean Analogin Deadzone (oletus:2 max:127)</translation> <translation>Oikean Analogin Deadzone (oletus:2 max:127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation>Peruuta</translation> <translation>Peruuta</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>Viimeksi päivitetty</translation> <translation>Viimeksi päivitetty</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation type="unfinished">Favorite</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation> <translation type="unfinished">SFO Viewer for </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation type="unfinished">Remove from Favorites</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation type="unfinished">Add to Favorites</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation>Kosketuslevyn Klikkaus</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation>Hiiri Joystickinä</translation> <translation>Hiiri Joystickinä</translation>
@ -1188,6 +1224,18 @@
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation>Ohjain</translation> <translation>Ohjain</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>Takaisin-painikkeen Käyttäytyminen</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation>Grafiikka</translation> <translation>Grafiikka</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>Aseta aika, milloin hiiri häviää oltuaan aktiivinen.</translation> <translation>Aseta aika, milloin hiiri häviää oltuaan aktiivinen.</translation>
</message> </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>Takaisin-napin käyttäytyminen:\nAsettaa ohjaimen takaisin-napin jäljittelemään kosketusta PS4:n kosketuslevyn määritettyyn kohtaan.</translation>
</message>
<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> <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>
<translation>Näytä Yhteensopivuustiedot:\nNäyttää pelien yhteensopivuustiedot listanäkymässä. Ota käyttöön &quot;Päivitä Yhteensopivuustietokanta Käynnistäessä&quot; saadaksesi ajantasaista tietoa.</translation> <translation>Näytä Yhteensopivuustiedot:\nNäyttää pelien yhteensopivuustiedot listanäkymässä. Ota käyttöön &quot;Päivitä Yhteensopivuustietokanta Käynnistäessä&quot; saadaksesi ajantasaista tietoa.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation>Aina</translation> <translation>Aina</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Kosketuslevyn Vasen Puoli</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Kosketuslevyn Oikea Puoli</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Kosketuslevyn Keskikohta</translation>
</message>
<message>
<source>None</source>
<translation>Ei mitään</translation>
</message>
<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> <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>Näytönohjain:\nUseamman näytönohjaimen järjestelmissä, valitse pudotusvalikosta, mitä näytönohjainta emulaattori käyttää,\n tai valitse &quot;Auto Select&quot; automaattiseen määritykseen.</translation> <translation>Näytönohjain:\nUseamman näytönohjaimen järjestelmissä, valitse pudotusvalikosta, mitä näytönohjainta emulaattori käyttää,\n tai valitse &quot;Auto Select&quot; automaattiseen määritykseen.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation>Utiliser les configurations par jeu</translation> <translation>Utiliser les configurations par jeu</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation>L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation>L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation>Retour</translation>
</message>
<message>
<source>R1 / RB</source>
<translation>R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation>R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation>Options / Start</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation>R3</translation> <translation>R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation>Touches d'action</translation> <translation>Touches d'action</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation>Triangle / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation>Carré / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation>Rond / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation>Croix / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation>Joystick Gauche Deadzone (def:2 max:127)</translation> <translation>Joystick Gauche Deadzone (def:2 max:127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation>Annuler</translation> <translation>Annuler</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>Dernière mise à jour</translation> <translation>Dernière mise à jour</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation type="unfinished">Favorite</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation>Visionneuse SFO pour </translation> <translation>Visionneuse SFO pour </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation type="unfinished">Remove from Favorites</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation type="unfinished">Add to Favorites</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation>Clic tactile</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation>Souris vers Joystick</translation> <translation>Souris vers Joystick</translation>
@ -1188,6 +1224,18 @@
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation>Manette</translation> <translation>Manette</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>Comportement du bouton retour</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation>Graphismes</translation> <translation>Graphismes</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>Définissez un temps pour que la souris disparaisse après être inactif.</translation> <translation>Définissez un temps pour que la souris disparaisse après être inactif.</translation>
</message> </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>Comportement du bouton retour:\nDéfinit le bouton de retour de la manette pour imiter le toucher de la position spécifiée sur le pavé tactile PS4.</translation>
</message>
<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> <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>
<translation>Afficher les données de compatibilité:\nAffiche les informations de compatibilité des jeux dans une colonne dédiée. Activez &quot;Mettre à jour la compatibilité au démarrage&quot; pour avoir des informations à jour.</translation> <translation>Afficher les données de compatibilité:\nAffiche les informations de compatibilité des jeux dans une colonne dédiée. Activez &quot;Mettre à jour la compatibilité au démarrage&quot; pour avoir des informations à jour.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation>Toujours</translation> <translation>Toujours</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Pavé Tactile Gauche</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Pavé Tactile Droit</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Centre du Pavé Tactile</translation>
</message>
<message>
<source>None</source>
<translation>Aucun</translation>
</message>
<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> <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>Adaptateur graphique:\nSélectionnez le GPU que l&apos;émulateur utilisera dans les systèmes multi-GPU à partir de la liste déroulante,\nou choisissez &quot;Auto Select&quot; pour le déterminer automatiquement.</translation> <translation>Adaptateur graphique:\nSélectionnez le GPU que l&apos;émulateur utilisera dans les systèmes multi-GPU à partir de la liste déroulante,\nou choisissez &quot;Auto Select&quot; pour le déterminer automatiquement.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation type="unfinished">Use per-game configs</translation> <translation type="unfinished">Use per-game configs</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation type="unfinished">L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation type="unfinished">L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation type="unfinished">Back</translation>
</message>
<message>
<source>R1 / RB</source>
<translation type="unfinished">R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation type="unfinished">R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation type="unfinished">L3</translation> <translation type="unfinished">L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation type="unfinished">Options / Start</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation type="unfinished">R3</translation> <translation type="unfinished">R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation> <translation type="unfinished">Face Buttons</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation type="unfinished">Triangle / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation type="unfinished">Square / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation type="unfinished">Circle / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation type="unfinished">Cross / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation type="unfinished">Right Stick Deadzone (def:2, max:127)</translation> <translation type="unfinished">Right Stick Deadzone (def:2, max:127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation type="unfinished">Cancel</translation> <translation type="unfinished">Cancel</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>Utoljára frissítve</translation> <translation>Utoljára frissítve</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation type="unfinished">Favorite</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation> <translation type="unfinished">SFO Viewer for </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation type="unfinished">Remove from Favorites</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation type="unfinished">Add to Favorites</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation type="unfinished">L3</translation> <translation type="unfinished">L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished">Touchpad Click</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation type="unfinished">Mouse to Joystick</translation> <translation type="unfinished">Mouse to Joystick</translation>
@ -1188,6 +1224,18 @@
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation>Kontroller</translation> <translation>Kontroller</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>Vissza gomb Viselkedése</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation>Grafika</translation> <translation>Grafika</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>Állítson be egy időt, ami után egér inaktív állapotban eltűnik.</translation> <translation>Állítson be egy időt, ami után egér inaktív állapotban eltűnik.</translation>
</message> </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>Vissza gomb viselkedés:\nBeállítja a vezérlő vissza gombját, hogy utánozza a PS4 érintőpadján megadott pozíció megérintését.</translation>
</message>
<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> <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>
<translation type="unfinished">Display Compatibility Data:\nDisplays game compatibility information in table view. Enable &quot;Update Compatibility On Startup&quot; to get up-to-date information.</translation> <translation type="unfinished">Display Compatibility Data:\nDisplays game compatibility information in table view. Enable &quot;Update Compatibility On Startup&quot; to get up-to-date information.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation>Mindig</translation> <translation>Mindig</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Érintőpad Bal</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Érintőpad Jobb</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Érintőpad Közép</translation>
</message>
<message>
<source>None</source>
<translation>Semmi</translation>
</message>
<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> <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>Grafikus eszköz:\nTöbb GPU-s rendszereken válassza ki, melyik GPU-t használja az emulátor a legördülő listából,\nvagy válassza az &quot;Auto Select&quot; lehetőséget, hogy automatikusan kiválassza azt.</translation> <translation>Grafikus eszköz:\nTöbb GPU-s rendszereken válassza ki, melyik GPU-t használja az emulátor a legördülő listából,\nvagy válassza az &quot;Auto Select&quot; lehetőséget, hogy automatikusan kiválassza azt.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation type="unfinished">Use per-game configs</translation> <translation type="unfinished">Use per-game configs</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation type="unfinished">L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation type="unfinished">L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation type="unfinished">Back</translation>
</message>
<message>
<source>R1 / RB</source>
<translation type="unfinished">R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation type="unfinished">R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation type="unfinished">L3</translation> <translation type="unfinished">L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation type="unfinished">Options / Start</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation type="unfinished">R3</translation> <translation type="unfinished">R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation> <translation type="unfinished">Face Buttons</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation type="unfinished">Triangle / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation type="unfinished">Square / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation type="unfinished">Circle / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation type="unfinished">Cross / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation type="unfinished">Right Stick Deadzone (def:2, max:127)</translation> <translation type="unfinished">Right Stick Deadzone (def:2, max:127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation type="unfinished">Cancel</translation> <translation type="unfinished">Cancel</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>Terakhir diperbarui</translation> <translation>Terakhir diperbarui</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation type="unfinished">Favorite</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation> <translation type="unfinished">SFO Viewer for </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation type="unfinished">Remove from Favorites</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation type="unfinished">Add to Favorites</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation type="unfinished">L3</translation> <translation type="unfinished">L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished">Touchpad Click</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation type="unfinished">Mouse to Joystick</translation> <translation type="unfinished">Mouse to Joystick</translation>
@ -1188,6 +1224,18 @@
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation>Pengontrol</translation> <translation>Pengontrol</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>Perilaku tombol kembali</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation type="unfinished">Graphics</translation> <translation type="unfinished">Graphics</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>Tetapkan waktu untuk mouse menghilang setelah tidak aktif.</translation> <translation>Tetapkan waktu untuk mouse menghilang setelah tidak aktif.</translation>
</message> </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>Perilaku Tombol Kembali:\nMengatur tombol kembali pada pengontrol untuk meniru ketukan di posisi yang ditentukan di touchpad PS4.</translation>
</message>
<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> <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>
<translation type="unfinished">Display Compatibility Data:\nDisplays game compatibility information in table view. Enable &quot;Update Compatibility On Startup&quot; to get up-to-date information.</translation> <translation type="unfinished">Display Compatibility Data:\nDisplays game compatibility information in table view. Enable &quot;Update Compatibility On Startup&quot; to get up-to-date information.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation>Selalu</translation> <translation>Selalu</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Touchpad Kiri</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Touchpad Kanan</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Pusat Touchpad</translation>
</message>
<message>
<source>None</source>
<translation>Tidak Ada</translation>
</message>
<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> <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>Perangkat Grafis:\nPada sistem GPU ganda, pilih GPU yang akan digunakan emulator dari daftar dropdown,\natau pilih &quot;Auto Select&quot; untuk menentukan secara otomatis.</translation> <translation>Perangkat Grafis:\nPada sistem GPU ganda, pilih GPU yang akan digunakan emulator dari daftar dropdown,\natau pilih &quot;Auto Select&quot; untuk menentukan secara otomatis.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation>Usa configurazioni per gioco</translation> <translation>Usa configurazioni per gioco</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation>L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation>L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation>Indietro</translation>
</message>
<message>
<source>R1 / RB</source>
<translation>R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation>R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation>Opzioni / Avvio</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation>R3</translation> <translation>R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation>Pulsanti Frontali</translation> <translation>Pulsanti Frontali</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation>Triangolo / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation>Quadrato / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation>Cerchio / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation>Croce / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation>Zona Morta Levetta Destra (def:2 max:127)</translation> <translation>Zona Morta Levetta Destra (def:2 max:127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation>Annulla</translation> <translation>Annulla</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>Ultimo aggiornamento</translation> <translation>Ultimo aggiornamento</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation type="unfinished">Favorite</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation>Visualizzatore SFO per </translation> <translation>Visualizzatore SFO per </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation type="unfinished">Remove from Favorites</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation type="unfinished">Add to Favorites</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation>Click Touchpad</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation>Mouse a Joystick</translation> <translation>Mouse a Joystick</translation>
@ -1184,10 +1220,22 @@
<source>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons: <source>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source> %1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons: <translation>Non è possibile associare più di una volta qualsiasi input univoco. Sono presenti input duplicati mappati ai seguenti pulsanti:
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation>Controller</translation> <translation>Controller</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>Comportamento del pulsante Indietro</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation>Grafica</translation> <translation>Grafica</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>Imposta un tempo affinché il mouse scompaia dopo essere stato inattivo.</translation> <translation>Imposta un tempo affinché il mouse scompaia dopo essere stato inattivo.</translation>
</message> </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>Comportamento del pulsante Indietro:\nImposta il pulsante Indietro del controller per emulare il tocco sulla posizione specificata sul touchpad PS4.</translation>
</message>
<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> <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>
<translation>Mostra Dati Compatibilità:\nMostra informazioni sulla compatibilità del gioco nella visualizzazione lista. Abilita &quot;Aggiorna Compatiblità all&apos;Avvio&quot; per ottenere informazioni aggiornate.</translation> <translation>Mostra Dati Compatibilità:\nMostra informazioni sulla compatibilità del gioco nella visualizzazione lista. Abilita &quot;Aggiorna Compatiblità all&apos;Avvio&quot; per ottenere informazioni aggiornate.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation>Sempre</translation> <translation>Sempre</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Touchpad Sinistra</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Touchpad Destra</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Centro del Touchpad</translation>
</message>
<message>
<source>None</source>
<translation>Nessuno</translation>
</message>
<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> <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>Dispositivo Grafico:\nIn sistemi con più GPU, seleziona la GPU che l&apos;emulatore utilizzerà dall&apos;elenco a discesa,\no seleziona &quot;Selezione Automatica&quot; per determinarlo automaticamente.</translation> <translation>Dispositivo Grafico:\nIn sistemi con più GPU, seleziona la GPU che l&apos;emulatore utilizzerà dall&apos;elenco a discesa,\no seleziona &quot;Selezione Automatica&quot; per determinarlo automaticamente.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation type="unfinished">Use per-game configs</translation> <translation type="unfinished">Use per-game configs</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation>L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation>L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation type="unfinished">Back</translation>
</message>
<message>
<source>R1 / RB</source>
<translation>R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation>R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation>Options / Start</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation>R3</translation> <translation>R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation> <translation type="unfinished">Face Buttons</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation> / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation> / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation> / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation> / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation>既定:2, 最大:127</translation> <translation>既定:2, 最大:127</translation>
@ -523,15 +483,15 @@
</message> </message>
<message> <message>
<source>R:</source> <source>R:</source>
<translation type="unfinished">R:</translation> <translation>R:</translation>
</message> </message>
<message> <message>
<source>G:</source> <source>G:</source>
<translation type="unfinished">G:</translation> <translation>G:</translation>
</message> </message>
<message> <message>
<source>B:</source> <source>B:</source>
<translation type="unfinished">B:</translation> <translation>B:</translation>
</message> </message>
<message> <message>
<source>Override Lightbar Color</source> <source>Override Lightbar Color</source>
@ -551,19 +511,87 @@
</message> </message>
<message> <message>
<source>Save</source> <source>Save</source>
<translation type="unfinished">Save</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Apply</source> <source>Apply</source>
<translation type="unfinished">Apply</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Restore Defaults</source> <source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Cancel</source> <source>Cancel</source>
<translation type="unfinished">Cancel</translation> <translation></translation>
</message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message> </message>
</context> </context>
<context> <context>
@ -574,11 +602,11 @@
</message> </message>
<message> <message>
<source>Use Per-Game configs</source> <source>Use Per-Game configs</source>
<translation type="unfinished">Use Per-Game configs</translation> <translation>使</translation>
</message> </message>
<message> <message>
<source>Error</source> <source>Error</source>
<translation type="unfinished">Error</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Could not open the file for reading</source> <source>Could not open the file for reading</source>
@ -590,11 +618,11 @@
</message> </message>
<message> <message>
<source>Save Changes</source> <source>Save Changes</source>
<translation type="unfinished">Save Changes</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Do you want to save changes?</source> <source>Do you want to save changes?</source>
<translation type="unfinished">Do you want to save changes?</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Help</source> <source>Help</source>
@ -610,7 +638,7 @@
</message> </message>
<message> <message>
<source>Reset to Default</source> <source>Reset to Default</source>
<translation type="unfinished">Reset to Default</translation> <translation></translation>
</message> </message>
</context> </context>
<context> <context>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Favorite</source>
<translation type="unfinished">Favorite</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -848,7 +880,7 @@
</message> </message>
<message> <message>
<source>Delete Trophy</source> <source>Delete Trophy</source>
<translation type="unfinished">Delete Trophy</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Compatibility...</source> <source>Compatibility...</source>
@ -944,12 +976,20 @@
</message> </message>
<message> <message>
<source>Trophy</source> <source>Trophy</source>
<translation type="unfinished">Trophy</translation> <translation></translation>
</message> </message>
<message> <message>
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation> <translation type="unfinished">SFO Viewer for </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation type="unfinished">Remove from Favorites</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation type="unfinished">Add to Favorites</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -959,7 +999,7 @@
</message> </message>
<message> <message>
<source>FAQ</source> <source>FAQ</source>
<translation type="unfinished">FAQ</translation> <translation>FAQ</translation>
</message> </message>
<message> <message>
<source>Syntax</source> <source>Syntax</source>
@ -982,11 +1022,11 @@
</message> </message>
<message> <message>
<source>D-Pad</source> <source>D-Pad</source>
<translation type="unfinished">D-Pad</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Up</source> <source>Up</source>
<translation type="unfinished">Up</translation> <translation></translation>
</message> </message>
<message> <message>
<source>unmapped</source> <source>unmapped</source>
@ -994,15 +1034,15 @@
</message> </message>
<message> <message>
<source>Left</source> <source>Left</source>
<translation type="unfinished">Left</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Right</source> <source>Right</source>
<translation type="unfinished">Right</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Down</source> <source>Down</source>
<translation type="unfinished">Down</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Left Analog Halfmode</source> <source>Left Analog Halfmode</source>
@ -1014,7 +1054,7 @@
</message> </message>
<message> <message>
<source>Left Stick</source> <source>Left Stick</source>
<translation type="unfinished">Left Stick</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Config Selection</source> <source>Config Selection</source>
@ -1030,11 +1070,11 @@
</message> </message>
<message> <message>
<source>L1</source> <source>L1</source>
<translation type="unfinished">L1</translation> <translation>L1</translation>
</message> </message>
<message> <message>
<source>L2</source> <source>L2</source>
<translation type="unfinished">L2</translation> <translation>L2</translation>
</message> </message>
<message> <message>
<source>Text Editor</source> <source>Text Editor</source>
@ -1046,19 +1086,15 @@
</message> </message>
<message> <message>
<source>R1</source> <source>R1</source>
<translation type="unfinished">R1</translation> <translation>R1</translation>
</message> </message>
<message> <message>
<source>R2</source> <source>R2</source>
<translation type="unfinished">R2</translation> <translation>R2</translation>
</message> </message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation type="unfinished">L3</translation> <translation>L3</translation>
</message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished">Touchpad Click</translation>
</message> </message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
@ -1070,7 +1106,7 @@
</message> </message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation type="unfinished">R3</translation> <translation>R3</translation>
</message> </message>
<message> <message>
<source>Options</source> <source>Options</source>
@ -1166,19 +1202,19 @@
</message> </message>
<message> <message>
<source>Save</source> <source>Save</source>
<translation type="unfinished">Save</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Apply</source> <source>Apply</source>
<translation type="unfinished">Apply</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Restore Defaults</source> <source>Restore Defaults</source>
<translation type="unfinished">Restore Defaults</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Cancel</source> <source>Cancel</source>
<translation type="unfinished">Cancel</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons: <source>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
@ -1188,6 +1224,18 @@
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1409,43 +1457,43 @@
</message> </message>
<message> <message>
<source>Play</source> <source>Play</source>
<translation type="unfinished">Play</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Pause</source> <source>Pause</source>
<translation type="unfinished">Pause</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Stop</source> <source>Stop</source>
<translation type="unfinished">Stop</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Restart</source> <source>Restart</source>
<translation type="unfinished">Restart</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Full Screen</source> <source>Full Screen</source>
<translation type="unfinished">Full Screen</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Controllers</source> <source>Controllers</source>
<translation type="unfinished">Controllers</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Keyboard</source> <source>Keyboard</source>
<translation type="unfinished">Keyboard</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Refresh List</source> <source>Refresh List</source>
<translation type="unfinished">Refresh List</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Resume</source> <source>Resume</source>
<translation type="unfinished">Resume</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Show Labels Under Icons</source> <source>Show Labels Under Icons</source>
<translation type="unfinished">Show Labels Under Icons</translation> <translation></translation>
</message> </message>
</context> </context>
<context> <context>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation></translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation></translation> <translation></translation>
@ -1632,7 +1676,7 @@
</message> </message>
<message> <message>
<source>Copy GPU Buffers</source> <source>Copy GPU Buffers</source>
<translation type="unfinished">Copy GPU Buffers</translation> <translation>GPU </translation>
</message> </message>
<message> <message>
<source>Host Debug Markers</source> <source>Host Debug Markers</source>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation></translation> <translation></translation>
</message> </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>:\nコントローラーの戻るボタンをPS4のタッチパッドの指定された位置をタッチするように設定します</translation>
</message>
<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> <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>
<translation>:\nゲームの互換性に関する情報を表として表示します&quot;&quot; </translation> <translation>:\nゲームの互換性に関する情報を表として表示します&quot;&quot; </translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation></translation>
</message>
<message>
<source>Touchpad Right</source>
<translation></translation>
</message>
<message>
<source>Touchpad Center</source>
<translation></translation>
</message>
<message>
<source>None</source>
<translation></translation>
</message>
<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> <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>:\nシステムに複数のGPUが搭載されている場合使GPUを選択するか\n</translation> <translation>:\nシステムに複数のGPUが搭載されている場合使GPUを選択するか\n</translation>
@ -1960,31 +1984,31 @@
</message> </message>
<message> <message>
<source>Display Mode</source> <source>Display Mode</source>
<translation type="unfinished">Display Mode</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Windowed</source> <source>Windowed</source>
<translation type="unfinished">Windowed</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Fullscreen</source> <source>Fullscreen</source>
<translation type="unfinished">Fullscreen</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Fullscreen (Borderless)</source> <source>Fullscreen (Borderless)</source>
<translation type="unfinished">Fullscreen (Borderless)</translation> <translation>()</translation>
</message> </message>
<message> <message>
<source>Window Size</source> <source>Window Size</source>
<translation type="unfinished">Window Size</translation> <translation></translation>
</message> </message>
<message> <message>
<source>W:</source> <source>W:</source>
<translation type="unfinished">W:</translation> <translation>W:</translation>
</message> </message>
<message> <message>
<source>H:</source> <source>H:</source>
<translation type="unfinished">H:</translation> <translation>H:</translation>
</message> </message>
<message> <message>
<source>Separate Log Files</source> <source>Separate Log Files</source>
@ -2000,11 +2024,11 @@
</message> </message>
<message> <message>
<source>Left</source> <source>Left</source>
<translation type="unfinished">Left</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Right</source> <source>Right</source>
<translation type="unfinished">Right</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Top</source> <source>Top</source>
@ -2016,7 +2040,7 @@
</message> </message>
<message> <message>
<source>Notification Duration</source> <source>Notification Duration</source>
<translation type="unfinished">Notification Duration</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Portable User Folder</source> <source>Portable User Folder</source>
@ -2036,7 +2060,7 @@
</message> </message>
<message> <message>
<source>%1 already exists</source> <source>%1 already exists</source>
<translation type="unfinished">%1 already exists</translation> <translation>%1 </translation>
</message> </message>
<message> <message>
<source>Portable user folder created</source> <source>Portable user folder created</source>
@ -2052,7 +2076,7 @@
</message> </message>
<message> <message>
<source> * Unsupported Vulkan Version</source> <source> * Unsupported Vulkan Version</source>
<translation type="unfinished"> * Unsupported Vulkan Version</translation> <translation> * Vulkanバージョン</translation>
</message> </message>
</context> </context>
<context> <context>
@ -2071,15 +2095,15 @@
</message> </message>
<message> <message>
<source>Show Earned Trophies</source> <source>Show Earned Trophies</source>
<translation type="unfinished">Show Earned Trophies</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Show Not Earned Trophies</source> <source>Show Not Earned Trophies</source>
<translation type="unfinished">Show Not Earned Trophies</translation> <translation></translation>
</message> </message>
<message> <message>
<source>Show Hidden Trophies</source> <source>Show Hidden Trophies</source>
<translation type="unfinished">Show Hidden Trophies</translation> <translation></translation>
</message> </message>
</context> </context>
</TS> </TS>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation> </translation> <translation> </translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation>L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation>L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation></translation>
</message>
<message>
<source>R1 / RB</source>
<translation>R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation>R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation> / </translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation>R3</translation> <translation>R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation> <translation type="unfinished">Face Buttons</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation type="unfinished">Triangle / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation type="unfinished">Square / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation type="unfinished">Circle / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation type="unfinished">Cross / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation type="unfinished">Right Stick Deadzone (def:2, max:127)</translation> <translation type="unfinished">Right Stick Deadzone (def:2, max:127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation type="unfinished">Cancel</translation> <translation type="unfinished">Cancel</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation> </translation> <translation> </translation>
</message> </message>
<message>
<source>Favorite</source>
<translation type="unfinished">Favorite</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation> <translation type="unfinished">SFO Viewer for </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation type="unfinished">Remove from Favorites</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation type="unfinished">Add to Favorites</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation type="unfinished">L3</translation> <translation type="unfinished">L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished">Touchpad Click</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation type="unfinished">Mouse to Joystick</translation> <translation type="unfinished">Mouse to Joystick</translation>
@ -1188,6 +1224,18 @@
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation type="unfinished">Controller</translation> <translation type="unfinished">Controller</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation type="unfinished">Back Button Behavior</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation type="unfinished">Graphics</translation> <translation type="unfinished">Graphics</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation type="unfinished">Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</translation> <translation type="unfinished">Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</translation>
</message> </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 type="unfinished">Back Button Behavior:\nSets the controller&apos;s back button to emulate tapping the specified position on the PS4 touchpad.</translation>
</message>
<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> <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>
<translation type="unfinished">Display Compatibility Data:\nDisplays game compatibility information in table view. Enable &quot;Update Compatibility On Startup&quot; to get up-to-date information.</translation> <translation type="unfinished">Display Compatibility Data:\nDisplays game compatibility information in table view. Enable &quot;Update Compatibility On Startup&quot; to get up-to-date information.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation type="unfinished">Always</translation> <translation type="unfinished">Always</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>None</source>
<translation type="unfinished">None</translation>
</message>
<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> <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 type="unfinished">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.</translation> <translation type="unfinished">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.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation type="unfinished">Use per-game configs</translation> <translation type="unfinished">Use per-game configs</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation type="unfinished">L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation type="unfinished">L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation>Atgal</translation>
</message>
<message>
<source>R1 / RB</source>
<translation type="unfinished">R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation type="unfinished">R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation type="unfinished">L3</translation> <translation type="unfinished">L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation type="unfinished">Options / Start</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation type="unfinished">R3</translation> <translation type="unfinished">R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation> <translation type="unfinished">Face Buttons</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation type="unfinished">Triangle / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation type="unfinished">Square / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation type="unfinished">Circle / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation type="unfinished">Cross / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation type="unfinished">Right Stick Deadzone (def:2, max:127)</translation> <translation type="unfinished">Right Stick Deadzone (def:2, max:127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation>Atšaukti</translation> <translation>Atšaukti</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>Paskutinį kartą atnaujinta</translation> <translation>Paskutinį kartą atnaujinta</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation type="unfinished">Favorite</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation> <translation type="unfinished">SFO Viewer for </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation type="unfinished">Remove from Favorites</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation type="unfinished">Add to Favorites</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation type="unfinished">L3</translation> <translation type="unfinished">L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished">Touchpad Click</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation type="unfinished">Mouse to Joystick</translation> <translation type="unfinished">Mouse to Joystick</translation>
@ -1188,6 +1224,18 @@
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation>Valdiklis</translation> <translation>Valdiklis</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>Atgal mygtuko elgsena</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation type="unfinished">Graphics</translation> <translation type="unfinished">Graphics</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>Slėpti tuščiosios eigos žymeklio skirtąjį laiką:\nTrukmė (sekundėmis), po kurios neaktyvus žymeklis pasislepia.</translation> <translation>Slėpti tuščiosios eigos žymeklio skirtąjį laiką:\nTrukmė (sekundėmis), po kurios neaktyvus žymeklis pasislepia.</translation>
</message> </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>Atgal mygtuko elgesys:\nNustato valdiklio atgal mygtuką imituoti paspaudimą nurodytoje vietoje PS4 jutiklinėje plokštėje.</translation>
</message>
<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> <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>
<translation type="unfinished">Display Compatibility Data:\nDisplays game compatibility information in table view. Enable &quot;Update Compatibility On Startup&quot; to get up-to-date information.</translation> <translation type="unfinished">Display Compatibility Data:\nDisplays game compatibility information in table view. Enable &quot;Update Compatibility On Startup&quot; to get up-to-date information.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation>Visada</translation> <translation>Visada</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Jutiklinis Paviršius Kairėje</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Jutiklinis Paviršius Dešinėje</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Jutiklinis Paviršius Centre</translation>
</message>
<message>
<source>None</source>
<translation>Nieko</translation>
</message>
<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> <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>Grafikos įrenginys:\nDaugiagrafikėse sistemose pasirinkite GPU, kurį emuliatorius naudos išskleidžiamojo sąrašo,\n arba pasirinkite &quot;Auto Select&quot;, kad jis būtų nustatytas automatiškai.</translation> <translation>Grafikos įrenginys:\nDaugiagrafikėse sistemose pasirinkite GPU, kurį emuliatorius naudos išskleidžiamojo sąrašo,\n arba pasirinkite &quot;Auto Select&quot;, kad jis būtų nustatytas automatiškai.</translation>

View File

@ -337,7 +337,7 @@
</message> </message>
<message> <message>
<source>The update has been downloaded, press OK to install.</source> <source>The update has been downloaded, press OK to install.</source>
<translation>Oppdateringen ble lastet ned, trykk OK for å installere.</translation> <translation>Oppdateringen er lastet ned, trykk OK for å installere.</translation>
</message> </message>
<message> <message>
<source>Failed to save the update file at</source> <source>Failed to save the update file at</source>
@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation>Bruk oppsett per spill</translation> <translation>Bruk oppsett per spill</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation>L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation>L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation>Tilbake</translation>
</message>
<message>
<source>R1 / RB</source>
<translation>R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation>R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation>Options / Start</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation>R3</translation> <translation>R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation>Handlingsknapper</translation> <translation>Handlingsknapper</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation>Triangel / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation>Firkant / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation>Sirkel / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation>Kryss / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation>Høyre analog dødsone (def:2, maks:127)</translation> <translation>Høyre analog dødsone (def:2, maks:127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation>Avbryt</translation> <translation>Avbryt</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>Sist oppdatert</translation> <translation>Sist oppdatert</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation>Favoritter</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation>SFO-viser for </translation> <translation>SFO-viser for </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation>Fjern fra favoritter</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation>Legg til i favoritter</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -990,7 +1030,7 @@
</message> </message>
<message> <message>
<source>unmapped</source> <source>unmapped</source>
<translation>Ikke satt opp</translation> <translation>Ikke tildelt</translation>
</message> </message>
<message> <message>
<source>Left</source> <source>Left</source>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation>Berøringsplateknapp</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation>Mus til styrespak</translation> <translation>Mus til styrespak</translation>
@ -1082,7 +1118,7 @@
</message> </message>
<message> <message>
<source>note: click Help Button/Special Keybindings for more information</source> <source>note: click Help Button/Special Keybindings for more information</source>
<translation>Merk: Trykk hjelpeknappen for mer informasjon</translation> <translation>Merk: Trykk «Hjelp»-knappen for mer informasjon</translation>
</message> </message>
<message> <message>
<source>Face Buttons</source> <source>Face Buttons</source>
@ -1184,10 +1220,22 @@
<source>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons: <source>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source> %1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons: <translation>Kan ikke tildele samme inndata mer enn én gang. Dupliserte inndata tildeles følgende taster:
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Berøringsplate venstre</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Berøringsplate midten</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Berøringsplate høyre</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation>Kontroller</translation> <translation>Kontroller</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>Tilbakeknapp atferd</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation>Grafikk</translation> <translation>Grafikk</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>Sett en tid for når musepekeren forsvinner etter å ha vært inaktiv.</translation> <translation>Sett en tid for når musepekeren forsvinner etter å ha vært inaktiv.</translation>
</message> </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>Atferd for tilbaketasten:\nSetter tilbaketasten kontrolleren til å imitere et trykk den angitte posisjonen PS4s berøringsplate.</translation>
</message>
<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> <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>
<translation>Vis kompatibilitets-data:\nViser informasjon om spillkompatibilitet i tabellvisning. Bruk «Oppdater database ved oppstart» for oppdatert informasjon.</translation> <translation>Vis kompatibilitets-data:\nViser informasjon om spillkompatibilitet i tabellvisning. Bruk «Oppdater database ved oppstart» for oppdatert informasjon.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation>Alltid</translation> <translation>Alltid</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Berøringsplate venstre</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Berøringsplate høyre</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Berøringsplate midten</translation>
</message>
<message>
<source>None</source>
<translation>Ingen</translation>
</message>
<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> <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:\nSystemer med flere GPU-er, kan emulatoren velge hvilken enhet som skal brukes fra rullegardinlista,\neller bruk «Velg automatisk».</translation> <translation>Grafikkenhet:\nSystemer med flere GPU-er, kan emulatoren velge hvilken enhet som skal brukes fra rullegardinlista,\neller bruk «Velg automatisk».</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation type="unfinished">Use per-game configs</translation> <translation type="unfinished">Use per-game configs</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation type="unfinished">L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation type="unfinished">L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation type="unfinished">Back</translation>
</message>
<message>
<source>R1 / RB</source>
<translation type="unfinished">R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation type="unfinished">R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation type="unfinished">L3</translation> <translation type="unfinished">L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation type="unfinished">Options / Start</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation type="unfinished">R3</translation> <translation type="unfinished">R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation> <translation type="unfinished">Face Buttons</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation type="unfinished">Triangle / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation type="unfinished">Square / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation type="unfinished">Circle / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation type="unfinished">Cross / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation type="unfinished">Right Stick Deadzone (def:2, max:127)</translation> <translation type="unfinished">Right Stick Deadzone (def:2, max:127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation type="unfinished">Cancel</translation> <translation type="unfinished">Cancel</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -582,7 +610,7 @@
</message> </message>
<message> <message>
<source>Could not open the file for reading</source> <source>Could not open the file for reading</source>
<translation/> <translation type="unfinished">Could not open the file for reading</translation>
</message> </message>
<message> <message>
<source>Could not open the file for writing</source> <source>Could not open the file for writing</source>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>Laatst bijgewerkt</translation> <translation>Laatst bijgewerkt</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation type="unfinished">Favorite</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation> <translation type="unfinished">SFO Viewer for </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation type="unfinished">Remove from Favorites</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation type="unfinished">Add to Favorites</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation type="unfinished">L3</translation> <translation type="unfinished">L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished">Touchpad Click</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation type="unfinished">Mouse to Joystick</translation> <translation type="unfinished">Mouse to Joystick</translation>
@ -1188,6 +1224,18 @@
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation type="unfinished">Controller</translation> <translation type="unfinished">Controller</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>Achterknop gedrag</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation type="unfinished">Graphics</translation> <translation type="unfinished">Graphics</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>Stel een tijd in voor wanneer de muis verdwijnt na inactiviteit.</translation> <translation>Stel een tijd in voor wanneer de muis verdwijnt na inactiviteit.</translation>
</message> </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>Gedrag van de terugknop:\nStelt de terugknop van de controller in om een aanraking op de opgegeven positie op de PS4-touchpad na te bootsen.</translation>
</message>
<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> <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>
<translation type="unfinished">Display Compatibility Data:\nDisplays game compatibility information in table view. Enable &quot;Update Compatibility On Startup&quot; to get up-to-date information.</translation> <translation type="unfinished">Display Compatibility Data:\nDisplays game compatibility information in table view. Enable &quot;Update Compatibility On Startup&quot; to get up-to-date information.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation>Altijd</translation> <translation>Altijd</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Touchpad Links</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Touchpad Rechts</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Touchpad Midden</translation>
</message>
<message>
<source>None</source>
<translation>Geen</translation>
</message>
<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> <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>Grafische adapter:\nIn systemen met meerdere GPU&apos;s, kies de GPU die de emulator uit de vervolgkeuzelijst moet gebruiken,\nof kies &quot;Auto Select&quot; om dit automatisch in te stellen.</translation> <translation>Grafische adapter:\nIn systemen met meerdere GPU&apos;s, kies de GPU die de emulator uit de vervolgkeuzelijst moet gebruiken,\nof kies &quot;Auto Select&quot; om dit automatisch in te stellen.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation>Użyj osobnej konfiguracji dla każdej gry</translation> <translation>Użyj osobnej konfiguracji dla każdej gry</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation>L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation>L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation>Wstecz</translation>
</message>
<message>
<source>R1 / RB</source>
<translation>R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation>R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation>Opcje / Start</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation>R3</translation> <translation>R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation>Przyciski akcji</translation> <translation>Przyciski akcji</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation>Trójkąt / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation>Kwadrat / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation>Kółko / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation>Krzyżyk / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation>Martwa strefa prawego drążka (def:2 max:127)</translation> <translation>Martwa strefa prawego drążka (def:2 max:127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation>Anuluj</translation> <translation>Anuluj</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>Ostatnia aktualizacja</translation> <translation>Ostatnia aktualizacja</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation type="unfinished">Favorite</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation>Menedżer plików SFO dla </translation> <translation>Menedżer plików SFO dla </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation type="unfinished">Remove from Favorites</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation type="unfinished">Add to Favorites</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation>Kliknięcie Touchpada</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation>Mysz na Joystick</translation> <translation>Mysz na Joystick</translation>
@ -1188,6 +1224,18 @@
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation>Kontroler</translation> <translation>Kontroler</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>Zachowanie przycisku wstecz</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation>Grafika</translation> <translation>Grafika</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>Ustaw czas, po którym mysz zniknie po bezczynności.</translation> <translation>Ustaw czas, po którym mysz zniknie po bezczynności.</translation>
</message> </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>Zachowanie przycisku Wstecz:\nUstawia przycisk Wstecz kontrolera tak, aby emulował dotknięcie określonego miejsca na panelu dotykowym PS4.</translation>
</message>
<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> <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>
<translation>Wyświetl dane zgodności:\nWyświetla informacje o kompatybilności gry w widoku tabeli. Włącz opcję Aktualizuj zgodność przy uruchomieniu, aby uzyskać aktualne informacje.</translation> <translation>Wyświetl dane zgodności:\nWyświetla informacje o kompatybilności gry w widoku tabeli. Włącz opcję Aktualizuj zgodność przy uruchomieniu, aby uzyskać aktualne informacje.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation>Zawsze</translation> <translation>Zawsze</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Touchpad Lewy</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Touchpad Prawy</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Touchpad Środkowy</translation>
</message>
<message>
<source>None</source>
<translation>Brak</translation>
</message>
<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> <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>Urządzenie graficzne:\nW systemach z wieloma GPU, wybierz GPU, który emulator ma używać z rozwijanego menu,\n lub wybierz &quot;Auto Select&quot;, aby ustawić go automatycznie.</translation> <translation>Urządzenie graficzne:\nW systemach z wieloma GPU, wybierz GPU, który emulator ma używać z rozwijanego menu,\n lub wybierz &quot;Auto Select&quot;, aby ustawić go automatycznie.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation>Usar configurações por jogo</translation> <translation>Usar configurações por jogo</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation>L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation>L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation>Voltar</translation>
</message>
<message>
<source>R1 / RB</source>
<translation>R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation>R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation>Options / Start</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation>R3</translation> <translation>R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation>Botões de Ação</translation> <translation>Botões de Ação</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation>Triângulo / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation>Quadrado / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation>Círculo / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation>Cruz / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation>Zona Morta do Analógico Direito (Pad: 2, Máx: 127)</translation> <translation>Zona Morta do Analógico Direito (Pad: 2, Máx: 127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation>Cancelar</translation> <translation>Cancelar</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation>não mapeado</translation>
</message>
<message>
<source>L1</source>
<translation>L1</translation>
</message>
<message>
<source>R1</source>
<translation>R1</translation>
</message>
<message>
<source>L2</source>
<translation>L2</translation>
</message>
<message>
<source>Options</source>
<translation>Opções</translation>
</message>
<message>
<source>R2</source>
<translation>R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation>Touchpad Esquerdo</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Touchpad Direito</translation>
</message>
<message>
<source>Triangle</source>
<translation>Triângulo</translation>
</message>
<message>
<source>Square</source>
<translation>Quadrado</translation>
</message>
<message>
<source>Circle</source>
<translation type="unfinished">Circle</translation>
</message>
<message>
<source>Cross</source>
<translation type="unfinished">Cross</translation>
</message>
<message>
<source>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation>Não é possível atribuir a mesma entrada mais de uma vez. Entradas duplicadas foram atribuídas aos seguintes botões:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation>Pressione um botão</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>Última atualização</translation> <translation>Última atualização</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation>Favorito</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation>Visualizador de SFO para </translation> <translation>Visualizador de SFO para </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation>Remover dos Favoritos</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation>Adicionar aos Favoritos</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation>Clique do Touchpad</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation>Mouse para Analógico</translation> <translation>Mouse para Analógico</translation>
@ -1184,10 +1220,22 @@
<source>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons: <source>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source> %1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons: <translation>Não é possível atribuir a mesma entrada mais de uma vez. Entradas duplicadas foram atribuídas aos seguintes botões:
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Touchpad Esquerdo</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Centro do Touchpad</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Touchpad Direito</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation>Controle</translation> <translation>Controle</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>Comportamento do Botão Voltar</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation>Gráficos</translation> <translation>Gráficos</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>Tempo de Inatividade para Ocultar Cursor:\nDefina um tempo em segundos para o mouse desaparecer após ficar inativo.</translation> <translation>Tempo de Inatividade para Ocultar Cursor:\nDefina um tempo em segundos para o mouse desaparecer após ficar inativo.</translation>
</message> </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>Comportamento do Botão Voltar:\nDefine o botão voltar do controle para emular o toque na posição especificada no touchpad do PS4.</translation>
</message>
<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> <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>
<translation>Exibir Dados de Compatibilidade:\nExibe informações de compatibilidade dos jogos na visualização de tabela.\nAtive &quot;Atualizar Compatibilidade ao Inicializar&quot; para obter informações atualizadas.</translation> <translation>Exibir Dados de Compatibilidade:\nExibe informações de compatibilidade dos jogos na visualização de tabela.\nAtive &quot;Atualizar Compatibilidade ao Inicializar&quot; para obter informações atualizadas.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation>Sempre</translation> <translation>Sempre</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Touchpad Esquerdo</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Touchpad Direito</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Centro do Touchpad</translation>
</message>
<message>
<source>None</source>
<translation>Nenhum</translation>
</message>
<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> <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>Placa de Vídeo:\nEm sistemas com múltiplas GPUs, escolha qual GPU o emulador utilizará da lista suspensa,\nou escolha &quot;Seleção Automática&quot; para escolher automaticamente o mesmo.</translation> <translation>Placa de Vídeo:\nEm sistemas com múltiplas GPUs, escolha qual GPU o emulador utilizará da lista suspensa,\nou escolha &quot;Seleção Automática&quot; para escolher automaticamente o mesmo.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation>Utilizar configurações por jogo</translation> <translation>Utilizar configurações por jogo</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation>L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation>L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation>Voltar</translation>
</message>
<message>
<source>R1 / RB</source>
<translation>R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation>R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation>Opções / Start</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation>R3</translation> <translation>R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation>Botões Frontais</translation> <translation>Botões Frontais</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation>Triângulo / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation>Quadrado / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation>Círculo / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation>Cruz / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation>Zona Morta do Manípulo Direito (def: 2, max: 127)</translation> <translation>Zona Morta do Manípulo Direito (def: 2, max: 127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation>Cancelar</translation> <translation>Cancelar</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>Última atualização</translation> <translation>Última atualização</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation type="unfinished">Favorite</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation>Visualizador SFO para </translation> <translation>Visualizador SFO para </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation type="unfinished">Remove from Favorites</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation type="unfinished">Add to Favorites</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation>Clique do Touchpad</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation>Rato para Manípulo</translation> <translation>Rato para Manípulo</translation>
@ -1188,6 +1224,18 @@
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation>Comando</translation> <translation>Comando</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>Comportamento do Botão Voltar</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation>Gráficos</translation> <translation>Gráficos</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>Tempo de Espera para Ocultar o Cursor:\nDefine o tempo em segundos para o rato desaparecer após ficar inativo.</translation> <translation>Tempo de Espera para Ocultar o Cursor:\nDefine o tempo em segundos para o rato desaparecer após ficar inativo.</translation>
</message> </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>Comportamento do Botão Voltar:\nConfigura o botão Voltar do comando para emular um toque na posição especificada no touchpad do PS4.</translation>
</message>
<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> <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>
<translation>Exibir Dados de Compatibilidade:\nExibe informações de compatibilidade dos jogos em visualização de tabela.\nAtivar &quot;Atualizar Base de Dados de Compatibilidade no Arranque&quot; para obter informações atualizadas.</translation> <translation>Exibir Dados de Compatibilidade:\nExibe informações de compatibilidade dos jogos em visualização de tabela.\nAtivar &quot;Atualizar Base de Dados de Compatibilidade no Arranque&quot; para obter informações atualizadas.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation>Sempre</translation> <translation>Sempre</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Esquerda do Touchpad</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Direita do Touchpad</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Centro do Touchpad</translation>
</message>
<message>
<source>None</source>
<translation>Nenhum</translation>
</message>
<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> <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>Placa Gráfica:\nEm sistemas com múltiplas GPUs, escolha qual GPU da lista o emulador utilizará,\nou escolha &quot;Seleção Automática&quot; para escolher automaticamente a mesma.</translation> <translation>Placa Gráfica:\nEm sistemas com múltiplas GPUs, escolha qual GPU da lista o emulador utilizará,\nou escolha &quot;Seleção Automática&quot; para escolher automaticamente a mesma.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation type="unfinished">Use per-game configs</translation> <translation type="unfinished">Use per-game configs</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation type="unfinished">L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation type="unfinished">L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation type="unfinished">Back</translation>
</message>
<message>
<source>R1 / RB</source>
<translation type="unfinished">R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation type="unfinished">R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation type="unfinished">L3</translation> <translation type="unfinished">L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation type="unfinished">Options / Start</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation type="unfinished">R3</translation> <translation type="unfinished">R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation> <translation type="unfinished">Face Buttons</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation type="unfinished">Triangle / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation type="unfinished">Square / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation type="unfinished">Circle / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation type="unfinished">Cross / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation type="unfinished">Right Stick Deadzone (def:2, max:127)</translation> <translation type="unfinished">Right Stick Deadzone (def:2, max:127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation type="unfinished">Cancel</translation> <translation type="unfinished">Cancel</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>Ultima actualizare</translation> <translation>Ultima actualizare</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation type="unfinished">Favorite</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation> <translation type="unfinished">SFO Viewer for </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation type="unfinished">Remove from Favorites</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation type="unfinished">Add to Favorites</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation type="unfinished">L3</translation> <translation type="unfinished">L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished">Touchpad Click</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation type="unfinished">Mouse to Joystick</translation> <translation type="unfinished">Mouse to Joystick</translation>
@ -1188,6 +1224,18 @@
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation>Controler</translation> <translation>Controler</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>Comportament buton înapoi</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation type="unfinished">Graphics</translation> <translation type="unfinished">Graphics</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>Setați un timp pentru ca mouse-ul dispară după ce a fost inactiv.</translation> <translation>Setați un timp pentru ca mouse-ul dispară după ce a fost inactiv.</translation>
</message> </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>Comportamentul butonului înapoi:\nSetează butonul înapoi al controlerului imite atingerea poziției specificate pe touchpad-ul PS4.</translation>
</message>
<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> <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>
<translation type="unfinished">Display Compatibility Data:\nDisplays game compatibility information in table view. Enable &quot;Update Compatibility On Startup&quot; to get up-to-date information.</translation> <translation type="unfinished">Display Compatibility Data:\nDisplays game compatibility information in table view. Enable &quot;Update Compatibility On Startup&quot; to get up-to-date information.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation>Întotdeauna</translation> <translation>Întotdeauna</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Touchpad Stânga</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Touchpad Dreapta</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Centru Touchpad</translation>
</message>
<message>
<source>None</source>
<translation>Niciunul</translation>
</message>
<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> <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>Dispozitiv grafic:\nPe sistemele cu mai multe GPU-uri, alege GPU-ul pe care emulatorul îl va folosi din lista derulantă,\nsau selectează &quot;Auto Select&quot; pentru a-l determina automat.</translation> <translation>Dispozitiv grafic:\nPe sistemele cu mai multe GPU-uri, alege GPU-ul pe care emulatorul îl va folosi din lista derulantă,\nsau selectează &quot;Auto Select&quot; pentru a-l determina automat.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation>Использовать настройки для каждой игры</translation> <translation>Использовать настройки для каждой игры</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation>L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation>L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation>Назад</translation>
</message>
<message>
<source>R1 / RB</source>
<translation>R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation>R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation>Options / Start</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation>R3</translation> <translation>R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation>Кнопки действий</translation> <translation>Кнопки действий</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation>Треугольник / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation>Квадрат / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation>Круг / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation>Крест / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation>Мёртвая зона правого стика (по умолч:2 макс:127)</translation> <translation>Мёртвая зона правого стика (по умолч:2 макс:127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation>Отмена</translation> <translation>Отмена</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation>не назначено</translation>
</message>
<message>
<source>L1</source>
<translation>L1</translation>
</message>
<message>
<source>R1</source>
<translation>R1</translation>
</message>
<message>
<source>L2</source>
<translation>L2</translation>
</message>
<message>
<source>Options</source>
<translation>Options</translation>
</message>
<message>
<source>R2</source>
<translation>R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation>Тачпад слева</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Тачпад центр</translation>
</message>
<message>
<source>Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation>Невозможно привязать уникальный ввод более одного раза. Дублированные вводы назначены на следующие кнопки:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation>Нажмите кнопку</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>Последнее обновление</translation> <translation>Последнее обновление</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation>Избранное</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation>Просмотр SFO для</translation> <translation>Просмотр SFO для</translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation>Удалить из избранного</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation>Добавить в избранное</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation>Нажатие на тачпад</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation>Мышь в джойстик</translation> <translation>Мышь в джойстик</translation>
@ -1138,7 +1174,7 @@
</message> </message>
<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> <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> <translation>Эта кнопка копирует настройки из общего конфига в текущий выбранный профиль, и не может быть использован, когда выбранный профиль - это общий конфиг.</translation>
</message> </message>
<message> <message>
<source>Copy values from Common Config</source> <source>Copy values from Common Config</source>
@ -1184,10 +1220,22 @@
<source>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons: <source>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source> %1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons: <translation>Невозможно привязать уникальный ввод более одного раза. Дублированные вводы назначены на следующие кнопки:
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Тачпад слева</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Тачпад центр</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Тачпад справа</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation>Контроллер</translation> <translation>Контроллер</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>Поведение кнопки назад</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation>Графика</translation> <translation>Графика</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>Время скрытия курсора при бездействии:\nВремя (в секундах), через которое курсор исчезнет при бездействии.</translation> <translation>Время скрытия курсора при бездействии:\nВремя (в секундах), через которое курсор исчезнет при бездействии.</translation>
</message> </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>Поведение кнопки «Назад»:\nНастраивает кнопку «Назад» контроллера на эмуляцию нажатия на указанную область на сенсорной панели контроллера PS4.</translation>
</message>
<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> <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>
<translation>Показывать данные совместимости:\оказывает информацию о совместимости игр в таблице. Включите «Обновлять базу совместимости при запуске» для получения актуальной информации.</translation> <translation>Показывать данные совместимости:\оказывает информацию о совместимости игр в таблице. Включите «Обновлять базу совместимости при запуске» для получения актуальной информации.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation>Всегда</translation> <translation>Всегда</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Тачпад слева</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Тачпад справа</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Центр тачпада</translation>
</message>
<message>
<source>None</source>
<translation>Нет</translation>
</message>
<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> <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>Графическое устройство:\nВ системах с несколькими GPU выберите тот, который будет использовать эмулятор.\nВыберите &quot;Автовыбор&quot;, чтобы определить GPU автоматически.</translation> <translation>Графическое устройство:\nВ системах с несколькими GPU выберите тот, который будет использовать эмулятор.\nВыберите &quot;Автовыбор&quot;, чтобы определить GPU автоматически.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation type="unfinished">Use per-game configs</translation> <translation type="unfinished">Use per-game configs</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation type="unfinished">L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation type="unfinished">L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation type="unfinished">Back</translation>
</message>
<message>
<source>R1 / RB</source>
<translation type="unfinished">R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation type="unfinished">R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation type="unfinished">L3</translation> <translation type="unfinished">L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation type="unfinished">Options / Start</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation type="unfinished">R3</translation> <translation type="unfinished">R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation> <translation type="unfinished">Face Buttons</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation type="unfinished">Triangle / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation type="unfinished">Square / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation type="unfinished">Circle / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation type="unfinished">Cross / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation type="unfinished">Right Stick Deadzone (def:2, max:127)</translation> <translation type="unfinished">Right Stick Deadzone (def:2, max:127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation type="unfinished">Cancel</translation> <translation type="unfinished">Cancel</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation type="unfinished">Last updated</translation> <translation type="unfinished">Last updated</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation type="unfinished">Favorite</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation> <translation type="unfinished">SFO Viewer for </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation type="unfinished">Remove from Favorites</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation type="unfinished">Add to Favorites</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation type="unfinished">L3</translation> <translation type="unfinished">L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished">Touchpad Click</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation type="unfinished">Mouse to Joystick</translation> <translation type="unfinished">Mouse to Joystick</translation>
@ -1188,6 +1224,18 @@
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation type="unfinished">Controller</translation> <translation type="unfinished">Controller</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation type="unfinished">Back Button Behavior</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation type="unfinished">Graphics</translation> <translation type="unfinished">Graphics</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation type="unfinished">Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</translation> <translation type="unfinished">Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</translation>
</message> </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 type="unfinished">Back Button Behavior:\nSets the controller&apos;s back button to emulate tapping the specified position on the PS4 touchpad.</translation>
</message>
<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> <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>
<translation type="unfinished">Display Compatibility Data:\nDisplays game compatibility information in table view. Enable &quot;Update Compatibility On Startup&quot; to get up-to-date information.</translation> <translation type="unfinished">Display Compatibility Data:\nDisplays game compatibility information in table view. Enable &quot;Update Compatibility On Startup&quot; to get up-to-date information.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation type="unfinished">Always</translation> <translation type="unfinished">Always</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>None</source>
<translation type="unfinished">None</translation>
</message>
<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> <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 type="unfinished">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.</translation> <translation type="unfinished">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.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation>Përdor konfigurime veçanta për secilën lojë</translation> <translation>Përdor konfigurime veçanta për secilën lojë</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation>L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation>L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation>Mbrapa</translation>
</message>
<message>
<source>R1 / RB</source>
<translation>R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation>R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation>Options / Start</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation>R3</translation> <translation>R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation>Butonat kryesore</translation> <translation>Butonat kryesore</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation>Trekëndësh / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation>Katror / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation>Rreth / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation>Kryq / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation>Zona e vdekur e levës djathtë (def:2, max:127)</translation> <translation>Zona e vdekur e levës djathtë (def:2, max:127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation>Anulo</translation> <translation>Anulo</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>Përditësuar për herë fundit</translation> <translation>Përditësuar për herë fundit</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation> Preferuarat</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation>Shikuesi SFO për </translation> <translation>Shikuesi SFO për </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation>Hiq nga Preferuarat</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation>Shto Preferuarat</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation>Klikim i Panelit me Prekje</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation>Miu Levë</translation> <translation>Miu Levë</translation>
@ -1184,10 +1220,22 @@
<source>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons: <source>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source> %1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons: <translation>Nuk mund caktohet e njëjta hyrje unike shumë se një herë. Hyrjet e dublikuara janë caktuar butonët e mëposhtëm:
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Paneli me Prekje Majtas</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Paneli me Prekje Qendër</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Paneli me Prekje Djathtas</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation>Dorezë</translation> <translation>Dorezë</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>Sjellja e butonit mbrapa</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation>Grafika</translation> <translation>Grafika</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>Koha për fshehjen e kursorit joaktiv:\nKohëzgjatja ( sekonda) pas cilës kursori nuk ka qënë veprim fshihet.</translation> <translation>Koha për fshehjen e kursorit joaktiv:\nKohëzgjatja ( sekonda) pas cilës kursori nuk ka qënë veprim fshihet.</translation>
</message> </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ë panelit me prekje dorezës do imitojë një prekje butoni mbrapa.</translation>
</message>
<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> <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>
<translation>Shfaq dhënat e përputhshmërisë:\nShfaq informacionin e përputhshmërisë lojës formë tabele. Aktivizo &quot;Përditëso përputhshmërinë gjatë nisjes&quot; për marrë informacion përditësuar.</translation> <translation>Shfaq dhënat e përputhshmërisë:\nShfaq informacionin e përputhshmërisë lojës formë tabele. Aktivizo &quot;Përditëso përputhshmërinë gjatë nisjes&quot; për marrë informacion përditësuar.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation>Gjithmonë</translation> <translation>Gjithmonë</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Paneli me Prekje Majtas</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Paneli me Prekje Djathtas</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Paneli me Prekje Qendër</translation>
</message>
<message>
<source>None</source>
<translation>Asnjë</translation>
</message>
<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> <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>Pajisja grafike:\nNë sistemet me GPU shumëfishta, zgjidh GPU- do përdorë emulatori nga lista rënëse,\nose zgjidh &quot;Auto Select&quot; për ta përcaktuar automatikisht.</translation> <translation>Pajisja grafike:\nNë sistemet me GPU shumëfishta, zgjidh GPU- do përdorë emulatori nga lista rënëse,\nose zgjidh &quot;Auto Select&quot; për ta përcaktuar automatikisht.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation type="unfinished">Use per-game configs</translation> <translation type="unfinished">Use per-game configs</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation type="unfinished">L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation type="unfinished">L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation type="unfinished">Back</translation>
</message>
<message>
<source>R1 / RB</source>
<translation type="unfinished">R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation type="unfinished">R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation type="unfinished">L3</translation> <translation type="unfinished">L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation type="unfinished">Options / Start</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation type="unfinished">R3</translation> <translation type="unfinished">R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation> <translation type="unfinished">Face Buttons</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation type="unfinished">Triangle / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation type="unfinished">Square / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation type="unfinished">Circle / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation type="unfinished">Cross / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation type="unfinished">Right Stick Deadzone (def:2, max:127)</translation> <translation type="unfinished">Right Stick Deadzone (def:2, max:127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation type="unfinished">Cancel</translation> <translation type="unfinished">Cancel</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation type="unfinished">Last updated</translation> <translation type="unfinished">Last updated</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation type="unfinished">Favorite</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation> <translation type="unfinished">SFO Viewer for </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation type="unfinished">Remove from Favorites</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation type="unfinished">Add to Favorites</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation type="unfinished">L3</translation> <translation type="unfinished">L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished">Touchpad Click</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation type="unfinished">Mouse to Joystick</translation> <translation type="unfinished">Mouse to Joystick</translation>
@ -1188,6 +1224,18 @@
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation type="unfinished">Controller</translation> <translation type="unfinished">Controller</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation type="unfinished">Back Button Behavior</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation type="unfinished">Graphics</translation> <translation type="unfinished">Graphics</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation type="unfinished">Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</translation> <translation type="unfinished">Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</translation>
</message> </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 type="unfinished">Back Button Behavior:\nSets the controller&apos;s back button to emulate tapping the specified position on the PS4 touchpad.</translation>
</message>
<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> <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>
<translation type="unfinished">Display Compatibility Data:\nDisplays game compatibility information in table view. Enable &quot;Update Compatibility On Startup&quot; to get up-to-date information.</translation> <translation type="unfinished">Display Compatibility Data:\nDisplays game compatibility information in table view. Enable &quot;Update Compatibility On Startup&quot; to get up-to-date information.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation type="unfinished">Always</translation> <translation type="unfinished">Always</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>None</source>
<translation type="unfinished">None</translation>
</message>
<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> <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 type="unfinished">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.</translation> <translation type="unfinished">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.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation>Använd konfigurationer per spel</translation> <translation>Använd konfigurationer per spel</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation>L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation>L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation>Bakåt</translation>
</message>
<message>
<source>R1 / RB</source>
<translation>R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation>R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation>Options / Start</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation>R3</translation> <translation>R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation>Handlingsknappar</translation> <translation>Handlingsknappar</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation>Triangel / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation>Fyrkant / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation>Cirkel / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation>Kryss / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation>Dödläge för höger spak (standard:2, max:127)</translation> <translation>Dödläge för höger spak (standard:2, max:127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation>Avbryt</translation> <translation>Avbryt</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>Senast uppdaterad</translation> <translation>Senast uppdaterad</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation>Favorit</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation>SFO-visare för </translation> <translation>SFO-visare för </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation>Ta bort från favoriter</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation>Lägg till i favoriter</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation>Klick styrplatta</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation>Mus till styrspak</translation> <translation>Mus till styrspak</translation>
@ -1184,10 +1220,22 @@
<source>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons: <source>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source> %1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons: <translation>Det går inte att binda samma unika inmatning mer än en gång. Dubbla inmatningar har mappats till följande knappar:
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Pekplatta vänster</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Pekplatta mitten</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Pekplatta höger</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation>Handkontroller</translation> <translation>Handkontroller</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>Beteende för bakåtknapp</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation>Grafik</translation> <translation>Grafik</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>Dölj pekare vid overksam:\nLängden (sekunder) efter vilken som muspekaren som har varit overksam döljer sig själv.</translation> <translation>Dölj pekare vid overksam:\nLängden (sekunder) efter vilken som muspekaren som har varit overksam döljer sig själv.</translation>
</message> </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>Beteende för bakåtknapp:\nStäller in handkontrollerns bakåtknapp för att emulera ett tryck angivna positionen PS4ns touchpad.</translation>
</message>
<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> <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>
<translation>Visa kompatibilitetsdata:\nVisar information om spelkompatibilitet i tabellvyn. Aktivera &quot;Uppdatera kompatibilitet vid uppstart&quot; för att uppdaterad information.</translation> <translation>Visa kompatibilitetsdata:\nVisar information om spelkompatibilitet i tabellvyn. Aktivera &quot;Uppdatera kompatibilitet vid uppstart&quot; för att uppdaterad information.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation>Alltid</translation> <translation>Alltid</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Touchpad vänster</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Touchpad höger</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Touchpad mitten</translation>
</message>
<message>
<source>None</source>
<translation>Ingen</translation>
</message>
<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> <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>Grafikenhet:\nFör system med flera GPUer kan du välja den GPU som emulatorn ska använda från rullgardinsmenyn,\neller välja &quot;Auto Select&quot; för att automatiskt bestämma det.</translation> <translation>Grafikenhet:\nFör system med flera GPUer kan du välja den GPU som emulatorn ska använda från rullgardinsmenyn,\neller välja &quot;Auto Select&quot; för att automatiskt bestämma det.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation>Oyuna özel yapılandırma kullan</translation> <translation>Oyuna özel yapılandırma kullan</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation>L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation>L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation>Geri</translation>
</message>
<message>
<source>R1 / RB</source>
<translation>R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation>R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation>Seçenekler / Başlat</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation>R3</translation> <translation>R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation>Eylem Düğmeleri</translation> <translation>Eylem Düğmeleri</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation>Üçgen / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation>Kare / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation>Daire / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation>Çarpı / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation>Sağ Analog Ö Bölgesi (varsayılan: 2, en çok: 127)</translation> <translation>Sağ Analog Ö Bölgesi (varsayılan: 2, en çok: 127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation>İptal</translation> <translation>İptal</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation>atanmamış</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation>Seçenekler</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
<message>
<source>Triangle</source>
<translation>Üçgen</translation>
</message>
<message>
<source>Square</source>
<translation>Kare</translation>
</message>
<message>
<source>Circle</source>
<translation>Yuvarlak</translation>
</message>
<message>
<source>Cross</source>
<translation>Çarpı</translation>
</message>
<message>
<source>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation>Aynı tuş birden fazla kez atanamaz. Aşağıdaki tuşlara birden fazla giriş atanmış:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation>Bir Düğmeye Bas</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>Son güncelleme</translation> <translation>Son güncelleme</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation>Sık Kullanılan</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation>SFO Görüntüleyici: </translation> <translation>SFO Görüntüleyici: </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation type="unfinished">Remove from Favorites</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation>Favorilere Ekle</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation>Dokunmatik Yüzey Tıklaması</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation>Mouse'dan Kontrolcü</translation> <translation>Mouse'dan Kontrolcü</translation>
@ -1184,10 +1220,22 @@
<source>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons: <source>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source> %1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons: <translation>Aynı tuş birden fazla kez atanamaz. Aşağıdaki tuşlara birden fazla giriş atanmış:
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation>Kontrolcü</translation> <translation>Kontrolcü</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>Geri Dönme Butonu Davranışı</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation>Grafikler</translation> <translation>Grafikler</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>İmleç İçin Hareketsizlik Zaman ımı:\nBoşta kalan imlecin kendini kaç saniye sonra gizleyeceğidir.</translation> <translation>İmleç İçin Hareketsizlik Zaman ımı:\nBoşta kalan imlecin kendini kaç saniye sonra gizleyeceğidir.</translation>
</message> </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>Geri düğmesi davranışı:\nKontrol cihazındaki geri düğmesini, PS4&apos;ün dokunmatik panelindeki belirlenen noktaya dokunmak için ayarlar.</translation>
</message>
<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> <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>
<translation>Uyumluluk Verilerini Göster:\nOyun uyumluluk bilgilerini tablo görünümünde görüntüler. Güncel bilgileri almak için &quot;Başlangıçta Uyumluluk Veritabanını Güncelle&quot;yi etkinleştirin.</translation> <translation>Uyumluluk Verilerini Göster:\nOyun uyumluluk bilgilerini tablo görünümünde görüntüler. Güncel bilgileri almak için &quot;Başlangıçta Uyumluluk Veritabanını Güncelle&quot;yi etkinleştirin.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation>Her zaman</translation> <translation>Her zaman</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Dokunmatik Yüzey Sol</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Dokunmatik Yüzey Sağ</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Dokunmatik Yüzey Orta</translation>
</message>
<message>
<source>None</source>
<translation>Yok</translation>
</message>
<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> <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>Grafik Aygıtı:\nBirden fazla GPU&apos;ya sahip sistemlerde, emülatörün kullanacağı GPU&apos;yu ılır listeden seçin,\nor &quot;Auto Select&quot; seçeneğini seçerek otomatik olarak belirlenmesini sağlayın.</translation> <translation>Grafik Aygıtı:\nBirden fazla GPU&apos;ya sahip sistemlerde, emülatörün kullanacağı GPU&apos;yu ılır listeden seçin,\nor &quot;Auto Select&quot; seçeneğini seçerek otomatik olarak belirlenmesini sağlayın.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation>Використовувати ігрові конфігурації</translation> <translation>Використовувати ігрові конфігурації</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation>L1 / Лівий Бампер</translation>
</message>
<message>
<source>L2 / LT</source>
<translation>L2 / Лівий Тригер</translation>
</message>
<message>
<source>Back</source>
<translation>Назад</translation>
</message>
<message>
<source>R1 / RB</source>
<translation>R1 / Правий Бампер</translation>
</message>
<message>
<source>R2 / RT</source>
<translation>R2 / Правий Тригер</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation>Кнопка лівого стику</translation> <translation>Кнопка лівого стику</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation>Опції / Старт</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation>Кнопка правого стику</translation> <translation>Кнопка правого стику</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation>Лицьові кнопки</translation> <translation>Лицьові кнопки</translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation>Трикутник / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation>Квадрат / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation>Коло / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation>Хрест / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation>Мертва зона правого стику (за замов.: 2, максимум: 127)</translation> <translation>Мертва зона правого стику (за замов.: 2, максимум: 127)</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation>Відмінити</translation> <translation>Відмінити</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>Останнє оновлення</translation> <translation>Останнє оновлення</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation type="unfinished">Favorite</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation>Перегляд SFO </translation> <translation>Перегляд SFO </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation type="unfinished">Remove from Favorites</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation type="unfinished">Add to Favorites</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation>Кнопка лівого стику</translation> <translation>Кнопка лівого стику</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation>Натискання на сенсорну панель</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation>Миша в джойстик</translation> <translation>Миша в джойстик</translation>
@ -1188,6 +1224,18 @@
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation>Контролер</translation> <translation>Контролер</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>Перепризначення кнопки назад</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation>Графіка</translation> <translation>Графіка</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>Встановіть час, через який курсор зникне в разі бездіяльності.</translation> <translation>Встановіть час, через який курсор зникне в разі бездіяльності.</translation>
</message> </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>Перепризначення кнопки «Назад»:\nНалаштовує кнопку «Назад» контролера на емуляцію натискання на зазначену область на сенсорній панелі контролера PS4.</translation>
</message>
<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> <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>
<translation>Відображати данні ігрової сумістністі:\nВідображає інформацію про сумісність ігор у вигляді таблиці. Увімкніть &quot;Оновлення даних ігрової сумісності під час запуску&quot; для отримання актуальної інформації.</translation> <translation>Відображати данні ігрової сумістністі:\nВідображає інформацію про сумісність ігор у вигляді таблиці. Увімкніть &quot;Оновлення даних ігрової сумісності під час запуску&quot; для отримання актуальної інформації.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation>Завжди</translation> <translation>Завжди</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Ліва сторона тачпаду</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Права сторона тачпаду</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Середина тачпаду</translation>
</message>
<message>
<source>None</source>
<translation>Без змін</translation>
</message>
<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> <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>Графічний пристрій:\nУ системах із кількома GPU виберіть з випадаючого списку GPU, який буде використовувати емулятор,\nабо виберіть &quot;Автовибір&quot;, щоб визначити його автоматично.</translation> <translation>Графічний пристрій:\nУ системах із кількома GPU виберіть з випадаючого списку GPU, який буде використовувати емулятор,\nабо виберіть &quot;Автовибір&quot;, щоб визначити його автоматично.</translation>

View File

@ -22,7 +22,7 @@
<name>CheatsPatches</name> <name>CheatsPatches</name>
<message> <message>
<source>Cheats / Patches for </source> <source>Cheats / Patches for </source>
<translation type="unfinished">Cheats / Patches for </translation> <translation>Cheats / Patches cho </translation>
</message> </message>
<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> <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>
@ -415,35 +415,35 @@
</message> </message>
<message> <message>
<source>Up</source> <source>Up</source>
<translation type="unfinished">Up</translation> <translation>Lên</translation>
</message> </message>
<message> <message>
<source>Left</source> <source>Left</source>
<translation type="unfinished">Left</translation> <translation>Trái</translation>
</message> </message>
<message> <message>
<source>Right</source> <source>Right</source>
<translation type="unfinished">Right</translation> <translation>Phải</translation>
</message> </message>
<message> <message>
<source>Down</source> <source>Down</source>
<translation type="unfinished">Down</translation> <translation>Xuống</translation>
</message> </message>
<message> <message>
<source>Left Stick Deadzone (def:2 max:127)</source> <source>Left Stick Deadzone (def:2 max:127)</source>
<translation type="unfinished">Left Stick Deadzone (def:2 max:127)</translation> <translation>Deadzone cần bên trái (def:2 max:127)</translation>
</message> </message>
<message> <message>
<source>Left Deadzone</source> <source>Left Deadzone</source>
<translation type="unfinished">Left Deadzone</translation> <translation>Deadzone bên trái</translation>
</message> </message>
<message> <message>
<source>Left Stick</source> <source>Left Stick</source>
<translation type="unfinished">Left Stick</translation> <translation>Cần bên trái</translation>
</message> </message>
<message> <message>
<source>Config Selection</source> <source>Config Selection</source>
<translation type="unfinished">Config Selection</translation> <translation>Chọn cấu hình</translation>
</message> </message>
<message> <message>
<source>Common Config</source> <source>Common Config</source>
@ -451,59 +451,19 @@
</message> </message>
<message> <message>
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation type="unfinished">Use per-game configs</translation> <translation>Cấu hình riêng cho từng game</translation>
</message>
<message>
<source>L1 / LB</source>
<translation type="unfinished">L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation type="unfinished">L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation type="unfinished">Back</translation>
</message>
<message>
<source>R1 / RB</source>
<translation type="unfinished">R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation type="unfinished">R2 / RT</translation>
</message> </message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation type="unfinished">L3</translation> <translation>L3</translation>
</message>
<message>
<source>Options / Start</source>
<translation type="unfinished">Options / Start</translation>
</message> </message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation type="unfinished">R3</translation> <translation>R3</translation>
</message> </message>
<message> <message>
<source>Face Buttons</source> <source>Face Buttons</source>
<translation type="unfinished">Face Buttons</translation> <translation>Nút bấm mặt trước</translation>
</message>
<message>
<source>Triangle / Y</source>
<translation type="unfinished">Triangle / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation type="unfinished">Square / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation type="unfinished">Circle / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation type="unfinished">Cross / A</translation>
</message> </message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation>Hủy</translation> <translation>Hủy</translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation>Cập nhật lần cuối</translation> <translation>Cập nhật lần cuối</translation>
</message> </message>
<message>
<source>Favorite</source>
<translation type="unfinished">Favorite</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -824,107 +856,107 @@
</message> </message>
<message> <message>
<source>Copy Size</source> <source>Copy Size</source>
<translation type="unfinished">Copy Size</translation> <translation>Kích thước bản sao</translation>
</message> </message>
<message> <message>
<source>Copy All</source> <source>Copy All</source>
<translation type="unfinished">Copy All</translation> <translation>Sao chép tất cả</translation>
</message> </message>
<message> <message>
<source>Delete...</source> <source>Delete...</source>
<translation type="unfinished">Delete...</translation> <translation>Xoá...</translation>
</message> </message>
<message> <message>
<source>Delete Game</source> <source>Delete Game</source>
<translation type="unfinished">Delete Game</translation> <translation>Xóa trò chơi</translation>
</message> </message>
<message> <message>
<source>Delete Update</source> <source>Delete Update</source>
<translation type="unfinished">Delete Update</translation> <translation>Xóa bản cập nhật</translation>
</message> </message>
<message> <message>
<source>Delete DLC</source> <source>Delete DLC</source>
<translation type="unfinished">Delete DLC</translation> <translation>Xoá DLC</translation>
</message> </message>
<message> <message>
<source>Delete Trophy</source> <source>Delete Trophy</source>
<translation type="unfinished">Delete Trophy</translation> <translation>Xóa cúp</translation>
</message> </message>
<message> <message>
<source>Compatibility...</source> <source>Compatibility...</source>
<translation type="unfinished">Compatibility...</translation> <translation>Khả năng tương thích...</translation>
</message> </message>
<message> <message>
<source>Update database</source> <source>Update database</source>
<translation type="unfinished">Update database</translation> <translation>Cập nhật sở dữ liệu</translation>
</message> </message>
<message> <message>
<source>View report</source> <source>View report</source>
<translation type="unfinished">View report</translation> <translation>Xem báo cáo</translation>
</message> </message>
<message> <message>
<source>Submit a report</source> <source>Submit a report</source>
<translation type="unfinished">Submit a report</translation> <translation>Gửi một báo cáo</translation>
</message> </message>
<message> <message>
<source>Shortcut creation</source> <source>Shortcut creation</source>
<translation type="unfinished">Shortcut creation</translation> <translation>Tạo phím tắt</translation>
</message> </message>
<message> <message>
<source>Shortcut created successfully!</source> <source>Shortcut created successfully!</source>
<translation type="unfinished">Shortcut created successfully!</translation> <translation>Phím tắt đã đưc tạo thành công!</translation>
</message> </message>
<message> <message>
<source>Error</source> <source>Error</source>
<translation type="unfinished">Error</translation> <translation>Lỗi</translation>
</message> </message>
<message> <message>
<source>Error creating shortcut!</source> <source>Error creating shortcut!</source>
<translation type="unfinished">Error creating shortcut!</translation> <translation>Lỗi khi tạo phím tắt!</translation>
</message> </message>
<message> <message>
<source>Game</source> <source>Game</source>
<translation type="unfinished">Game</translation> <translation>Trò chơi</translation>
</message> </message>
<message> <message>
<source>This game has no update to delete!</source> <source>This game has no update to delete!</source>
<translation type="unfinished">This game has no update to delete!</translation> <translation>Trò chơi này không bản cập nhật nào đ xóa!</translation>
</message> </message>
<message> <message>
<source>Update</source> <source>Update</source>
<translation type="unfinished">Update</translation> <translation>Cập nhật</translation>
</message> </message>
<message> <message>
<source>This game has no DLC to delete!</source> <source>This game has no DLC to delete!</source>
<translation type="unfinished">This game has no DLC to delete!</translation> <translation>Trò chơi này không DLC nào đ xóa!</translation>
</message> </message>
<message> <message>
<source>DLC</source> <source>DLC</source>
<translation type="unfinished">DLC</translation> <translation>DLC</translation>
</message> </message>
<message> <message>
<source>Delete %1</source> <source>Delete %1</source>
<translation type="unfinished">Delete %1</translation> <translation>Xóa %1</translation>
</message> </message>
<message> <message>
<source>Are you sure you want to delete %1&apos;s %2 directory?</source> <source>Are you sure you want to delete %1&apos;s %2 directory?</source>
<translation type="unfinished">Are you sure you want to delete %1&apos;s %2 directory?</translation> <translation>Bạn muốn xoá thư mục %1&apos;s %2 không?</translation>
</message> </message>
<message> <message>
<source>Open Update Folder</source> <source>Open Update Folder</source>
<translation type="unfinished">Open Update Folder</translation> <translation>Mở thư mục Cập nhật</translation>
</message> </message>
<message> <message>
<source>Delete Save Data</source> <source>Delete Save Data</source>
<translation type="unfinished">Delete Save Data</translation> <translation>Xóa Lưu Dữ Liệu</translation>
</message> </message>
<message> <message>
<source>This game has no update folder to open!</source> <source>This game has no update folder to open!</source>
<translation type="unfinished">This game has no update folder to open!</translation> <translation>Trò chơi này không thư mục Cập nhật nào đ mở!</translation>
</message> </message>
<message> <message>
<source>No log file found for this game!</source> <source>No log file found for this game!</source>
<translation type="unfinished">No log file found for this game!</translation> <translation/>
</message> </message>
<message> <message>
<source>Failed to convert icon.</source> <source>Failed to convert icon.</source>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation type="unfinished">SFO Viewer for </translation> <translation type="unfinished">SFO Viewer for </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation type="unfinished">Remove from Favorites</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation type="unfinished">Add to Favorites</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation type="unfinished">L3</translation> <translation type="unfinished">L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation type="unfinished">Touchpad Click</translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation type="unfinished">Mouse to Joystick</translation> <translation type="unfinished">Mouse to Joystick</translation>
@ -1188,6 +1224,18 @@
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation>Điều khiển</translation> <translation>Điều khiển</translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation>Hành vi nút quay lại</translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation>Đ họa</translation> <translation>Đ họa</translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>Đt thời gian đ chuột biến mất sau khi không hoạt đng.</translation> <translation>Đt thời gian đ chuột biến mất sau khi không hoạt đng.</translation>
</message> </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>Hành vi nút quay lại:\nĐặt nút quay lại của tay cầm đ phỏng việc chạm vào vị trí đã chỉ đnh trên touchpad của PS4.</translation>
</message>
<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> <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>
<translation type="unfinished">Display Compatibility Data:\nDisplays game compatibility information in table view. Enable &quot;Update Compatibility On Startup&quot; to get up-to-date information.</translation> <translation type="unfinished">Display Compatibility Data:\nDisplays game compatibility information in table view. Enable &quot;Update Compatibility On Startup&quot; to get up-to-date information.</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation>Luôn luôn</translation> <translation>Luôn luôn</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation>Touchpad Trái</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation>Touchpad Phải</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation>Giữa Touchpad</translation>
</message>
<message>
<source>None</source>
<translation>Không </translation>
</message>
<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> <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>Thiết bị đ họa:\nTrên các hệ thống GPU đa năng, hãy chọn GPU trình giả lập sẽ sử dụng từ danh sách thả xuống,\hoặc chọn &quot;Auto Select&quot; đ tự đng xác đnh.</translation> <translation>Thiết bị đ họa:\nTrên các hệ thống GPU đa năng, hãy chọn GPU trình giả lập sẽ sử dụng từ danh sách thả xuống,\hoặc chọn &quot;Auto Select&quot; đ tự đng xác đnh.</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation>使</translation> <translation>使</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation>L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation>L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation>Back</translation>
</message>
<message>
<source>R1 / RB</source>
<translation>R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation>R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation>Options / Start</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation>R3</translation> <translation>R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation> / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation> / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation> / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation> / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation>2 127</translation> <translation>2 127</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Favorite</source>
<translation></translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation>SFO - </translation> <translation>SFO - </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation></translation>
</message>
<message>
<source>Add to Favorites</source>
<translation></translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation></translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation></translation> <translation></translation>
@ -1184,10 +1220,22 @@
<source>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons: <source>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source> %1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons: <translation>
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation></translation>
</message>
<message>
<source>Touchpad Center</source>
<translation></translation>
</message>
<message>
<source>Touchpad Right</source>
<translation></translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation></translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation></translation> <translation></translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>\n光标自动隐藏之前的闲置时长</translation> <translation>\n光标自动隐藏之前的闲置时长</translation>
</message> </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>\n设置手柄的返回按钮模拟在 PS4 </translation>
</message>
<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> <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>
<translation>\n在列表视图中显示游戏兼容性信息</translation> <translation>\n在列表视图中显示游戏兼容性信息</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation></translation>
</message>
<message>
<source>Touchpad Right</source>
<translation></translation>
</message>
<message>
<source>Touchpad Center</source>
<translation></translation>
</message>
<message>
<source>None</source>
<translation></translation>
</message>
<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> <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>\n在具有多个 GPU 使 GPU\n或者选择</translation> <translation>\n在具有多个 GPU 使 GPU\n或者选择</translation>

View File

@ -453,34 +453,10 @@
<source>Use per-game configs</source> <source>Use per-game configs</source>
<translation>使</translation> <translation>使</translation>
</message> </message>
<message>
<source>L1 / LB</source>
<translation>L1 / LB</translation>
</message>
<message>
<source>L2 / LT</source>
<translation>L2 / LT</translation>
</message>
<message>
<source>Back</source>
<translation>Back</translation>
</message>
<message>
<source>R1 / RB</source>
<translation>R1 / RB</translation>
</message>
<message>
<source>R2 / RT</source>
<translation>R2 / RT</translation>
</message>
<message> <message>
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Options / Start</source>
<translation>Options / Start</translation>
</message>
<message> <message>
<source>R3</source> <source>R3</source>
<translation>R3</translation> <translation>R3</translation>
@ -489,22 +465,6 @@
<source>Face Buttons</source> <source>Face Buttons</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Triangle / Y</source>
<translation> / Y</translation>
</message>
<message>
<source>Square / X</source>
<translation> / X</translation>
</message>
<message>
<source>Circle / B</source>
<translation> / B</translation>
</message>
<message>
<source>Cross / A</source>
<translation> / A</translation>
</message>
<message> <message>
<source>Right Stick Deadzone (def:2, max:127)</source> <source>Right Stick Deadzone (def:2, max:127)</source>
<translation>2 127</translation> <translation>2 127</translation>
@ -565,6 +525,74 @@
<source>Cancel</source> <source>Cancel</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>unmapped</source>
<translation type="unfinished">unmapped</translation>
</message>
<message>
<source>L1</source>
<translation type="unfinished">L1</translation>
</message>
<message>
<source>R1</source>
<translation type="unfinished">R1</translation>
</message>
<message>
<source>L2</source>
<translation type="unfinished">L2</translation>
</message>
<message>
<source>Options</source>
<translation type="unfinished">Options</translation>
</message>
<message>
<source>R2</source>
<translation type="unfinished">R2</translation>
</message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</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>Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</source>
<translation type="unfinished">Cannot bind any unique input more than once. Duplicate inputs mapped to the following buttons:
%1</translation>
</message>
<message>
<source>Press a button</source>
<translation type="unfinished">Press a button</translation>
</message>
<message>
<source>Move analog stick</source>
<translation type="unfinished">Move analog stick</translation>
</message>
</context> </context>
<context> <context>
<name>EditorDialog</name> <name>EditorDialog</name>
@ -748,6 +776,10 @@
<source>Last updated</source> <source>Last updated</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Favorite</source>
<translation type="unfinished">Favorite</translation>
</message>
</context> </context>
<context> <context>
<name>GameListUtils</name> <name>GameListUtils</name>
@ -950,6 +982,14 @@
<source>SFO Viewer for </source> <source>SFO Viewer for </source>
<translation>SFO </translation> <translation>SFO </translation>
</message> </message>
<message>
<source>Remove from Favorites</source>
<translation type="unfinished">Remove from Favorites</translation>
</message>
<message>
<source>Add to Favorites</source>
<translation type="unfinished">Add to Favorites</translation>
</message>
</context> </context>
<context> <context>
<name>HelpDialog</name> <name>HelpDialog</name>
@ -1056,10 +1096,6 @@
<source>L3</source> <source>L3</source>
<translation>L3</translation> <translation>L3</translation>
</message> </message>
<message>
<source>Touchpad Click</source>
<translation></translation>
</message>
<message> <message>
<source>Mouse to Joystick</source> <source>Mouse to Joystick</source>
<translation></translation> <translation></translation>
@ -1188,6 +1224,18 @@
%1</translation> %1</translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation type="unfinished">Touchpad Left</translation>
</message>
<message>
<source>Touchpad Center</source>
<translation type="unfinished">Touchpad Center</translation>
</message>
<message>
<source>Touchpad Right</source>
<translation type="unfinished">Touchpad Right</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@ -1546,10 +1594,6 @@
<source>Controller</source> <source>Controller</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Back Button Behavior</source>
<translation></translation>
</message>
<message> <message>
<source>Graphics</source> <source>Graphics</source>
<translation></translation> <translation></translation>
@ -1786,10 +1830,6 @@
<source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source> <source>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</source>
<translation>\n閒置滑鼠指標隱藏自身之前的持續顯示時間</translation> <translation>\n閒置滑鼠指標隱藏自身之前的持續顯示時間</translation>
</message> </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>\n設定控制器&apos; PS4 </translation>
</message>
<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> <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>
<translation>\n在表格顯視模式中顯示遊戲相容性資訊&quot;&quot;</translation> <translation>\n在表格顯視模式中顯示遊戲相容性資訊&quot;&quot;</translation>
@ -1814,22 +1854,6 @@
<source>Always</source> <source>Always</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Touchpad Left</source>
<translation></translation>
</message>
<message>
<source>Touchpad Right</source>
<translation></translation>
</message>
<message>
<source>Touchpad Center</source>
<translation></translation>
</message>
<message>
<source>None</source>
<translation></translation>
</message>
<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> <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>\n在多GPU系統中使GPU\n或選取GPU</translation> <translation>\n在多GPU系統中使GPU\n或選取GPU</translation>

View File

@ -104,14 +104,16 @@ void TrophyViewer::updateTableFilters() {
} }
} }
TrophyViewer::TrophyViewer(QString trophyPath, QString gameTrpPath, QString gameName, TrophyViewer::TrophyViewer(std::shared_ptr<gui_settings> gui_settings, QString trophyPath,
QString gameTrpPath, QString gameName,
const QVector<TrophyGameInfo>& allTrophyGames) const QVector<TrophyGameInfo>& allTrophyGames)
: QMainWindow(), allTrophyGames_(allTrophyGames), currentGameName_(gameName) { : QMainWindow(), allTrophyGames_(allTrophyGames), currentGameName_(gameName),
m_gui_settings(std::move(gui_settings)) {
this->setWindowTitle(tr("Trophy Viewer") + " - " + currentGameName_); this->setWindowTitle(tr("Trophy Viewer") + " - " + currentGameName_);
this->setAttribute(Qt::WA_DeleteOnClose); this->setAttribute(Qt::WA_DeleteOnClose);
tabWidget = new QTabWidget(this); tabWidget = new QTabWidget(this);
auto lan = Config::getEmulatorLanguage(); auto lan = m_gui_settings->GetValue(gui::gen_guiLanguage).toString();
if (lan == "en_US" || lan == "zh_CN" || lan == "zh_TW" || lan == "ja_JP" || lan == "ko_KR" || if (lan == "en_US" || lan == "zh_CN" || lan == "zh_TW" || lan == "ja_JP" || lan == "ko_KR" ||
lan == "lt_LT" || lan == "nb_NO" || lan == "nl_NL") { lan == "lt_LT" || lan == "nb_NO" || lan == "nl_NL") {
useEuropeanDateFormat = false; useEuropeanDateFormat = false;
@ -463,7 +465,7 @@ void TrophyViewer::SetTableItem(QTableWidget* parent, int row, int column, QStri
item->setTextAlignment(Qt::AlignCenter); item->setTextAlignment(Qt::AlignCenter);
item->setFont(QFont("Arial", 12, QFont::Bold)); item->setFont(QFont("Arial", 12, QFont::Bold));
Theme theme = static_cast<Theme>(Config::getMainWindowTheme()); Theme theme = static_cast<Theme>(m_gui_settings->GetValue(gui::gen_theme).toInt());
if (theme == Theme::Light) { if (theme == Theme::Light) {
item->setForeground(QBrush(Qt::black)); item->setForeground(QBrush(Qt::black));

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